From ccc5016eaeedbfb3f6be6763979e30e12485188b Mon Sep 17 00:00:00 2001 From: Maxim Vezenov Date: Tue, 19 Mar 2024 16:37:44 +0000 Subject: [PATCH] feat(acir)!: Program and witness stack structure (#5149) --- .circleci/config.yml | 229 ++- .vscode/settings.json | 1 + avm-transpiler/src/transpile_contract.rs | 12 +- .../acir_tests/flows/write_contract.sh | 7 + .../cpp/src/barretenberg/dsl/README.md | 34 + .../acir_format/acir_to_constraint_buf.hpp | 82 +- .../dsl/acir_format/serde/acir.hpp | 1819 +++++++++-------- .../dsl/acir_format/serde/index.hpp | 4 +- .../dsl/acir_format/serde/witness_map.hpp | 123 -- .../dsl/acir_format/serde/witness_stack.hpp | 247 +++ build_manifest.yml | 3 + noir/Dockerfile.packages | 6 + noir/Dockerfile.packages-test | 9 + noir/Earthfile | 7 +- .../noir-repo/acvm-repo/acir/codegen/acir.cpp | 1732 ++++++++-------- .../acvm-repo/acir/codegen/witness.cpp | 130 +- .../acvm-repo/acir/src/circuit/mod.rs | 76 +- noir/noir-repo/acvm-repo/acir/src/lib.rs | 18 +- .../acvm-repo/acir/src/native_types/mod.rs | 4 +- .../acir/src/native_types/witness_stack.rs | 64 + .../acir/tests/test_program_serialization.rs | 119 +- .../acvm-repo/acvm_js/src/compression.rs | 15 +- .../acvm-repo/acvm_js/src/execute.rs | 18 +- .../acvm-repo/acvm_js/src/public_witness.rs | 47 +- .../acvm-repo/acvm_js/test/shared/addition.ts | 11 +- .../test/shared/complex_foreign_call.ts | 16 +- .../test/shared/fixed_base_scalar_mul.ts | 6 +- .../acvm_js/test/shared/foreign_call.ts | 9 +- .../acvm_js/test/shared/memory_op.ts | 9 +- .../acvm-repo/acvm_js/test/shared/pedersen.ts | 5 +- .../acvm_js/test/shared/schnorr_verify.ts | 28 +- .../test/shared/witness_compression.ts | 23 +- .../compiler/noirc_driver/src/contract.rs | 8 +- .../compiler/noirc_driver/src/lib.rs | 9 +- .../compiler/noirc_driver/src/program.rs | 8 +- .../witness_compression/Nargo.toml | 7 + .../witness_compression/Prover.toml | 2 + .../witness_compression/src/main.nr | 7 + .../tooling/acvm_cli/src/cli/execute_cmd.rs | 6 +- noir/noir-repo/tooling/acvm_cli/src/errors.rs | 2 +- .../backend_interface/src/proof_system.rs | 35 +- .../backend_interface/src/smart_contract.rs | 15 +- noir/noir-repo/tooling/debugger/src/dap.rs | 9 +- .../tooling/nargo/src/artifacts/contract.rs | 8 +- .../tooling/nargo/src/artifacts/program.rs | 24 +- .../tooling/nargo/src/ops/optimize.rs | 19 +- noir/noir-repo/tooling/nargo/src/ops/test.rs | 15 +- .../tooling/nargo/src/ops/transform.rs | 25 +- .../nargo_cli/src/cli/codegen_verifier_cmd.rs | 8 +- .../tooling/nargo_cli/src/cli/compile_cmd.rs | 4 +- .../tooling/nargo_cli/src/cli/debug_cmd.rs | 2 +- .../tooling/nargo_cli/src/cli/execute_cmd.rs | 3 +- .../tooling/nargo_cli/src/cli/fs/program.rs | 9 +- .../tooling/nargo_cli/src/cli/fs/witness.rs | 6 +- .../tooling/nargo_cli/src/cli/info_cmd.rs | 8 +- .../tooling/nargo_cli/src/cli/prove_cmd.rs | 4 +- .../tooling/nargo_cli/src/cli/verify_cmd.rs | 2 +- .../noir-repo/tooling/nargo_cli/src/errors.rs | 6 +- .../noir_js_backend_barretenberg/package.json | 2 +- .../noir_js_backend_barretenberg/src/index.ts | 1 - noir/noir-repo/yarn.lock | 13 +- noir/scripts/test_native.sh | 2 +- .../__snapshots__/contract_class.test.ts.snap | 10 +- .../__snapshots__/index.test.ts.snap | 10 +- 64 files changed, 2905 insertions(+), 2297 deletions(-) create mode 100755 barretenberg/acir_tests/flows/write_contract.sh create mode 100644 barretenberg/cpp/src/barretenberg/dsl/README.md delete mode 100644 barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_map.hpp create mode 100644 barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_stack.hpp create mode 100644 noir/noir-repo/acvm-repo/acir/src/native_types/witness_stack.rs create mode 100644 noir/noir-repo/test_programs/execution_success/witness_compression/Nargo.toml create mode 100644 noir/noir-repo/test_programs/execution_success/witness_compression/Prover.toml create mode 100644 noir/noir-repo/test_programs/execution_success/witness_compression/src/main.nr diff --git a/.circleci/config.yml b/.circleci/config.yml index e5cbccf0ea1..a5ca27789ae 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -92,103 +92,6 @@ jobs: - continuation/continue: configuration_path: .circleci/generated_config.yml - # Noir - noir-x86_64: - docker: - - image: aztecprotocol/alpine-build-image - resource_class: small - steps: - - *checkout - - *setup_env - - run: - name: "Build" - command: cond_spot_run_build noir 32 - aztec_manifest_key: noir - - noir-arm64: - docker: - - image: aztecprotocol/alpine-build-image - resource_class: small - steps: - - *checkout - - *setup_env - - run: - name: "Build" - command: cond_spot_run_build noir 32 arm64 - aztec_manifest_key: noir - - noir-ecr-manifest: - machine: - image: default - resource_class: medium - steps: - - *checkout - - *setup_env - - run: - name: "Create ECR manifest" - command: create_ecr_manifest noir x86_64,arm64 - aztec_manifest_key: noir - - noir-tests: - docker: - - image: aztecprotocol/alpine-build-image - resource_class: small - steps: - - *checkout - - *setup_env - - run: - name: "Build" - command: cond_spot_run_build noir-tests 32 - aztec_manifest_key: noir-tests - - noir-packages: - docker: - - image: aztecprotocol/alpine-build-image - resource_class: small - steps: - - *checkout - - *setup_env - - run: - name: "Build" - command: cond_spot_run_build noir-packages 32 - aztec_manifest_key: noir-packages - - noir-packages-tests: - docker: - - image: aztecprotocol/alpine-build-image - resource_class: small - steps: - - *checkout - - *setup_env - - run: - name: "Build" - command: cond_spot_run_build noir-packages-tests 32 - aztec_manifest_key: noir-packages-tests - - noir-compile-acir-tests: - docker: - - image: aztecprotocol/alpine-build-image - resource_class: small - steps: - - *checkout - - *setup_env - - run: - name: "Build" - command: cond_spot_run_build noir-compile-acir-tests 32 - aztec_manifest_key: noir-compile-acir-tests - - avm-transpiler: - docker: - - image: aztecprotocol/alpine-build-image - resource_class: small - steps: - - *checkout - - *setup_env - - run: - name: "Build" - command: cond_spot_run_build avm-transpiler 32 - aztec_manifest_key: avm-transpiler - # Barretenberg barretenberg-wasm-linux-clang: docker: @@ -356,7 +259,19 @@ jobs: command: cond_spot_run_test barretenberg-x86_64-linux-clang-assert 32 ./scripts/run_tests 3 stdlib_plonk_recursion_tests --gtest_filter=-*turbo* aztec_manifest_key: barretenberg-x86_64-linux-clang-assert - barretenberg-acir-tests-bb: + bb-js: + machine: + image: default + resource_class: large + steps: + - *checkout + - *setup_env + - run: + name: "Build and test" + command: build bb.js + aztec_manifest_key: bb.js + + bb-js-tests: docker: - image: aztecprotocol/alpine-build-image resource_class: small @@ -365,10 +280,23 @@ jobs: - *setup_env - run: name: "Build and test" - command: cond_spot_run_build barretenberg-acir-tests-bb 32 - aztec_manifest_key: barretenberg-acir-tests-bb + command: cond_spot_run_test bb.js 32 ./scripts/run_tests + aztec_manifest_key: bb.js + + # Noir + noir-x86_64: + docker: + - image: aztecprotocol/alpine-build-image + resource_class: small + steps: + - *checkout + - *setup_env + - run: + name: "Build" + command: cond_spot_run_build noir 32 + aztec_manifest_key: noir - barretenberg-acir-tests-bb-sol: + noir-arm64: docker: - image: aztecprotocol/alpine-build-image resource_class: small @@ -376,23 +304,95 @@ jobs: - *checkout - *setup_env - run: - name: "Build and test" - command: cond_spot_run_build barretenberg-acir-tests-bb-sol 32 - aztec_manifest_key: barretenberg-acir-tests-bb-sol + name: "Build" + command: cond_spot_run_build noir 32 arm64 + aztec_manifest_key: noir - bb-js: + noir-ecr-manifest: machine: image: default - resource_class: large + resource_class: medium + steps: + - *checkout + - *setup_env + - run: + name: "Create ECR manifest" + command: create_ecr_manifest noir x86_64,arm64 + aztec_manifest_key: noir + + noir-tests: + docker: + - image: aztecprotocol/alpine-build-image + resource_class: small + steps: + - *checkout + - *setup_env + - run: + name: "Build" + command: cond_spot_run_build noir-tests 32 + aztec_manifest_key: noir-tests + + noir-packages: + docker: + - image: aztecprotocol/alpine-build-image + resource_class: small + steps: + - *checkout + - *setup_env + - run: + name: "Build" + command: cond_spot_run_build noir-packages 32 + aztec_manifest_key: noir-packages + + noir-packages-tests: + docker: + - image: aztecprotocol/alpine-build-image + resource_class: small + steps: + - *checkout + - *setup_env + - run: + name: "Build" + command: cond_spot_run_build noir-packages-tests 32 + aztec_manifest_key: noir-packages-tests + + noir-compile-acir-tests: + docker: + - image: aztecprotocol/alpine-build-image + resource_class: small + steps: + - *checkout + - *setup_env + - run: + name: "Build" + command: cond_spot_run_build noir-compile-acir-tests 32 + aztec_manifest_key: noir-compile-acir-tests + + avm-transpiler: + docker: + - image: aztecprotocol/alpine-build-image + resource_class: small + steps: + - *checkout + - *setup_env + - run: + name: "Build" + command: cond_spot_run_build avm-transpiler 32 + aztec_manifest_key: avm-transpiler + + barretenberg-acir-tests-bb: + docker: + - image: aztecprotocol/alpine-build-image + resource_class: small steps: - *checkout - *setup_env - run: name: "Build and test" - command: build bb.js - aztec_manifest_key: bb.js + command: cond_spot_run_build barretenberg-acir-tests-bb 32 + aztec_manifest_key: barretenberg-acir-tests-bb - bb-js-tests: + barretenberg-acir-tests-bb-sol: docker: - image: aztecprotocol/alpine-build-image resource_class: small @@ -401,8 +401,8 @@ jobs: - *setup_env - run: name: "Build and test" - command: cond_spot_run_test bb.js 32 ./scripts/run_tests - aztec_manifest_key: bb.js + command: cond_spot_run_build barretenberg-acir-tests-bb-sol 32 + aztec_manifest_key: barretenberg-acir-tests-bb-sol bb-js-acir-tests: docker: @@ -1272,10 +1272,14 @@ workflows: - noir-arm64 <<: *defaults - noir-tests: *defaults - - noir-packages: *defaults + - noir-packages: + requires: + - bb-js + <<: *defaults - noir-packages-tests: requires: - noir-ecr-manifest + - noir-packages <<: *defaults - noir-compile-acir-tests: requires: @@ -1305,6 +1309,7 @@ workflows: - barretenberg-acir-tests-bb-sol: requires: - barretenberg-x86_64-linux-clang-sol + - noir-compile-acir-tests <<: *bb_acir_tests - barretenberg-docs: *defaults - bb-js: diff --git a/.vscode/settings.json b/.vscode/settings.json index 2e610b828f9..98b15088b50 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -158,6 +158,7 @@ "C_Cpp.default.includePath": ["barretenberg/cpp/src"], "rust-analyzer.linkedProjects": [ "noir/noir-repo/Cargo.toml", + "noir/noir-repo/acvm-repo/acvm_js/Cargo.toml", "avm-transpiler/Cargo.toml" ] } diff --git a/avm-transpiler/src/transpile_contract.rs b/avm-transpiler/src/transpile_contract.rs index 50b1447d3eb..6f8922f8045 100644 --- a/avm-transpiler/src/transpile_contract.rs +++ b/avm-transpiler/src/transpile_contract.rs @@ -3,7 +3,7 @@ use log::info; use regex::Regex; use serde::{Deserialize, Serialize}; -use acvm::acir::circuit::Circuit; +use acvm::acir::circuit::Program; use crate::transpile::brillig_to_avm; use crate::utils::extract_brillig_from_acir; @@ -55,10 +55,10 @@ pub struct AcirContractFunction { pub custom_attributes: Vec, pub abi: serde_json::Value, #[serde( - serialize_with = "Circuit::serialize_circuit_base64", - deserialize_with = "Circuit::deserialize_circuit_base64" + serialize_with = "Program::serialize_program_base64", + deserialize_with = "Program::deserialize_program_base64" )] - pub bytecode: Circuit, + pub bytecode: Program, pub debug_symbols: serde_json::Value, } @@ -88,8 +88,8 @@ impl From for TranspiledContract { function.name, contract.name ); // Extract Brillig Opcodes from acir - let acir_circuit = function.bytecode.clone(); - let brillig = extract_brillig_from_acir(&acir_circuit.opcodes); + let acir_program = function.bytecode; + let brillig = extract_brillig_from_acir(&acir_program.functions[0].opcodes); // Transpile to AVM let avm_bytecode = brillig_to_avm(brillig); diff --git a/barretenberg/acir_tests/flows/write_contract.sh b/barretenberg/acir_tests/flows/write_contract.sh new file mode 100755 index 00000000000..4f483395c58 --- /dev/null +++ b/barretenberg/acir_tests/flows/write_contract.sh @@ -0,0 +1,7 @@ +#!/bin/sh +set -eu + +export TEST_NAME=$(basename $(pwd)) + +$BIN write_vk -o vk +$BIN contract -k vk -c $CRS_PATH -b ./target/acir.gz -o $TEST_NAME.sol diff --git a/barretenberg/cpp/src/barretenberg/dsl/README.md b/barretenberg/cpp/src/barretenberg/dsl/README.md new file mode 100644 index 00000000000..9a76586bde5 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/dsl/README.md @@ -0,0 +1,34 @@ +# Domain Specific Language + +This package adds support to use [ACIR](https://github.com/noir-lang/noir/tree/master/acvm-repo/acir) with barretenberg. + +## Serialization Changes + +There are two types of breaking serialization changes. One that alters that alters the internal ACIR structure passed to barretenberg, and one that changes how we serialize the buffer passed to barretenberg. + +1. Internal Structure Change + +Go to the ACVM `acir` crate and re-run the [serde reflection test](../../../../../noir/noir-repo/acvm-repo/acir/src/lib.rs#L51). Remember to comment out the hash check to write the updated C++ serde file. Copy that file into the `dsl` package's [serde folder](./acir_format/serde/) where you will see an `acir.hpp` file. + +You will have to update a couple things in the new `acir.hpp`: +- Replace all `throw serde::deserialization_error` with `throw_or_abort` +- The top-level struct (such as `Program`) will still use its own namespace for its internal fields. This extra `Program::` can be removed from the top-level `struct Program { .. }` object. + +The same can then be done for any breaking changes introduced to `witness_stack.hpp`. + +2. Full Breaking Change + +This type of breaking change is rarely expected to happen, however, due to its nature there are multiple consumers of the pre-existing serialization you should be aware of if you ever need to make this change. + +A full change is when you attempt to change the object whose buffer we are actually deserializing in barretenberg. To give more detail, when [deserializing the constraint buffer](./acir_format/acir_to_constraint_buf.hpp#366) if the object for which we call `bincodeDeserialize` on changes, anything that has pre-existing ACIR using the previous object's `bincodeDeserialize` method will now fail. The serialization is once again determined by the top-level object in the [acir crate](../../../../../noir/noir-repo/acvm-repo/acir/src/circuit/mod.rs). After performing the steps outlined for an internal structure breaking change as listed in (1) above, we need to update all consumers of barretenberg. + +Even if you correctly update all serialization in [acvm_js](../../../../../noir/noir-repo/acvm-repo/acvm_js/README.md) such as during [execution](../../../../../noir/noir-repo/acvm-repo/acvm_js/src/execute.rs#57), there is multiple places the `yarn-project` uses the ACIR top-level serialization. The `yarn-project` sequencer also uses the native `acvm_cli tool` that has an execute method that [expects raw byte code](../../../../../noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs#63). + +In the context of Aztec we need to regenerate all the artifacts in [noir-projects](../../../../../noir-projects/bootstrap.sh). This regeneration assumes that we have rebuilt the compilers (Noir compiler and AVM transpiler) to use the new serialization. After regenerating these artifacts we can bootstrap the yarn-project. There are multiple packages in the yarn-project that rely on pre-computed artifacts such as `yarn-project/circuits.js` and `yarn-project/protocol-contracts`. + +The Aztec artifacts can be individually regenerated as well using `yarn test -u`. +You can also run the command on the relevant workspaces, which at the time are the following: +``` +yarn workspace @aztec/circuits.js test -u +yarn workspace @aztec/protocol-contracts test -u +``` diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.hpp index f7a5cbcf44d..58d036f4e16 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.hpp @@ -26,10 +26,10 @@ namespace acir_format { * * @param arg acir representation of an 3-wire arithmetic operation * @return poly_triple - * @note In principle Circuit::Expression can accommodate arbitrarily many quadratic and linear terms but in practice + * @note In principle Program::Expression can accommodate arbitrarily many quadratic and linear terms but in practice * the ones processed here have a max of 1 and 3 respectively, in accordance with the standard width-3 arithmetic gate. */ -poly_triple serialize_arithmetic_gate(Circuit::Expression const& arg) +poly_triple serialize_arithmetic_gate(Program::Expression const& arg) { // TODO(https://github.com/AztecProtocol/barretenberg/issues/816): The initialization of the witness indices a,b,c // to 0 is implicitly assuming that (builder.zero_idx == 0) which is no longer the case. Now, witness idx 0 in @@ -98,17 +98,17 @@ poly_triple serialize_arithmetic_gate(Circuit::Expression const& arg) return pt; } -void handle_arithmetic(Circuit::Opcode::AssertZero const& arg, AcirFormat& af) +void handle_arithmetic(Program::Opcode::AssertZero const& arg, AcirFormat& af) { af.constraints.push_back(serialize_arithmetic_gate(arg.value)); } -void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, AcirFormat& af) +void handle_blackbox_func_call(Program::Opcode::BlackBoxFuncCall const& arg, AcirFormat& af) { std::visit( [&](auto&& arg) { using T = std::decay_t; - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { af.logic_constraints.push_back(LogicConstraint{ .a = arg.lhs.witness.value, .b = arg.rhs.witness.value, @@ -116,7 +116,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci .num_bits = arg.lhs.num_bits, .is_xor_gate = false, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.logic_constraints.push_back(LogicConstraint{ .a = arg.lhs.witness.value, .b = arg.rhs.witness.value, @@ -124,12 +124,12 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci .num_bits = arg.lhs.num_bits, .is_xor_gate = true, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.range_constraints.push_back(RangeConstraint{ .witness = arg.input.witness.value, .num_bits = arg.input.num_bits, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.sha256_constraints.push_back(Sha256Constraint{ .inputs = map(arg.inputs, [](auto& e) { @@ -140,7 +140,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci }), .result = map(arg.outputs, [](auto& e) { return e.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.sha256_compression.push_back(Sha256Compression{ .inputs = map(arg.inputs, [](auto& e) { @@ -158,7 +158,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci }), .result = map(arg.outputs, [](auto& e) { return e.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.blake2s_constraints.push_back(Blake2sConstraint{ .inputs = map(arg.inputs, [](auto& e) { @@ -169,7 +169,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci }), .result = map(arg.outputs, [](auto& e) { return e.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.blake3_constraints.push_back(Blake3Constraint{ .inputs = map(arg.inputs, [](auto& e) { @@ -180,7 +180,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci }), .result = map(arg.outputs, [](auto& e) { return e.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.schnorr_constraints.push_back(SchnorrConstraint{ .message = map(arg.message, [](auto& e) { return e.witness.value; }), .public_key_x = arg.public_key_x.witness.value, @@ -188,20 +188,20 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci .result = arg.output.value, .signature = map(arg.signature, [](auto& e) { return e.witness.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.pedersen_constraints.push_back(PedersenConstraint{ .scalars = map(arg.inputs, [](auto& e) { return e.witness.value; }), .hash_index = arg.domain_separator, .result_x = arg.outputs[0].value, .result_y = arg.outputs[1].value, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.pedersen_hash_constraints.push_back(PedersenHashConstraint{ .scalars = map(arg.inputs, [](auto& e) { return e.witness.value; }), .hash_index = arg.domain_separator, .result = arg.output.value, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.ecdsa_k1_constraints.push_back(EcdsaSecp256k1Constraint{ .hashed_message = map(arg.hashed_message, [](auto& e) { return e.witness.value; }), .signature = map(arg.signature, [](auto& e) { return e.witness.value; }), @@ -209,7 +209,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci .pub_y_indices = map(arg.public_key_y, [](auto& e) { return e.witness.value; }), .result = arg.output.value, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.ecdsa_r1_constraints.push_back(EcdsaSecp256r1Constraint{ .hashed_message = map(arg.hashed_message, [](auto& e) { return e.witness.value; }), .pub_x_indices = map(arg.public_key_x, [](auto& e) { return e.witness.value; }), @@ -217,14 +217,14 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci .result = arg.output.value, .signature = map(arg.signature, [](auto& e) { return e.witness.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.fixed_base_scalar_mul_constraints.push_back(FixedBaseScalarMul{ .low = arg.low.witness.value, .high = arg.high.witness.value, .pub_key_x = arg.outputs[0].value, .pub_key_y = arg.outputs[1].value, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.ec_add_constraints.push_back(EcAdd{ .input1_x = arg.input1_x.witness.value, .input1_y = arg.input1_y.witness.value, @@ -233,7 +233,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci .result_x = arg.outputs[0].value, .result_y = arg.outputs[1].value, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.keccak_constraints.push_back(KeccakConstraint{ .inputs = map(arg.inputs, [](auto& e) { @@ -244,7 +244,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci }), .result = map(arg.outputs, [](auto& e) { return e.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.keccak_var_constraints.push_back(KeccakVarConstraint{ .inputs = map(arg.inputs, [](auto& e) { @@ -256,12 +256,12 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci .result = map(arg.outputs, [](auto& e) { return e.value; }), .var_message_size = arg.var_message_size.witness.value, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.keccak_permutations.push_back(Keccakf1600{ .state = map(arg.inputs, [](auto& e) { return e.witness.value; }), .result = map(arg.outputs, [](auto& e) { return e.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { auto c = RecursionConstraint{ .key = map(arg.verification_key, [](auto& e) { return e.witness.value; }), .proof = map(arg.proof, [](auto& e) { return e.witness.value; }), @@ -269,46 +269,46 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci .key_hash = arg.key_hash.witness.value, }; af.recursion_constraints.push_back(c); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.bigint_from_le_bytes_constraints.push_back(BigIntFromLeBytes{ .inputs = map(arg.inputs, [](auto& e) { return e.witness.value; }), .modulus = map(arg.modulus, [](auto& e) -> uint32_t { return e; }), .result = arg.output, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.bigint_to_le_bytes_constraints.push_back(BigIntToLeBytes{ .input = arg.input, .result = map(arg.outputs, [](auto& e) { return e.value; }), }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.bigint_operations.push_back(BigIntOperation{ .lhs = arg.lhs, .rhs = arg.rhs, .result = arg.output, .opcode = BigIntOperationType::Add, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.bigint_operations.push_back(BigIntOperation{ .lhs = arg.lhs, .rhs = arg.rhs, .result = arg.output, .opcode = BigIntOperationType::Sub, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.bigint_operations.push_back(BigIntOperation{ .lhs = arg.lhs, .rhs = arg.rhs, .result = arg.output, .opcode = BigIntOperationType::Mul, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.bigint_operations.push_back(BigIntOperation{ .lhs = arg.lhs, .rhs = arg.rhs, .result = arg.output, .opcode = BigIntOperationType::Div, }); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { af.poseidon2_constraints.push_back(Poseidon2Constraint{ .state = map(arg.inputs, [](auto& e) { return e.witness.value; }), .result = map(arg.outputs, [](auto& e) { return e.value; }), @@ -319,7 +319,7 @@ void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, Aci arg.value.value); } -BlockConstraint handle_memory_init(Circuit::Opcode::MemoryInit const& mem_init) +BlockConstraint handle_memory_init(Program::Opcode::MemoryInit const& mem_init) { BlockConstraint block{ .init = {}, .trace = {}, .type = BlockType::ROM }; std::vector init; @@ -341,13 +341,13 @@ BlockConstraint handle_memory_init(Circuit::Opcode::MemoryInit const& mem_init) return block; } -bool is_rom(Circuit::MemOp const& mem_op) +bool is_rom(Program::MemOp const& mem_op) { return mem_op.operation.mul_terms.size() == 0 && mem_op.operation.linear_combinations.size() == 0 && uint256_t(mem_op.operation.q_c) == 0; } -void handle_memory_op(Circuit::Opcode::MemoryOp const& mem_op, BlockConstraint& block) +void handle_memory_op(Program::Opcode::MemoryOp const& mem_op, BlockConstraint& block) { uint8_t access_type = 1; if (is_rom(mem_op.op)) { @@ -365,7 +365,9 @@ void handle_memory_op(Circuit::Opcode::MemoryOp const& mem_op, BlockConstraint& AcirFormat circuit_buf_to_acir_format(std::vector const& buf) { - auto circuit = Circuit::Circuit::bincodeDeserialize(buf); + // TODO(maxim): Handle the new `Program` structure once ACVM supports a function call stack. + // For now we expect a single ACIR function + auto circuit = Program::Program::bincodeDeserialize(buf).functions[0]; AcirFormat af; // `varnum` is the true number of variables, thus we add one to the index which starts at zero @@ -378,15 +380,15 @@ AcirFormat circuit_buf_to_acir_format(std::vector const& buf) std::visit( [&](auto&& arg) { using T = std::decay_t; - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { handle_arithmetic(arg, af); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { handle_blackbox_func_call(arg, af); - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { auto block = handle_memory_init(arg); uint32_t block_id = arg.block_id.value; block_id_to_block_constraint[block_id] = block; - } else if constexpr (std::is_same_v) { + } else if constexpr (std::is_same_v) { auto block = block_id_to_block_constraint.find(arg.block_id.value); if (block == block_id_to_block_constraint.end()) { throw_or_abort("unitialized MemoryOp"); @@ -414,7 +416,11 @@ AcirFormat circuit_buf_to_acir_format(std::vector const& buf) */ WitnessVector witness_buf_to_witness_data(std::vector const& buf) { - auto w = WitnessMap::WitnessMap::bincodeDeserialize(buf); + // TODO(maxim): Handle the new `WitnessStack` structure once ACVM supports a function call stack + // A `StackItem` contains an index to an ACIR circuit and its respective ACIR-native `WitnessMap`. + // For now we expect the `WitnessStack` to contain a single witness. + auto w = WitnessStack::WitnessStack::bincodeDeserialize(buf).stack[0].witness; + WitnessVector wv; size_t index = 0; for (auto& e : w.value) { diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp index d047e6c9f8b..e662002ee8c 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp @@ -3,7 +3,7 @@ #include "bincode.hpp" #include "serde.hpp" -namespace Circuit { +namespace Program { struct BinaryFieldOp { @@ -152,7 +152,7 @@ struct MemoryAddress { }; struct HeapArray { - Circuit::MemoryAddress pointer; + Program::MemoryAddress pointer; uint64_t size; friend bool operator==(const HeapArray&, const HeapArray&); @@ -161,8 +161,8 @@ struct HeapArray { }; struct HeapVector { - Circuit::MemoryAddress pointer; - Circuit::MemoryAddress size; + Program::MemoryAddress pointer; + Program::MemoryAddress size; friend bool operator==(const HeapVector&, const HeapVector&); std::vector bincodeSerialize() const; @@ -172,8 +172,8 @@ struct HeapVector { struct BlackBoxOp { struct Sha256 { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Sha256&, const Sha256&); std::vector bincodeSerialize() const; @@ -181,8 +181,8 @@ struct BlackBoxOp { }; struct Blake2s { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Blake2s&, const Blake2s&); std::vector bincodeSerialize() const; @@ -190,8 +190,8 @@ struct BlackBoxOp { }; struct Blake3 { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Blake3&, const Blake3&); std::vector bincodeSerialize() const; @@ -199,8 +199,8 @@ struct BlackBoxOp { }; struct Keccak256 { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Keccak256&, const Keccak256&); std::vector bincodeSerialize() const; @@ -208,8 +208,8 @@ struct BlackBoxOp { }; struct Keccakf1600 { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Keccakf1600&, const Keccakf1600&); std::vector bincodeSerialize() const; @@ -217,11 +217,11 @@ struct BlackBoxOp { }; struct EcdsaSecp256k1 { - Circuit::HeapVector hashed_msg; - Circuit::HeapArray public_key_x; - Circuit::HeapArray public_key_y; - Circuit::HeapArray signature; - Circuit::MemoryAddress result; + Program::HeapVector hashed_msg; + Program::HeapArray public_key_x; + Program::HeapArray public_key_y; + Program::HeapArray signature; + Program::MemoryAddress result; friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&); std::vector bincodeSerialize() const; @@ -229,11 +229,11 @@ struct BlackBoxOp { }; struct EcdsaSecp256r1 { - Circuit::HeapVector hashed_msg; - Circuit::HeapArray public_key_x; - Circuit::HeapArray public_key_y; - Circuit::HeapArray signature; - Circuit::MemoryAddress result; + Program::HeapVector hashed_msg; + Program::HeapArray public_key_x; + Program::HeapArray public_key_y; + Program::HeapArray signature; + Program::MemoryAddress result; friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&); std::vector bincodeSerialize() const; @@ -241,11 +241,11 @@ struct BlackBoxOp { }; struct SchnorrVerify { - Circuit::MemoryAddress public_key_x; - Circuit::MemoryAddress public_key_y; - Circuit::HeapVector message; - Circuit::HeapVector signature; - Circuit::MemoryAddress result; + Program::MemoryAddress public_key_x; + Program::MemoryAddress public_key_y; + Program::HeapVector message; + Program::HeapVector signature; + Program::MemoryAddress result; friend bool operator==(const SchnorrVerify&, const SchnorrVerify&); std::vector bincodeSerialize() const; @@ -253,9 +253,9 @@ struct BlackBoxOp { }; struct PedersenCommitment { - Circuit::HeapVector inputs; - Circuit::MemoryAddress domain_separator; - Circuit::HeapArray output; + Program::HeapVector inputs; + Program::MemoryAddress domain_separator; + Program::HeapArray output; friend bool operator==(const PedersenCommitment&, const PedersenCommitment&); std::vector bincodeSerialize() const; @@ -263,9 +263,9 @@ struct BlackBoxOp { }; struct PedersenHash { - Circuit::HeapVector inputs; - Circuit::MemoryAddress domain_separator; - Circuit::MemoryAddress output; + Program::HeapVector inputs; + Program::MemoryAddress domain_separator; + Program::MemoryAddress output; friend bool operator==(const PedersenHash&, const PedersenHash&); std::vector bincodeSerialize() const; @@ -273,9 +273,9 @@ struct BlackBoxOp { }; struct FixedBaseScalarMul { - Circuit::MemoryAddress low; - Circuit::MemoryAddress high; - Circuit::HeapArray result; + Program::MemoryAddress low; + Program::MemoryAddress high; + Program::HeapArray result; friend bool operator==(const FixedBaseScalarMul&, const FixedBaseScalarMul&); std::vector bincodeSerialize() const; @@ -283,11 +283,11 @@ struct BlackBoxOp { }; struct EmbeddedCurveAdd { - Circuit::MemoryAddress input1_x; - Circuit::MemoryAddress input1_y; - Circuit::MemoryAddress input2_x; - Circuit::MemoryAddress input2_y; - Circuit::HeapArray result; + Program::MemoryAddress input1_x; + Program::MemoryAddress input1_y; + Program::MemoryAddress input2_x; + Program::MemoryAddress input2_y; + Program::HeapArray result; friend bool operator==(const EmbeddedCurveAdd&, const EmbeddedCurveAdd&); std::vector bincodeSerialize() const; @@ -295,9 +295,9 @@ struct BlackBoxOp { }; struct BigIntAdd { - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; - Circuit::MemoryAddress output; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; + Program::MemoryAddress output; friend bool operator==(const BigIntAdd&, const BigIntAdd&); std::vector bincodeSerialize() const; @@ -305,9 +305,9 @@ struct BlackBoxOp { }; struct BigIntSub { - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; - Circuit::MemoryAddress output; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; + Program::MemoryAddress output; friend bool operator==(const BigIntSub&, const BigIntSub&); std::vector bincodeSerialize() const; @@ -315,9 +315,9 @@ struct BlackBoxOp { }; struct BigIntMul { - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; - Circuit::MemoryAddress output; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; + Program::MemoryAddress output; friend bool operator==(const BigIntMul&, const BigIntMul&); std::vector bincodeSerialize() const; @@ -325,9 +325,9 @@ struct BlackBoxOp { }; struct BigIntDiv { - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; - Circuit::MemoryAddress output; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; + Program::MemoryAddress output; friend bool operator==(const BigIntDiv&, const BigIntDiv&); std::vector bincodeSerialize() const; @@ -335,9 +335,9 @@ struct BlackBoxOp { }; struct BigIntFromLeBytes { - Circuit::HeapVector inputs; - Circuit::HeapVector modulus; - Circuit::MemoryAddress output; + Program::HeapVector inputs; + Program::HeapVector modulus; + Program::MemoryAddress output; friend bool operator==(const BigIntFromLeBytes&, const BigIntFromLeBytes&); std::vector bincodeSerialize() const; @@ -345,8 +345,8 @@ struct BlackBoxOp { }; struct BigIntToLeBytes { - Circuit::MemoryAddress input; - Circuit::HeapVector output; + Program::MemoryAddress input; + Program::HeapVector output; friend bool operator==(const BigIntToLeBytes&, const BigIntToLeBytes&); std::vector bincodeSerialize() const; @@ -354,9 +354,9 @@ struct BlackBoxOp { }; struct Poseidon2Permutation { - Circuit::HeapVector message; - Circuit::HeapArray output; - Circuit::MemoryAddress len; + Program::HeapVector message; + Program::HeapArray output; + Program::MemoryAddress len; friend bool operator==(const Poseidon2Permutation&, const Poseidon2Permutation&); std::vector bincodeSerialize() const; @@ -364,9 +364,9 @@ struct BlackBoxOp { }; struct Sha256Compression { - Circuit::HeapVector input; - Circuit::HeapVector hash_values; - Circuit::HeapArray output; + Program::HeapVector input; + Program::HeapVector hash_values; + Program::HeapArray output; friend bool operator==(const Sha256Compression&, const Sha256Compression&); std::vector bincodeSerialize() const; @@ -411,7 +411,7 @@ struct HeapValueType { }; struct Array { - std::vector value_types; + std::vector value_types; uint64_t size; friend bool operator==(const Array&, const Array&); @@ -420,7 +420,7 @@ struct HeapValueType { }; struct Vector { - std::vector value_types; + std::vector value_types; friend bool operator==(const Vector&, const Vector&); std::vector bincodeSerialize() const; @@ -445,7 +445,7 @@ struct Value { struct ValueOrArray { struct MemoryAddress { - Circuit::MemoryAddress value; + Program::MemoryAddress value; friend bool operator==(const MemoryAddress&, const MemoryAddress&); std::vector bincodeSerialize() const; @@ -453,7 +453,7 @@ struct ValueOrArray { }; struct HeapArray { - Circuit::HeapArray value; + Program::HeapArray value; friend bool operator==(const HeapArray&, const HeapArray&); std::vector bincodeSerialize() const; @@ -461,7 +461,7 @@ struct ValueOrArray { }; struct HeapVector { - Circuit::HeapVector value; + Program::HeapVector value; friend bool operator==(const HeapVector&, const HeapVector&); std::vector bincodeSerialize() const; @@ -478,10 +478,10 @@ struct ValueOrArray { struct BrilligOpcode { struct BinaryFieldOp { - Circuit::MemoryAddress destination; - Circuit::BinaryFieldOp op; - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; + Program::MemoryAddress destination; + Program::BinaryFieldOp op; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&); std::vector bincodeSerialize() const; @@ -489,11 +489,11 @@ struct BrilligOpcode { }; struct BinaryIntOp { - Circuit::MemoryAddress destination; - Circuit::BinaryIntOp op; + Program::MemoryAddress destination; + Program::BinaryIntOp op; uint32_t bit_size; - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; friend bool operator==(const BinaryIntOp&, const BinaryIntOp&); std::vector bincodeSerialize() const; @@ -501,8 +501,8 @@ struct BrilligOpcode { }; struct Cast { - Circuit::MemoryAddress destination; - Circuit::MemoryAddress source; + Program::MemoryAddress destination; + Program::MemoryAddress source; uint32_t bit_size; friend bool operator==(const Cast&, const Cast&); @@ -511,7 +511,7 @@ struct BrilligOpcode { }; struct JumpIfNot { - Circuit::MemoryAddress condition; + Program::MemoryAddress condition; uint64_t location; friend bool operator==(const JumpIfNot&, const JumpIfNot&); @@ -520,7 +520,7 @@ struct BrilligOpcode { }; struct JumpIf { - Circuit::MemoryAddress condition; + Program::MemoryAddress condition; uint64_t location; friend bool operator==(const JumpIf&, const JumpIf&); @@ -537,7 +537,7 @@ struct BrilligOpcode { }; struct CalldataCopy { - Circuit::MemoryAddress destination_address; + Program::MemoryAddress destination_address; uint64_t size; uint64_t offset; @@ -555,9 +555,9 @@ struct BrilligOpcode { }; struct Const { - Circuit::MemoryAddress destination; + Program::MemoryAddress destination; uint32_t bit_size; - Circuit::Value value; + Program::Value value; friend bool operator==(const Const&, const Const&); std::vector bincodeSerialize() const; @@ -572,10 +572,10 @@ struct BrilligOpcode { struct ForeignCall { std::string function; - std::vector destinations; - std::vector destination_value_types; - std::vector inputs; - std::vector input_value_types; + std::vector destinations; + std::vector destination_value_types; + std::vector inputs; + std::vector input_value_types; friend bool operator==(const ForeignCall&, const ForeignCall&); std::vector bincodeSerialize() const; @@ -583,8 +583,8 @@ struct BrilligOpcode { }; struct Mov { - Circuit::MemoryAddress destination; - Circuit::MemoryAddress source; + Program::MemoryAddress destination; + Program::MemoryAddress source; friend bool operator==(const Mov&, const Mov&); std::vector bincodeSerialize() const; @@ -592,8 +592,8 @@ struct BrilligOpcode { }; struct Load { - Circuit::MemoryAddress destination; - Circuit::MemoryAddress source_pointer; + Program::MemoryAddress destination; + Program::MemoryAddress source_pointer; friend bool operator==(const Load&, const Load&); std::vector bincodeSerialize() const; @@ -601,8 +601,8 @@ struct BrilligOpcode { }; struct Store { - Circuit::MemoryAddress destination_pointer; - Circuit::MemoryAddress source; + Program::MemoryAddress destination_pointer; + Program::MemoryAddress source; friend bool operator==(const Store&, const Store&); std::vector bincodeSerialize() const; @@ -610,7 +610,7 @@ struct BrilligOpcode { }; struct BlackBox { - Circuit::BlackBoxOp value; + Program::BlackBoxOp value; friend bool operator==(const BlackBox&, const BlackBox&); std::vector bincodeSerialize() const; @@ -665,7 +665,7 @@ struct Witness { }; struct FunctionInput { - Circuit::Witness witness; + Program::Witness witness; uint32_t num_bits; friend bool operator==(const FunctionInput&, const FunctionInput&); @@ -676,9 +676,9 @@ struct FunctionInput { struct BlackBoxFuncCall { struct AND { - Circuit::FunctionInput lhs; - Circuit::FunctionInput rhs; - Circuit::Witness output; + Program::FunctionInput lhs; + Program::FunctionInput rhs; + Program::Witness output; friend bool operator==(const AND&, const AND&); std::vector bincodeSerialize() const; @@ -686,9 +686,9 @@ struct BlackBoxFuncCall { }; struct XOR { - Circuit::FunctionInput lhs; - Circuit::FunctionInput rhs; - Circuit::Witness output; + Program::FunctionInput lhs; + Program::FunctionInput rhs; + Program::Witness output; friend bool operator==(const XOR&, const XOR&); std::vector bincodeSerialize() const; @@ -696,7 +696,7 @@ struct BlackBoxFuncCall { }; struct RANGE { - Circuit::FunctionInput input; + Program::FunctionInput input; friend bool operator==(const RANGE&, const RANGE&); std::vector bincodeSerialize() const; @@ -704,8 +704,8 @@ struct BlackBoxFuncCall { }; struct SHA256 { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const SHA256&, const SHA256&); std::vector bincodeSerialize() const; @@ -713,8 +713,8 @@ struct BlackBoxFuncCall { }; struct Blake2s { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Blake2s&, const Blake2s&); std::vector bincodeSerialize() const; @@ -722,8 +722,8 @@ struct BlackBoxFuncCall { }; struct Blake3 { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Blake3&, const Blake3&); std::vector bincodeSerialize() const; @@ -731,11 +731,11 @@ struct BlackBoxFuncCall { }; struct SchnorrVerify { - Circuit::FunctionInput public_key_x; - Circuit::FunctionInput public_key_y; - std::vector signature; - std::vector message; - Circuit::Witness output; + Program::FunctionInput public_key_x; + Program::FunctionInput public_key_y; + std::vector signature; + std::vector message; + Program::Witness output; friend bool operator==(const SchnorrVerify&, const SchnorrVerify&); std::vector bincodeSerialize() const; @@ -743,9 +743,9 @@ struct BlackBoxFuncCall { }; struct PedersenCommitment { - std::vector inputs; + std::vector inputs; uint32_t domain_separator; - std::array outputs; + std::array outputs; friend bool operator==(const PedersenCommitment&, const PedersenCommitment&); std::vector bincodeSerialize() const; @@ -753,9 +753,9 @@ struct BlackBoxFuncCall { }; struct PedersenHash { - std::vector inputs; + std::vector inputs; uint32_t domain_separator; - Circuit::Witness output; + Program::Witness output; friend bool operator==(const PedersenHash&, const PedersenHash&); std::vector bincodeSerialize() const; @@ -763,11 +763,11 @@ struct BlackBoxFuncCall { }; struct EcdsaSecp256k1 { - std::vector public_key_x; - std::vector public_key_y; - std::vector signature; - std::vector hashed_message; - Circuit::Witness output; + std::vector public_key_x; + std::vector public_key_y; + std::vector signature; + std::vector hashed_message; + Program::Witness output; friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&); std::vector bincodeSerialize() const; @@ -775,11 +775,11 @@ struct BlackBoxFuncCall { }; struct EcdsaSecp256r1 { - std::vector public_key_x; - std::vector public_key_y; - std::vector signature; - std::vector hashed_message; - Circuit::Witness output; + std::vector public_key_x; + std::vector public_key_y; + std::vector signature; + std::vector hashed_message; + Program::Witness output; friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&); std::vector bincodeSerialize() const; @@ -787,9 +787,9 @@ struct BlackBoxFuncCall { }; struct FixedBaseScalarMul { - Circuit::FunctionInput low; - Circuit::FunctionInput high; - std::array outputs; + Program::FunctionInput low; + Program::FunctionInput high; + std::array outputs; friend bool operator==(const FixedBaseScalarMul&, const FixedBaseScalarMul&); std::vector bincodeSerialize() const; @@ -797,11 +797,11 @@ struct BlackBoxFuncCall { }; struct EmbeddedCurveAdd { - Circuit::FunctionInput input1_x; - Circuit::FunctionInput input1_y; - Circuit::FunctionInput input2_x; - Circuit::FunctionInput input2_y; - std::array outputs; + Program::FunctionInput input1_x; + Program::FunctionInput input1_y; + Program::FunctionInput input2_x; + Program::FunctionInput input2_y; + std::array outputs; friend bool operator==(const EmbeddedCurveAdd&, const EmbeddedCurveAdd&); std::vector bincodeSerialize() const; @@ -809,8 +809,8 @@ struct BlackBoxFuncCall { }; struct Keccak256 { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Keccak256&, const Keccak256&); std::vector bincodeSerialize() const; @@ -818,9 +818,9 @@ struct BlackBoxFuncCall { }; struct Keccak256VariableLength { - std::vector inputs; - Circuit::FunctionInput var_message_size; - std::vector outputs; + std::vector inputs; + Program::FunctionInput var_message_size; + std::vector outputs; friend bool operator==(const Keccak256VariableLength&, const Keccak256VariableLength&); std::vector bincodeSerialize() const; @@ -828,8 +828,8 @@ struct BlackBoxFuncCall { }; struct Keccakf1600 { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Keccakf1600&, const Keccakf1600&); std::vector bincodeSerialize() const; @@ -837,10 +837,10 @@ struct BlackBoxFuncCall { }; struct RecursiveAggregation { - std::vector verification_key; - std::vector proof; - std::vector public_inputs; - Circuit::FunctionInput key_hash; + std::vector verification_key; + std::vector proof; + std::vector public_inputs; + Program::FunctionInput key_hash; friend bool operator==(const RecursiveAggregation&, const RecursiveAggregation&); std::vector bincodeSerialize() const; @@ -888,7 +888,7 @@ struct BlackBoxFuncCall { }; struct BigIntFromLeBytes { - std::vector inputs; + std::vector inputs; std::vector modulus; uint32_t output; @@ -899,7 +899,7 @@ struct BlackBoxFuncCall { struct BigIntToLeBytes { uint32_t input; - std::vector outputs; + std::vector outputs; friend bool operator==(const BigIntToLeBytes&, const BigIntToLeBytes&); std::vector bincodeSerialize() const; @@ -907,8 +907,8 @@ struct BlackBoxFuncCall { }; struct Poseidon2Permutation { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; uint32_t len; friend bool operator==(const Poseidon2Permutation&, const Poseidon2Permutation&); @@ -917,9 +917,9 @@ struct BlackBoxFuncCall { }; struct Sha256Compression { - std::vector inputs; - std::vector hash_values; - std::vector outputs; + std::vector inputs; + std::vector hash_values; + std::vector outputs; friend bool operator==(const Sha256Compression&, const Sha256Compression&); std::vector bincodeSerialize() const; @@ -967,8 +967,8 @@ struct BlockId { }; struct Expression { - std::vector> mul_terms; - std::vector> linear_combinations; + std::vector> mul_terms; + std::vector> linear_combinations; std::string q_c; friend bool operator==(const Expression&, const Expression&); @@ -979,7 +979,7 @@ struct Expression { struct BrilligInputs { struct Single { - Circuit::Expression value; + Program::Expression value; friend bool operator==(const Single&, const Single&); std::vector bincodeSerialize() const; @@ -987,7 +987,7 @@ struct BrilligInputs { }; struct Array { - std::vector value; + std::vector value; friend bool operator==(const Array&, const Array&); std::vector bincodeSerialize() const; @@ -995,7 +995,7 @@ struct BrilligInputs { }; struct MemoryArray { - Circuit::BlockId value; + Program::BlockId value; friend bool operator==(const MemoryArray&, const MemoryArray&); std::vector bincodeSerialize() const; @@ -1012,7 +1012,7 @@ struct BrilligInputs { struct BrilligOutputs { struct Simple { - Circuit::Witness value; + Program::Witness value; friend bool operator==(const Simple&, const Simple&); std::vector bincodeSerialize() const; @@ -1020,7 +1020,7 @@ struct BrilligOutputs { }; struct Array { - std::vector value; + std::vector value; friend bool operator==(const Array&, const Array&); std::vector bincodeSerialize() const; @@ -1035,10 +1035,10 @@ struct BrilligOutputs { }; struct Brillig { - std::vector inputs; - std::vector outputs; - std::vector bytecode; - std::optional predicate; + std::vector inputs; + std::vector outputs; + std::vector bytecode; + std::optional predicate; friend bool operator==(const Brillig&, const Brillig&); std::vector bincodeSerialize() const; @@ -1048,8 +1048,8 @@ struct Brillig { struct Directive { struct ToLeRadix { - Circuit::Expression a; - std::vector b; + Program::Expression a; + std::vector b; uint32_t radix; friend bool operator==(const ToLeRadix&, const ToLeRadix&); @@ -1065,9 +1065,9 @@ struct Directive { }; struct MemOp { - Circuit::Expression operation; - Circuit::Expression index; - Circuit::Expression value; + Program::Expression operation; + Program::Expression index; + Program::Expression value; friend bool operator==(const MemOp&, const MemOp&); std::vector bincodeSerialize() const; @@ -1077,7 +1077,7 @@ struct MemOp { struct Opcode { struct AssertZero { - Circuit::Expression value; + Program::Expression value; friend bool operator==(const AssertZero&, const AssertZero&); std::vector bincodeSerialize() const; @@ -1085,7 +1085,7 @@ struct Opcode { }; struct BlackBoxFuncCall { - Circuit::BlackBoxFuncCall value; + Program::BlackBoxFuncCall value; friend bool operator==(const BlackBoxFuncCall&, const BlackBoxFuncCall&); std::vector bincodeSerialize() const; @@ -1093,7 +1093,7 @@ struct Opcode { }; struct Directive { - Circuit::Directive value; + Program::Directive value; friend bool operator==(const Directive&, const Directive&); std::vector bincodeSerialize() const; @@ -1101,7 +1101,7 @@ struct Opcode { }; struct Brillig { - Circuit::Brillig value; + Program::Brillig value; friend bool operator==(const Brillig&, const Brillig&); std::vector bincodeSerialize() const; @@ -1109,9 +1109,9 @@ struct Opcode { }; struct MemoryOp { - Circuit::BlockId block_id; - Circuit::MemOp op; - std::optional predicate; + Program::BlockId block_id; + Program::MemOp op; + std::optional predicate; friend bool operator==(const MemoryOp&, const MemoryOp&); std::vector bincodeSerialize() const; @@ -1119,8 +1119,8 @@ struct Opcode { }; struct MemoryInit { - Circuit::BlockId block_id; - std::vector init; + Program::BlockId block_id; + std::vector init; friend bool operator==(const MemoryInit&, const MemoryInit&); std::vector bincodeSerialize() const; @@ -1129,8 +1129,8 @@ struct Opcode { struct Call { uint32_t id; - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Call&, const Call&); std::vector bincodeSerialize() const; @@ -1194,7 +1194,7 @@ struct OpcodeLocation { }; struct PublicInputs { - std::vector value; + std::vector value; friend bool operator==(const PublicInputs&, const PublicInputs&); std::vector bincodeSerialize() const; @@ -1203,12 +1203,12 @@ struct PublicInputs { struct Circuit { uint32_t current_witness_index; - std::vector opcodes; - ExpressionWidth expression_width; - std::vector private_parameters; - PublicInputs public_parameters; - PublicInputs return_values; - std::vector> assert_messages; + std::vector opcodes; + Program::ExpressionWidth expression_width; + std::vector private_parameters; + Program::PublicInputs public_parameters; + Program::PublicInputs return_values; + std::vector> assert_messages; bool recursive; friend bool operator==(const Circuit&, const Circuit&); @@ -1216,9 +1216,17 @@ struct Circuit { static Circuit bincodeDeserialize(std::vector); }; -} // end of namespace Circuit +struct Program { + std::vector functions; -namespace Circuit { + friend bool operator==(const Program&, const Program&); + std::vector bincodeSerialize() const; + static Program bincodeDeserialize(std::vector); +}; + +} // end of namespace Program + +namespace Program { inline bool operator==(const BinaryFieldOp& lhs, const BinaryFieldOp& rhs) { @@ -1245,11 +1253,11 @@ inline BinaryFieldOp BinaryFieldOp::bincodeDeserialize(std::vector inpu return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::BinaryFieldOp& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -1258,16 +1266,16 @@ void serde::Serializable::serialize(const Circuit::Binar template <> template -Circuit::BinaryFieldOp serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryFieldOp serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::BinaryFieldOp obj; + Program::BinaryFieldOp obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Add& lhs, const BinaryFieldOp::Add& rhs) { @@ -1291,23 +1299,23 @@ inline BinaryFieldOp::Add BinaryFieldOp::Add::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Add& obj, +void serde::Serializable::serialize(const Program::BinaryFieldOp::Add& obj, Serializer& serializer) {} template <> template -Circuit::BinaryFieldOp::Add serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryFieldOp::Add serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryFieldOp::Add obj; + Program::BinaryFieldOp::Add obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Sub& lhs, const BinaryFieldOp::Sub& rhs) { @@ -1331,23 +1339,23 @@ inline BinaryFieldOp::Sub BinaryFieldOp::Sub::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Sub& obj, +void serde::Serializable::serialize(const Program::BinaryFieldOp::Sub& obj, Serializer& serializer) {} template <> template -Circuit::BinaryFieldOp::Sub serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryFieldOp::Sub serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryFieldOp::Sub obj; + Program::BinaryFieldOp::Sub obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Mul& lhs, const BinaryFieldOp::Mul& rhs) { @@ -1371,23 +1379,23 @@ inline BinaryFieldOp::Mul BinaryFieldOp::Mul::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Mul& obj, +void serde::Serializable::serialize(const Program::BinaryFieldOp::Mul& obj, Serializer& serializer) {} template <> template -Circuit::BinaryFieldOp::Mul serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryFieldOp::Mul serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryFieldOp::Mul obj; + Program::BinaryFieldOp::Mul obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Div& lhs, const BinaryFieldOp::Div& rhs) { @@ -1411,23 +1419,23 @@ inline BinaryFieldOp::Div BinaryFieldOp::Div::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Div& obj, +void serde::Serializable::serialize(const Program::BinaryFieldOp::Div& obj, Serializer& serializer) {} template <> template -Circuit::BinaryFieldOp::Div serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryFieldOp::Div serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryFieldOp::Div obj; + Program::BinaryFieldOp::Div obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::IntegerDiv& lhs, const BinaryFieldOp::IntegerDiv& rhs) { @@ -1451,24 +1459,24 @@ inline BinaryFieldOp::IntegerDiv BinaryFieldOp::IntegerDiv::bincodeDeserialize(s return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::IntegerDiv& obj, +void serde::Serializable::serialize(const Program::BinaryFieldOp::IntegerDiv& obj, Serializer& serializer) {} template <> template -Circuit::BinaryFieldOp::IntegerDiv serde::Deserializable::deserialize( +Program::BinaryFieldOp::IntegerDiv serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BinaryFieldOp::IntegerDiv obj; + Program::BinaryFieldOp::IntegerDiv obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Equals& lhs, const BinaryFieldOp::Equals& rhs) { @@ -1492,24 +1500,24 @@ inline BinaryFieldOp::Equals BinaryFieldOp::Equals::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Equals& obj, +void serde::Serializable::serialize(const Program::BinaryFieldOp::Equals& obj, Serializer& serializer) {} template <> template -Circuit::BinaryFieldOp::Equals serde::Deserializable::deserialize( +Program::BinaryFieldOp::Equals serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BinaryFieldOp::Equals obj; + Program::BinaryFieldOp::Equals obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::LessThan& lhs, const BinaryFieldOp::LessThan& rhs) { @@ -1533,24 +1541,24 @@ inline BinaryFieldOp::LessThan BinaryFieldOp::LessThan::bincodeDeserialize(std:: return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::LessThan& obj, +void serde::Serializable::serialize(const Program::BinaryFieldOp::LessThan& obj, Serializer& serializer) {} template <> template -Circuit::BinaryFieldOp::LessThan serde::Deserializable::deserialize( +Program::BinaryFieldOp::LessThan serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BinaryFieldOp::LessThan obj; + Program::BinaryFieldOp::LessThan obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::LessThanEquals& lhs, const BinaryFieldOp::LessThanEquals& rhs) { @@ -1574,24 +1582,24 @@ inline BinaryFieldOp::LessThanEquals BinaryFieldOp::LessThanEquals::bincodeDeser return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BinaryFieldOp::LessThanEquals& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BinaryFieldOp::LessThanEquals& obj, Serializer& serializer) {} template <> template -Circuit::BinaryFieldOp::LessThanEquals serde::Deserializable::deserialize( +Program::BinaryFieldOp::LessThanEquals serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BinaryFieldOp::LessThanEquals obj; + Program::BinaryFieldOp::LessThanEquals obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp& lhs, const BinaryIntOp& rhs) { @@ -1618,11 +1626,11 @@ inline BinaryIntOp BinaryIntOp::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::BinaryIntOp& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -1631,16 +1639,16 @@ void serde::Serializable::serialize(const Circuit::BinaryI template <> template -Circuit::BinaryIntOp serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::BinaryIntOp obj; + Program::BinaryIntOp obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Add& lhs, const BinaryIntOp::Add& rhs) { @@ -1664,23 +1672,23 @@ inline BinaryIntOp::Add BinaryIntOp::Add::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Add& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Add& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Add serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::Add serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::Add obj; + Program::BinaryIntOp::Add obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Sub& lhs, const BinaryIntOp::Sub& rhs) { @@ -1704,23 +1712,23 @@ inline BinaryIntOp::Sub BinaryIntOp::Sub::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Sub& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Sub& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Sub serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::Sub serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::Sub obj; + Program::BinaryIntOp::Sub obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Mul& lhs, const BinaryIntOp::Mul& rhs) { @@ -1744,23 +1752,23 @@ inline BinaryIntOp::Mul BinaryIntOp::Mul::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Mul& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Mul& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Mul serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::Mul serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::Mul obj; + Program::BinaryIntOp::Mul obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Div& lhs, const BinaryIntOp::Div& rhs) { @@ -1784,23 +1792,23 @@ inline BinaryIntOp::Div BinaryIntOp::Div::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Div& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Div& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Div serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::Div serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::Div obj; + Program::BinaryIntOp::Div obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Equals& lhs, const BinaryIntOp::Equals& rhs) { @@ -1824,24 +1832,24 @@ inline BinaryIntOp::Equals BinaryIntOp::Equals::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Equals& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Equals& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Equals serde::Deserializable::deserialize( +Program::BinaryIntOp::Equals serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BinaryIntOp::Equals obj; + Program::BinaryIntOp::Equals obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::LessThan& lhs, const BinaryIntOp::LessThan& rhs) { @@ -1865,24 +1873,24 @@ inline BinaryIntOp::LessThan BinaryIntOp::LessThan::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::LessThan& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::LessThan& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::LessThan serde::Deserializable::deserialize( +Program::BinaryIntOp::LessThan serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BinaryIntOp::LessThan obj; + Program::BinaryIntOp::LessThan obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::LessThanEquals& lhs, const BinaryIntOp::LessThanEquals& rhs) { @@ -1906,24 +1914,24 @@ inline BinaryIntOp::LessThanEquals BinaryIntOp::LessThanEquals::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BinaryIntOp::LessThanEquals& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BinaryIntOp::LessThanEquals& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::LessThanEquals serde::Deserializable::deserialize( +Program::BinaryIntOp::LessThanEquals serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BinaryIntOp::LessThanEquals obj; + Program::BinaryIntOp::LessThanEquals obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::And& lhs, const BinaryIntOp::And& rhs) { @@ -1947,23 +1955,23 @@ inline BinaryIntOp::And BinaryIntOp::And::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::And& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::And& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::And serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::And serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::And obj; + Program::BinaryIntOp::And obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Or& lhs, const BinaryIntOp::Or& rhs) { @@ -1987,23 +1995,23 @@ inline BinaryIntOp::Or BinaryIntOp::Or::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Or& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Or& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Or serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::Or serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::Or obj; + Program::BinaryIntOp::Or obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Xor& lhs, const BinaryIntOp::Xor& rhs) { @@ -2027,23 +2035,23 @@ inline BinaryIntOp::Xor BinaryIntOp::Xor::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Xor& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Xor& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Xor serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::Xor serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::Xor obj; + Program::BinaryIntOp::Xor obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Shl& lhs, const BinaryIntOp::Shl& rhs) { @@ -2067,23 +2075,23 @@ inline BinaryIntOp::Shl BinaryIntOp::Shl::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Shl& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Shl& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Shl serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::Shl serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::Shl obj; + Program::BinaryIntOp::Shl obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Shr& lhs, const BinaryIntOp::Shr& rhs) { @@ -2107,23 +2115,23 @@ inline BinaryIntOp::Shr BinaryIntOp::Shr::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Shr& obj, +void serde::Serializable::serialize(const Program::BinaryIntOp::Shr& obj, Serializer& serializer) {} template <> template -Circuit::BinaryIntOp::Shr serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BinaryIntOp::Shr serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BinaryIntOp::Shr obj; + Program::BinaryIntOp::Shr obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall& lhs, const BlackBoxFuncCall& rhs) { @@ -2150,11 +2158,11 @@ inline BlackBoxFuncCall BlackBoxFuncCall::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall& obj, +void serde::Serializable::serialize(const Program::BlackBoxFuncCall& obj, Serializer& serializer) { serializer.increase_container_depth(); @@ -2164,16 +2172,16 @@ void serde::Serializable::serialize(const Circuit::Bl template <> template -Circuit::BlackBoxFuncCall serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::BlackBoxFuncCall obj; + Program::BlackBoxFuncCall obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::AND& lhs, const BlackBoxFuncCall::AND& rhs) { @@ -2206,11 +2214,11 @@ inline BlackBoxFuncCall::AND BlackBoxFuncCall::AND::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::AND& obj, +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::AND& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); @@ -2220,17 +2228,17 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxFuncCall::AND serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::AND serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::AND obj; + Program::BlackBoxFuncCall::AND obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::XOR& lhs, const BlackBoxFuncCall::XOR& rhs) { @@ -2263,11 +2271,11 @@ inline BlackBoxFuncCall::XOR BlackBoxFuncCall::XOR::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::XOR& obj, +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::XOR& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); @@ -2277,17 +2285,17 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxFuncCall::XOR serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::XOR serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::XOR obj; + Program::BlackBoxFuncCall::XOR obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::RANGE& lhs, const BlackBoxFuncCall::RANGE& rhs) { @@ -2314,11 +2322,11 @@ inline BlackBoxFuncCall::RANGE BlackBoxFuncCall::RANGE::bincodeDeserialize(std:: return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::RANGE& obj, +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::RANGE& obj, Serializer& serializer) { serde::Serializable::serialize(obj.input, serializer); @@ -2326,15 +2334,15 @@ void serde::Serializable::serialize(const Circ template <> template -Circuit::BlackBoxFuncCall::RANGE serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::RANGE serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::RANGE obj; + Program::BlackBoxFuncCall::RANGE obj; obj.input = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::SHA256& lhs, const BlackBoxFuncCall::SHA256& rhs) { @@ -2364,11 +2372,11 @@ inline BlackBoxFuncCall::SHA256 BlackBoxFuncCall::SHA256::bincodeDeserialize(std return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::SHA256& obj, +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::SHA256& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); @@ -2377,16 +2385,16 @@ void serde::Serializable::serialize(const Cir template <> template -Circuit::BlackBoxFuncCall::SHA256 serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::SHA256 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::SHA256 obj; + Program::BlackBoxFuncCall::SHA256 obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Blake2s& lhs, const BlackBoxFuncCall::Blake2s& rhs) { @@ -2416,11 +2424,11 @@ inline BlackBoxFuncCall::Blake2s BlackBoxFuncCall::Blake2s::bincodeDeserialize(s return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Blake2s& obj, +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Blake2s& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); @@ -2429,16 +2437,16 @@ void serde::Serializable::serialize(const Ci template <> template -Circuit::BlackBoxFuncCall::Blake2s serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::Blake2s serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::Blake2s obj; + Program::BlackBoxFuncCall::Blake2s obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Blake3& lhs, const BlackBoxFuncCall::Blake3& rhs) { @@ -2468,11 +2476,11 @@ inline BlackBoxFuncCall::Blake3 BlackBoxFuncCall::Blake3::bincodeDeserialize(std return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Blake3& obj, +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Blake3& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); @@ -2481,16 +2489,16 @@ void serde::Serializable::serialize(const Cir template <> template -Circuit::BlackBoxFuncCall::Blake3 serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::Blake3 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::Blake3 obj; + Program::BlackBoxFuncCall::Blake3 obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::SchnorrVerify& lhs, const BlackBoxFuncCall::SchnorrVerify& rhs) { @@ -2529,12 +2537,12 @@ inline BlackBoxFuncCall::SchnorrVerify BlackBoxFuncCall::SchnorrVerify::bincodeD return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::SchnorrVerify& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::SchnorrVerify& obj, Serializer& serializer) { serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); @@ -2545,10 +2553,10 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::SchnorrVerify serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::SchnorrVerify serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::SchnorrVerify obj; + Program::BlackBoxFuncCall::SchnorrVerify obj; obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); obj.signature = serde::Deserializable::deserialize(deserializer); @@ -2557,7 +2565,7 @@ Circuit::BlackBoxFuncCall::SchnorrVerify serde::Deserializable template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::PedersenCommitment& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::PedersenCommitment& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.domain_separator, serializer); @@ -2605,17 +2613,17 @@ void serde::Serializable::seriali template <> template -Circuit::BlackBoxFuncCall::PedersenCommitment serde::Deserializable< - Circuit::BlackBoxFuncCall::PedersenCommitment>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::PedersenCommitment serde::Deserializable< + Program::BlackBoxFuncCall::PedersenCommitment>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::PedersenCommitment obj; + Program::BlackBoxFuncCall::PedersenCommitment obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.domain_separator = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::PedersenHash& lhs, const BlackBoxFuncCall::PedersenHash& rhs) { @@ -2648,12 +2656,12 @@ inline BlackBoxFuncCall::PedersenHash BlackBoxFuncCall::PedersenHash::bincodeDes return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::PedersenHash& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::PedersenHash& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.domain_separator, serializer); @@ -2662,17 +2670,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::PedersenHash serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::PedersenHash serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::PedersenHash obj; + Program::BlackBoxFuncCall::PedersenHash obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.domain_separator = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::EcdsaSecp256k1& lhs, const BlackBoxFuncCall::EcdsaSecp256k1& rhs) { @@ -2711,12 +2719,12 @@ inline BlackBoxFuncCall::EcdsaSecp256k1 BlackBoxFuncCall::EcdsaSecp256k1::bincod return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::EcdsaSecp256k1& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::EcdsaSecp256k1& obj, Serializer& serializer) { serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); @@ -2727,10 +2735,10 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::EcdsaSecp256k1 serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::EcdsaSecp256k1 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::EcdsaSecp256k1 obj; + Program::BlackBoxFuncCall::EcdsaSecp256k1 obj; obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); obj.signature = serde::Deserializable::deserialize(deserializer); @@ -2739,7 +2747,7 @@ Circuit::BlackBoxFuncCall::EcdsaSecp256k1 serde::Deserializable template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::EcdsaSecp256r1& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::EcdsaSecp256r1& obj, Serializer& serializer) { serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); @@ -2794,10 +2802,10 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::EcdsaSecp256r1 serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::EcdsaSecp256r1 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::EcdsaSecp256r1 obj; + Program::BlackBoxFuncCall::EcdsaSecp256r1 obj; obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); obj.signature = serde::Deserializable::deserialize(deserializer); @@ -2806,7 +2814,7 @@ Circuit::BlackBoxFuncCall::EcdsaSecp256r1 serde::Deserializable template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::FixedBaseScalarMul& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::FixedBaseScalarMul& obj, Serializer& serializer) { serde::Serializable::serialize(obj.low, serializer); serde::Serializable::serialize(obj.high, serializer); @@ -2854,17 +2862,17 @@ void serde::Serializable::seriali template <> template -Circuit::BlackBoxFuncCall::FixedBaseScalarMul serde::Deserializable< - Circuit::BlackBoxFuncCall::FixedBaseScalarMul>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::FixedBaseScalarMul serde::Deserializable< + Program::BlackBoxFuncCall::FixedBaseScalarMul>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::FixedBaseScalarMul obj; + Program::BlackBoxFuncCall::FixedBaseScalarMul obj; obj.low = serde::Deserializable::deserialize(deserializer); obj.high = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::EmbeddedCurveAdd& lhs, const BlackBoxFuncCall::EmbeddedCurveAdd& rhs) { @@ -2904,12 +2912,12 @@ inline BlackBoxFuncCall::EmbeddedCurveAdd BlackBoxFuncCall::EmbeddedCurveAdd::bi return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::EmbeddedCurveAdd& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::EmbeddedCurveAdd& obj, Serializer& serializer) { serde::Serializable::serialize(obj.input1_x, serializer); serde::Serializable::serialize(obj.input1_y, serializer); @@ -2920,10 +2928,10 @@ void serde::Serializable::serialize template <> template -Circuit::BlackBoxFuncCall::EmbeddedCurveAdd serde::Deserializable< - Circuit::BlackBoxFuncCall::EmbeddedCurveAdd>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::EmbeddedCurveAdd serde::Deserializable< + Program::BlackBoxFuncCall::EmbeddedCurveAdd>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::EmbeddedCurveAdd obj; + Program::BlackBoxFuncCall::EmbeddedCurveAdd obj; obj.input1_x = serde::Deserializable::deserialize(deserializer); obj.input1_y = serde::Deserializable::deserialize(deserializer); obj.input2_x = serde::Deserializable::deserialize(deserializer); @@ -2932,7 +2940,7 @@ Circuit::BlackBoxFuncCall::EmbeddedCurveAdd serde::Deserializable< return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Keccak256& lhs, const BlackBoxFuncCall::Keccak256& rhs) { @@ -2962,12 +2970,12 @@ inline BlackBoxFuncCall::Keccak256 BlackBoxFuncCall::Keccak256::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::Keccak256& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::Keccak256& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -2975,16 +2983,16 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::Keccak256 serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::Keccak256 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::Keccak256 obj; + Program::BlackBoxFuncCall::Keccak256 obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Keccak256VariableLength& lhs, const BlackBoxFuncCall::Keccak256VariableLength& rhs) @@ -3019,12 +3027,12 @@ inline BlackBoxFuncCall::Keccak256VariableLength BlackBoxFuncCall::Keccak256Vari return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::Keccak256VariableLength& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::Keccak256VariableLength& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.var_message_size, serializer); @@ -3033,17 +3041,17 @@ void serde::Serializable::se template <> template -Circuit::BlackBoxFuncCall::Keccak256VariableLength serde::Deserializable< - Circuit::BlackBoxFuncCall::Keccak256VariableLength>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::Keccak256VariableLength serde::Deserializable< + Program::BlackBoxFuncCall::Keccak256VariableLength>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::Keccak256VariableLength obj; + Program::BlackBoxFuncCall::Keccak256VariableLength obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.var_message_size = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Keccakf1600& lhs, const BlackBoxFuncCall::Keccakf1600& rhs) { @@ -3073,12 +3081,12 @@ inline BlackBoxFuncCall::Keccakf1600 BlackBoxFuncCall::Keccakf1600::bincodeDeser return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::Keccakf1600& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::Keccakf1600& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -3086,16 +3094,16 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::Keccakf1600 serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::Keccakf1600 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::Keccakf1600 obj; + Program::BlackBoxFuncCall::Keccakf1600 obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::RecursiveAggregation& lhs, const BlackBoxFuncCall::RecursiveAggregation& rhs) @@ -3133,12 +3141,12 @@ inline BlackBoxFuncCall::RecursiveAggregation BlackBoxFuncCall::RecursiveAggrega return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::RecursiveAggregation& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::RecursiveAggregation& obj, Serializer& serializer) { serde::Serializable::serialize(obj.verification_key, serializer); serde::Serializable::serialize(obj.proof, serializer); @@ -3148,10 +3156,10 @@ void serde::Serializable::seria template <> template -Circuit::BlackBoxFuncCall::RecursiveAggregation serde::Deserializable< - Circuit::BlackBoxFuncCall::RecursiveAggregation>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::RecursiveAggregation serde::Deserializable< + Program::BlackBoxFuncCall::RecursiveAggregation>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::RecursiveAggregation obj; + Program::BlackBoxFuncCall::RecursiveAggregation obj; obj.verification_key = serde::Deserializable::deserialize(deserializer); obj.proof = serde::Deserializable::deserialize(deserializer); obj.public_inputs = serde::Deserializable::deserialize(deserializer); @@ -3159,7 +3167,7 @@ Circuit::BlackBoxFuncCall::RecursiveAggregation serde::Deserializable< return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntAdd& lhs, const BlackBoxFuncCall::BigIntAdd& rhs) { @@ -3192,12 +3200,12 @@ inline BlackBoxFuncCall::BigIntAdd BlackBoxFuncCall::BigIntAdd::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::BigIntAdd& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::BigIntAdd& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); @@ -3206,17 +3214,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::BigIntAdd serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::BigIntAdd serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::BigIntAdd obj; + Program::BlackBoxFuncCall::BigIntAdd obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntSub& lhs, const BlackBoxFuncCall::BigIntSub& rhs) { @@ -3249,12 +3257,12 @@ inline BlackBoxFuncCall::BigIntSub BlackBoxFuncCall::BigIntSub::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::BigIntSub& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::BigIntSub& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); @@ -3263,17 +3271,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::BigIntSub serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::BigIntSub serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::BigIntSub obj; + Program::BlackBoxFuncCall::BigIntSub obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntMul& lhs, const BlackBoxFuncCall::BigIntMul& rhs) { @@ -3306,12 +3314,12 @@ inline BlackBoxFuncCall::BigIntMul BlackBoxFuncCall::BigIntMul::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::BigIntMul& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::BigIntMul& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); @@ -3320,17 +3328,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::BigIntMul serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::BigIntMul serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::BigIntMul obj; + Program::BlackBoxFuncCall::BigIntMul obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntDiv& lhs, const BlackBoxFuncCall::BigIntDiv& rhs) { @@ -3363,12 +3371,12 @@ inline BlackBoxFuncCall::BigIntDiv BlackBoxFuncCall::BigIntDiv::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::BigIntDiv& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::BigIntDiv& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); @@ -3377,17 +3385,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::BigIntDiv serde::Deserializable::deserialize( +Program::BlackBoxFuncCall::BigIntDiv serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::BigIntDiv obj; + Program::BlackBoxFuncCall::BigIntDiv obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntFromLeBytes& lhs, const BlackBoxFuncCall::BigIntFromLeBytes& rhs) { @@ -3421,12 +3429,12 @@ inline BlackBoxFuncCall::BigIntFromLeBytes BlackBoxFuncCall::BigIntFromLeBytes:: return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::BigIntFromLeBytes& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::BigIntFromLeBytes& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.modulus, serializer); @@ -3435,17 +3443,17 @@ void serde::Serializable::serializ template <> template -Circuit::BlackBoxFuncCall::BigIntFromLeBytes serde::Deserializable< - Circuit::BlackBoxFuncCall::BigIntFromLeBytes>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::BigIntFromLeBytes serde::Deserializable< + Program::BlackBoxFuncCall::BigIntFromLeBytes>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::BigIntFromLeBytes obj; + Program::BlackBoxFuncCall::BigIntFromLeBytes obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.modulus = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntToLeBytes& lhs, const BlackBoxFuncCall::BigIntToLeBytes& rhs) { @@ -3476,12 +3484,12 @@ inline BlackBoxFuncCall::BigIntToLeBytes BlackBoxFuncCall::BigIntToLeBytes::binc return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::BigIntToLeBytes& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::BigIntToLeBytes& obj, Serializer& serializer) { serde::Serializable::serialize(obj.input, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -3489,16 +3497,16 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxFuncCall::BigIntToLeBytes serde::Deserializable< - Circuit::BlackBoxFuncCall::BigIntToLeBytes>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::BigIntToLeBytes serde::Deserializable< + Program::BlackBoxFuncCall::BigIntToLeBytes>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::BigIntToLeBytes obj; + Program::BlackBoxFuncCall::BigIntToLeBytes obj; obj.input = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Poseidon2Permutation& lhs, const BlackBoxFuncCall::Poseidon2Permutation& rhs) @@ -3533,12 +3541,12 @@ inline BlackBoxFuncCall::Poseidon2Permutation BlackBoxFuncCall::Poseidon2Permuta return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::Poseidon2Permutation& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::Poseidon2Permutation& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -3547,17 +3555,17 @@ void serde::Serializable::seria template <> template -Circuit::BlackBoxFuncCall::Poseidon2Permutation serde::Deserializable< - Circuit::BlackBoxFuncCall::Poseidon2Permutation>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::Poseidon2Permutation serde::Deserializable< + Program::BlackBoxFuncCall::Poseidon2Permutation>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::Poseidon2Permutation obj; + Program::BlackBoxFuncCall::Poseidon2Permutation obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); obj.len = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Sha256Compression& lhs, const BlackBoxFuncCall::Sha256Compression& rhs) { @@ -3591,12 +3599,12 @@ inline BlackBoxFuncCall::Sha256Compression BlackBoxFuncCall::Sha256Compression:: return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxFuncCall::Sha256Compression& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxFuncCall::Sha256Compression& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.hash_values, serializer); @@ -3605,17 +3613,17 @@ void serde::Serializable::serializ template <> template -Circuit::BlackBoxFuncCall::Sha256Compression serde::Deserializable< - Circuit::BlackBoxFuncCall::Sha256Compression>::deserialize(Deserializer& deserializer) +Program::BlackBoxFuncCall::Sha256Compression serde::Deserializable< + Program::BlackBoxFuncCall::Sha256Compression>::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxFuncCall::Sha256Compression obj; + Program::BlackBoxFuncCall::Sha256Compression obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.hash_values = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp& lhs, const BlackBoxOp& rhs) { @@ -3642,11 +3650,11 @@ inline BlackBoxOp BlackBoxOp::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::BlackBoxOp& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -3655,16 +3663,16 @@ void serde::Serializable::serialize(const Circuit::BlackBox template <> template -Circuit::BlackBoxOp serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BlackBoxOp serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::BlackBoxOp obj; + Program::BlackBoxOp obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Sha256& lhs, const BlackBoxOp::Sha256& rhs) { @@ -3694,11 +3702,11 @@ inline BlackBoxOp::Sha256 BlackBoxOp::Sha256::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Sha256& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::Sha256& obj, Serializer& serializer) { serde::Serializable::serialize(obj.message, serializer); @@ -3707,15 +3715,15 @@ void serde::Serializable::serialize(const Circuit:: template <> template -Circuit::BlackBoxOp::Sha256 serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BlackBoxOp::Sha256 serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxOp::Sha256 obj; + Program::BlackBoxOp::Sha256 obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Blake2s& lhs, const BlackBoxOp::Blake2s& rhs) { @@ -3745,11 +3753,11 @@ inline BlackBoxOp::Blake2s BlackBoxOp::Blake2s::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Blake2s& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::Blake2s& obj, Serializer& serializer) { serde::Serializable::serialize(obj.message, serializer); @@ -3758,16 +3766,16 @@ void serde::Serializable::serialize(const Circuit: template <> template -Circuit::BlackBoxOp::Blake2s serde::Deserializable::deserialize( +Program::BlackBoxOp::Blake2s serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::Blake2s obj; + Program::BlackBoxOp::Blake2s obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Blake3& lhs, const BlackBoxOp::Blake3& rhs) { @@ -3797,11 +3805,11 @@ inline BlackBoxOp::Blake3 BlackBoxOp::Blake3::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Blake3& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::Blake3& obj, Serializer& serializer) { serde::Serializable::serialize(obj.message, serializer); @@ -3810,15 +3818,15 @@ void serde::Serializable::serialize(const Circuit:: template <> template -Circuit::BlackBoxOp::Blake3 serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BlackBoxOp::Blake3 serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BlackBoxOp::Blake3 obj; + Program::BlackBoxOp::Blake3 obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Keccak256& lhs, const BlackBoxOp::Keccak256& rhs) { @@ -3848,11 +3856,11 @@ inline BlackBoxOp::Keccak256 BlackBoxOp::Keccak256::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Keccak256& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::Keccak256& obj, Serializer& serializer) { serde::Serializable::serialize(obj.message, serializer); @@ -3861,16 +3869,16 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::Keccak256 serde::Deserializable::deserialize( +Program::BlackBoxOp::Keccak256 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::Keccak256 obj; + Program::BlackBoxOp::Keccak256 obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Keccakf1600& lhs, const BlackBoxOp::Keccakf1600& rhs) { @@ -3900,11 +3908,11 @@ inline BlackBoxOp::Keccakf1600 BlackBoxOp::Keccakf1600::bincodeDeserialize(std:: return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Keccakf1600& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::Keccakf1600& obj, Serializer& serializer) { serde::Serializable::serialize(obj.message, serializer); @@ -3913,16 +3921,16 @@ void serde::Serializable::serialize(const Circ template <> template -Circuit::BlackBoxOp::Keccakf1600 serde::Deserializable::deserialize( +Program::BlackBoxOp::Keccakf1600 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::Keccakf1600 obj; + Program::BlackBoxOp::Keccakf1600 obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::EcdsaSecp256k1& lhs, const BlackBoxOp::EcdsaSecp256k1& rhs) { @@ -3961,11 +3969,11 @@ inline BlackBoxOp::EcdsaSecp256k1 BlackBoxOp::EcdsaSecp256k1::bincodeDeserialize return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::EcdsaSecp256k1& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::EcdsaSecp256k1& obj, Serializer& serializer) { serde::Serializable::serialize(obj.hashed_msg, serializer); @@ -3977,10 +3985,10 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BlackBoxOp::EcdsaSecp256k1 serde::Deserializable::deserialize( +Program::BlackBoxOp::EcdsaSecp256k1 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::EcdsaSecp256k1 obj; + Program::BlackBoxOp::EcdsaSecp256k1 obj; obj.hashed_msg = serde::Deserializable::deserialize(deserializer); obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); @@ -3989,7 +3997,7 @@ Circuit::BlackBoxOp::EcdsaSecp256k1 serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::EcdsaSecp256r1& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::EcdsaSecp256r1& obj, Serializer& serializer) { serde::Serializable::serialize(obj.hashed_msg, serializer); @@ -4044,10 +4052,10 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BlackBoxOp::EcdsaSecp256r1 serde::Deserializable::deserialize( +Program::BlackBoxOp::EcdsaSecp256r1 serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::EcdsaSecp256r1 obj; + Program::BlackBoxOp::EcdsaSecp256r1 obj; obj.hashed_msg = serde::Deserializable::deserialize(deserializer); obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); @@ -4056,7 +4064,7 @@ Circuit::BlackBoxOp::EcdsaSecp256r1 serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::SchnorrVerify& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::SchnorrVerify& obj, Serializer& serializer) { serde::Serializable::serialize(obj.public_key_x, serializer); @@ -4111,10 +4119,10 @@ void serde::Serializable::serialize(const Ci template <> template -Circuit::BlackBoxOp::SchnorrVerify serde::Deserializable::deserialize( +Program::BlackBoxOp::SchnorrVerify serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::SchnorrVerify obj; + Program::BlackBoxOp::SchnorrVerify obj; obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); obj.message = serde::Deserializable::deserialize(deserializer); @@ -4123,7 +4131,7 @@ Circuit::BlackBoxOp::SchnorrVerify serde::Deserializable template -void serde::Serializable::serialize( - const Circuit::BlackBoxOp::PedersenCommitment& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxOp::PedersenCommitment& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.domain_separator, serializer); @@ -4170,17 +4178,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxOp::PedersenCommitment serde::Deserializable::deserialize( +Program::BlackBoxOp::PedersenCommitment serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::PedersenCommitment obj; + Program::BlackBoxOp::PedersenCommitment obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.domain_separator = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::PedersenHash& lhs, const BlackBoxOp::PedersenHash& rhs) { @@ -4213,11 +4221,11 @@ inline BlackBoxOp::PedersenHash BlackBoxOp::PedersenHash::bincodeDeserialize(std return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::PedersenHash& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::PedersenHash& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); @@ -4227,17 +4235,17 @@ void serde::Serializable::serialize(const Cir template <> template -Circuit::BlackBoxOp::PedersenHash serde::Deserializable::deserialize( +Program::BlackBoxOp::PedersenHash serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::PedersenHash obj; + Program::BlackBoxOp::PedersenHash obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.domain_separator = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::FixedBaseScalarMul& lhs, const BlackBoxOp::FixedBaseScalarMul& rhs) { @@ -4270,12 +4278,12 @@ inline BlackBoxOp::FixedBaseScalarMul BlackBoxOp::FixedBaseScalarMul::bincodeDes return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxOp::FixedBaseScalarMul& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxOp::FixedBaseScalarMul& obj, Serializer& serializer) { serde::Serializable::serialize(obj.low, serializer); serde::Serializable::serialize(obj.high, serializer); @@ -4284,17 +4292,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxOp::FixedBaseScalarMul serde::Deserializable::deserialize( +Program::BlackBoxOp::FixedBaseScalarMul serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::FixedBaseScalarMul obj; + Program::BlackBoxOp::FixedBaseScalarMul obj; obj.low = serde::Deserializable::deserialize(deserializer); obj.high = serde::Deserializable::deserialize(deserializer); obj.result = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::EmbeddedCurveAdd& lhs, const BlackBoxOp::EmbeddedCurveAdd& rhs) { @@ -4333,12 +4341,12 @@ inline BlackBoxOp::EmbeddedCurveAdd BlackBoxOp::EmbeddedCurveAdd::bincodeDeseria return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxOp::EmbeddedCurveAdd& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxOp::EmbeddedCurveAdd& obj, Serializer& serializer) { serde::Serializable::serialize(obj.input1_x, serializer); serde::Serializable::serialize(obj.input1_y, serializer); @@ -4349,10 +4357,10 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxOp::EmbeddedCurveAdd serde::Deserializable::deserialize( +Program::BlackBoxOp::EmbeddedCurveAdd serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::EmbeddedCurveAdd obj; + Program::BlackBoxOp::EmbeddedCurveAdd obj; obj.input1_x = serde::Deserializable::deserialize(deserializer); obj.input1_y = serde::Deserializable::deserialize(deserializer); obj.input2_x = serde::Deserializable::deserialize(deserializer); @@ -4361,7 +4369,7 @@ Circuit::BlackBoxOp::EmbeddedCurveAdd serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntAdd& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntAdd& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); @@ -4408,17 +4416,17 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::BigIntAdd serde::Deserializable::deserialize( +Program::BlackBoxOp::BigIntAdd serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::BigIntAdd obj; + Program::BlackBoxOp::BigIntAdd obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntSub& lhs, const BlackBoxOp::BigIntSub& rhs) { @@ -4451,11 +4459,11 @@ inline BlackBoxOp::BigIntSub BlackBoxOp::BigIntSub::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntSub& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntSub& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); @@ -4465,17 +4473,17 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::BigIntSub serde::Deserializable::deserialize( +Program::BlackBoxOp::BigIntSub serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::BigIntSub obj; + Program::BlackBoxOp::BigIntSub obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntMul& lhs, const BlackBoxOp::BigIntMul& rhs) { @@ -4508,11 +4516,11 @@ inline BlackBoxOp::BigIntMul BlackBoxOp::BigIntMul::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntMul& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntMul& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); @@ -4522,17 +4530,17 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::BigIntMul serde::Deserializable::deserialize( +Program::BlackBoxOp::BigIntMul serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::BigIntMul obj; + Program::BlackBoxOp::BigIntMul obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntDiv& lhs, const BlackBoxOp::BigIntDiv& rhs) { @@ -4565,11 +4573,11 @@ inline BlackBoxOp::BigIntDiv BlackBoxOp::BigIntDiv::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntDiv& obj, +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntDiv& obj, Serializer& serializer) { serde::Serializable::serialize(obj.lhs, serializer); @@ -4579,17 +4587,17 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::BigIntDiv serde::Deserializable::deserialize( +Program::BlackBoxOp::BigIntDiv serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::BigIntDiv obj; + Program::BlackBoxOp::BigIntDiv obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntFromLeBytes& lhs, const BlackBoxOp::BigIntFromLeBytes& rhs) { @@ -4622,12 +4630,12 @@ inline BlackBoxOp::BigIntFromLeBytes BlackBoxOp::BigIntFromLeBytes::bincodeDeser return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxOp::BigIntFromLeBytes& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxOp::BigIntFromLeBytes& obj, Serializer& serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.modulus, serializer); @@ -4636,17 +4644,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxOp::BigIntFromLeBytes serde::Deserializable::deserialize( +Program::BlackBoxOp::BigIntFromLeBytes serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::BigIntFromLeBytes obj; + Program::BlackBoxOp::BigIntFromLeBytes obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.modulus = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntToLeBytes& lhs, const BlackBoxOp::BigIntToLeBytes& rhs) { @@ -4676,12 +4684,12 @@ inline BlackBoxOp::BigIntToLeBytes BlackBoxOp::BigIntToLeBytes::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxOp::BigIntToLeBytes& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxOp::BigIntToLeBytes& obj, Serializer& serializer) { serde::Serializable::serialize(obj.input, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -4689,16 +4697,16 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxOp::BigIntToLeBytes serde::Deserializable::deserialize( +Program::BlackBoxOp::BigIntToLeBytes serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::BigIntToLeBytes obj; + Program::BlackBoxOp::BigIntToLeBytes obj; obj.input = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Poseidon2Permutation& lhs, const BlackBoxOp::Poseidon2Permutation& rhs) { @@ -4731,12 +4739,12 @@ inline BlackBoxOp::Poseidon2Permutation BlackBoxOp::Poseidon2Permutation::bincod return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxOp::Poseidon2Permutation& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxOp::Poseidon2Permutation& obj, Serializer& serializer) { serde::Serializable::serialize(obj.message, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -4745,17 +4753,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxOp::Poseidon2Permutation serde::Deserializable::deserialize( +Program::BlackBoxOp::Poseidon2Permutation serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::Poseidon2Permutation obj; + Program::BlackBoxOp::Poseidon2Permutation obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); obj.len = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Sha256Compression& lhs, const BlackBoxOp::Sha256Compression& rhs) { @@ -4788,12 +4796,12 @@ inline BlackBoxOp::Sha256Compression BlackBoxOp::Sha256Compression::bincodeDeser return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BlackBoxOp::Sha256Compression& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BlackBoxOp::Sha256Compression& obj, Serializer& serializer) { serde::Serializable::serialize(obj.input, serializer); serde::Serializable::serialize(obj.hash_values, serializer); @@ -4802,17 +4810,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BlackBoxOp::Sha256Compression serde::Deserializable::deserialize( +Program::BlackBoxOp::Sha256Compression serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BlackBoxOp::Sha256Compression obj; + Program::BlackBoxOp::Sha256Compression obj; obj.input = serde::Deserializable::deserialize(deserializer); obj.hash_values = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlockId& lhs, const BlockId& rhs) { @@ -4839,11 +4847,11 @@ inline BlockId BlockId::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlockId& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::BlockId& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -4852,16 +4860,16 @@ void serde::Serializable::serialize(const Circuit::BlockId& ob template <> template -Circuit::BlockId serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BlockId serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::BlockId obj; + Program::BlockId obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Brillig& lhs, const Brillig& rhs) { @@ -4897,11 +4905,11 @@ inline Brillig Brillig::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Brillig& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::Brillig& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.inputs, serializer); @@ -4913,10 +4921,10 @@ void serde::Serializable::serialize(const Circuit::Brillig& ob template <> template -Circuit::Brillig serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Brillig serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::Brillig obj; + Program::Brillig obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); obj.bytecode = serde::Deserializable::deserialize(deserializer); @@ -4925,7 +4933,7 @@ Circuit::Brillig serde::Deserializable::deserialize(Deserializ return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligInputs& lhs, const BrilligInputs& rhs) { @@ -4952,11 +4960,11 @@ inline BrilligInputs BrilligInputs::bincodeDeserialize(std::vector inpu return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligInputs& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::BrilligInputs& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -4965,16 +4973,16 @@ void serde::Serializable::serialize(const Circuit::Brill template <> template -Circuit::BrilligInputs serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BrilligInputs serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::BrilligInputs obj; + Program::BrilligInputs obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligInputs::Single& lhs, const BrilligInputs::Single& rhs) { @@ -5001,11 +5009,11 @@ inline BrilligInputs::Single BrilligInputs::Single::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligInputs::Single& obj, +void serde::Serializable::serialize(const Program::BrilligInputs::Single& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -5013,15 +5021,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BrilligInputs::Single serde::Deserializable::deserialize( +Program::BrilligInputs::Single serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligInputs::Single obj; + Program::BrilligInputs::Single obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligInputs::Array& lhs, const BrilligInputs::Array& rhs) { @@ -5048,11 +5056,11 @@ inline BrilligInputs::Array BrilligInputs::Array::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligInputs::Array& obj, +void serde::Serializable::serialize(const Program::BrilligInputs::Array& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -5060,15 +5068,15 @@ void serde::Serializable::serialize(const Circuit template <> template -Circuit::BrilligInputs::Array serde::Deserializable::deserialize( +Program::BrilligInputs::Array serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligInputs::Array obj; + Program::BrilligInputs::Array obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligInputs::MemoryArray& lhs, const BrilligInputs::MemoryArray& rhs) { @@ -5095,11 +5103,11 @@ inline BrilligInputs::MemoryArray BrilligInputs::MemoryArray::bincodeDeserialize return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligInputs::MemoryArray& obj, +void serde::Serializable::serialize(const Program::BrilligInputs::MemoryArray& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -5107,15 +5115,15 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BrilligInputs::MemoryArray serde::Deserializable::deserialize( +Program::BrilligInputs::MemoryArray serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligInputs::MemoryArray obj; + Program::BrilligInputs::MemoryArray obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode& lhs, const BrilligOpcode& rhs) { @@ -5142,11 +5150,11 @@ inline BrilligOpcode BrilligOpcode::bincodeDeserialize(std::vector inpu return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::BrilligOpcode& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -5155,16 +5163,16 @@ void serde::Serializable::serialize(const Circuit::Brill template <> template -Circuit::BrilligOpcode serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BrilligOpcode serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::BrilligOpcode obj; + Program::BrilligOpcode obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::BinaryFieldOp& lhs, const BrilligOpcode::BinaryFieldOp& rhs) { @@ -5200,12 +5208,12 @@ inline BrilligOpcode::BinaryFieldOp BrilligOpcode::BinaryFieldOp::bincodeDeseria return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BrilligOpcode::BinaryFieldOp& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BrilligOpcode::BinaryFieldOp& obj, Serializer& serializer) { serde::Serializable::serialize(obj.destination, serializer); serde::Serializable::serialize(obj.op, serializer); @@ -5215,10 +5223,10 @@ void serde::Serializable::serialize( template <> template -Circuit::BrilligOpcode::BinaryFieldOp serde::Deserializable::deserialize( +Program::BrilligOpcode::BinaryFieldOp serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::BinaryFieldOp obj; + Program::BrilligOpcode::BinaryFieldOp obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.op = serde::Deserializable::deserialize(deserializer); obj.lhs = serde::Deserializable::deserialize(deserializer); @@ -5226,7 +5234,7 @@ Circuit::BrilligOpcode::BinaryFieldOp serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::BinaryIntOp& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::BinaryIntOp& obj, Serializer& serializer) { serde::Serializable::serialize(obj.destination, serializer); @@ -5281,10 +5289,10 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BrilligOpcode::BinaryIntOp serde::Deserializable::deserialize( +Program::BrilligOpcode::BinaryIntOp serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::BinaryIntOp obj; + Program::BrilligOpcode::BinaryIntOp obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.op = serde::Deserializable::deserialize(deserializer); obj.bit_size = serde::Deserializable::deserialize(deserializer); @@ -5293,7 +5301,7 @@ Circuit::BrilligOpcode::BinaryIntOp serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Cast& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Cast& obj, Serializer& serializer) { serde::Serializable::serialize(obj.destination, serializer); @@ -5340,17 +5348,17 @@ void serde::Serializable::serialize(const Circuit: template <> template -Circuit::BrilligOpcode::Cast serde::Deserializable::deserialize( +Program::BrilligOpcode::Cast serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Cast obj; + Program::BrilligOpcode::Cast obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.source = serde::Deserializable::deserialize(deserializer); obj.bit_size = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::JumpIfNot& lhs, const BrilligOpcode::JumpIfNot& rhs) { @@ -5380,11 +5388,11 @@ inline BrilligOpcode::JumpIfNot BrilligOpcode::JumpIfNot::bincodeDeserialize(std return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::JumpIfNot& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::JumpIfNot& obj, Serializer& serializer) { serde::Serializable::serialize(obj.condition, serializer); @@ -5393,16 +5401,16 @@ void serde::Serializable::serialize(const Cir template <> template -Circuit::BrilligOpcode::JumpIfNot serde::Deserializable::deserialize( +Program::BrilligOpcode::JumpIfNot serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::JumpIfNot obj; + Program::BrilligOpcode::JumpIfNot obj; obj.condition = serde::Deserializable::deserialize(deserializer); obj.location = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::JumpIf& lhs, const BrilligOpcode::JumpIf& rhs) { @@ -5432,11 +5440,11 @@ inline BrilligOpcode::JumpIf BrilligOpcode::JumpIf::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::JumpIf& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::JumpIf& obj, Serializer& serializer) { serde::Serializable::serialize(obj.condition, serializer); @@ -5445,16 +5453,16 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BrilligOpcode::JumpIf serde::Deserializable::deserialize( +Program::BrilligOpcode::JumpIf serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::JumpIf obj; + Program::BrilligOpcode::JumpIf obj; obj.condition = serde::Deserializable::deserialize(deserializer); obj.location = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Jump& lhs, const BrilligOpcode::Jump& rhs) { @@ -5481,11 +5489,11 @@ inline BrilligOpcode::Jump BrilligOpcode::Jump::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Jump& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Jump& obj, Serializer& serializer) { serde::Serializable::serialize(obj.location, serializer); @@ -5493,15 +5501,15 @@ void serde::Serializable::serialize(const Circuit: template <> template -Circuit::BrilligOpcode::Jump serde::Deserializable::deserialize( +Program::BrilligOpcode::Jump serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Jump obj; + Program::BrilligOpcode::Jump obj; obj.location = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::CalldataCopy& lhs, const BrilligOpcode::CalldataCopy& rhs) { @@ -5534,12 +5542,12 @@ inline BrilligOpcode::CalldataCopy BrilligOpcode::CalldataCopy::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::BrilligOpcode::CalldataCopy& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::BrilligOpcode::CalldataCopy& obj, Serializer& serializer) { serde::Serializable::serialize(obj.destination_address, serializer); serde::Serializable::serialize(obj.size, serializer); @@ -5548,17 +5556,17 @@ void serde::Serializable::serialize( template <> template -Circuit::BrilligOpcode::CalldataCopy serde::Deserializable::deserialize( +Program::BrilligOpcode::CalldataCopy serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::CalldataCopy obj; + Program::BrilligOpcode::CalldataCopy obj; obj.destination_address = serde::Deserializable::deserialize(deserializer); obj.size = serde::Deserializable::deserialize(deserializer); obj.offset = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Call& lhs, const BrilligOpcode::Call& rhs) { @@ -5585,11 +5593,11 @@ inline BrilligOpcode::Call BrilligOpcode::Call::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Call& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Call& obj, Serializer& serializer) { serde::Serializable::serialize(obj.location, serializer); @@ -5597,15 +5605,15 @@ void serde::Serializable::serialize(const Circuit: template <> template -Circuit::BrilligOpcode::Call serde::Deserializable::deserialize( +Program::BrilligOpcode::Call serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Call obj; + Program::BrilligOpcode::Call obj; obj.location = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Const& lhs, const BrilligOpcode::Const& rhs) { @@ -5638,11 +5646,11 @@ inline BrilligOpcode::Const BrilligOpcode::Const::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Const& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Const& obj, Serializer& serializer) { serde::Serializable::serialize(obj.destination, serializer); @@ -5652,17 +5660,17 @@ void serde::Serializable::serialize(const Circuit template <> template -Circuit::BrilligOpcode::Const serde::Deserializable::deserialize( +Program::BrilligOpcode::Const serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Const obj; + Program::BrilligOpcode::Const obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.bit_size = serde::Deserializable::deserialize(deserializer); obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Return& lhs, const BrilligOpcode::Return& rhs) { @@ -5686,24 +5694,24 @@ inline BrilligOpcode::Return BrilligOpcode::Return::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Return& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Return& obj, Serializer& serializer) {} template <> template -Circuit::BrilligOpcode::Return serde::Deserializable::deserialize( +Program::BrilligOpcode::Return serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Return obj; + Program::BrilligOpcode::Return obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::ForeignCall& lhs, const BrilligOpcode::ForeignCall& rhs) { @@ -5742,11 +5750,11 @@ inline BrilligOpcode::ForeignCall BrilligOpcode::ForeignCall::bincodeDeserialize return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::ForeignCall& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::ForeignCall& obj, Serializer& serializer) { serde::Serializable::serialize(obj.function, serializer); @@ -5758,10 +5766,10 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BrilligOpcode::ForeignCall serde::Deserializable::deserialize( +Program::BrilligOpcode::ForeignCall serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::ForeignCall obj; + Program::BrilligOpcode::ForeignCall obj; obj.function = serde::Deserializable::deserialize(deserializer); obj.destinations = serde::Deserializable::deserialize(deserializer); obj.destination_value_types = @@ -5771,7 +5779,7 @@ Circuit::BrilligOpcode::ForeignCall serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Mov& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Mov& obj, Serializer& serializer) { serde::Serializable::serialize(obj.destination, serializer); @@ -5814,15 +5822,15 @@ void serde::Serializable::serialize(const Circuit:: template <> template -Circuit::BrilligOpcode::Mov serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BrilligOpcode::Mov serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::BrilligOpcode::Mov obj; + Program::BrilligOpcode::Mov obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.source = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Load& lhs, const BrilligOpcode::Load& rhs) { @@ -5852,11 +5860,11 @@ inline BrilligOpcode::Load BrilligOpcode::Load::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Load& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Load& obj, Serializer& serializer) { serde::Serializable::serialize(obj.destination, serializer); @@ -5865,16 +5873,16 @@ void serde::Serializable::serialize(const Circuit: template <> template -Circuit::BrilligOpcode::Load serde::Deserializable::deserialize( +Program::BrilligOpcode::Load serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Load obj; + Program::BrilligOpcode::Load obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.source_pointer = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Store& lhs, const BrilligOpcode::Store& rhs) { @@ -5904,11 +5912,11 @@ inline BrilligOpcode::Store BrilligOpcode::Store::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Store& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Store& obj, Serializer& serializer) { serde::Serializable::serialize(obj.destination_pointer, serializer); @@ -5917,16 +5925,16 @@ void serde::Serializable::serialize(const Circuit template <> template -Circuit::BrilligOpcode::Store serde::Deserializable::deserialize( +Program::BrilligOpcode::Store serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Store obj; + Program::BrilligOpcode::Store obj; obj.destination_pointer = serde::Deserializable::deserialize(deserializer); obj.source = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::BlackBox& lhs, const BrilligOpcode::BlackBox& rhs) { @@ -5953,11 +5961,11 @@ inline BrilligOpcode::BlackBox BrilligOpcode::BlackBox::bincodeDeserialize(std:: return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::BlackBox& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::BlackBox& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -5965,15 +5973,15 @@ void serde::Serializable::serialize(const Circ template <> template -Circuit::BrilligOpcode::BlackBox serde::Deserializable::deserialize( +Program::BrilligOpcode::BlackBox serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::BlackBox obj; + Program::BrilligOpcode::BlackBox obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Trap& lhs, const BrilligOpcode::Trap& rhs) { @@ -5997,24 +6005,24 @@ inline BrilligOpcode::Trap BrilligOpcode::Trap::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Trap& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Trap& obj, Serializer& serializer) {} template <> template -Circuit::BrilligOpcode::Trap serde::Deserializable::deserialize( +Program::BrilligOpcode::Trap serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Trap obj; + Program::BrilligOpcode::Trap obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Stop& lhs, const BrilligOpcode::Stop& rhs) { @@ -6044,11 +6052,11 @@ inline BrilligOpcode::Stop BrilligOpcode::Stop::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Stop& obj, +void serde::Serializable::serialize(const Program::BrilligOpcode::Stop& obj, Serializer& serializer) { serde::Serializable::serialize(obj.return_data_offset, serializer); @@ -6057,16 +6065,16 @@ void serde::Serializable::serialize(const Circuit: template <> template -Circuit::BrilligOpcode::Stop serde::Deserializable::deserialize( +Program::BrilligOpcode::Stop serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOpcode::Stop obj; + Program::BrilligOpcode::Stop obj; obj.return_data_offset = serde::Deserializable::deserialize(deserializer); obj.return_data_size = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOutputs& lhs, const BrilligOutputs& rhs) { @@ -6093,11 +6101,11 @@ inline BrilligOutputs BrilligOutputs::bincodeDeserialize(std::vector in return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOutputs& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::BrilligOutputs& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -6106,16 +6114,16 @@ void serde::Serializable::serialize(const Circuit::Bril template <> template -Circuit::BrilligOutputs serde::Deserializable::deserialize(Deserializer& deserializer) +Program::BrilligOutputs serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::BrilligOutputs obj; + Program::BrilligOutputs obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOutputs::Simple& lhs, const BrilligOutputs::Simple& rhs) { @@ -6142,11 +6150,11 @@ inline BrilligOutputs::Simple BrilligOutputs::Simple::bincodeDeserialize(std::ve return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOutputs::Simple& obj, +void serde::Serializable::serialize(const Program::BrilligOutputs::Simple& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -6154,15 +6162,15 @@ void serde::Serializable::serialize(const Circu template <> template -Circuit::BrilligOutputs::Simple serde::Deserializable::deserialize( +Program::BrilligOutputs::Simple serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOutputs::Simple obj; + Program::BrilligOutputs::Simple obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOutputs::Array& lhs, const BrilligOutputs::Array& rhs) { @@ -6189,11 +6197,11 @@ inline BrilligOutputs::Array BrilligOutputs::Array::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOutputs::Array& obj, +void serde::Serializable::serialize(const Program::BrilligOutputs::Array& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -6201,15 +6209,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BrilligOutputs::Array serde::Deserializable::deserialize( +Program::BrilligOutputs::Array serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::BrilligOutputs::Array obj; + Program::BrilligOutputs::Array obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Circuit& lhs, const Circuit& rhs) { @@ -6257,11 +6265,11 @@ inline Circuit Circuit::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Circuit& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::Circuit& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.current_witness_index, serializer); @@ -6277,10 +6285,10 @@ void serde::Serializable::serialize(const Circuit::Circuit& ob template <> template -Circuit::Circuit serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Circuit serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::Circuit obj; + Program::Circuit obj; obj.current_witness_index = serde::Deserializable::deserialize(deserializer); obj.opcodes = serde::Deserializable::deserialize(deserializer); obj.expression_width = serde::Deserializable::deserialize(deserializer); @@ -6293,7 +6301,7 @@ Circuit::Circuit serde::Deserializable::deserialize(Deserializ return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Directive& lhs, const Directive& rhs) { @@ -6320,11 +6328,11 @@ inline Directive Directive::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Directive& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::Directive& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -6333,16 +6341,16 @@ void serde::Serializable::serialize(const Circuit::Directive template <> template -Circuit::Directive serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Directive serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::Directive obj; + Program::Directive obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Directive::ToLeRadix& lhs, const Directive::ToLeRadix& rhs) { @@ -6375,11 +6383,11 @@ inline Directive::ToLeRadix Directive::ToLeRadix::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Directive::ToLeRadix& obj, +void serde::Serializable::serialize(const Program::Directive::ToLeRadix& obj, Serializer& serializer) { serde::Serializable::serialize(obj.a, serializer); @@ -6389,17 +6397,17 @@ void serde::Serializable::serialize(const Circuit template <> template -Circuit::Directive::ToLeRadix serde::Deserializable::deserialize( +Program::Directive::ToLeRadix serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::Directive::ToLeRadix obj; + Program::Directive::ToLeRadix obj; obj.a = serde::Deserializable::deserialize(deserializer); obj.b = serde::Deserializable::deserialize(deserializer); obj.radix = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Expression& lhs, const Expression& rhs) { @@ -6432,11 +6440,11 @@ inline Expression Expression::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Expression& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::Expression& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.mul_terms, serializer); @@ -6447,10 +6455,10 @@ void serde::Serializable::serialize(const Circuit::Expressi template <> template -Circuit::Expression serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Expression serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::Expression obj; + Program::Expression obj; obj.mul_terms = serde::Deserializable::deserialize(deserializer); obj.linear_combinations = serde::Deserializable::deserialize(deserializer); obj.q_c = serde::Deserializable::deserialize(deserializer); @@ -6458,7 +6466,7 @@ Circuit::Expression serde::Deserializable::deserialize(Dese return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ExpressionWidth& lhs, const ExpressionWidth& rhs) { @@ -6485,11 +6493,11 @@ inline ExpressionWidth ExpressionWidth::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ExpressionWidth& obj, +void serde::Serializable::serialize(const Program::ExpressionWidth& obj, Serializer& serializer) { serializer.increase_container_depth(); @@ -6499,16 +6507,16 @@ void serde::Serializable::serialize(const Circuit::Exp template <> template -Circuit::ExpressionWidth serde::Deserializable::deserialize(Deserializer& deserializer) +Program::ExpressionWidth serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::ExpressionWidth obj; + Program::ExpressionWidth obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ExpressionWidth::Unbounded& lhs, const ExpressionWidth::Unbounded& rhs) { @@ -6532,24 +6540,24 @@ inline ExpressionWidth::Unbounded ExpressionWidth::Unbounded::bincodeDeserialize return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ExpressionWidth::Unbounded& obj, +void serde::Serializable::serialize(const Program::ExpressionWidth::Unbounded& obj, Serializer& serializer) {} template <> template -Circuit::ExpressionWidth::Unbounded serde::Deserializable::deserialize( +Program::ExpressionWidth::Unbounded serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::ExpressionWidth::Unbounded obj; + Program::ExpressionWidth::Unbounded obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ExpressionWidth::Bounded& lhs, const ExpressionWidth::Bounded& rhs) { @@ -6576,11 +6584,11 @@ inline ExpressionWidth::Bounded ExpressionWidth::Bounded::bincodeDeserialize(std return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ExpressionWidth::Bounded& obj, +void serde::Serializable::serialize(const Program::ExpressionWidth::Bounded& obj, Serializer& serializer) { serde::Serializable::serialize(obj.width, serializer); @@ -6588,15 +6596,15 @@ void serde::Serializable::serialize(const Cir template <> template -Circuit::ExpressionWidth::Bounded serde::Deserializable::deserialize( +Program::ExpressionWidth::Bounded serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::ExpressionWidth::Bounded obj; + Program::ExpressionWidth::Bounded obj; obj.width = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const FunctionInput& lhs, const FunctionInput& rhs) { @@ -6626,11 +6634,11 @@ inline FunctionInput FunctionInput::bincodeDeserialize(std::vector inpu return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::FunctionInput& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::FunctionInput& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.witness, serializer); @@ -6640,17 +6648,17 @@ void serde::Serializable::serialize(const Circuit::Funct template <> template -Circuit::FunctionInput serde::Deserializable::deserialize(Deserializer& deserializer) +Program::FunctionInput serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::FunctionInput obj; + Program::FunctionInput obj; obj.witness = serde::Deserializable::deserialize(deserializer); obj.num_bits = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapArray& lhs, const HeapArray& rhs) { @@ -6680,11 +6688,11 @@ inline HeapArray HeapArray::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapArray& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::HeapArray& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.pointer, serializer); @@ -6694,17 +6702,17 @@ void serde::Serializable::serialize(const Circuit::HeapArray template <> template -Circuit::HeapArray serde::Deserializable::deserialize(Deserializer& deserializer) +Program::HeapArray serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::HeapArray obj; + Program::HeapArray obj; obj.pointer = serde::Deserializable::deserialize(deserializer); obj.size = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapValueType& lhs, const HeapValueType& rhs) { @@ -6731,11 +6739,11 @@ inline HeapValueType HeapValueType::bincodeDeserialize(std::vector inpu return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapValueType& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::HeapValueType& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -6744,16 +6752,16 @@ void serde::Serializable::serialize(const Circuit::HeapV template <> template -Circuit::HeapValueType serde::Deserializable::deserialize(Deserializer& deserializer) +Program::HeapValueType serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::HeapValueType obj; + Program::HeapValueType obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapValueType::Simple& lhs, const HeapValueType::Simple& rhs) { @@ -6777,24 +6785,24 @@ inline HeapValueType::Simple HeapValueType::Simple::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapValueType::Simple& obj, +void serde::Serializable::serialize(const Program::HeapValueType::Simple& obj, Serializer& serializer) {} template <> template -Circuit::HeapValueType::Simple serde::Deserializable::deserialize( +Program::HeapValueType::Simple serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::HeapValueType::Simple obj; + Program::HeapValueType::Simple obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapValueType::Array& lhs, const HeapValueType::Array& rhs) { @@ -6824,11 +6832,11 @@ inline HeapValueType::Array HeapValueType::Array::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapValueType::Array& obj, +void serde::Serializable::serialize(const Program::HeapValueType::Array& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value_types, serializer); @@ -6837,16 +6845,16 @@ void serde::Serializable::serialize(const Circuit template <> template -Circuit::HeapValueType::Array serde::Deserializable::deserialize( +Program::HeapValueType::Array serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::HeapValueType::Array obj; + Program::HeapValueType::Array obj; obj.value_types = serde::Deserializable::deserialize(deserializer); obj.size = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapValueType::Vector& lhs, const HeapValueType::Vector& rhs) { @@ -6873,11 +6881,11 @@ inline HeapValueType::Vector HeapValueType::Vector::bincodeDeserialize(std::vect return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapValueType::Vector& obj, +void serde::Serializable::serialize(const Program::HeapValueType::Vector& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value_types, serializer); @@ -6885,15 +6893,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::HeapValueType::Vector serde::Deserializable::deserialize( +Program::HeapValueType::Vector serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::HeapValueType::Vector obj; + Program::HeapValueType::Vector obj; obj.value_types = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapVector& lhs, const HeapVector& rhs) { @@ -6923,11 +6931,11 @@ inline HeapVector HeapVector::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapVector& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::HeapVector& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.pointer, serializer); @@ -6937,17 +6945,17 @@ void serde::Serializable::serialize(const Circuit::HeapVect template <> template -Circuit::HeapVector serde::Deserializable::deserialize(Deserializer& deserializer) +Program::HeapVector serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::HeapVector obj; + Program::HeapVector obj; obj.pointer = serde::Deserializable::deserialize(deserializer); obj.size = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const MemOp& lhs, const MemOp& rhs) { @@ -6980,11 +6988,11 @@ inline MemOp MemOp::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::MemOp& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::MemOp& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.operation, serializer); @@ -6995,10 +7003,10 @@ void serde::Serializable::serialize(const Circuit::MemOp& obj, S template <> template -Circuit::MemOp serde::Deserializable::deserialize(Deserializer& deserializer) +Program::MemOp serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::MemOp obj; + Program::MemOp obj; obj.operation = serde::Deserializable::deserialize(deserializer); obj.index = serde::Deserializable::deserialize(deserializer); obj.value = serde::Deserializable::deserialize(deserializer); @@ -7006,7 +7014,7 @@ Circuit::MemOp serde::Deserializable::deserialize(Deserializer& return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const MemoryAddress& lhs, const MemoryAddress& rhs) { @@ -7033,11 +7041,11 @@ inline MemoryAddress MemoryAddress::bincodeDeserialize(std::vector inpu return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::MemoryAddress& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::MemoryAddress& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -7046,16 +7054,16 @@ void serde::Serializable::serialize(const Circuit::Memor template <> template -Circuit::MemoryAddress serde::Deserializable::deserialize(Deserializer& deserializer) +Program::MemoryAddress serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::MemoryAddress obj; + Program::MemoryAddress obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode& lhs, const Opcode& rhs) { @@ -7082,11 +7090,11 @@ inline Opcode Opcode::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::Opcode& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -7095,16 +7103,16 @@ void serde::Serializable::serialize(const Circuit::Opcode& obj, template <> template -Circuit::Opcode serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Opcode serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::Opcode obj; + Program::Opcode obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::AssertZero& lhs, const Opcode::AssertZero& rhs) { @@ -7131,11 +7139,11 @@ inline Opcode::AssertZero Opcode::AssertZero::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::Opcode::AssertZero& obj, +void serde::Serializable::serialize(const Program::Opcode::AssertZero& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -7143,14 +7151,14 @@ void serde::Serializable::serialize(const Circuit:: template <> template -Circuit::Opcode::AssertZero serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Opcode::AssertZero serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::Opcode::AssertZero obj; + Program::Opcode::AssertZero obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::BlackBoxFuncCall& lhs, const Opcode::BlackBoxFuncCall& rhs) { @@ -7177,11 +7185,11 @@ inline Opcode::BlackBoxFuncCall Opcode::BlackBoxFuncCall::bincodeDeserialize(std return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::BlackBoxFuncCall& obj, +void serde::Serializable::serialize(const Program::Opcode::BlackBoxFuncCall& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -7189,15 +7197,15 @@ void serde::Serializable::serialize(const Cir template <> template -Circuit::Opcode::BlackBoxFuncCall serde::Deserializable::deserialize( +Program::Opcode::BlackBoxFuncCall serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::Opcode::BlackBoxFuncCall obj; + Program::Opcode::BlackBoxFuncCall obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::Directive& lhs, const Opcode::Directive& rhs) { @@ -7224,11 +7232,11 @@ inline Opcode::Directive Opcode::Directive::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::Opcode::Directive& obj, +void serde::Serializable::serialize(const Program::Opcode::Directive& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -7236,14 +7244,14 @@ void serde::Serializable::serialize(const Circuit::O template <> template -Circuit::Opcode::Directive serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Opcode::Directive serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::Opcode::Directive obj; + Program::Opcode::Directive obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::Brillig& lhs, const Opcode::Brillig& rhs) { @@ -7270,11 +7278,11 @@ inline Opcode::Brillig Opcode::Brillig::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::Brillig& obj, +void serde::Serializable::serialize(const Program::Opcode::Brillig& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -7282,14 +7290,14 @@ void serde::Serializable::serialize(const Circuit::Opc template <> template -Circuit::Opcode::Brillig serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Opcode::Brillig serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::Opcode::Brillig obj; + Program::Opcode::Brillig obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::MemoryOp& lhs, const Opcode::MemoryOp& rhs) { @@ -7322,11 +7330,11 @@ inline Opcode::MemoryOp Opcode::MemoryOp::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::Opcode::MemoryOp& obj, +void serde::Serializable::serialize(const Program::Opcode::MemoryOp& obj, Serializer& serializer) { serde::Serializable::serialize(obj.block_id, serializer); @@ -7336,16 +7344,16 @@ void serde::Serializable::serialize(const Circuit::Op template <> template -Circuit::Opcode::MemoryOp serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Opcode::MemoryOp serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::Opcode::MemoryOp obj; + Program::Opcode::MemoryOp obj; obj.block_id = serde::Deserializable::deserialize(deserializer); obj.op = serde::Deserializable::deserialize(deserializer); obj.predicate = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::MemoryInit& lhs, const Opcode::MemoryInit& rhs) { @@ -7375,11 +7383,11 @@ inline Opcode::MemoryInit Opcode::MemoryInit::bincodeDeserialize(std::vector template -void serde::Serializable::serialize(const Circuit::Opcode::MemoryInit& obj, +void serde::Serializable::serialize(const Program::Opcode::MemoryInit& obj, Serializer& serializer) { serde::Serializable::serialize(obj.block_id, serializer); @@ -7388,15 +7396,15 @@ void serde::Serializable::serialize(const Circuit:: template <> template -Circuit::Opcode::MemoryInit serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Opcode::MemoryInit serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::Opcode::MemoryInit obj; + Program::Opcode::MemoryInit obj; obj.block_id = serde::Deserializable::deserialize(deserializer); obj.init = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::Call& lhs, const Opcode::Call& rhs) { @@ -7429,11 +7437,11 @@ inline Opcode::Call Opcode::Call::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::Call& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::Opcode::Call& obj, Serializer& serializer) { serde::Serializable::serialize(obj.id, serializer); serde::Serializable::serialize(obj.inputs, serializer); @@ -7442,16 +7450,16 @@ void serde::Serializable::serialize(const Circuit::Opcode template <> template -Circuit::Opcode::Call serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Opcode::Call serde::Deserializable::deserialize(Deserializer& deserializer) { - Circuit::Opcode::Call obj; + Program::Opcode::Call obj; obj.id = serde::Deserializable::deserialize(deserializer); obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const OpcodeLocation& lhs, const OpcodeLocation& rhs) { @@ -7478,11 +7486,11 @@ inline OpcodeLocation OpcodeLocation::bincodeDeserialize(std::vector in return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::OpcodeLocation& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::OpcodeLocation& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -7491,16 +7499,16 @@ void serde::Serializable::serialize(const Circuit::Opco template <> template -Circuit::OpcodeLocation serde::Deserializable::deserialize(Deserializer& deserializer) +Program::OpcodeLocation serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::OpcodeLocation obj; + Program::OpcodeLocation obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const OpcodeLocation::Acir& lhs, const OpcodeLocation::Acir& rhs) { @@ -7527,11 +7535,11 @@ inline OpcodeLocation::Acir OpcodeLocation::Acir::bincodeDeserialize(std::vector return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::OpcodeLocation::Acir& obj, +void serde::Serializable::serialize(const Program::OpcodeLocation::Acir& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -7539,15 +7547,15 @@ void serde::Serializable::serialize(const Circuit template <> template -Circuit::OpcodeLocation::Acir serde::Deserializable::deserialize( +Program::OpcodeLocation::Acir serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::OpcodeLocation::Acir obj; + Program::OpcodeLocation::Acir obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const OpcodeLocation::Brillig& lhs, const OpcodeLocation::Brillig& rhs) { @@ -7577,11 +7585,11 @@ inline OpcodeLocation::Brillig OpcodeLocation::Brillig::bincodeDeserialize(std:: return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::OpcodeLocation::Brillig& obj, +void serde::Serializable::serialize(const Program::OpcodeLocation::Brillig& obj, Serializer& serializer) { serde::Serializable::serialize(obj.acir_index, serializer); @@ -7590,16 +7598,65 @@ void serde::Serializable::serialize(const Circ template <> template -Circuit::OpcodeLocation::Brillig serde::Deserializable::deserialize( +Program::OpcodeLocation::Brillig serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::OpcodeLocation::Brillig obj; + Program::OpcodeLocation::Brillig obj; obj.acir_index = serde::Deserializable::deserialize(deserializer); obj.brillig_index = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { + +inline bool operator==(const Program& lhs, const Program& rhs) +{ + if (!(lhs.functions == rhs.functions)) { + return false; + } + return true; +} + +inline std::vector Program::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Program Program::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Program + +template <> +template +void serde::Serializable::serialize(const Program::Program& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.functions, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Program::Program serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Program::Program obj; + obj.functions = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Program { inline bool operator==(const PublicInputs& lhs, const PublicInputs& rhs) { @@ -7626,11 +7683,11 @@ inline PublicInputs PublicInputs::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::PublicInputs& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::PublicInputs& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -7639,16 +7696,16 @@ void serde::Serializable::serialize(const Circuit::Public template <> template -Circuit::PublicInputs serde::Deserializable::deserialize(Deserializer& deserializer) +Program::PublicInputs serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::PublicInputs obj; + Program::PublicInputs obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Value& lhs, const Value& rhs) { @@ -7675,11 +7732,11 @@ inline Value Value::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Value& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::Value& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.inner, serializer); @@ -7688,16 +7745,16 @@ void serde::Serializable::serialize(const Circuit::Value& obj, S template <> template -Circuit::Value serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Value serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::Value obj; + Program::Value obj; obj.inner = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ValueOrArray& lhs, const ValueOrArray& rhs) { @@ -7724,11 +7781,11 @@ inline ValueOrArray ValueOrArray::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ValueOrArray& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::ValueOrArray& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -7737,16 +7794,16 @@ void serde::Serializable::serialize(const Circuit::ValueO template <> template -Circuit::ValueOrArray serde::Deserializable::deserialize(Deserializer& deserializer) +Program::ValueOrArray serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::ValueOrArray obj; + Program::ValueOrArray obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ValueOrArray::MemoryAddress& lhs, const ValueOrArray::MemoryAddress& rhs) { @@ -7773,27 +7830,27 @@ inline ValueOrArray::MemoryAddress ValueOrArray::MemoryAddress::bincodeDeseriali return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize( - const Circuit::ValueOrArray::MemoryAddress& obj, Serializer& serializer) +void serde::Serializable::serialize( + const Program::ValueOrArray::MemoryAddress& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::ValueOrArray::MemoryAddress serde::Deserializable::deserialize( +Program::ValueOrArray::MemoryAddress serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::ValueOrArray::MemoryAddress obj; + Program::ValueOrArray::MemoryAddress obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ValueOrArray::HeapArray& lhs, const ValueOrArray::HeapArray& rhs) { @@ -7820,11 +7877,11 @@ inline ValueOrArray::HeapArray ValueOrArray::HeapArray::bincodeDeserialize(std:: return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ValueOrArray::HeapArray& obj, +void serde::Serializable::serialize(const Program::ValueOrArray::HeapArray& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -7832,15 +7889,15 @@ void serde::Serializable::serialize(const Circ template <> template -Circuit::ValueOrArray::HeapArray serde::Deserializable::deserialize( +Program::ValueOrArray::HeapArray serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::ValueOrArray::HeapArray obj; + Program::ValueOrArray::HeapArray obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ValueOrArray::HeapVector& lhs, const ValueOrArray::HeapVector& rhs) { @@ -7867,11 +7924,11 @@ inline ValueOrArray::HeapVector ValueOrArray::HeapVector::bincodeDeserialize(std return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ValueOrArray::HeapVector& obj, +void serde::Serializable::serialize(const Program::ValueOrArray::HeapVector& obj, Serializer& serializer) { serde::Serializable::serialize(obj.value, serializer); @@ -7879,15 +7936,15 @@ void serde::Serializable::serialize(const Cir template <> template -Circuit::ValueOrArray::HeapVector serde::Deserializable::deserialize( +Program::ValueOrArray::HeapVector serde::Deserializable::deserialize( Deserializer& deserializer) { - Circuit::ValueOrArray::HeapVector obj; + Program::ValueOrArray::HeapVector obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Witness& lhs, const Witness& rhs) { @@ -7914,11 +7971,11 @@ inline Witness Witness::bincodeDeserialize(std::vector input) return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Witness& obj, Serializer& serializer) +void serde::Serializable::serialize(const Program::Witness& obj, Serializer& serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); @@ -7927,10 +7984,10 @@ void serde::Serializable::serialize(const Circuit::Witness& ob template <> template -Circuit::Witness serde::Deserializable::deserialize(Deserializer& deserializer) +Program::Witness serde::Deserializable::deserialize(Deserializer& deserializer) { deserializer.increase_container_depth(); - Circuit::Witness obj; + Program::Witness obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/index.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/index.hpp index 82716cef883..da0e55ad1c5 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/index.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/index.hpp @@ -6,7 +6,7 @@ #pragma clang diagnostic ignored "-Wshorten-64-to-32" #pragma clang diagnostic ignored "-Wunused-parameter" #include "acir.hpp" -#include "witness_map.hpp" +#include "witness_stack.hpp" #pragma clang diagnostic pop #else #pragma GCC diagnostic push @@ -16,6 +16,6 @@ #pragma GCC diagnostic ignored "-Wsign-conversion" #pragma GCC diagnostic ignored "-Wconversion" #include "acir.hpp" -#include "witness_map.hpp" +#include "witness_stack.hpp" #pragma GCC diagnostic pop #endif \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_map.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_map.hpp deleted file mode 100644 index de4523e7020..00000000000 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_map.hpp +++ /dev/null @@ -1,123 +0,0 @@ -#pragma once - -#include "bincode.hpp" -#include "serde.hpp" - -namespace WitnessMap { - -struct Witness { - uint32_t value; - - friend bool operator==(const Witness&, const Witness&); - bool operator<(Witness const& rhs) const { return value < rhs.value; } - std::vector bincodeSerialize() const; - static Witness bincodeDeserialize(std::vector); -}; - -struct WitnessMap { - std::map value; - - friend bool operator==(const WitnessMap&, const WitnessMap&); - std::vector bincodeSerialize() const; - static WitnessMap bincodeDeserialize(std::vector); -}; - -} // end of namespace WitnessMap - -namespace WitnessMap { - -inline bool operator==(const Witness& lhs, const Witness& rhs) -{ - if (!(lhs.value == rhs.value)) { - return false; - } - return true; -} - -inline std::vector Witness::bincodeSerialize() const -{ - auto serializer = serde::BincodeSerializer(); - serde::Serializable::serialize(*this, serializer); - return std::move(serializer).bytes(); -} - -inline Witness Witness::bincodeDeserialize(std::vector input) -{ - auto deserializer = serde::BincodeDeserializer(input); - auto value = serde::Deserializable::deserialize(deserializer); - if (deserializer.get_buffer_offset() < input.size()) { - throw_or_abort("Some input bytes were not read"); - } - return value; -} - -} // end of namespace WitnessMap - -template <> -template -void serde::Serializable::serialize(const WitnessMap::Witness& obj, Serializer& serializer) -{ - serializer.increase_container_depth(); - serde::Serializable::serialize(obj.value, serializer); - serializer.decrease_container_depth(); -} - -template <> -template -WitnessMap::Witness serde::Deserializable::deserialize(Deserializer& deserializer) -{ - deserializer.increase_container_depth(); - WitnessMap::Witness obj; - obj.value = serde::Deserializable::deserialize(deserializer); - deserializer.decrease_container_depth(); - return obj; -} - -namespace WitnessMap { - -inline bool operator==(const WitnessMap& lhs, const WitnessMap& rhs) -{ - if (!(lhs.value == rhs.value)) { - return false; - } - return true; -} - -inline std::vector WitnessMap::bincodeSerialize() const -{ - auto serializer = serde::BincodeSerializer(); - serde::Serializable::serialize(*this, serializer); - return std::move(serializer).bytes(); -} - -inline WitnessMap WitnessMap::bincodeDeserialize(std::vector input) -{ - auto deserializer = serde::BincodeDeserializer(input); - auto value = serde::Deserializable::deserialize(deserializer); - if (deserializer.get_buffer_offset() < input.size()) { - throw_or_abort("Some input bytes were not read"); - } - return value; -} - -} // end of namespace WitnessMap - -template <> -template -void serde::Serializable::serialize(const WitnessMap::WitnessMap& obj, Serializer& serializer) -{ - serializer.increase_container_depth(); - serde::Serializable::serialize(obj.value, serializer); - serializer.decrease_container_depth(); -} - -template <> -template -WitnessMap::WitnessMap serde::Deserializable::deserialize(Deserializer& deserializer) -{ - deserializer.increase_container_depth(); - WitnessMap::WitnessMap obj; - obj.value = serde::Deserializable::deserialize(deserializer); - deserializer.decrease_container_depth(); - return obj; -} \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_stack.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_stack.hpp new file mode 100644 index 00000000000..67ef655babf --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_stack.hpp @@ -0,0 +1,247 @@ +#pragma once + +#include "bincode.hpp" +#include "serde.hpp" + +namespace WitnessStack { + +struct Witness { + uint32_t value; + + friend bool operator==(const Witness&, const Witness&); + + bool operator<(Witness const& rhs) const { return value < rhs.value; } + + std::vector bincodeSerialize() const; + static Witness bincodeDeserialize(std::vector); +}; + +struct WitnessMap { + std::map value; + + friend bool operator==(const WitnessMap&, const WitnessMap&); + std::vector bincodeSerialize() const; + static WitnessMap bincodeDeserialize(std::vector); +}; + +struct StackItem { + uint32_t index; + WitnessStack::WitnessMap witness; + + friend bool operator==(const StackItem&, const StackItem&); + std::vector bincodeSerialize() const; + static StackItem bincodeDeserialize(std::vector); +}; + +struct WitnessStack { + std::vector stack; + + friend bool operator==(const WitnessStack&, const WitnessStack&); + std::vector bincodeSerialize() const; + static WitnessStack bincodeDeserialize(std::vector); +}; + +} // end of namespace WitnessStack + +namespace WitnessStack { + +inline bool operator==(const StackItem& lhs, const StackItem& rhs) +{ + if (!(lhs.index == rhs.index)) { + return false; + } + if (!(lhs.witness == rhs.witness)) { + return false; + } + return true; +} + +inline std::vector StackItem::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline StackItem StackItem::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace WitnessStack + +template <> +template +void serde::Serializable::serialize(const WitnessStack::StackItem& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.index, serializer); + serde::Serializable::serialize(obj.witness, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +WitnessStack::StackItem serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + WitnessStack::StackItem obj; + obj.index = serde::Deserializable::deserialize(deserializer); + obj.witness = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace WitnessStack { + +inline bool operator==(const Witness& lhs, const Witness& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Witness::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Witness Witness::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace WitnessStack + +template <> +template +void serde::Serializable::serialize(const WitnessStack::Witness& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +WitnessStack::Witness serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + WitnessStack::Witness obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace WitnessStack { + +inline bool operator==(const WitnessMap& lhs, const WitnessMap& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector WitnessMap::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline WitnessMap WitnessMap::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace WitnessStack + +template <> +template +void serde::Serializable::serialize(const WitnessStack::WitnessMap& obj, + Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +WitnessStack::WitnessMap serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + WitnessStack::WitnessMap obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace WitnessStack { + +inline bool operator==(const WitnessStack& lhs, const WitnessStack& rhs) +{ + if (!(lhs.stack == rhs.stack)) { + return false; + } + return true; +} + +inline std::vector WitnessStack::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline WitnessStack WitnessStack::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace WitnessStack + +template <> +template +void serde::Serializable::serialize(const WitnessStack::WitnessStack& obj, + Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.stack, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +WitnessStack::WitnessStack serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + WitnessStack::WitnessStack obj; + obj.stack = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} diff --git a/build_manifest.yml b/build_manifest.yml index 10382887281..e650233f6d1 100644 --- a/build_manifest.yml +++ b/build_manifest.yml @@ -28,6 +28,8 @@ noir-packages: buildDir: noir dockerfile: Dockerfile.packages rebuildPatterns: .rebuild_patterns_packages + dependencies: + - bb.js # Builds and runs *all* noir package tests. noir-packages-tests: @@ -36,6 +38,7 @@ noir-packages-tests: rebuildPatterns: .rebuild_patterns_packages dependencies: - noir + - bb.js - noir-packages # Builds the brillig to avm transpiler. diff --git a/noir/Dockerfile.packages b/noir/Dockerfile.packages index c45260afaf4..f6bf8ad6756 100644 --- a/noir/Dockerfile.packages +++ b/noir/Dockerfile.packages @@ -1,4 +1,10 @@ +FROM --platform=linux/amd64 aztecprotocol/bb.js as bb.js + FROM node:20 AS builder + +# Copy in portalled packages. +COPY --from=bb.js /usr/src/barretenberg/ts /usr/src/barretenberg/ts + ENV PATH=${PATH}:/usr/src/noir/noir-repo/target/release RUN curl https://sh.rustup.rs -sSf | bash -s -- -y RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc diff --git a/noir/Dockerfile.packages-test b/noir/Dockerfile.packages-test index b9b4ac32267..e4d9b72b4a9 100644 --- a/noir/Dockerfile.packages-test +++ b/noir/Dockerfile.packages-test @@ -1,9 +1,18 @@ FROM aztecprotocol/noir AS noir +FROM --platform=linux/amd64 aztecprotocol/bb.js as bb.js FROM --platform=linux/amd64 aztecprotocol/noir-packages as noir-packages FROM node:20 AS builder +COPY --from=bb.js /usr/src/barretenberg/ts /usr/src/barretenberg/ts COPY --from=noir-packages /usr/src/noir/packages /usr/src/noir/packages +WORKDIR /usr/src/barretenberg/ts +RUN yarn --immutable + +# Set the nargo backend to use the local bb.js of breaking serialization changes +# We use the backend to write the verification key for smart contract integration tests +ENV NARGO_BACKEND_PATH=/usr/src/barretenberg/ts/dest/node/main.js + COPY --from=noir /usr/src/noir/noir-repo/target/release /usr/src/noir/noir-repo/target/release ENV PATH=${PATH}:/usr/src/noir/noir-repo/target/release RUN curl https://sh.rustup.rs -sSf | bash -s -- -y diff --git a/noir/Earthfile b/noir/Earthfile index f2d91a4cd7b..d3f86ad5fa1 100644 --- a/noir/Earthfile +++ b/noir/Earthfile @@ -1,6 +1,5 @@ VERSION 0.8 - nargo: FROM rust:bullseye RUN apt update && apt install -y libc++1 @@ -26,6 +25,11 @@ nargo: packages: FROM node:20 + + # `noir-repo` is nested inside of `noir` so we copy `bb.js` as such to account + # for the extra nested folder specified in portalled package paths + COPY ../barretenberg/ts/+build/build /build/../barretenberg/ts + RUN curl https://sh.rustup.rs -sSf | bash -s -- -y RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc RUN apt update && apt install -y jq libc++1 @@ -56,6 +60,7 @@ packages: COPY --keep-ts noir-repo/.github/scripts noir-repo/.github/scripts COPY --keep-ts ./scripts/bootstrap_packages.sh ./scripts/bootstrap_packages.sh + # TODO(AD) is this OK as a content hash? ENV COMMIT_HASH=$(find . -type f -exec sha256sum {} ';' | sort | sha256sum | awk '{print $1}') RUN PATH="/root/.cargo/bin:$PATH" ./scripts/bootstrap_packages.sh diff --git a/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp b/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp index 11afd44ed6d..32525007e2a 100644 --- a/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp +++ b/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp @@ -3,7 +3,7 @@ #include "serde.hpp" #include "bincode.hpp" -namespace Circuit { +namespace Program { struct BinaryFieldOp { @@ -152,7 +152,7 @@ namespace Circuit { }; struct HeapArray { - Circuit::MemoryAddress pointer; + Program::MemoryAddress pointer; uint64_t size; friend bool operator==(const HeapArray&, const HeapArray&); @@ -161,8 +161,8 @@ namespace Circuit { }; struct HeapVector { - Circuit::MemoryAddress pointer; - Circuit::MemoryAddress size; + Program::MemoryAddress pointer; + Program::MemoryAddress size; friend bool operator==(const HeapVector&, const HeapVector&); std::vector bincodeSerialize() const; @@ -172,8 +172,8 @@ namespace Circuit { struct BlackBoxOp { struct Sha256 { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Sha256&, const Sha256&); std::vector bincodeSerialize() const; @@ -181,8 +181,8 @@ namespace Circuit { }; struct Blake2s { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Blake2s&, const Blake2s&); std::vector bincodeSerialize() const; @@ -190,8 +190,8 @@ namespace Circuit { }; struct Blake3 { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Blake3&, const Blake3&); std::vector bincodeSerialize() const; @@ -199,8 +199,8 @@ namespace Circuit { }; struct Keccak256 { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Keccak256&, const Keccak256&); std::vector bincodeSerialize() const; @@ -208,8 +208,8 @@ namespace Circuit { }; struct Keccakf1600 { - Circuit::HeapVector message; - Circuit::HeapArray output; + Program::HeapVector message; + Program::HeapArray output; friend bool operator==(const Keccakf1600&, const Keccakf1600&); std::vector bincodeSerialize() const; @@ -217,11 +217,11 @@ namespace Circuit { }; struct EcdsaSecp256k1 { - Circuit::HeapVector hashed_msg; - Circuit::HeapArray public_key_x; - Circuit::HeapArray public_key_y; - Circuit::HeapArray signature; - Circuit::MemoryAddress result; + Program::HeapVector hashed_msg; + Program::HeapArray public_key_x; + Program::HeapArray public_key_y; + Program::HeapArray signature; + Program::MemoryAddress result; friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&); std::vector bincodeSerialize() const; @@ -229,11 +229,11 @@ namespace Circuit { }; struct EcdsaSecp256r1 { - Circuit::HeapVector hashed_msg; - Circuit::HeapArray public_key_x; - Circuit::HeapArray public_key_y; - Circuit::HeapArray signature; - Circuit::MemoryAddress result; + Program::HeapVector hashed_msg; + Program::HeapArray public_key_x; + Program::HeapArray public_key_y; + Program::HeapArray signature; + Program::MemoryAddress result; friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&); std::vector bincodeSerialize() const; @@ -241,11 +241,11 @@ namespace Circuit { }; struct SchnorrVerify { - Circuit::MemoryAddress public_key_x; - Circuit::MemoryAddress public_key_y; - Circuit::HeapVector message; - Circuit::HeapVector signature; - Circuit::MemoryAddress result; + Program::MemoryAddress public_key_x; + Program::MemoryAddress public_key_y; + Program::HeapVector message; + Program::HeapVector signature; + Program::MemoryAddress result; friend bool operator==(const SchnorrVerify&, const SchnorrVerify&); std::vector bincodeSerialize() const; @@ -253,9 +253,9 @@ namespace Circuit { }; struct PedersenCommitment { - Circuit::HeapVector inputs; - Circuit::MemoryAddress domain_separator; - Circuit::HeapArray output; + Program::HeapVector inputs; + Program::MemoryAddress domain_separator; + Program::HeapArray output; friend bool operator==(const PedersenCommitment&, const PedersenCommitment&); std::vector bincodeSerialize() const; @@ -263,9 +263,9 @@ namespace Circuit { }; struct PedersenHash { - Circuit::HeapVector inputs; - Circuit::MemoryAddress domain_separator; - Circuit::MemoryAddress output; + Program::HeapVector inputs; + Program::MemoryAddress domain_separator; + Program::MemoryAddress output; friend bool operator==(const PedersenHash&, const PedersenHash&); std::vector bincodeSerialize() const; @@ -273,9 +273,9 @@ namespace Circuit { }; struct FixedBaseScalarMul { - Circuit::MemoryAddress low; - Circuit::MemoryAddress high; - Circuit::HeapArray result; + Program::MemoryAddress low; + Program::MemoryAddress high; + Program::HeapArray result; friend bool operator==(const FixedBaseScalarMul&, const FixedBaseScalarMul&); std::vector bincodeSerialize() const; @@ -283,11 +283,11 @@ namespace Circuit { }; struct EmbeddedCurveAdd { - Circuit::MemoryAddress input1_x; - Circuit::MemoryAddress input1_y; - Circuit::MemoryAddress input2_x; - Circuit::MemoryAddress input2_y; - Circuit::HeapArray result; + Program::MemoryAddress input1_x; + Program::MemoryAddress input1_y; + Program::MemoryAddress input2_x; + Program::MemoryAddress input2_y; + Program::HeapArray result; friend bool operator==(const EmbeddedCurveAdd&, const EmbeddedCurveAdd&); std::vector bincodeSerialize() const; @@ -295,9 +295,9 @@ namespace Circuit { }; struct BigIntAdd { - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; - Circuit::MemoryAddress output; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; + Program::MemoryAddress output; friend bool operator==(const BigIntAdd&, const BigIntAdd&); std::vector bincodeSerialize() const; @@ -305,9 +305,9 @@ namespace Circuit { }; struct BigIntSub { - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; - Circuit::MemoryAddress output; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; + Program::MemoryAddress output; friend bool operator==(const BigIntSub&, const BigIntSub&); std::vector bincodeSerialize() const; @@ -315,9 +315,9 @@ namespace Circuit { }; struct BigIntMul { - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; - Circuit::MemoryAddress output; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; + Program::MemoryAddress output; friend bool operator==(const BigIntMul&, const BigIntMul&); std::vector bincodeSerialize() const; @@ -325,9 +325,9 @@ namespace Circuit { }; struct BigIntDiv { - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; - Circuit::MemoryAddress output; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; + Program::MemoryAddress output; friend bool operator==(const BigIntDiv&, const BigIntDiv&); std::vector bincodeSerialize() const; @@ -335,9 +335,9 @@ namespace Circuit { }; struct BigIntFromLeBytes { - Circuit::HeapVector inputs; - Circuit::HeapVector modulus; - Circuit::MemoryAddress output; + Program::HeapVector inputs; + Program::HeapVector modulus; + Program::MemoryAddress output; friend bool operator==(const BigIntFromLeBytes&, const BigIntFromLeBytes&); std::vector bincodeSerialize() const; @@ -345,8 +345,8 @@ namespace Circuit { }; struct BigIntToLeBytes { - Circuit::MemoryAddress input; - Circuit::HeapVector output; + Program::MemoryAddress input; + Program::HeapVector output; friend bool operator==(const BigIntToLeBytes&, const BigIntToLeBytes&); std::vector bincodeSerialize() const; @@ -354,9 +354,9 @@ namespace Circuit { }; struct Poseidon2Permutation { - Circuit::HeapVector message; - Circuit::HeapArray output; - Circuit::MemoryAddress len; + Program::HeapVector message; + Program::HeapArray output; + Program::MemoryAddress len; friend bool operator==(const Poseidon2Permutation&, const Poseidon2Permutation&); std::vector bincodeSerialize() const; @@ -364,9 +364,9 @@ namespace Circuit { }; struct Sha256Compression { - Circuit::HeapVector input; - Circuit::HeapVector hash_values; - Circuit::HeapArray output; + Program::HeapVector input; + Program::HeapVector hash_values; + Program::HeapArray output; friend bool operator==(const Sha256Compression&, const Sha256Compression&); std::vector bincodeSerialize() const; @@ -391,7 +391,7 @@ namespace Circuit { }; struct Array { - std::vector value_types; + std::vector value_types; uint64_t size; friend bool operator==(const Array&, const Array&); @@ -400,7 +400,7 @@ namespace Circuit { }; struct Vector { - std::vector value_types; + std::vector value_types; friend bool operator==(const Vector&, const Vector&); std::vector bincodeSerialize() const; @@ -425,7 +425,7 @@ namespace Circuit { struct ValueOrArray { struct MemoryAddress { - Circuit::MemoryAddress value; + Program::MemoryAddress value; friend bool operator==(const MemoryAddress&, const MemoryAddress&); std::vector bincodeSerialize() const; @@ -433,7 +433,7 @@ namespace Circuit { }; struct HeapArray { - Circuit::HeapArray value; + Program::HeapArray value; friend bool operator==(const HeapArray&, const HeapArray&); std::vector bincodeSerialize() const; @@ -441,7 +441,7 @@ namespace Circuit { }; struct HeapVector { - Circuit::HeapVector value; + Program::HeapVector value; friend bool operator==(const HeapVector&, const HeapVector&); std::vector bincodeSerialize() const; @@ -458,10 +458,10 @@ namespace Circuit { struct BrilligOpcode { struct BinaryFieldOp { - Circuit::MemoryAddress destination; - Circuit::BinaryFieldOp op; - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; + Program::MemoryAddress destination; + Program::BinaryFieldOp op; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&); std::vector bincodeSerialize() const; @@ -469,11 +469,11 @@ namespace Circuit { }; struct BinaryIntOp { - Circuit::MemoryAddress destination; - Circuit::BinaryIntOp op; + Program::MemoryAddress destination; + Program::BinaryIntOp op; uint32_t bit_size; - Circuit::MemoryAddress lhs; - Circuit::MemoryAddress rhs; + Program::MemoryAddress lhs; + Program::MemoryAddress rhs; friend bool operator==(const BinaryIntOp&, const BinaryIntOp&); std::vector bincodeSerialize() const; @@ -481,8 +481,8 @@ namespace Circuit { }; struct Cast { - Circuit::MemoryAddress destination; - Circuit::MemoryAddress source; + Program::MemoryAddress destination; + Program::MemoryAddress source; uint32_t bit_size; friend bool operator==(const Cast&, const Cast&); @@ -491,7 +491,7 @@ namespace Circuit { }; struct JumpIfNot { - Circuit::MemoryAddress condition; + Program::MemoryAddress condition; uint64_t location; friend bool operator==(const JumpIfNot&, const JumpIfNot&); @@ -500,7 +500,7 @@ namespace Circuit { }; struct JumpIf { - Circuit::MemoryAddress condition; + Program::MemoryAddress condition; uint64_t location; friend bool operator==(const JumpIf&, const JumpIf&); @@ -517,7 +517,7 @@ namespace Circuit { }; struct CalldataCopy { - Circuit::MemoryAddress destination_address; + Program::MemoryAddress destination_address; uint64_t size; uint64_t offset; @@ -535,9 +535,9 @@ namespace Circuit { }; struct Const { - Circuit::MemoryAddress destination; + Program::MemoryAddress destination; uint32_t bit_size; - Circuit::Value value; + Program::Value value; friend bool operator==(const Const&, const Const&); std::vector bincodeSerialize() const; @@ -552,10 +552,10 @@ namespace Circuit { struct ForeignCall { std::string function; - std::vector destinations; - std::vector destination_value_types; - std::vector inputs; - std::vector input_value_types; + std::vector destinations; + std::vector destination_value_types; + std::vector inputs; + std::vector input_value_types; friend bool operator==(const ForeignCall&, const ForeignCall&); std::vector bincodeSerialize() const; @@ -563,8 +563,8 @@ namespace Circuit { }; struct Mov { - Circuit::MemoryAddress destination; - Circuit::MemoryAddress source; + Program::MemoryAddress destination; + Program::MemoryAddress source; friend bool operator==(const Mov&, const Mov&); std::vector bincodeSerialize() const; @@ -572,8 +572,8 @@ namespace Circuit { }; struct Load { - Circuit::MemoryAddress destination; - Circuit::MemoryAddress source_pointer; + Program::MemoryAddress destination; + Program::MemoryAddress source_pointer; friend bool operator==(const Load&, const Load&); std::vector bincodeSerialize() const; @@ -581,8 +581,8 @@ namespace Circuit { }; struct Store { - Circuit::MemoryAddress destination_pointer; - Circuit::MemoryAddress source; + Program::MemoryAddress destination_pointer; + Program::MemoryAddress source; friend bool operator==(const Store&, const Store&); std::vector bincodeSerialize() const; @@ -590,7 +590,7 @@ namespace Circuit { }; struct BlackBox { - Circuit::BlackBoxOp value; + Program::BlackBoxOp value; friend bool operator==(const BlackBox&, const BlackBox&); std::vector bincodeSerialize() const; @@ -628,7 +628,7 @@ namespace Circuit { }; struct FunctionInput { - Circuit::Witness witness; + Program::Witness witness; uint32_t num_bits; friend bool operator==(const FunctionInput&, const FunctionInput&); @@ -639,9 +639,9 @@ namespace Circuit { struct BlackBoxFuncCall { struct AND { - Circuit::FunctionInput lhs; - Circuit::FunctionInput rhs; - Circuit::Witness output; + Program::FunctionInput lhs; + Program::FunctionInput rhs; + Program::Witness output; friend bool operator==(const AND&, const AND&); std::vector bincodeSerialize() const; @@ -649,9 +649,9 @@ namespace Circuit { }; struct XOR { - Circuit::FunctionInput lhs; - Circuit::FunctionInput rhs; - Circuit::Witness output; + Program::FunctionInput lhs; + Program::FunctionInput rhs; + Program::Witness output; friend bool operator==(const XOR&, const XOR&); std::vector bincodeSerialize() const; @@ -659,7 +659,7 @@ namespace Circuit { }; struct RANGE { - Circuit::FunctionInput input; + Program::FunctionInput input; friend bool operator==(const RANGE&, const RANGE&); std::vector bincodeSerialize() const; @@ -667,8 +667,8 @@ namespace Circuit { }; struct SHA256 { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const SHA256&, const SHA256&); std::vector bincodeSerialize() const; @@ -676,8 +676,8 @@ namespace Circuit { }; struct Blake2s { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Blake2s&, const Blake2s&); std::vector bincodeSerialize() const; @@ -685,8 +685,8 @@ namespace Circuit { }; struct Blake3 { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Blake3&, const Blake3&); std::vector bincodeSerialize() const; @@ -694,11 +694,11 @@ namespace Circuit { }; struct SchnorrVerify { - Circuit::FunctionInput public_key_x; - Circuit::FunctionInput public_key_y; - std::vector signature; - std::vector message; - Circuit::Witness output; + Program::FunctionInput public_key_x; + Program::FunctionInput public_key_y; + std::vector signature; + std::vector message; + Program::Witness output; friend bool operator==(const SchnorrVerify&, const SchnorrVerify&); std::vector bincodeSerialize() const; @@ -706,9 +706,9 @@ namespace Circuit { }; struct PedersenCommitment { - std::vector inputs; + std::vector inputs; uint32_t domain_separator; - std::array outputs; + std::array outputs; friend bool operator==(const PedersenCommitment&, const PedersenCommitment&); std::vector bincodeSerialize() const; @@ -716,9 +716,9 @@ namespace Circuit { }; struct PedersenHash { - std::vector inputs; + std::vector inputs; uint32_t domain_separator; - Circuit::Witness output; + Program::Witness output; friend bool operator==(const PedersenHash&, const PedersenHash&); std::vector bincodeSerialize() const; @@ -726,11 +726,11 @@ namespace Circuit { }; struct EcdsaSecp256k1 { - std::vector public_key_x; - std::vector public_key_y; - std::vector signature; - std::vector hashed_message; - Circuit::Witness output; + std::vector public_key_x; + std::vector public_key_y; + std::vector signature; + std::vector hashed_message; + Program::Witness output; friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&); std::vector bincodeSerialize() const; @@ -738,11 +738,11 @@ namespace Circuit { }; struct EcdsaSecp256r1 { - std::vector public_key_x; - std::vector public_key_y; - std::vector signature; - std::vector hashed_message; - Circuit::Witness output; + std::vector public_key_x; + std::vector public_key_y; + std::vector signature; + std::vector hashed_message; + Program::Witness output; friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&); std::vector bincodeSerialize() const; @@ -750,9 +750,9 @@ namespace Circuit { }; struct FixedBaseScalarMul { - Circuit::FunctionInput low; - Circuit::FunctionInput high; - std::array outputs; + Program::FunctionInput low; + Program::FunctionInput high; + std::array outputs; friend bool operator==(const FixedBaseScalarMul&, const FixedBaseScalarMul&); std::vector bincodeSerialize() const; @@ -760,11 +760,11 @@ namespace Circuit { }; struct EmbeddedCurveAdd { - Circuit::FunctionInput input1_x; - Circuit::FunctionInput input1_y; - Circuit::FunctionInput input2_x; - Circuit::FunctionInput input2_y; - std::array outputs; + Program::FunctionInput input1_x; + Program::FunctionInput input1_y; + Program::FunctionInput input2_x; + Program::FunctionInput input2_y; + std::array outputs; friend bool operator==(const EmbeddedCurveAdd&, const EmbeddedCurveAdd&); std::vector bincodeSerialize() const; @@ -772,8 +772,8 @@ namespace Circuit { }; struct Keccak256 { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Keccak256&, const Keccak256&); std::vector bincodeSerialize() const; @@ -781,9 +781,9 @@ namespace Circuit { }; struct Keccak256VariableLength { - std::vector inputs; - Circuit::FunctionInput var_message_size; - std::vector outputs; + std::vector inputs; + Program::FunctionInput var_message_size; + std::vector outputs; friend bool operator==(const Keccak256VariableLength&, const Keccak256VariableLength&); std::vector bincodeSerialize() const; @@ -791,8 +791,8 @@ namespace Circuit { }; struct Keccakf1600 { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Keccakf1600&, const Keccakf1600&); std::vector bincodeSerialize() const; @@ -800,10 +800,10 @@ namespace Circuit { }; struct RecursiveAggregation { - std::vector verification_key; - std::vector proof; - std::vector public_inputs; - Circuit::FunctionInput key_hash; + std::vector verification_key; + std::vector proof; + std::vector public_inputs; + Program::FunctionInput key_hash; friend bool operator==(const RecursiveAggregation&, const RecursiveAggregation&); std::vector bincodeSerialize() const; @@ -851,7 +851,7 @@ namespace Circuit { }; struct BigIntFromLeBytes { - std::vector inputs; + std::vector inputs; std::vector modulus; uint32_t output; @@ -862,7 +862,7 @@ namespace Circuit { struct BigIntToLeBytes { uint32_t input; - std::vector outputs; + std::vector outputs; friend bool operator==(const BigIntToLeBytes&, const BigIntToLeBytes&); std::vector bincodeSerialize() const; @@ -870,8 +870,8 @@ namespace Circuit { }; struct Poseidon2Permutation { - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; uint32_t len; friend bool operator==(const Poseidon2Permutation&, const Poseidon2Permutation&); @@ -880,9 +880,9 @@ namespace Circuit { }; struct Sha256Compression { - std::vector inputs; - std::vector hash_values; - std::vector outputs; + std::vector inputs; + std::vector hash_values; + std::vector outputs; friend bool operator==(const Sha256Compression&, const Sha256Compression&); std::vector bincodeSerialize() const; @@ -905,8 +905,8 @@ namespace Circuit { }; struct Expression { - std::vector> mul_terms; - std::vector> linear_combinations; + std::vector> mul_terms; + std::vector> linear_combinations; std::string q_c; friend bool operator==(const Expression&, const Expression&); @@ -917,7 +917,7 @@ namespace Circuit { struct BrilligInputs { struct Single { - Circuit::Expression value; + Program::Expression value; friend bool operator==(const Single&, const Single&); std::vector bincodeSerialize() const; @@ -925,7 +925,7 @@ namespace Circuit { }; struct Array { - std::vector value; + std::vector value; friend bool operator==(const Array&, const Array&); std::vector bincodeSerialize() const; @@ -933,7 +933,7 @@ namespace Circuit { }; struct MemoryArray { - Circuit::BlockId value; + Program::BlockId value; friend bool operator==(const MemoryArray&, const MemoryArray&); std::vector bincodeSerialize() const; @@ -950,7 +950,7 @@ namespace Circuit { struct BrilligOutputs { struct Simple { - Circuit::Witness value; + Program::Witness value; friend bool operator==(const Simple&, const Simple&); std::vector bincodeSerialize() const; @@ -958,7 +958,7 @@ namespace Circuit { }; struct Array { - std::vector value; + std::vector value; friend bool operator==(const Array&, const Array&); std::vector bincodeSerialize() const; @@ -973,10 +973,10 @@ namespace Circuit { }; struct Brillig { - std::vector inputs; - std::vector outputs; - std::vector bytecode; - std::optional predicate; + std::vector inputs; + std::vector outputs; + std::vector bytecode; + std::optional predicate; friend bool operator==(const Brillig&, const Brillig&); std::vector bincodeSerialize() const; @@ -986,8 +986,8 @@ namespace Circuit { struct Directive { struct ToLeRadix { - Circuit::Expression a; - std::vector b; + Program::Expression a; + std::vector b; uint32_t radix; friend bool operator==(const ToLeRadix&, const ToLeRadix&); @@ -1003,9 +1003,9 @@ namespace Circuit { }; struct MemOp { - Circuit::Expression operation; - Circuit::Expression index; - Circuit::Expression value; + Program::Expression operation; + Program::Expression index; + Program::Expression value; friend bool operator==(const MemOp&, const MemOp&); std::vector bincodeSerialize() const; @@ -1015,7 +1015,7 @@ namespace Circuit { struct Opcode { struct AssertZero { - Circuit::Expression value; + Program::Expression value; friend bool operator==(const AssertZero&, const AssertZero&); std::vector bincodeSerialize() const; @@ -1023,7 +1023,7 @@ namespace Circuit { }; struct BlackBoxFuncCall { - Circuit::BlackBoxFuncCall value; + Program::BlackBoxFuncCall value; friend bool operator==(const BlackBoxFuncCall&, const BlackBoxFuncCall&); std::vector bincodeSerialize() const; @@ -1031,7 +1031,7 @@ namespace Circuit { }; struct Directive { - Circuit::Directive value; + Program::Directive value; friend bool operator==(const Directive&, const Directive&); std::vector bincodeSerialize() const; @@ -1039,7 +1039,7 @@ namespace Circuit { }; struct Brillig { - Circuit::Brillig value; + Program::Brillig value; friend bool operator==(const Brillig&, const Brillig&); std::vector bincodeSerialize() const; @@ -1047,9 +1047,9 @@ namespace Circuit { }; struct MemoryOp { - Circuit::BlockId block_id; - Circuit::MemOp op; - std::optional predicate; + Program::BlockId block_id; + Program::MemOp op; + std::optional predicate; friend bool operator==(const MemoryOp&, const MemoryOp&); std::vector bincodeSerialize() const; @@ -1057,8 +1057,8 @@ namespace Circuit { }; struct MemoryInit { - Circuit::BlockId block_id; - std::vector init; + Program::BlockId block_id; + std::vector init; friend bool operator==(const MemoryInit&, const MemoryInit&); std::vector bincodeSerialize() const; @@ -1067,8 +1067,8 @@ namespace Circuit { struct Call { uint32_t id; - std::vector inputs; - std::vector outputs; + std::vector inputs; + std::vector outputs; friend bool operator==(const Call&, const Call&); std::vector bincodeSerialize() const; @@ -1132,7 +1132,7 @@ namespace Circuit { }; struct PublicInputs { - std::vector value; + std::vector value; friend bool operator==(const PublicInputs&, const PublicInputs&); std::vector bincodeSerialize() const; @@ -1141,12 +1141,12 @@ namespace Circuit { struct Circuit { uint32_t current_witness_index; - std::vector opcodes; - Circuit::ExpressionWidth expression_width; - std::vector private_parameters; - Circuit::PublicInputs public_parameters; - Circuit::PublicInputs return_values; - std::vector> assert_messages; + std::vector opcodes; + Program::ExpressionWidth expression_width; + std::vector private_parameters; + Program::PublicInputs public_parameters; + Program::PublicInputs return_values; + std::vector> assert_messages; bool recursive; friend bool operator==(const Circuit&, const Circuit&); @@ -1154,10 +1154,18 @@ namespace Circuit { static Circuit bincodeDeserialize(std::vector); }; -} // end of namespace Circuit + struct Program { + std::vector functions; + friend bool operator==(const Program&, const Program&); + std::vector bincodeSerialize() const; + static Program bincodeDeserialize(std::vector); + }; + +} // end of namespace Program -namespace Circuit { + +namespace Program { inline bool operator==(const BinaryFieldOp &lhs, const BinaryFieldOp &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -1179,11 +1187,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -1191,15 +1199,15 @@ void serde::Serializable::serialize(const Circuit::Binar template <> template -Circuit::BinaryFieldOp serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::BinaryFieldOp serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::BinaryFieldOp obj; + Program::BinaryFieldOp obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Add &lhs, const BinaryFieldOp::Add &rhs) { return true; @@ -1220,21 +1228,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Add &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp::Add &obj, Serializer &serializer) { } template <> template -Circuit::BinaryFieldOp::Add serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryFieldOp::Add obj; +Program::BinaryFieldOp::Add serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryFieldOp::Add obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Sub &lhs, const BinaryFieldOp::Sub &rhs) { return true; @@ -1255,21 +1263,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Sub &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp::Sub &obj, Serializer &serializer) { } template <> template -Circuit::BinaryFieldOp::Sub serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryFieldOp::Sub obj; +Program::BinaryFieldOp::Sub serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryFieldOp::Sub obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Mul &lhs, const BinaryFieldOp::Mul &rhs) { return true; @@ -1290,21 +1298,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Mul &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp::Mul &obj, Serializer &serializer) { } template <> template -Circuit::BinaryFieldOp::Mul serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryFieldOp::Mul obj; +Program::BinaryFieldOp::Mul serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryFieldOp::Mul obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Div &lhs, const BinaryFieldOp::Div &rhs) { return true; @@ -1325,21 +1333,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Div &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp::Div &obj, Serializer &serializer) { } template <> template -Circuit::BinaryFieldOp::Div serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryFieldOp::Div obj; +Program::BinaryFieldOp::Div serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryFieldOp::Div obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::IntegerDiv &lhs, const BinaryFieldOp::IntegerDiv &rhs) { return true; @@ -1360,21 +1368,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::IntegerDiv &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp::IntegerDiv &obj, Serializer &serializer) { } template <> template -Circuit::BinaryFieldOp::IntegerDiv serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryFieldOp::IntegerDiv obj; +Program::BinaryFieldOp::IntegerDiv serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryFieldOp::IntegerDiv obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::Equals &lhs, const BinaryFieldOp::Equals &rhs) { return true; @@ -1395,21 +1403,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Equals &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp::Equals &obj, Serializer &serializer) { } template <> template -Circuit::BinaryFieldOp::Equals serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryFieldOp::Equals obj; +Program::BinaryFieldOp::Equals serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryFieldOp::Equals obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::LessThan &lhs, const BinaryFieldOp::LessThan &rhs) { return true; @@ -1430,21 +1438,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::LessThan &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp::LessThan &obj, Serializer &serializer) { } template <> template -Circuit::BinaryFieldOp::LessThan serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryFieldOp::LessThan obj; +Program::BinaryFieldOp::LessThan serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryFieldOp::LessThan obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryFieldOp::LessThanEquals &lhs, const BinaryFieldOp::LessThanEquals &rhs) { return true; @@ -1465,21 +1473,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryFieldOp::LessThanEquals &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryFieldOp::LessThanEquals &obj, Serializer &serializer) { } template <> template -Circuit::BinaryFieldOp::LessThanEquals serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryFieldOp::LessThanEquals obj; +Program::BinaryFieldOp::LessThanEquals serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryFieldOp::LessThanEquals obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp &lhs, const BinaryIntOp &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -1501,11 +1509,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -1513,15 +1521,15 @@ void serde::Serializable::serialize(const Circuit::BinaryI template <> template -Circuit::BinaryIntOp serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::BinaryIntOp serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::BinaryIntOp obj; + Program::BinaryIntOp obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Add &lhs, const BinaryIntOp::Add &rhs) { return true; @@ -1542,21 +1550,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Add &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Add &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Add serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Add obj; +Program::BinaryIntOp::Add serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Add obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Sub &lhs, const BinaryIntOp::Sub &rhs) { return true; @@ -1577,21 +1585,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Sub &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Sub &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Sub serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Sub obj; +Program::BinaryIntOp::Sub serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Sub obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Mul &lhs, const BinaryIntOp::Mul &rhs) { return true; @@ -1612,21 +1620,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Mul &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Mul &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Mul serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Mul obj; +Program::BinaryIntOp::Mul serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Mul obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Div &lhs, const BinaryIntOp::Div &rhs) { return true; @@ -1647,21 +1655,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Div &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Div &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Div serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Div obj; +Program::BinaryIntOp::Div serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Div obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Equals &lhs, const BinaryIntOp::Equals &rhs) { return true; @@ -1682,21 +1690,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Equals &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Equals &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Equals serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Equals obj; +Program::BinaryIntOp::Equals serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Equals obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::LessThan &lhs, const BinaryIntOp::LessThan &rhs) { return true; @@ -1717,21 +1725,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::LessThan &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::LessThan &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::LessThan serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::LessThan obj; +Program::BinaryIntOp::LessThan serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::LessThan obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::LessThanEquals &lhs, const BinaryIntOp::LessThanEquals &rhs) { return true; @@ -1752,21 +1760,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::LessThanEquals &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::LessThanEquals &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::LessThanEquals serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::LessThanEquals obj; +Program::BinaryIntOp::LessThanEquals serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::LessThanEquals obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::And &lhs, const BinaryIntOp::And &rhs) { return true; @@ -1787,21 +1795,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::And &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::And &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::And serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::And obj; +Program::BinaryIntOp::And serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::And obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Or &lhs, const BinaryIntOp::Or &rhs) { return true; @@ -1822,21 +1830,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Or &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Or &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Or serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Or obj; +Program::BinaryIntOp::Or serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Or obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Xor &lhs, const BinaryIntOp::Xor &rhs) { return true; @@ -1857,21 +1865,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Xor &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Xor &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Xor serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Xor obj; +Program::BinaryIntOp::Xor serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Xor obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Shl &lhs, const BinaryIntOp::Shl &rhs) { return true; @@ -1892,21 +1900,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Shl &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Shl &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Shl serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Shl obj; +Program::BinaryIntOp::Shl serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Shl obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BinaryIntOp::Shr &lhs, const BinaryIntOp::Shr &rhs) { return true; @@ -1927,21 +1935,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BinaryIntOp::Shr &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BinaryIntOp::Shr &obj, Serializer &serializer) { } template <> template -Circuit::BinaryIntOp::Shr serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BinaryIntOp::Shr obj; +Program::BinaryIntOp::Shr serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BinaryIntOp::Shr obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall &lhs, const BlackBoxFuncCall &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -1963,11 +1971,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -1975,15 +1983,15 @@ void serde::Serializable::serialize(const Circuit::Bl template <> template -Circuit::BlackBoxFuncCall serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::BlackBoxFuncCall serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::BlackBoxFuncCall obj; + Program::BlackBoxFuncCall obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::AND &lhs, const BlackBoxFuncCall::AND &rhs) { if (!(lhs.lhs == rhs.lhs)) { return false; } @@ -2007,11 +2015,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::AND &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::AND &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -2019,15 +2027,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxFuncCall::AND serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::AND obj; +Program::BlackBoxFuncCall::AND serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::AND obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::XOR &lhs, const BlackBoxFuncCall::XOR &rhs) { if (!(lhs.lhs == rhs.lhs)) { return false; } @@ -2051,11 +2059,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::XOR &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::XOR &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -2063,15 +2071,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxFuncCall::XOR serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::XOR obj; +Program::BlackBoxFuncCall::XOR serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::XOR obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::RANGE &lhs, const BlackBoxFuncCall::RANGE &rhs) { if (!(lhs.input == rhs.input)) { return false; } @@ -2093,23 +2101,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::RANGE &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::RANGE &obj, Serializer &serializer) { serde::Serializable::serialize(obj.input, serializer); } template <> template -Circuit::BlackBoxFuncCall::RANGE serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::RANGE obj; +Program::BlackBoxFuncCall::RANGE serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::RANGE obj; obj.input = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::SHA256 &lhs, const BlackBoxFuncCall::SHA256 &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -2132,25 +2140,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::SHA256 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::SHA256 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); } template <> template -Circuit::BlackBoxFuncCall::SHA256 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::SHA256 obj; +Program::BlackBoxFuncCall::SHA256 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::SHA256 obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Blake2s &lhs, const BlackBoxFuncCall::Blake2s &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -2173,25 +2181,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Blake2s &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Blake2s &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); } template <> template -Circuit::BlackBoxFuncCall::Blake2s serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::Blake2s obj; +Program::BlackBoxFuncCall::Blake2s serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::Blake2s obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Blake3 &lhs, const BlackBoxFuncCall::Blake3 &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -2214,25 +2222,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Blake3 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Blake3 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); } template <> template -Circuit::BlackBoxFuncCall::Blake3 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::Blake3 obj; +Program::BlackBoxFuncCall::Blake3 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::Blake3 obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::SchnorrVerify &lhs, const BlackBoxFuncCall::SchnorrVerify &rhs) { if (!(lhs.public_key_x == rhs.public_key_x)) { return false; } @@ -2258,11 +2266,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::SchnorrVerify &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::SchnorrVerify &obj, Serializer &serializer) { serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); serde::Serializable::serialize(obj.signature, serializer); @@ -2272,8 +2280,8 @@ void serde::Serializable::serialize(co template <> template -Circuit::BlackBoxFuncCall::SchnorrVerify serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::SchnorrVerify obj; +Program::BlackBoxFuncCall::SchnorrVerify serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::SchnorrVerify obj; obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); obj.signature = serde::Deserializable::deserialize(deserializer); @@ -2282,7 +2290,7 @@ Circuit::BlackBoxFuncCall::SchnorrVerify serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::PedersenCommitment &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::PedersenCommitment &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.domain_separator, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -2318,15 +2326,15 @@ void serde::Serializable::seriali template <> template -Circuit::BlackBoxFuncCall::PedersenCommitment serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::PedersenCommitment obj; +Program::BlackBoxFuncCall::PedersenCommitment serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::PedersenCommitment obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.domain_separator = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::PedersenHash &lhs, const BlackBoxFuncCall::PedersenHash &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -2350,11 +2358,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::PedersenHash &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::PedersenHash &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.domain_separator, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -2362,15 +2370,15 @@ void serde::Serializable::serialize(con template <> template -Circuit::BlackBoxFuncCall::PedersenHash serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::PedersenHash obj; +Program::BlackBoxFuncCall::PedersenHash serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::PedersenHash obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.domain_separator = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::EcdsaSecp256k1 &lhs, const BlackBoxFuncCall::EcdsaSecp256k1 &rhs) { if (!(lhs.public_key_x == rhs.public_key_x)) { return false; } @@ -2396,11 +2404,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::EcdsaSecp256k1 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::EcdsaSecp256k1 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); serde::Serializable::serialize(obj.signature, serializer); @@ -2410,8 +2418,8 @@ void serde::Serializable::serialize(c template <> template -Circuit::BlackBoxFuncCall::EcdsaSecp256k1 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::EcdsaSecp256k1 obj; +Program::BlackBoxFuncCall::EcdsaSecp256k1 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::EcdsaSecp256k1 obj; obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); obj.signature = serde::Deserializable::deserialize(deserializer); @@ -2420,7 +2428,7 @@ Circuit::BlackBoxFuncCall::EcdsaSecp256k1 serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::EcdsaSecp256r1 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::EcdsaSecp256r1 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); serde::Serializable::serialize(obj.signature, serializer); @@ -2460,8 +2468,8 @@ void serde::Serializable::serialize(c template <> template -Circuit::BlackBoxFuncCall::EcdsaSecp256r1 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::EcdsaSecp256r1 obj; +Program::BlackBoxFuncCall::EcdsaSecp256r1 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::EcdsaSecp256r1 obj; obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); obj.signature = serde::Deserializable::deserialize(deserializer); @@ -2470,7 +2478,7 @@ Circuit::BlackBoxFuncCall::EcdsaSecp256r1 serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::FixedBaseScalarMul &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::FixedBaseScalarMul &obj, Serializer &serializer) { serde::Serializable::serialize(obj.low, serializer); serde::Serializable::serialize(obj.high, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -2506,15 +2514,15 @@ void serde::Serializable::seriali template <> template -Circuit::BlackBoxFuncCall::FixedBaseScalarMul serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::FixedBaseScalarMul obj; +Program::BlackBoxFuncCall::FixedBaseScalarMul serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::FixedBaseScalarMul obj; obj.low = serde::Deserializable::deserialize(deserializer); obj.high = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::EmbeddedCurveAdd &lhs, const BlackBoxFuncCall::EmbeddedCurveAdd &rhs) { if (!(lhs.input1_x == rhs.input1_x)) { return false; } @@ -2540,11 +2548,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::EmbeddedCurveAdd &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::EmbeddedCurveAdd &obj, Serializer &serializer) { serde::Serializable::serialize(obj.input1_x, serializer); serde::Serializable::serialize(obj.input1_y, serializer); serde::Serializable::serialize(obj.input2_x, serializer); @@ -2554,8 +2562,8 @@ void serde::Serializable::serialize template <> template -Circuit::BlackBoxFuncCall::EmbeddedCurveAdd serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::EmbeddedCurveAdd obj; +Program::BlackBoxFuncCall::EmbeddedCurveAdd serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::EmbeddedCurveAdd obj; obj.input1_x = serde::Deserializable::deserialize(deserializer); obj.input1_y = serde::Deserializable::deserialize(deserializer); obj.input2_x = serde::Deserializable::deserialize(deserializer); @@ -2564,7 +2572,7 @@ Circuit::BlackBoxFuncCall::EmbeddedCurveAdd serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Keccak256 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Keccak256 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); } template <> template -Circuit::BlackBoxFuncCall::Keccak256 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::Keccak256 obj; +Program::BlackBoxFuncCall::Keccak256 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::Keccak256 obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Keccak256VariableLength &lhs, const BlackBoxFuncCall::Keccak256VariableLength &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -2629,11 +2637,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Keccak256VariableLength &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Keccak256VariableLength &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.var_message_size, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -2641,15 +2649,15 @@ void serde::Serializable::se template <> template -Circuit::BlackBoxFuncCall::Keccak256VariableLength serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::Keccak256VariableLength obj; +Program::BlackBoxFuncCall::Keccak256VariableLength serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::Keccak256VariableLength obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.var_message_size = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Keccakf1600 &lhs, const BlackBoxFuncCall::Keccakf1600 &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -2672,25 +2680,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Keccakf1600 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Keccakf1600 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); } template <> template -Circuit::BlackBoxFuncCall::Keccakf1600 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::Keccakf1600 obj; +Program::BlackBoxFuncCall::Keccakf1600 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::Keccakf1600 obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::RecursiveAggregation &lhs, const BlackBoxFuncCall::RecursiveAggregation &rhs) { if (!(lhs.verification_key == rhs.verification_key)) { return false; } @@ -2715,11 +2723,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::RecursiveAggregation &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::RecursiveAggregation &obj, Serializer &serializer) { serde::Serializable::serialize(obj.verification_key, serializer); serde::Serializable::serialize(obj.proof, serializer); serde::Serializable::serialize(obj.public_inputs, serializer); @@ -2728,8 +2736,8 @@ void serde::Serializable::seria template <> template -Circuit::BlackBoxFuncCall::RecursiveAggregation serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::RecursiveAggregation obj; +Program::BlackBoxFuncCall::RecursiveAggregation serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::RecursiveAggregation obj; obj.verification_key = serde::Deserializable::deserialize(deserializer); obj.proof = serde::Deserializable::deserialize(deserializer); obj.public_inputs = serde::Deserializable::deserialize(deserializer); @@ -2737,7 +2745,7 @@ Circuit::BlackBoxFuncCall::RecursiveAggregation serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::BigIntAdd &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::BigIntAdd &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -2773,15 +2781,15 @@ void serde::Serializable::serialize(const template <> template -Circuit::BlackBoxFuncCall::BigIntAdd serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::BigIntAdd obj; +Program::BlackBoxFuncCall::BigIntAdd serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::BigIntAdd obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntSub &lhs, const BlackBoxFuncCall::BigIntSub &rhs) { if (!(lhs.lhs == rhs.lhs)) { return false; } @@ -2805,11 +2813,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::BigIntSub &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::BigIntSub &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -2817,15 +2825,15 @@ void serde::Serializable::serialize(const template <> template -Circuit::BlackBoxFuncCall::BigIntSub serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::BigIntSub obj; +Program::BlackBoxFuncCall::BigIntSub serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::BigIntSub obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntMul &lhs, const BlackBoxFuncCall::BigIntMul &rhs) { if (!(lhs.lhs == rhs.lhs)) { return false; } @@ -2849,11 +2857,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::BigIntMul &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::BigIntMul &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -2861,15 +2869,15 @@ void serde::Serializable::serialize(const template <> template -Circuit::BlackBoxFuncCall::BigIntMul serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::BigIntMul obj; +Program::BlackBoxFuncCall::BigIntMul serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::BigIntMul obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntDiv &lhs, const BlackBoxFuncCall::BigIntDiv &rhs) { if (!(lhs.lhs == rhs.lhs)) { return false; } @@ -2893,11 +2901,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::BigIntDiv &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::BigIntDiv &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -2905,15 +2913,15 @@ void serde::Serializable::serialize(const template <> template -Circuit::BlackBoxFuncCall::BigIntDiv serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::BigIntDiv obj; +Program::BlackBoxFuncCall::BigIntDiv serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::BigIntDiv obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntFromLeBytes &lhs, const BlackBoxFuncCall::BigIntFromLeBytes &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -2937,11 +2945,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::BigIntFromLeBytes &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::BigIntFromLeBytes &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.modulus, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -2949,15 +2957,15 @@ void serde::Serializable::serializ template <> template -Circuit::BlackBoxFuncCall::BigIntFromLeBytes serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::BigIntFromLeBytes obj; +Program::BlackBoxFuncCall::BigIntFromLeBytes serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::BigIntFromLeBytes obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.modulus = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::BigIntToLeBytes &lhs, const BlackBoxFuncCall::BigIntToLeBytes &rhs) { if (!(lhs.input == rhs.input)) { return false; } @@ -2980,25 +2988,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::BigIntToLeBytes &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::BigIntToLeBytes &obj, Serializer &serializer) { serde::Serializable::serialize(obj.input, serializer); serde::Serializable::serialize(obj.outputs, serializer); } template <> template -Circuit::BlackBoxFuncCall::BigIntToLeBytes serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::BigIntToLeBytes obj; +Program::BlackBoxFuncCall::BigIntToLeBytes serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::BigIntToLeBytes obj; obj.input = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Poseidon2Permutation &lhs, const BlackBoxFuncCall::Poseidon2Permutation &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -3022,11 +3030,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Poseidon2Permutation &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Poseidon2Permutation &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); serde::Serializable::serialize(obj.len, serializer); @@ -3034,15 +3042,15 @@ void serde::Serializable::seria template <> template -Circuit::BlackBoxFuncCall::Poseidon2Permutation serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::Poseidon2Permutation obj; +Program::BlackBoxFuncCall::Poseidon2Permutation serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::Poseidon2Permutation obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); obj.len = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxFuncCall::Sha256Compression &lhs, const BlackBoxFuncCall::Sha256Compression &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -3066,11 +3074,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Sha256Compression &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxFuncCall::Sha256Compression &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.hash_values, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -3078,15 +3086,15 @@ void serde::Serializable::serializ template <> template -Circuit::BlackBoxFuncCall::Sha256Compression serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxFuncCall::Sha256Compression obj; +Program::BlackBoxFuncCall::Sha256Compression serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxFuncCall::Sha256Compression obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.hash_values = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp &lhs, const BlackBoxOp &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -3108,11 +3116,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -3120,15 +3128,15 @@ void serde::Serializable::serialize(const Circuit::BlackBox template <> template -Circuit::BlackBoxOp serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::BlackBoxOp serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::BlackBoxOp obj; + Program::BlackBoxOp obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Sha256 &lhs, const BlackBoxOp::Sha256 &rhs) { if (!(lhs.message == rhs.message)) { return false; } @@ -3151,25 +3159,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Sha256 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::Sha256 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.message, serializer); serde::Serializable::serialize(obj.output, serializer); } template <> template -Circuit::BlackBoxOp::Sha256 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::Sha256 obj; +Program::BlackBoxOp::Sha256 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::Sha256 obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Blake2s &lhs, const BlackBoxOp::Blake2s &rhs) { if (!(lhs.message == rhs.message)) { return false; } @@ -3192,25 +3200,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Blake2s &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::Blake2s &obj, Serializer &serializer) { serde::Serializable::serialize(obj.message, serializer); serde::Serializable::serialize(obj.output, serializer); } template <> template -Circuit::BlackBoxOp::Blake2s serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::Blake2s obj; +Program::BlackBoxOp::Blake2s serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::Blake2s obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Blake3 &lhs, const BlackBoxOp::Blake3 &rhs) { if (!(lhs.message == rhs.message)) { return false; } @@ -3233,25 +3241,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Blake3 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::Blake3 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.message, serializer); serde::Serializable::serialize(obj.output, serializer); } template <> template -Circuit::BlackBoxOp::Blake3 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::Blake3 obj; +Program::BlackBoxOp::Blake3 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::Blake3 obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Keccak256 &lhs, const BlackBoxOp::Keccak256 &rhs) { if (!(lhs.message == rhs.message)) { return false; } @@ -3274,25 +3282,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Keccak256 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::Keccak256 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.message, serializer); serde::Serializable::serialize(obj.output, serializer); } template <> template -Circuit::BlackBoxOp::Keccak256 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::Keccak256 obj; +Program::BlackBoxOp::Keccak256 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::Keccak256 obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Keccakf1600 &lhs, const BlackBoxOp::Keccakf1600 &rhs) { if (!(lhs.message == rhs.message)) { return false; } @@ -3315,25 +3323,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Keccakf1600 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::Keccakf1600 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.message, serializer); serde::Serializable::serialize(obj.output, serializer); } template <> template -Circuit::BlackBoxOp::Keccakf1600 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::Keccakf1600 obj; +Program::BlackBoxOp::Keccakf1600 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::Keccakf1600 obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::EcdsaSecp256k1 &lhs, const BlackBoxOp::EcdsaSecp256k1 &rhs) { if (!(lhs.hashed_msg == rhs.hashed_msg)) { return false; } @@ -3359,11 +3367,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::EcdsaSecp256k1 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::EcdsaSecp256k1 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.hashed_msg, serializer); serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); @@ -3373,8 +3381,8 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BlackBoxOp::EcdsaSecp256k1 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::EcdsaSecp256k1 obj; +Program::BlackBoxOp::EcdsaSecp256k1 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::EcdsaSecp256k1 obj; obj.hashed_msg = serde::Deserializable::deserialize(deserializer); obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); @@ -3383,7 +3391,7 @@ Circuit::BlackBoxOp::EcdsaSecp256k1 serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::EcdsaSecp256r1 &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::EcdsaSecp256r1 &obj, Serializer &serializer) { serde::Serializable::serialize(obj.hashed_msg, serializer); serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); @@ -3423,8 +3431,8 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BlackBoxOp::EcdsaSecp256r1 serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::EcdsaSecp256r1 obj; +Program::BlackBoxOp::EcdsaSecp256r1 serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::EcdsaSecp256r1 obj; obj.hashed_msg = serde::Deserializable::deserialize(deserializer); obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); @@ -3433,7 +3441,7 @@ Circuit::BlackBoxOp::EcdsaSecp256r1 serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::SchnorrVerify &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::SchnorrVerify &obj, Serializer &serializer) { serde::Serializable::serialize(obj.public_key_x, serializer); serde::Serializable::serialize(obj.public_key_y, serializer); serde::Serializable::serialize(obj.message, serializer); @@ -3473,8 +3481,8 @@ void serde::Serializable::serialize(const Ci template <> template -Circuit::BlackBoxOp::SchnorrVerify serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::SchnorrVerify obj; +Program::BlackBoxOp::SchnorrVerify serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::SchnorrVerify obj; obj.public_key_x = serde::Deserializable::deserialize(deserializer); obj.public_key_y = serde::Deserializable::deserialize(deserializer); obj.message = serde::Deserializable::deserialize(deserializer); @@ -3483,7 +3491,7 @@ Circuit::BlackBoxOp::SchnorrVerify serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::PedersenCommitment &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::PedersenCommitment &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.domain_separator, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -3519,15 +3527,15 @@ void serde::Serializable::serialize(con template <> template -Circuit::BlackBoxOp::PedersenCommitment serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::PedersenCommitment obj; +Program::BlackBoxOp::PedersenCommitment serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::PedersenCommitment obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.domain_separator = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::PedersenHash &lhs, const BlackBoxOp::PedersenHash &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -3551,11 +3559,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::PedersenHash &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::PedersenHash &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.domain_separator, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -3563,15 +3571,15 @@ void serde::Serializable::serialize(const Cir template <> template -Circuit::BlackBoxOp::PedersenHash serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::PedersenHash obj; +Program::BlackBoxOp::PedersenHash serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::PedersenHash obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.domain_separator = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::FixedBaseScalarMul &lhs, const BlackBoxOp::FixedBaseScalarMul &rhs) { if (!(lhs.low == rhs.low)) { return false; } @@ -3595,11 +3603,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::FixedBaseScalarMul &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::FixedBaseScalarMul &obj, Serializer &serializer) { serde::Serializable::serialize(obj.low, serializer); serde::Serializable::serialize(obj.high, serializer); serde::Serializable::serialize(obj.result, serializer); @@ -3607,15 +3615,15 @@ void serde::Serializable::serialize(con template <> template -Circuit::BlackBoxOp::FixedBaseScalarMul serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::FixedBaseScalarMul obj; +Program::BlackBoxOp::FixedBaseScalarMul serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::FixedBaseScalarMul obj; obj.low = serde::Deserializable::deserialize(deserializer); obj.high = serde::Deserializable::deserialize(deserializer); obj.result = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::EmbeddedCurveAdd &lhs, const BlackBoxOp::EmbeddedCurveAdd &rhs) { if (!(lhs.input1_x == rhs.input1_x)) { return false; } @@ -3641,11 +3649,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::EmbeddedCurveAdd &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::EmbeddedCurveAdd &obj, Serializer &serializer) { serde::Serializable::serialize(obj.input1_x, serializer); serde::Serializable::serialize(obj.input1_y, serializer); serde::Serializable::serialize(obj.input2_x, serializer); @@ -3655,8 +3663,8 @@ void serde::Serializable::serialize(const template <> template -Circuit::BlackBoxOp::EmbeddedCurveAdd serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::EmbeddedCurveAdd obj; +Program::BlackBoxOp::EmbeddedCurveAdd serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::EmbeddedCurveAdd obj; obj.input1_x = serde::Deserializable::deserialize(deserializer); obj.input1_y = serde::Deserializable::deserialize(deserializer); obj.input2_x = serde::Deserializable::deserialize(deserializer); @@ -3665,7 +3673,7 @@ Circuit::BlackBoxOp::EmbeddedCurveAdd serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntAdd &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntAdd &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -3701,15 +3709,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::BigIntAdd serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::BigIntAdd obj; +Program::BlackBoxOp::BigIntAdd serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::BigIntAdd obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntSub &lhs, const BlackBoxOp::BigIntSub &rhs) { if (!(lhs.lhs == rhs.lhs)) { return false; } @@ -3733,11 +3741,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntSub &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntSub &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -3745,15 +3753,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::BigIntSub serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::BigIntSub obj; +Program::BlackBoxOp::BigIntSub serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::BigIntSub obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntMul &lhs, const BlackBoxOp::BigIntMul &rhs) { if (!(lhs.lhs == rhs.lhs)) { return false; } @@ -3777,11 +3785,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntMul &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntMul &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -3789,15 +3797,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::BigIntMul serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::BigIntMul obj; +Program::BlackBoxOp::BigIntMul serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::BigIntMul obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntDiv &lhs, const BlackBoxOp::BigIntDiv &rhs) { if (!(lhs.lhs == rhs.lhs)) { return false; } @@ -3821,11 +3829,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntDiv &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntDiv &obj, Serializer &serializer) { serde::Serializable::serialize(obj.lhs, serializer); serde::Serializable::serialize(obj.rhs, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -3833,15 +3841,15 @@ void serde::Serializable::serialize(const Circui template <> template -Circuit::BlackBoxOp::BigIntDiv serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::BigIntDiv obj; +Program::BlackBoxOp::BigIntDiv serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::BigIntDiv obj; obj.lhs = serde::Deserializable::deserialize(deserializer); obj.rhs = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntFromLeBytes &lhs, const BlackBoxOp::BigIntFromLeBytes &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -3865,11 +3873,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntFromLeBytes &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntFromLeBytes &obj, Serializer &serializer) { serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.modulus, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -3877,15 +3885,15 @@ void serde::Serializable::serialize(cons template <> template -Circuit::BlackBoxOp::BigIntFromLeBytes serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::BigIntFromLeBytes obj; +Program::BlackBoxOp::BigIntFromLeBytes serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::BigIntFromLeBytes obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.modulus = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::BigIntToLeBytes &lhs, const BlackBoxOp::BigIntToLeBytes &rhs) { if (!(lhs.input == rhs.input)) { return false; } @@ -3908,25 +3916,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::BigIntToLeBytes &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::BigIntToLeBytes &obj, Serializer &serializer) { serde::Serializable::serialize(obj.input, serializer); serde::Serializable::serialize(obj.output, serializer); } template <> template -Circuit::BlackBoxOp::BigIntToLeBytes serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::BigIntToLeBytes obj; +Program::BlackBoxOp::BigIntToLeBytes serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::BigIntToLeBytes obj; obj.input = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Poseidon2Permutation &lhs, const BlackBoxOp::Poseidon2Permutation &rhs) { if (!(lhs.message == rhs.message)) { return false; } @@ -3950,11 +3958,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Poseidon2Permutation &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::Poseidon2Permutation &obj, Serializer &serializer) { serde::Serializable::serialize(obj.message, serializer); serde::Serializable::serialize(obj.output, serializer); serde::Serializable::serialize(obj.len, serializer); @@ -3962,15 +3970,15 @@ void serde::Serializable::serialize(c template <> template -Circuit::BlackBoxOp::Poseidon2Permutation serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::Poseidon2Permutation obj; +Program::BlackBoxOp::Poseidon2Permutation serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::Poseidon2Permutation obj; obj.message = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); obj.len = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlackBoxOp::Sha256Compression &lhs, const BlackBoxOp::Sha256Compression &rhs) { if (!(lhs.input == rhs.input)) { return false; } @@ -3994,11 +4002,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlackBoxOp::Sha256Compression &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlackBoxOp::Sha256Compression &obj, Serializer &serializer) { serde::Serializable::serialize(obj.input, serializer); serde::Serializable::serialize(obj.hash_values, serializer); serde::Serializable::serialize(obj.output, serializer); @@ -4006,15 +4014,15 @@ void serde::Serializable::serialize(cons template <> template -Circuit::BlackBoxOp::Sha256Compression serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BlackBoxOp::Sha256Compression obj; +Program::BlackBoxOp::Sha256Compression serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BlackBoxOp::Sha256Compression obj; obj.input = serde::Deserializable::deserialize(deserializer); obj.hash_values = serde::Deserializable::deserialize(deserializer); obj.output = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BlockId &lhs, const BlockId &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -4036,11 +4044,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BlockId &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BlockId &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -4048,15 +4056,15 @@ void serde::Serializable::serialize(const Circuit::BlockId &ob template <> template -Circuit::BlockId serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::BlockId serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::BlockId obj; + Program::BlockId obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Brillig &lhs, const Brillig &rhs) { if (!(lhs.inputs == rhs.inputs)) { return false; } @@ -4081,11 +4089,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Brillig &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Brillig &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -4096,9 +4104,9 @@ void serde::Serializable::serialize(const Circuit::Brillig &ob template <> template -Circuit::Brillig serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::Brillig serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::Brillig obj; + Program::Brillig obj; obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); obj.bytecode = serde::Deserializable::deserialize(deserializer); @@ -4107,7 +4115,7 @@ Circuit::Brillig serde::Deserializable::deserialize(Deserializ return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligInputs &lhs, const BrilligInputs &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -4129,11 +4137,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligInputs &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligInputs &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -4141,15 +4149,15 @@ void serde::Serializable::serialize(const Circuit::Brill template <> template -Circuit::BrilligInputs serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::BrilligInputs serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::BrilligInputs obj; + Program::BrilligInputs obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligInputs::Single &lhs, const BrilligInputs::Single &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -4171,23 +4179,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligInputs::Single &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligInputs::Single &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::BrilligInputs::Single serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligInputs::Single obj; +Program::BrilligInputs::Single serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligInputs::Single obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligInputs::Array &lhs, const BrilligInputs::Array &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -4209,23 +4217,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligInputs::Array &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligInputs::Array &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::BrilligInputs::Array serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligInputs::Array obj; +Program::BrilligInputs::Array serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligInputs::Array obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligInputs::MemoryArray &lhs, const BrilligInputs::MemoryArray &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -4247,23 +4255,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligInputs::MemoryArray &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligInputs::MemoryArray &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::BrilligInputs::MemoryArray serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligInputs::MemoryArray obj; +Program::BrilligInputs::MemoryArray serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligInputs::MemoryArray obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode &lhs, const BrilligOpcode &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -4285,11 +4293,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -4297,15 +4305,15 @@ void serde::Serializable::serialize(const Circuit::Brill template <> template -Circuit::BrilligOpcode serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::BrilligOpcode serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::BrilligOpcode obj; + Program::BrilligOpcode obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::BinaryFieldOp &lhs, const BrilligOpcode::BinaryFieldOp &rhs) { if (!(lhs.destination == rhs.destination)) { return false; } @@ -4330,11 +4338,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::BinaryFieldOp &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::BinaryFieldOp &obj, Serializer &serializer) { serde::Serializable::serialize(obj.destination, serializer); serde::Serializable::serialize(obj.op, serializer); serde::Serializable::serialize(obj.lhs, serializer); @@ -4343,8 +4351,8 @@ void serde::Serializable::serialize(const template <> template -Circuit::BrilligOpcode::BinaryFieldOp serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::BinaryFieldOp obj; +Program::BrilligOpcode::BinaryFieldOp serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::BinaryFieldOp obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.op = serde::Deserializable::deserialize(deserializer); obj.lhs = serde::Deserializable::deserialize(deserializer); @@ -4352,7 +4360,7 @@ Circuit::BrilligOpcode::BinaryFieldOp serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::BinaryIntOp &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::BinaryIntOp &obj, Serializer &serializer) { serde::Serializable::serialize(obj.destination, serializer); serde::Serializable::serialize(obj.op, serializer); serde::Serializable::serialize(obj.bit_size, serializer); @@ -4392,8 +4400,8 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BrilligOpcode::BinaryIntOp serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::BinaryIntOp obj; +Program::BrilligOpcode::BinaryIntOp serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::BinaryIntOp obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.op = serde::Deserializable::deserialize(deserializer); obj.bit_size = serde::Deserializable::deserialize(deserializer); @@ -4402,7 +4410,7 @@ Circuit::BrilligOpcode::BinaryIntOp serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Cast &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Cast &obj, Serializer &serializer) { serde::Serializable::serialize(obj.destination, serializer); serde::Serializable::serialize(obj.source, serializer); serde::Serializable::serialize(obj.bit_size, serializer); @@ -4438,15 +4446,15 @@ void serde::Serializable::serialize(const Circuit: template <> template -Circuit::BrilligOpcode::Cast serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Cast obj; +Program::BrilligOpcode::Cast serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Cast obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.source = serde::Deserializable::deserialize(deserializer); obj.bit_size = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::JumpIfNot &lhs, const BrilligOpcode::JumpIfNot &rhs) { if (!(lhs.condition == rhs.condition)) { return false; } @@ -4469,25 +4477,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::JumpIfNot &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::JumpIfNot &obj, Serializer &serializer) { serde::Serializable::serialize(obj.condition, serializer); serde::Serializable::serialize(obj.location, serializer); } template <> template -Circuit::BrilligOpcode::JumpIfNot serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::JumpIfNot obj; +Program::BrilligOpcode::JumpIfNot serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::JumpIfNot obj; obj.condition = serde::Deserializable::deserialize(deserializer); obj.location = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::JumpIf &lhs, const BrilligOpcode::JumpIf &rhs) { if (!(lhs.condition == rhs.condition)) { return false; } @@ -4510,25 +4518,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::JumpIf &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::JumpIf &obj, Serializer &serializer) { serde::Serializable::serialize(obj.condition, serializer); serde::Serializable::serialize(obj.location, serializer); } template <> template -Circuit::BrilligOpcode::JumpIf serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::JumpIf obj; +Program::BrilligOpcode::JumpIf serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::JumpIf obj; obj.condition = serde::Deserializable::deserialize(deserializer); obj.location = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Jump &lhs, const BrilligOpcode::Jump &rhs) { if (!(lhs.location == rhs.location)) { return false; } @@ -4550,23 +4558,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Jump &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Jump &obj, Serializer &serializer) { serde::Serializable::serialize(obj.location, serializer); } template <> template -Circuit::BrilligOpcode::Jump serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Jump obj; +Program::BrilligOpcode::Jump serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Jump obj; obj.location = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::CalldataCopy &lhs, const BrilligOpcode::CalldataCopy &rhs) { if (!(lhs.destination_address == rhs.destination_address)) { return false; } @@ -4590,11 +4598,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::CalldataCopy &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::CalldataCopy &obj, Serializer &serializer) { serde::Serializable::serialize(obj.destination_address, serializer); serde::Serializable::serialize(obj.size, serializer); serde::Serializable::serialize(obj.offset, serializer); @@ -4602,15 +4610,15 @@ void serde::Serializable::serialize(const template <> template -Circuit::BrilligOpcode::CalldataCopy serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::CalldataCopy obj; +Program::BrilligOpcode::CalldataCopy serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::CalldataCopy obj; obj.destination_address = serde::Deserializable::deserialize(deserializer); obj.size = serde::Deserializable::deserialize(deserializer); obj.offset = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Call &lhs, const BrilligOpcode::Call &rhs) { if (!(lhs.location == rhs.location)) { return false; } @@ -4632,23 +4640,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Call &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Call &obj, Serializer &serializer) { serde::Serializable::serialize(obj.location, serializer); } template <> template -Circuit::BrilligOpcode::Call serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Call obj; +Program::BrilligOpcode::Call serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Call obj; obj.location = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Const &lhs, const BrilligOpcode::Const &rhs) { if (!(lhs.destination == rhs.destination)) { return false; } @@ -4672,11 +4680,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Const &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Const &obj, Serializer &serializer) { serde::Serializable::serialize(obj.destination, serializer); serde::Serializable::serialize(obj.bit_size, serializer); serde::Serializable::serialize(obj.value, serializer); @@ -4684,15 +4692,15 @@ void serde::Serializable::serialize(const Circuit template <> template -Circuit::BrilligOpcode::Const serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Const obj; +Program::BrilligOpcode::Const serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Const obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.bit_size = serde::Deserializable::deserialize(deserializer); obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Return &lhs, const BrilligOpcode::Return &rhs) { return true; @@ -4713,21 +4721,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Return &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Return &obj, Serializer &serializer) { } template <> template -Circuit::BrilligOpcode::Return serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Return obj; +Program::BrilligOpcode::Return serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Return obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::ForeignCall &lhs, const BrilligOpcode::ForeignCall &rhs) { if (!(lhs.function == rhs.function)) { return false; } @@ -4753,11 +4761,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::ForeignCall &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::ForeignCall &obj, Serializer &serializer) { serde::Serializable::serialize(obj.function, serializer); serde::Serializable::serialize(obj.destinations, serializer); serde::Serializable::serialize(obj.destination_value_types, serializer); @@ -4767,8 +4775,8 @@ void serde::Serializable::serialize(const C template <> template -Circuit::BrilligOpcode::ForeignCall serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::ForeignCall obj; +Program::BrilligOpcode::ForeignCall serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::ForeignCall obj; obj.function = serde::Deserializable::deserialize(deserializer); obj.destinations = serde::Deserializable::deserialize(deserializer); obj.destination_value_types = serde::Deserializable::deserialize(deserializer); @@ -4777,7 +4785,7 @@ Circuit::BrilligOpcode::ForeignCall serde::Deserializable template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Mov &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Mov &obj, Serializer &serializer) { serde::Serializable::serialize(obj.destination, serializer); serde::Serializable::serialize(obj.source, serializer); } template <> template -Circuit::BrilligOpcode::Mov serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Mov obj; +Program::BrilligOpcode::Mov serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Mov obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.source = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Load &lhs, const BrilligOpcode::Load &rhs) { if (!(lhs.destination == rhs.destination)) { return false; } @@ -4841,25 +4849,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Load &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Load &obj, Serializer &serializer) { serde::Serializable::serialize(obj.destination, serializer); serde::Serializable::serialize(obj.source_pointer, serializer); } template <> template -Circuit::BrilligOpcode::Load serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Load obj; +Program::BrilligOpcode::Load serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Load obj; obj.destination = serde::Deserializable::deserialize(deserializer); obj.source_pointer = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Store &lhs, const BrilligOpcode::Store &rhs) { if (!(lhs.destination_pointer == rhs.destination_pointer)) { return false; } @@ -4882,25 +4890,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Store &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Store &obj, Serializer &serializer) { serde::Serializable::serialize(obj.destination_pointer, serializer); serde::Serializable::serialize(obj.source, serializer); } template <> template -Circuit::BrilligOpcode::Store serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Store obj; +Program::BrilligOpcode::Store serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Store obj; obj.destination_pointer = serde::Deserializable::deserialize(deserializer); obj.source = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::BlackBox &lhs, const BrilligOpcode::BlackBox &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -4922,23 +4930,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::BlackBox &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::BlackBox &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::BrilligOpcode::BlackBox serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::BlackBox obj; +Program::BrilligOpcode::BlackBox serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::BlackBox obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Trap &lhs, const BrilligOpcode::Trap &rhs) { return true; @@ -4959,21 +4967,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Trap &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Trap &obj, Serializer &serializer) { } template <> template -Circuit::BrilligOpcode::Trap serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Trap obj; +Program::BrilligOpcode::Trap serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Trap obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOpcode::Stop &lhs, const BrilligOpcode::Stop &rhs) { if (!(lhs.return_data_offset == rhs.return_data_offset)) { return false; } @@ -4996,25 +5004,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOpcode::Stop &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOpcode::Stop &obj, Serializer &serializer) { serde::Serializable::serialize(obj.return_data_offset, serializer); serde::Serializable::serialize(obj.return_data_size, serializer); } template <> template -Circuit::BrilligOpcode::Stop serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOpcode::Stop obj; +Program::BrilligOpcode::Stop serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOpcode::Stop obj; obj.return_data_offset = serde::Deserializable::deserialize(deserializer); obj.return_data_size = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOutputs &lhs, const BrilligOutputs &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5036,11 +5044,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOutputs &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOutputs &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -5048,15 +5056,15 @@ void serde::Serializable::serialize(const Circuit::Bril template <> template -Circuit::BrilligOutputs serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::BrilligOutputs serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::BrilligOutputs obj; + Program::BrilligOutputs obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOutputs::Simple &lhs, const BrilligOutputs::Simple &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5078,23 +5086,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOutputs::Simple &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOutputs::Simple &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::BrilligOutputs::Simple serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOutputs::Simple obj; +Program::BrilligOutputs::Simple serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOutputs::Simple obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const BrilligOutputs::Array &lhs, const BrilligOutputs::Array &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5116,23 +5124,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::BrilligOutputs::Array &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::BrilligOutputs::Array &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::BrilligOutputs::Array serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::BrilligOutputs::Array obj; +Program::BrilligOutputs::Array serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::BrilligOutputs::Array obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Circuit &lhs, const Circuit &rhs) { if (!(lhs.current_witness_index == rhs.current_witness_index)) { return false; } @@ -5161,11 +5169,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Circuit &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Circuit &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.current_witness_index, serializer); serde::Serializable::serialize(obj.opcodes, serializer); @@ -5180,9 +5188,9 @@ void serde::Serializable::serialize(const Circuit::Circuit &ob template <> template -Circuit::Circuit serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::Circuit serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::Circuit obj; + Program::Circuit obj; obj.current_witness_index = serde::Deserializable::deserialize(deserializer); obj.opcodes = serde::Deserializable::deserialize(deserializer); obj.expression_width = serde::Deserializable::deserialize(deserializer); @@ -5195,7 +5203,7 @@ Circuit::Circuit serde::Deserializable::deserialize(Deserializ return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Directive &lhs, const Directive &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5217,11 +5225,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Directive &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Directive &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -5229,15 +5237,15 @@ void serde::Serializable::serialize(const Circuit::Directive template <> template -Circuit::Directive serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::Directive serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::Directive obj; + Program::Directive obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Directive::ToLeRadix &lhs, const Directive::ToLeRadix &rhs) { if (!(lhs.a == rhs.a)) { return false; } @@ -5261,11 +5269,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Directive::ToLeRadix &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Directive::ToLeRadix &obj, Serializer &serializer) { serde::Serializable::serialize(obj.a, serializer); serde::Serializable::serialize(obj.b, serializer); serde::Serializable::serialize(obj.radix, serializer); @@ -5273,15 +5281,15 @@ void serde::Serializable::serialize(const Circuit template <> template -Circuit::Directive::ToLeRadix serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::Directive::ToLeRadix obj; +Program::Directive::ToLeRadix serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::Directive::ToLeRadix obj; obj.a = serde::Deserializable::deserialize(deserializer); obj.b = serde::Deserializable::deserialize(deserializer); obj.radix = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Expression &lhs, const Expression &rhs) { if (!(lhs.mul_terms == rhs.mul_terms)) { return false; } @@ -5305,11 +5313,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Expression &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Expression &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.mul_terms, serializer); serde::Serializable::serialize(obj.linear_combinations, serializer); @@ -5319,9 +5327,9 @@ void serde::Serializable::serialize(const Circuit::Expressi template <> template -Circuit::Expression serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::Expression serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::Expression obj; + Program::Expression obj; obj.mul_terms = serde::Deserializable::deserialize(deserializer); obj.linear_combinations = serde::Deserializable::deserialize(deserializer); obj.q_c = serde::Deserializable::deserialize(deserializer); @@ -5329,7 +5337,7 @@ Circuit::Expression serde::Deserializable::deserialize(Dese return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ExpressionWidth &lhs, const ExpressionWidth &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5351,11 +5359,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ExpressionWidth &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::ExpressionWidth &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -5363,15 +5371,15 @@ void serde::Serializable::serialize(const Circuit::Exp template <> template -Circuit::ExpressionWidth serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::ExpressionWidth serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::ExpressionWidth obj; + Program::ExpressionWidth obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ExpressionWidth::Unbounded &lhs, const ExpressionWidth::Unbounded &rhs) { return true; @@ -5392,21 +5400,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ExpressionWidth::Unbounded &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::ExpressionWidth::Unbounded &obj, Serializer &serializer) { } template <> template -Circuit::ExpressionWidth::Unbounded serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::ExpressionWidth::Unbounded obj; +Program::ExpressionWidth::Unbounded serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::ExpressionWidth::Unbounded obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ExpressionWidth::Bounded &lhs, const ExpressionWidth::Bounded &rhs) { if (!(lhs.width == rhs.width)) { return false; } @@ -5428,23 +5436,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ExpressionWidth::Bounded &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::ExpressionWidth::Bounded &obj, Serializer &serializer) { serde::Serializable::serialize(obj.width, serializer); } template <> template -Circuit::ExpressionWidth::Bounded serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::ExpressionWidth::Bounded obj; +Program::ExpressionWidth::Bounded serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::ExpressionWidth::Bounded obj; obj.width = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const FunctionInput &lhs, const FunctionInput &rhs) { if (!(lhs.witness == rhs.witness)) { return false; } @@ -5467,11 +5475,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::FunctionInput &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::FunctionInput &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.witness, serializer); serde::Serializable::serialize(obj.num_bits, serializer); @@ -5480,16 +5488,16 @@ void serde::Serializable::serialize(const Circuit::Funct template <> template -Circuit::FunctionInput serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::FunctionInput serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::FunctionInput obj; + Program::FunctionInput obj; obj.witness = serde::Deserializable::deserialize(deserializer); obj.num_bits = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapArray &lhs, const HeapArray &rhs) { if (!(lhs.pointer == rhs.pointer)) { return false; } @@ -5512,11 +5520,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapArray &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::HeapArray &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.pointer, serializer); serde::Serializable::serialize(obj.size, serializer); @@ -5525,16 +5533,16 @@ void serde::Serializable::serialize(const Circuit::HeapArray template <> template -Circuit::HeapArray serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::HeapArray serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::HeapArray obj; + Program::HeapArray obj; obj.pointer = serde::Deserializable::deserialize(deserializer); obj.size = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapValueType &lhs, const HeapValueType &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5556,11 +5564,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapValueType &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::HeapValueType &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -5568,15 +5576,15 @@ void serde::Serializable::serialize(const Circuit::HeapV template <> template -Circuit::HeapValueType serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::HeapValueType serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::HeapValueType obj; + Program::HeapValueType obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapValueType::Simple &lhs, const HeapValueType::Simple &rhs) { return true; @@ -5597,21 +5605,21 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapValueType::Simple &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::HeapValueType::Simple &obj, Serializer &serializer) { } template <> template -Circuit::HeapValueType::Simple serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::HeapValueType::Simple obj; +Program::HeapValueType::Simple serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::HeapValueType::Simple obj; return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapValueType::Array &lhs, const HeapValueType::Array &rhs) { if (!(lhs.value_types == rhs.value_types)) { return false; } @@ -5634,25 +5642,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapValueType::Array &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::HeapValueType::Array &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value_types, serializer); serde::Serializable::serialize(obj.size, serializer); } template <> template -Circuit::HeapValueType::Array serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::HeapValueType::Array obj; +Program::HeapValueType::Array serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::HeapValueType::Array obj; obj.value_types = serde::Deserializable::deserialize(deserializer); obj.size = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapValueType::Vector &lhs, const HeapValueType::Vector &rhs) { if (!(lhs.value_types == rhs.value_types)) { return false; } @@ -5674,23 +5682,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapValueType::Vector &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::HeapValueType::Vector &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value_types, serializer); } template <> template -Circuit::HeapValueType::Vector serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::HeapValueType::Vector obj; +Program::HeapValueType::Vector serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::HeapValueType::Vector obj; obj.value_types = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const HeapVector &lhs, const HeapVector &rhs) { if (!(lhs.pointer == rhs.pointer)) { return false; } @@ -5713,11 +5721,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::HeapVector &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::HeapVector &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.pointer, serializer); serde::Serializable::serialize(obj.size, serializer); @@ -5726,16 +5734,16 @@ void serde::Serializable::serialize(const Circuit::HeapVect template <> template -Circuit::HeapVector serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::HeapVector serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::HeapVector obj; + Program::HeapVector obj; obj.pointer = serde::Deserializable::deserialize(deserializer); obj.size = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const MemOp &lhs, const MemOp &rhs) { if (!(lhs.operation == rhs.operation)) { return false; } @@ -5759,11 +5767,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::MemOp &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::MemOp &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.operation, serializer); serde::Serializable::serialize(obj.index, serializer); @@ -5773,9 +5781,9 @@ void serde::Serializable::serialize(const Circuit::MemOp &obj, S template <> template -Circuit::MemOp serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::MemOp serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::MemOp obj; + Program::MemOp obj; obj.operation = serde::Deserializable::deserialize(deserializer); obj.index = serde::Deserializable::deserialize(deserializer); obj.value = serde::Deserializable::deserialize(deserializer); @@ -5783,7 +5791,7 @@ Circuit::MemOp serde::Deserializable::deserialize(Deserializer & return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const MemoryAddress &lhs, const MemoryAddress &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5805,11 +5813,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::MemoryAddress &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::MemoryAddress &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -5817,15 +5825,15 @@ void serde::Serializable::serialize(const Circuit::Memor template <> template -Circuit::MemoryAddress serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::MemoryAddress serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::MemoryAddress obj; + Program::MemoryAddress obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode &lhs, const Opcode &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5847,11 +5855,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Opcode &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -5859,15 +5867,15 @@ void serde::Serializable::serialize(const Circuit::Opcode &obj, template <> template -Circuit::Opcode serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::Opcode serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::Opcode obj; + Program::Opcode obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::AssertZero &lhs, const Opcode::AssertZero &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5889,23 +5897,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::AssertZero &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Opcode::AssertZero &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::Opcode::AssertZero serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::Opcode::AssertZero obj; +Program::Opcode::AssertZero serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::Opcode::AssertZero obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::BlackBoxFuncCall &lhs, const Opcode::BlackBoxFuncCall &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5927,23 +5935,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::BlackBoxFuncCall &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Opcode::BlackBoxFuncCall &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::Opcode::BlackBoxFuncCall serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::Opcode::BlackBoxFuncCall obj; +Program::Opcode::BlackBoxFuncCall serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::Opcode::BlackBoxFuncCall obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::Directive &lhs, const Opcode::Directive &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -5965,23 +5973,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::Directive &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Opcode::Directive &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::Opcode::Directive serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::Opcode::Directive obj; +Program::Opcode::Directive serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::Opcode::Directive obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::Brillig &lhs, const Opcode::Brillig &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6003,23 +6011,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::Brillig &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Opcode::Brillig &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::Opcode::Brillig serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::Opcode::Brillig obj; +Program::Opcode::Brillig serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::Opcode::Brillig obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::MemoryOp &lhs, const Opcode::MemoryOp &rhs) { if (!(lhs.block_id == rhs.block_id)) { return false; } @@ -6043,11 +6051,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::MemoryOp &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Opcode::MemoryOp &obj, Serializer &serializer) { serde::Serializable::serialize(obj.block_id, serializer); serde::Serializable::serialize(obj.op, serializer); serde::Serializable::serialize(obj.predicate, serializer); @@ -6055,15 +6063,15 @@ void serde::Serializable::serialize(const Circuit::Op template <> template -Circuit::Opcode::MemoryOp serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::Opcode::MemoryOp obj; +Program::Opcode::MemoryOp serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::Opcode::MemoryOp obj; obj.block_id = serde::Deserializable::deserialize(deserializer); obj.op = serde::Deserializable::deserialize(deserializer); obj.predicate = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::MemoryInit &lhs, const Opcode::MemoryInit &rhs) { if (!(lhs.block_id == rhs.block_id)) { return false; } @@ -6086,25 +6094,25 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::MemoryInit &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Opcode::MemoryInit &obj, Serializer &serializer) { serde::Serializable::serialize(obj.block_id, serializer); serde::Serializable::serialize(obj.init, serializer); } template <> template -Circuit::Opcode::MemoryInit serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::Opcode::MemoryInit obj; +Program::Opcode::MemoryInit serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::Opcode::MemoryInit obj; obj.block_id = serde::Deserializable::deserialize(deserializer); obj.init = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Opcode::Call &lhs, const Opcode::Call &rhs) { if (!(lhs.id == rhs.id)) { return false; } @@ -6128,11 +6136,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Opcode::Call &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Opcode::Call &obj, Serializer &serializer) { serde::Serializable::serialize(obj.id, serializer); serde::Serializable::serialize(obj.inputs, serializer); serde::Serializable::serialize(obj.outputs, serializer); @@ -6140,15 +6148,15 @@ void serde::Serializable::serialize(const Circuit::Opcode template <> template -Circuit::Opcode::Call serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::Opcode::Call obj; +Program::Opcode::Call serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::Opcode::Call obj; obj.id = serde::Deserializable::deserialize(deserializer); obj.inputs = serde::Deserializable::deserialize(deserializer); obj.outputs = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const OpcodeLocation &lhs, const OpcodeLocation &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6170,11 +6178,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::OpcodeLocation &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::OpcodeLocation &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -6182,15 +6190,15 @@ void serde::Serializable::serialize(const Circuit::Opco template <> template -Circuit::OpcodeLocation serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::OpcodeLocation serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::OpcodeLocation obj; + Program::OpcodeLocation obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const OpcodeLocation::Acir &lhs, const OpcodeLocation::Acir &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6212,23 +6220,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::OpcodeLocation::Acir &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::OpcodeLocation::Acir &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::OpcodeLocation::Acir serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::OpcodeLocation::Acir obj; +Program::OpcodeLocation::Acir serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::OpcodeLocation::Acir obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const OpcodeLocation::Brillig &lhs, const OpcodeLocation::Brillig &rhs) { if (!(lhs.acir_index == rhs.acir_index)) { return false; } @@ -6251,25 +6259,67 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::OpcodeLocation::Brillig &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::OpcodeLocation::Brillig &obj, Serializer &serializer) { serde::Serializable::serialize(obj.acir_index, serializer); serde::Serializable::serialize(obj.brillig_index, serializer); } template <> template -Circuit::OpcodeLocation::Brillig serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::OpcodeLocation::Brillig obj; +Program::OpcodeLocation::Brillig serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::OpcodeLocation::Brillig obj; obj.acir_index = serde::Deserializable::deserialize(deserializer); obj.brillig_index = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { + + inline bool operator==(const Program &lhs, const Program &rhs) { + if (!(lhs.functions == rhs.functions)) { return false; } + return true; + } + + inline std::vector Program::bincodeSerialize() const { + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); + } + + inline Program Program::bincodeDeserialize(std::vector input) { + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw serde::deserialization_error("Some input bytes were not read"); + } + return value; + } + +} // end of namespace Program + +template <> +template +void serde::Serializable::serialize(const Program::Program &obj, Serializer &serializer) { + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.functions, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Program::Program serde::Deserializable::deserialize(Deserializer &deserializer) { + deserializer.increase_container_depth(); + Program::Program obj; + obj.functions = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Program { inline bool operator==(const PublicInputs &lhs, const PublicInputs &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6291,11 +6341,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::PublicInputs &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::PublicInputs &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -6303,15 +6353,15 @@ void serde::Serializable::serialize(const Circuit::Public template <> template -Circuit::PublicInputs serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::PublicInputs serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::PublicInputs obj; + Program::PublicInputs obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Value &lhs, const Value &rhs) { if (!(lhs.inner == rhs.inner)) { return false; } @@ -6333,11 +6383,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Value &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Value &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.inner, serializer); serializer.decrease_container_depth(); @@ -6345,15 +6395,15 @@ void serde::Serializable::serialize(const Circuit::Value &obj, S template <> template -Circuit::Value serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::Value serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::Value obj; + Program::Value obj; obj.inner = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ValueOrArray &lhs, const ValueOrArray &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6375,11 +6425,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ValueOrArray &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::ValueOrArray &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -6387,15 +6437,15 @@ void serde::Serializable::serialize(const Circuit::ValueO template <> template -Circuit::ValueOrArray serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::ValueOrArray serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::ValueOrArray obj; + Program::ValueOrArray obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ValueOrArray::MemoryAddress &lhs, const ValueOrArray::MemoryAddress &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6417,23 +6467,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ValueOrArray::MemoryAddress &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::ValueOrArray::MemoryAddress &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::ValueOrArray::MemoryAddress serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::ValueOrArray::MemoryAddress obj; +Program::ValueOrArray::MemoryAddress serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::ValueOrArray::MemoryAddress obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ValueOrArray::HeapArray &lhs, const ValueOrArray::HeapArray &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6455,23 +6505,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ValueOrArray::HeapArray &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::ValueOrArray::HeapArray &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::ValueOrArray::HeapArray serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::ValueOrArray::HeapArray obj; +Program::ValueOrArray::HeapArray serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::ValueOrArray::HeapArray obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const ValueOrArray::HeapVector &lhs, const ValueOrArray::HeapVector &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6493,23 +6543,23 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::ValueOrArray::HeapVector &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::ValueOrArray::HeapVector &obj, Serializer &serializer) { serde::Serializable::serialize(obj.value, serializer); } template <> template -Circuit::ValueOrArray::HeapVector serde::Deserializable::deserialize(Deserializer &deserializer) { - Circuit::ValueOrArray::HeapVector obj; +Program::ValueOrArray::HeapVector serde::Deserializable::deserialize(Deserializer &deserializer) { + Program::ValueOrArray::HeapVector obj; obj.value = serde::Deserializable::deserialize(deserializer); return obj; } -namespace Circuit { +namespace Program { inline bool operator==(const Witness &lhs, const Witness &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -6531,11 +6581,11 @@ namespace Circuit { return value; } -} // end of namespace Circuit +} // end of namespace Program template <> template -void serde::Serializable::serialize(const Circuit::Witness &obj, Serializer &serializer) { +void serde::Serializable::serialize(const Program::Witness &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -6543,9 +6593,9 @@ void serde::Serializable::serialize(const Circuit::Witness &ob template <> template -Circuit::Witness serde::Deserializable::deserialize(Deserializer &deserializer) { +Program::Witness serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - Circuit::Witness obj; + Program::Witness obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; diff --git a/noir/noir-repo/acvm-repo/acir/codegen/witness.cpp b/noir/noir-repo/acvm-repo/acir/codegen/witness.cpp index 118d4ca7ac5..ad2b0550db2 100644 --- a/noir/noir-repo/acvm-repo/acir/codegen/witness.cpp +++ b/noir/noir-repo/acvm-repo/acir/codegen/witness.cpp @@ -3,7 +3,7 @@ #include "serde.hpp" #include "bincode.hpp" -namespace WitnessMap { +namespace WitnessStack { struct Witness { uint32_t value; @@ -14,17 +14,79 @@ namespace WitnessMap { }; struct WitnessMap { - std::map value; + std::map value; friend bool operator==(const WitnessMap&, const WitnessMap&); std::vector bincodeSerialize() const; static WitnessMap bincodeDeserialize(std::vector); }; -} // end of namespace WitnessMap + struct StackItem { + uint32_t index; + WitnessStack::WitnessMap witness; + friend bool operator==(const StackItem&, const StackItem&); + std::vector bincodeSerialize() const; + static StackItem bincodeDeserialize(std::vector); + }; + + struct WitnessStack { + std::vector stack; + + friend bool operator==(const WitnessStack&, const WitnessStack&); + std::vector bincodeSerialize() const; + static WitnessStack bincodeDeserialize(std::vector); + }; + +} // end of namespace WitnessStack + + +namespace WitnessStack { + + inline bool operator==(const StackItem &lhs, const StackItem &rhs) { + if (!(lhs.index == rhs.index)) { return false; } + if (!(lhs.witness == rhs.witness)) { return false; } + return true; + } + + inline std::vector StackItem::bincodeSerialize() const { + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); + } + + inline StackItem StackItem::bincodeDeserialize(std::vector input) { + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw serde::deserialization_error("Some input bytes were not read"); + } + return value; + } + +} // end of namespace WitnessStack + +template <> +template +void serde::Serializable::serialize(const WitnessStack::StackItem &obj, Serializer &serializer) { + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.index, serializer); + serde::Serializable::serialize(obj.witness, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +WitnessStack::StackItem serde::Deserializable::deserialize(Deserializer &deserializer) { + deserializer.increase_container_depth(); + WitnessStack::StackItem obj; + obj.index = serde::Deserializable::deserialize(deserializer); + obj.witness = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} -namespace WitnessMap { +namespace WitnessStack { inline bool operator==(const Witness &lhs, const Witness &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -46,11 +108,11 @@ namespace WitnessMap { return value; } -} // end of namespace WitnessMap +} // end of namespace WitnessStack template <> template -void serde::Serializable::serialize(const WitnessMap::Witness &obj, Serializer &serializer) { +void serde::Serializable::serialize(const WitnessStack::Witness &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -58,15 +120,15 @@ void serde::Serializable::serialize(const WitnessMap::Witne template <> template -WitnessMap::Witness serde::Deserializable::deserialize(Deserializer &deserializer) { +WitnessStack::Witness serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - WitnessMap::Witness obj; + WitnessStack::Witness obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } -namespace WitnessMap { +namespace WitnessStack { inline bool operator==(const WitnessMap &lhs, const WitnessMap &rhs) { if (!(lhs.value == rhs.value)) { return false; } @@ -88,11 +150,11 @@ namespace WitnessMap { return value; } -} // end of namespace WitnessMap +} // end of namespace WitnessStack template <> template -void serde::Serializable::serialize(const WitnessMap::WitnessMap &obj, Serializer &serializer) { +void serde::Serializable::serialize(const WitnessStack::WitnessMap &obj, Serializer &serializer) { serializer.increase_container_depth(); serde::Serializable::serialize(obj.value, serializer); serializer.decrease_container_depth(); @@ -100,10 +162,52 @@ void serde::Serializable::serialize(const WitnessMap::Wi template <> template -WitnessMap::WitnessMap serde::Deserializable::deserialize(Deserializer &deserializer) { +WitnessStack::WitnessMap serde::Deserializable::deserialize(Deserializer &deserializer) { deserializer.increase_container_depth(); - WitnessMap::WitnessMap obj; + WitnessStack::WitnessMap obj; obj.value = serde::Deserializable::deserialize(deserializer); deserializer.decrease_container_depth(); return obj; } + +namespace WitnessStack { + + inline bool operator==(const WitnessStack &lhs, const WitnessStack &rhs) { + if (!(lhs.stack == rhs.stack)) { return false; } + return true; + } + + inline std::vector WitnessStack::bincodeSerialize() const { + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); + } + + inline WitnessStack WitnessStack::bincodeDeserialize(std::vector input) { + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw serde::deserialization_error("Some input bytes were not read"); + } + return value; + } + +} // end of namespace WitnessStack + +template <> +template +void serde::Serializable::serialize(const WitnessStack::WitnessStack &obj, Serializer &serializer) { + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.stack, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +WitnessStack::WitnessStack serde::Deserializable::deserialize(Deserializer &deserializer) { + deserializer.increase_container_depth(); + WitnessStack::WitnessStack obj; + obj.stack = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} diff --git a/noir/noir-repo/acvm-repo/acir/src/circuit/mod.rs b/noir/noir-repo/acvm-repo/acir/src/circuit/mod.rs index 7e6cbf23803..b5d6348d34f 100644 --- a/noir/noir-repo/acvm-repo/acir/src/circuit/mod.rs +++ b/noir/noir-repo/acvm-repo/acir/src/circuit/mod.rs @@ -32,6 +32,13 @@ pub enum ExpressionWidth { }, } +/// A program represented by multiple ACIR circuits. The execution trace of these +/// circuits is dictated by construction of the [crate::native_types::WitnessStack]. +#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct Program { + pub functions: Vec, +} + #[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Default)] pub struct Circuit { // current_witness_index is the highest witness index in the circuit. The next witness to be added to this circuit @@ -152,7 +159,9 @@ impl Circuit { self.public_parameters.0.union(&self.return_values.0).cloned().collect(); PublicInputs(public_inputs) } +} +impl Program { fn write(&self, writer: W) -> std::io::Result<()> { let buf = bincode::serialize(self).unwrap(); let mut encoder = flate2::write::GzEncoder::new(writer, Compression::default()); @@ -169,36 +178,36 @@ impl Circuit { .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err)) } - pub fn serialize_circuit(circuit: &Circuit) -> Vec { - let mut circuit_bytes: Vec = Vec::new(); - circuit.write(&mut circuit_bytes).expect("expected circuit to be serializable"); - circuit_bytes + pub fn serialize_program(program: &Program) -> Vec { + let mut program_bytes: Vec = Vec::new(); + program.write(&mut program_bytes).expect("expected circuit to be serializable"); + program_bytes } - pub fn deserialize_circuit(serialized_circuit: &[u8]) -> std::io::Result { - Circuit::read(serialized_circuit) + pub fn deserialize_program(serialized_circuit: &[u8]) -> std::io::Result { + Program::read(serialized_circuit) } - // Serialize and base64 encode circuit - pub fn serialize_circuit_base64(circuit: &Circuit, s: S) -> Result + // Serialize and base64 encode program + pub fn serialize_program_base64(program: &Program, s: S) -> Result where S: Serializer, { - let circuit_bytes = Circuit::serialize_circuit(circuit); - let encoded_b64 = base64::engine::general_purpose::STANDARD.encode(circuit_bytes); + let program_bytes = Program::serialize_program(program); + let encoded_b64 = base64::engine::general_purpose::STANDARD.encode(program_bytes); s.serialize_str(&encoded_b64) } - // Deserialize and base64 decode circuit - pub fn deserialize_circuit_base64<'de, D>(deserializer: D) -> Result + // Deserialize and base64 decode program + pub fn deserialize_program_base64<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let bytecode_b64: String = serde::Deserialize::deserialize(deserializer)?; - let circuit_bytes = base64::engine::general_purpose::STANDARD + let program_bytes = base64::engine::general_purpose::STANDARD .decode(bytecode_b64) .map_err(D::Error::custom)?; - let circuit = Self::deserialize_circuit(&circuit_bytes).map_err(D::Error::custom)?; + let circuit = Self::deserialize_program(&program_bytes).map_err(D::Error::custom)?; Ok(circuit) } } @@ -240,6 +249,22 @@ impl std::fmt::Debug for Circuit { } } +impl std::fmt::Display for Program { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for (func_index, function) in self.functions.iter().enumerate() { + writeln!(f, "func {}", func_index)?; + writeln!(f, "{}", function)?; + } + Ok(()) + } +} + +impl std::fmt::Debug for Program { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(self, f) + } +} + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default)] pub struct PublicInputs(pub BTreeSet); @@ -262,7 +287,10 @@ mod tests { opcodes::{BlackBoxFuncCall, FunctionInput}, Circuit, Compression, Opcode, PublicInputs, }; - use crate::{circuit::ExpressionWidth, native_types::Witness}; + use crate::{ + circuit::{ExpressionWidth, Program}, + native_types::Witness, + }; use acir_field::FieldElement; fn and_opcode() -> Opcode { @@ -348,14 +376,15 @@ mod tests { assert_messages: Default::default(), recursive: false, }; + let program = Program { functions: vec![circuit] }; - fn read_write(circuit: Circuit) -> (Circuit, Circuit) { - let bytes = Circuit::serialize_circuit(&circuit); - let got_circuit = Circuit::deserialize_circuit(&bytes).unwrap(); - (circuit, got_circuit) + fn read_write(program: Program) -> (Program, Program) { + let bytes = Program::serialize_program(&program); + let got_program = Program::deserialize_program(&bytes).unwrap(); + (program, got_program) } - let (circ, got_circ) = read_write(circuit); + let (circ, got_circ) = read_write(program); assert_eq!(circ, got_circ); } @@ -380,11 +409,12 @@ mod tests { assert_messages: Default::default(), recursive: false, }; + let program = Program { functions: vec![circuit] }; - let json = serde_json::to_string_pretty(&circuit).unwrap(); + let json = serde_json::to_string_pretty(&program).unwrap(); let deserialized = serde_json::from_str(&json).unwrap(); - assert_eq!(circuit, deserialized); + assert_eq!(program, deserialized); } #[test] @@ -400,7 +430,7 @@ mod tests { encoder.write_all(bad_circuit).unwrap(); encoder.finish().unwrap(); - let deserialization_result = Circuit::deserialize_circuit(&zipped_bad_circuit); + let deserialization_result = Program::deserialize_program(&zipped_bad_circuit); assert!(deserialization_result.is_err()); } } diff --git a/noir/noir-repo/acvm-repo/acir/src/lib.rs b/noir/noir-repo/acvm-repo/acir/src/lib.rs index c7be5026850..29e58874478 100644 --- a/noir/noir-repo/acvm-repo/acir/src/lib.rs +++ b/noir/noir-repo/acvm-repo/acir/src/lib.rs @@ -42,9 +42,9 @@ mod reflection { brillig::{BrilligInputs, BrilligOutputs}, directives::Directive, opcodes::BlackBoxFuncCall, - Circuit, ExpressionWidth, Opcode, OpcodeLocation, + Circuit, ExpressionWidth, Opcode, OpcodeLocation, Program, }, - native_types::{Witness, WitnessMap}, + native_types::{Witness, WitnessMap, WitnessStack}, }; #[test] @@ -59,6 +59,7 @@ mod reflection { }; let mut tracer = Tracer::new(TracerConfig::default()); + tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); @@ -78,16 +79,16 @@ mod reflection { // Create C++ class definitions. let mut source = Vec::new(); - let config = serde_generate::CodeGeneratorConfig::new("Circuit".to_string()) + let config = serde_generate::CodeGeneratorConfig::new("Program".to_string()) .with_encodings(vec![serde_generate::Encoding::Bincode]); let generator = serde_generate::cpp::CodeGenerator::new(&config); generator.output(&mut source, ®istry).unwrap(); // Comment this out to write updated C++ code to file. - if let Some(old_hash) = old_hash { - let new_hash = fxhash::hash64(&source); - assert_eq!(new_hash, old_hash, "Serialization format has changed"); - } + // if let Some(old_hash) = old_hash { + // let new_hash = fxhash::hash64(&source); + // assert_eq!(new_hash, old_hash, "Serialization format has changed"); + // } write_to_file(&source, &path); } @@ -106,12 +107,13 @@ mod reflection { let mut tracer = Tracer::new(TracerConfig::default()); tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); + tracer.trace_simple_type::().unwrap(); let registry = tracer.registry().unwrap(); // Create C++ class definitions. let mut source = Vec::new(); - let config = serde_generate::CodeGeneratorConfig::new("WitnessMap".to_string()) + let config = serde_generate::CodeGeneratorConfig::new("WitnessStack".to_string()) .with_encodings(vec![serde_generate::Encoding::Bincode]); let generator = serde_generate::cpp::CodeGenerator::new(&config); generator.output(&mut source, ®istry).unwrap(); diff --git a/noir/noir-repo/acvm-repo/acir/src/native_types/mod.rs b/noir/noir-repo/acvm-repo/acir/src/native_types/mod.rs index 66c822bfff8..eb9d1f6fd03 100644 --- a/noir/noir-repo/acvm-repo/acir/src/native_types/mod.rs +++ b/noir/noir-repo/acvm-repo/acir/src/native_types/mod.rs @@ -1,8 +1,10 @@ mod expression; mod witness; mod witness_map; +mod witness_stack; pub use expression::Expression; pub use witness::Witness; pub use witness_map::WitnessMap; -pub use witness_map::WitnessMapError; +pub use witness_stack::WitnessStack; +pub use witness_stack::WitnessStackError; diff --git a/noir/noir-repo/acvm-repo/acir/src/native_types/witness_stack.rs b/noir/noir-repo/acvm-repo/acir/src/native_types/witness_stack.rs new file mode 100644 index 00000000000..9592d90b014 --- /dev/null +++ b/noir/noir-repo/acvm-repo/acir/src/native_types/witness_stack.rs @@ -0,0 +1,64 @@ +use std::io::Read; + +use flate2::bufread::GzDecoder; +use flate2::bufread::GzEncoder; +use flate2::Compression; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +use super::WitnessMap; + +#[derive(Debug, Error)] +enum SerializationError { + #[error(transparent)] + Deflate(#[from] std::io::Error), +} + +#[derive(Debug, Error)] +#[error(transparent)] +pub struct WitnessStackError(#[from] SerializationError); + +/// An ordered set of witness maps for separate circuits +#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Default, Serialize, Deserialize)] +pub struct WitnessStack { + pub stack: Vec, +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Default, Serialize, Deserialize)] +pub struct StackItem { + /// Index into a [crate::circuit::Program] function list for which we have an associated witness + pub index: u32, + /// A full witness for the respective constraint system specified by the index + pub witness: WitnessMap, +} + +impl From for WitnessStack { + fn from(witness: WitnessMap) -> Self { + let stack = vec![StackItem { index: 0, witness }]; + Self { stack } + } +} + +impl TryFrom for Vec { + type Error = WitnessStackError; + + fn try_from(val: WitnessStack) -> Result { + let buf = bincode::serialize(&val).unwrap(); + let mut deflater = GzEncoder::new(buf.as_slice(), Compression::best()); + let mut buf_c = Vec::new(); + deflater.read_to_end(&mut buf_c).map_err(|err| WitnessStackError(err.into()))?; + Ok(buf_c) + } +} + +impl TryFrom<&[u8]> for WitnessStack { + type Error = WitnessStackError; + + fn try_from(bytes: &[u8]) -> Result { + let mut deflater = GzDecoder::new(bytes); + let mut buf_d = Vec::new(); + deflater.read_to_end(&mut buf_d).map_err(|err| WitnessStackError(err.into()))?; + let witness_stack = bincode::deserialize(&buf_d).unwrap(); + Ok(witness_stack) + } +} diff --git a/noir/noir-repo/acvm-repo/acir/tests/test_program_serialization.rs b/noir/noir-repo/acvm-repo/acir/tests/test_program_serialization.rs index 2c8ad2b9986..238f51b1e28 100644 --- a/noir/noir-repo/acvm-repo/acir/tests/test_program_serialization.rs +++ b/noir/noir-repo/acvm-repo/acir/tests/test_program_serialization.rs @@ -1,13 +1,13 @@ //! This integration test defines a set of circuits which are used in order to test the acvm_js package. //! -//! The acvm_js test suite contains serialized [circuits][`Circuit`] which must be kept in sync with the format +//! The acvm_js test suite contains serialized program [circuits][`Program`] which must be kept in sync with the format //! outputted from the [ACIR crate][acir]. //! Breaking changes to the serialization format then require refreshing acvm_js's test suite. //! This file contains Rust definitions of these circuits and outputs the updated serialized format. //! //! These tests also check this circuit serialization against an expected value, erroring if the serialization changes. //! Generally in this situation we just need to refresh the `expected_serialization` variables to match the -//! actual output, **HOWEVER** note that this results in a breaking change to the ACIR format. +//! actual output, **HOWEVER** note that this results in a breaking change to the backend ACIR format. use std::collections::BTreeSet; @@ -15,7 +15,7 @@ use acir::{ circuit::{ brillig::{Brillig, BrilligInputs, BrilligOutputs}, opcodes::{BlackBoxFuncCall, BlockId, FunctionInput, MemOp}, - Circuit, Opcode, PublicInputs, + Circuit, Opcode, Program, PublicInputs, }, native_types::{Expression, Witness}, }; @@ -41,16 +41,17 @@ fn addition_circuit() { return_values: PublicInputs([Witness(3)].into()), ..Circuit::default() }; + let program = Program { functions: vec![circuit] }; - let bytes = Circuit::serialize_circuit(&circuit); + let bytes = Program::serialize_program(&program); let expected_serialization: Vec = vec![ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 208, 49, 14, 192, 32, 8, 5, 80, 212, 30, 8, 4, 20, - 182, 94, 165, 166, 122, 255, 35, 52, 77, 28, 76, 58, 214, 191, 124, 166, 23, 242, 15, 0, 8, - 240, 77, 154, 125, 206, 198, 127, 161, 176, 209, 138, 139, 197, 88, 68, 122, 205, 157, 152, - 46, 204, 222, 76, 81, 180, 21, 35, 35, 53, 189, 179, 49, 119, 19, 171, 222, 188, 162, 147, - 112, 167, 161, 206, 99, 98, 105, 223, 95, 248, 26, 113, 90, 97, 185, 97, 217, 56, 173, 35, - 63, 243, 81, 87, 163, 125, 1, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 144, 75, 14, 128, 32, 12, 68, 249, 120, 160, 150, + 182, 208, 238, 188, 138, 68, 184, 255, 17, 212, 200, 130, 196, 165, 188, 164, 153, 174, 94, + 38, 227, 221, 203, 118, 159, 119, 95, 226, 200, 125, 36, 252, 3, 253, 66, 87, 152, 92, 4, + 153, 185, 149, 212, 144, 240, 128, 100, 85, 5, 88, 106, 86, 84, 20, 149, 51, 41, 81, 83, + 214, 98, 213, 10, 24, 50, 53, 236, 98, 212, 135, 44, 174, 235, 5, 143, 35, 12, 151, 159, + 126, 55, 109, 28, 231, 145, 47, 245, 105, 191, 143, 133, 1, 0, 0, ]; assert_eq!(bytes, expected_serialization) @@ -71,13 +72,14 @@ fn fixed_base_scalar_mul_circuit() { return_values: PublicInputs(BTreeSet::from_iter(vec![Witness(3), Witness(4)])), ..Circuit::default() }; + let program = Program { functions: vec![circuit] }; - let bytes = Circuit::serialize_circuit(&circuit); + let bytes = Program::serialize_program(&program); let expected_serialization: Vec = vec![ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 77, 138, 91, 10, 0, 32, 16, 2, 109, 171, 175, 46, 221, - 209, 247, 229, 130, 130, 140, 200, 92, 0, 11, 157, 228, 35, 127, 212, 200, 29, 61, 116, 76, - 220, 217, 250, 171, 91, 113, 160, 66, 104, 242, 97, 0, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 77, 138, 81, 10, 0, 48, 8, 66, 87, 219, 190, 118, 233, + 29, 61, 43, 3, 5, 121, 34, 207, 86, 231, 162, 198, 157, 124, 228, 71, 157, 220, 232, 161, + 227, 226, 206, 214, 95, 221, 74, 0, 116, 58, 13, 182, 105, 0, 0, 0, ]; assert_eq!(bytes, expected_serialization) @@ -98,13 +100,14 @@ fn pedersen_circuit() { return_values: PublicInputs(BTreeSet::from_iter(vec![Witness(2), Witness(3)])), ..Circuit::default() }; + let program = Program { functions: vec![circuit] }; - let bytes = Circuit::serialize_circuit(&circuit); + let bytes = Program::serialize_program(&program); let expected_serialization: Vec = vec![ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 93, 74, 135, 9, 0, 48, 8, 75, 171, 224, 255, 15, 139, - 27, 196, 64, 200, 100, 0, 15, 133, 80, 57, 89, 219, 127, 39, 173, 126, 235, 236, 247, 151, - 48, 224, 71, 90, 33, 97, 0, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 93, 74, 7, 6, 0, 0, 8, 108, 209, 255, 63, 156, 54, 233, + 56, 55, 17, 26, 18, 196, 241, 169, 250, 178, 141, 167, 32, 159, 254, 234, 238, 255, 87, + 112, 52, 63, 63, 101, 105, 0, 0, 0, ]; assert_eq!(bytes, expected_serialization) @@ -139,26 +142,27 @@ fn schnorr_verify_circuit() { return_values: PublicInputs(BTreeSet::from([output])), ..Circuit::default() }; + let program = Program { functions: vec![circuit] }; - let bytes = Circuit::serialize_circuit(&circuit); + let bytes = Program::serialize_program(&program); let expected_serialization: Vec = vec![ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 77, 210, 7, 74, 3, 1, 20, 69, 209, 177, 247, 222, 123, - 239, 189, 119, 141, 93, 99, 220, 133, 251, 95, 130, 152, 103, 78, 32, 3, 195, 33, 4, 66, - 248, 239, 254, 20, 69, 209, 84, 212, 158, 216, 206, 223, 234, 219, 204, 146, 239, 91, 170, - 111, 103, 245, 109, 101, 27, 219, 217, 193, 250, 219, 197, 110, 246, 176, 151, 125, 236, - 231, 0, 7, 57, 196, 97, 142, 112, 148, 99, 28, 231, 4, 39, 57, 197, 105, 206, 112, 150, - 115, 156, 231, 2, 23, 185, 196, 101, 174, 112, 149, 107, 92, 231, 6, 55, 185, 197, 109, - 238, 112, 151, 123, 220, 231, 1, 15, 121, 196, 99, 158, 240, 148, 103, 60, 231, 5, 47, 121, - 197, 107, 222, 240, 150, 119, 188, 231, 3, 75, 124, 228, 83, 195, 142, 121, 158, 125, 126, - 225, 43, 223, 248, 206, 15, 126, 178, 204, 47, 86, 248, 237, 119, 43, 76, 127, 105, 47, - 189, 165, 181, 116, 150, 198, 234, 125, 117, 249, 47, 233, 41, 45, 165, 163, 52, 148, 126, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 77, 210, 7, 78, 2, 1, 20, 69, 81, 236, 189, 247, 222, + 123, 239, 93, 177, 33, 34, 238, 194, 253, 47, 193, 200, 147, 67, 194, 36, 147, 163, 33, 33, + 228, 191, 219, 82, 168, 63, 63, 181, 183, 197, 223, 177, 147, 191, 181, 183, 149, 69, 159, + 183, 213, 222, 238, 218, 219, 206, 14, 118, 178, 139, 141, 183, 135, 189, 236, 99, 63, 7, + 56, 200, 33, 14, 115, 132, 163, 28, 227, 56, 39, 56, 201, 41, 78, 115, 134, 179, 156, 227, + 60, 23, 184, 200, 37, 46, 115, 133, 171, 92, 227, 58, 55, 184, 201, 45, 110, 115, 135, 187, + 220, 227, 62, 15, 120, 200, 35, 30, 243, 132, 167, 60, 227, 57, 47, 120, 201, 43, 94, 243, + 134, 183, 188, 227, 61, 31, 248, 200, 39, 22, 249, 204, 151, 166, 29, 243, 188, 250, 255, + 141, 239, 44, 241, 131, 101, 126, 178, 194, 47, 86, 249, 237, 123, 171, 76, 127, 105, 47, + 189, 165, 181, 116, 150, 198, 26, 125, 245, 248, 45, 233, 41, 45, 165, 163, 52, 148, 126, 210, 78, 186, 73, 51, 233, 37, 173, 164, 147, 52, 146, 62, 210, 70, 186, 72, 19, 233, 33, - 45, 164, 131, 52, 144, 253, 23, 139, 218, 238, 217, 60, 123, 103, 235, 236, 156, 141, 179, - 239, 166, 93, 183, 237, 185, 107, 199, 125, 251, 29, 218, 237, 216, 94, 167, 118, 58, 183, - 207, 165, 93, 174, 237, 113, 107, 135, 123, 247, 47, 185, 251, 147, 59, 191, 184, 239, 155, - 187, 126, 184, 103, 217, 29, 235, 55, 171, 223, 173, 104, 184, 231, 255, 243, 7, 236, 52, - 239, 128, 225, 3, 0, 0, + 45, 164, 131, 52, 144, 253, 151, 11, 245, 221, 179, 121, 246, 206, 214, 217, 57, 27, 103, + 223, 109, 187, 238, 218, 115, 223, 142, 135, 246, 59, 182, 219, 169, 189, 206, 237, 116, + 105, 159, 107, 187, 220, 218, 227, 222, 14, 143, 238, 95, 116, 247, 23, 119, 126, 115, 223, + 146, 187, 150, 221, 179, 226, 142, 141, 155, 53, 238, 86, 104, 186, 231, 255, 243, 7, 100, + 141, 232, 192, 233, 3, 0, 0, ]; assert_eq!(bytes, expected_serialization) @@ -202,15 +206,16 @@ fn simple_brillig_foreign_call() { private_parameters: BTreeSet::from([Witness(1), Witness(2)]), ..Circuit::default() }; + let program = Program { functions: vec![circuit] }; - let bytes = Circuit::serialize_circuit(&circuit); + let bytes = Program::serialize_program(&program); let expected_serialization: Vec = vec![ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 143, 177, 10, 192, 32, 16, 67, 227, 21, 74, 233, - 212, 79, 177, 127, 208, 159, 233, 224, 226, 32, 226, 247, 139, 168, 16, 68, 93, 244, 45, - 119, 228, 142, 144, 92, 0, 20, 50, 7, 237, 76, 213, 190, 50, 245, 26, 175, 218, 231, 165, - 57, 175, 148, 14, 137, 179, 147, 191, 114, 211, 221, 216, 240, 59, 63, 107, 221, 115, 104, - 181, 103, 244, 43, 36, 10, 38, 68, 108, 25, 253, 238, 136, 1, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 143, 65, 10, 192, 32, 12, 4, 77, 10, 165, 244, 212, + 167, 216, 31, 244, 51, 61, 120, 241, 32, 226, 251, 85, 140, 176, 136, 122, 209, 129, 144, + 176, 9, 97, 151, 84, 225, 74, 69, 50, 31, 48, 35, 85, 251, 164, 235, 53, 94, 218, 247, 75, + 163, 95, 150, 12, 153, 179, 227, 191, 114, 195, 222, 216, 240, 59, 63, 75, 221, 251, 208, + 106, 207, 232, 150, 65, 100, 53, 33, 2, 9, 69, 91, 82, 144, 1, 0, 0, ]; assert_eq!(bytes, expected_serialization) @@ -301,19 +306,20 @@ fn complex_brillig_foreign_call() { private_parameters: BTreeSet::from([Witness(1), Witness(2), Witness(3)]), ..Circuit::default() }; + let program = Program { functions: vec![circuit] }; - let bytes = Circuit::serialize_circuit(&circuit); + let bytes = Program::serialize_program(&program); let expected_serialization: Vec = vec![ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 84, 75, 10, 132, 48, 12, 125, 177, 163, 35, 179, - 154, 35, 8, 51, 7, 232, 204, 9, 188, 139, 184, 83, 116, 233, 241, 173, 152, 98, 12, 213, - 141, 21, 244, 65, 232, 39, 175, 233, 35, 73, 155, 3, 32, 204, 48, 206, 18, 158, 19, 175, - 37, 60, 175, 228, 209, 30, 195, 143, 226, 197, 178, 103, 105, 76, 110, 160, 209, 156, 160, - 209, 247, 195, 69, 235, 29, 179, 46, 81, 243, 103, 2, 239, 231, 225, 44, 117, 150, 241, - 250, 201, 99, 206, 251, 96, 95, 161, 242, 14, 193, 243, 40, 162, 105, 253, 219, 12, 75, 47, - 146, 186, 251, 37, 116, 86, 93, 219, 55, 245, 96, 20, 85, 75, 253, 136, 249, 87, 249, 105, - 231, 220, 4, 249, 237, 132, 56, 20, 224, 109, 113, 223, 88, 82, 153, 34, 64, 34, 14, 164, - 69, 172, 48, 2, 23, 243, 6, 31, 25, 5, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 84, 65, 14, 132, 32, 12, 108, 101, 117, 205, 158, + 246, 9, 38, 187, 15, 96, 247, 5, 254, 197, 120, 211, 232, 209, 231, 139, 113, 136, 181, 65, + 47, 98, 162, 147, 52, 20, 24, 202, 164, 45, 48, 205, 200, 157, 49, 124, 227, 44, 129, 207, + 152, 75, 120, 94, 137, 209, 30, 195, 143, 227, 197, 178, 103, 105, 76, 110, 160, 209, 156, + 160, 209, 247, 195, 69, 235, 29, 179, 46, 81, 243, 103, 2, 239, 231, 225, 44, 117, 150, 97, + 254, 196, 152, 99, 157, 176, 87, 168, 188, 147, 224, 121, 20, 209, 180, 254, 109, 70, 75, + 47, 178, 186, 251, 37, 116, 86, 93, 219, 55, 245, 96, 20, 85, 75, 253, 8, 255, 171, 246, + 121, 231, 220, 4, 249, 237, 132, 56, 28, 224, 109, 113, 223, 180, 164, 50, 165, 0, 137, 17, + 72, 139, 88, 97, 4, 198, 90, 226, 196, 33, 5, 0, 0, ]; assert_eq!(bytes, expected_serialization) @@ -342,13 +348,16 @@ fn memory_op_circuit() { return_values: PublicInputs([Witness(4)].into()), ..Circuit::default() }; - let bytes = Circuit::serialize_circuit(&circuit); + let program = Program { functions: vec![circuit] }; + + let bytes = Program::serialize_program(&program); let expected_serialization: Vec = vec![ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 145, 187, 17, 0, 32, 8, 67, 195, 111, 31, 220, 192, - 253, 167, 178, 144, 2, 239, 236, 132, 194, 52, 129, 230, 93, 8, 6, 64, 176, 101, 225, 28, - 78, 49, 43, 238, 154, 225, 254, 166, 209, 205, 165, 98, 174, 212, 177, 188, 187, 92, 255, - 173, 92, 173, 190, 93, 82, 80, 78, 123, 14, 127, 60, 97, 1, 210, 144, 46, 242, 19, 3, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 81, 201, 13, 0, 32, 8, 147, 195, 125, 112, 3, 247, + 159, 74, 141, 60, 106, 226, 79, 120, 216, 132, 180, 124, 154, 82, 168, 108, 212, 57, 2, + 122, 129, 157, 201, 181, 150, 59, 186, 179, 189, 161, 101, 251, 82, 176, 175, 196, 121, 89, + 118, 185, 246, 91, 185, 26, 125, 187, 64, 80, 134, 29, 195, 31, 79, 24, 2, 250, 167, 252, + 27, 3, 0, 0, ]; assert_eq!(bytes, expected_serialization) diff --git a/noir/noir-repo/acvm-repo/acvm_js/src/compression.rs b/noir/noir-repo/acvm-repo/acvm_js/src/compression.rs index fedaa514bf0..18e9216297e 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/src/compression.rs +++ b/noir/noir-repo/acvm-repo/acvm_js/src/compression.rs @@ -1,4 +1,4 @@ -use acvm::acir::native_types::WitnessMap; +use acvm::acir::native_types::{WitnessMap, WitnessStack}; use js_sys::JsString; use wasm_bindgen::prelude::wasm_bindgen; @@ -13,10 +13,11 @@ pub fn compress_witness(witness_map: JsWitnessMap) -> Result, JsString> console_error_panic_hook::set_once(); let witness_map = WitnessMap::from(witness_map); - let compressed_witness_map: Vec = - Vec::::try_from(witness_map).map_err(|err| err.to_string())?; + let witness_stack = WitnessStack::from(witness_map); + let compressed_witness_stack: Vec = + Vec::::try_from(witness_stack).map_err(|err| err.to_string())?; - Ok(compressed_witness_map) + Ok(compressed_witness_stack) } /// Decompresses a compressed witness as outputted by Nargo into a `WitnessMap`. @@ -27,8 +28,8 @@ pub fn compress_witness(witness_map: JsWitnessMap) -> Result, JsString> pub fn decompress_witness(compressed_witness: Vec) -> Result { console_error_panic_hook::set_once(); - let witness_map = - WitnessMap::try_from(compressed_witness.as_slice()).map_err(|err| err.to_string())?; + let witness_stack = + WitnessStack::try_from(compressed_witness.as_slice()).map_err(|err| err.to_string())?; - Ok(witness_map.into()) + Ok(witness_stack.stack[0].witness.clone().into()) } diff --git a/noir/noir-repo/acvm-repo/acvm_js/src/execute.rs b/noir/noir-repo/acvm-repo/acvm_js/src/execute.rs index 3f691e1abf2..ac71a573e64 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/src/execute.rs +++ b/noir/noir-repo/acvm-repo/acvm_js/src/execute.rs @@ -1,5 +1,5 @@ use acvm::{ - acir::circuit::Circuit, + acir::circuit::Program, pwg::{ACVMStatus, ErrorLocation, OpcodeResolutionError, ACVM}, }; use bn254_blackbox_solver::Bn254BlackBoxSolver; @@ -34,7 +34,7 @@ pub async fn create_black_box_solver() -> WasmBlackBoxFunctionSolver { /// @returns {WitnessMap} The solved witness calculated by executing the circuit on the provided inputs. #[wasm_bindgen(js_name = executeCircuit, skip_jsdoc)] pub async fn execute_circuit( - circuit: Vec, + program: Vec, initial_witness: JsWitnessMap, foreign_call_handler: ForeignCallHandler, ) -> Result { @@ -42,7 +42,7 @@ pub async fn execute_circuit( let solver = WasmBlackBoxFunctionSolver::initialize().await; - execute_circuit_with_black_box_solver(&solver, circuit, initial_witness, foreign_call_handler) + execute_circuit_with_black_box_solver(&solver, program, initial_witness, foreign_call_handler) .await } @@ -56,13 +56,21 @@ pub async fn execute_circuit( #[wasm_bindgen(js_name = executeCircuitWithBlackBoxSolver, skip_jsdoc)] pub async fn execute_circuit_with_black_box_solver( solver: &WasmBlackBoxFunctionSolver, - circuit: Vec, + // TODO(https://github.com/noir-lang/noir/issues/4428): These need to be updated to match the same interfaces + // as the native ACVM executor. Right now native execution still only handles one circuit so I do not feel the need + // to break the JS interface just yet. + program: Vec, initial_witness: JsWitnessMap, foreign_call_handler: ForeignCallHandler, ) -> Result { console_error_panic_hook::set_once(); - let circuit: Circuit = Circuit::deserialize_circuit(&circuit) + let program: Program = Program::deserialize_program(&program) .map_err(|_| JsExecutionError::new("Failed to deserialize circuit. This is likely due to differing serialization formats between ACVM_JS and your compiler".to_string(), None))?; + let circuit = match program.functions.len() { + 0 => return Ok(initial_witness), + 1 => &program.functions[0], + _ => return Err(JsExecutionError::new("Program contains multiple circuits however ACVM currently only supports programs containing a single circuit".to_string(), None).into()) + }; let mut acvm = ACVM::new(&solver.0, &circuit.opcodes, initial_witness.into()); diff --git a/noir/noir-repo/acvm-repo/acvm_js/src/public_witness.rs b/noir/noir-repo/acvm-repo/acvm_js/src/public_witness.rs index 8dc66c435b3..a0d5b5f8be2 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/src/public_witness.rs +++ b/noir/noir-repo/acvm-repo/acvm_js/src/public_witness.rs @@ -1,5 +1,5 @@ use acvm::acir::{ - circuit::Circuit, + circuit::Program, native_types::{Witness, WitnessMap}, }; use js_sys::JsString; @@ -26,16 +26,25 @@ fn extract_indices(witness_map: &WitnessMap, indices: Vec) -> Result, + // TODO(https://github.com/noir-lang/noir/issues/4428): These need to be updated to match the same interfaces + // as the native ACVM executor. Right now native execution still only handles one circuit so I do not feel the need + // to break the JS interface just yet. + program: Vec, witness_map: JsWitnessMap, ) -> Result { console_error_panic_hook::set_once(); - let circuit: Circuit = - Circuit::deserialize_circuit(&circuit).expect("Failed to deserialize circuit"); + let program: Program = + Program::deserialize_program(&program).expect("Failed to deserialize circuit"); + let circuit = match program.functions.len() { + 0 => return Ok(JsWitnessMap::from(WitnessMap::new())), + 1 => &program.functions[0], + _ => return Err(JsString::from("Program contains multiple circuits however ACVM currently only supports programs containing a single circuit")) + }; + let witness_map = WitnessMap::from(witness_map); let return_witness = - extract_indices(&witness_map, circuit.return_values.0.into_iter().collect())?; + extract_indices(&witness_map, circuit.return_values.0.clone().into_iter().collect())?; Ok(JsWitnessMap::from(return_witness)) } @@ -47,16 +56,22 @@ pub fn get_return_witness( /// @returns {WitnessMap} A witness map containing the circuit's public parameters. #[wasm_bindgen(js_name = getPublicParametersWitness)] pub fn get_public_parameters_witness( - circuit: Vec, + program: Vec, solved_witness: JsWitnessMap, ) -> Result { console_error_panic_hook::set_once(); - let circuit: Circuit = - Circuit::deserialize_circuit(&circuit).expect("Failed to deserialize circuit"); + let program: Program = + Program::deserialize_program(&program).expect("Failed to deserialize circuit"); + let circuit = match program.functions.len() { + 0 => return Ok(JsWitnessMap::from(WitnessMap::new())), + 1 => &program.functions[0], + _ => return Err(JsString::from("Program contains multiple circuits however ACVM currently only supports programs containing a single circuit")) + }; + let witness_map = WitnessMap::from(solved_witness); let public_params_witness = - extract_indices(&witness_map, circuit.public_parameters.0.into_iter().collect())?; + extract_indices(&witness_map, circuit.public_parameters.0.clone().into_iter().collect())?; Ok(JsWitnessMap::from(public_params_witness)) } @@ -68,16 +83,22 @@ pub fn get_public_parameters_witness( /// @returns {WitnessMap} A witness map containing the circuit's public inputs. #[wasm_bindgen(js_name = getPublicWitness)] pub fn get_public_witness( - circuit: Vec, + program: Vec, solved_witness: JsWitnessMap, ) -> Result { console_error_panic_hook::set_once(); - let circuit: Circuit = - Circuit::deserialize_circuit(&circuit).expect("Failed to deserialize circuit"); + let program: Program = + Program::deserialize_program(&program).expect("Failed to deserialize circuit"); + let circuit = match program.functions.len() { + 0 => return Ok(JsWitnessMap::from(WitnessMap::new())), + 1 => &program.functions[0], + _ => return Err(JsString::from("Program contains multiple circuits however ACVM currently only supports programs containing a single circuit")) + }; + let witness_map = WitnessMap::from(solved_witness); let public_witness = - extract_indices(&witness_map, circuit.public_inputs().0.into_iter().collect())?; + extract_indices(&witness_map, circuit.public_inputs().0.clone().into_iter().collect())?; Ok(JsWitnessMap::from(public_witness)) } diff --git a/noir/noir-repo/acvm-repo/acvm_js/test/shared/addition.ts b/noir/noir-repo/acvm-repo/acvm_js/test/shared/addition.ts index 217902bdea6..f5b0bda2d07 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/test/shared/addition.ts +++ b/noir/noir-repo/acvm-repo/acvm_js/test/shared/addition.ts @@ -2,11 +2,12 @@ import { WitnessMap } from '@noir-lang/acvm_js'; // See `addition_circuit` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 208, 49, 14, 192, 32, 8, 5, 80, 212, 30, 8, 4, 20, 182, 94, 165, 166, 122, - 255, 35, 52, 77, 28, 76, 58, 214, 191, 124, 166, 23, 242, 15, 0, 8, 240, 77, 154, 125, 206, 198, 127, 161, 176, 209, - 138, 139, 197, 88, 68, 122, 205, 157, 152, 46, 204, 222, 76, 81, 180, 21, 35, 35, 53, 189, 179, 49, 119, 19, 171, 222, - 188, 162, 147, 112, 167, 161, 206, 99, 98, 105, 223, 95, 248, 26, 113, 90, 97, 185, 97, 217, 56, 173, 35, 63, 243, 81, - 87, 163, 125, 1, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 144, 75, 14, 128, 32, 12, 68, 249, 120, 160, 150, + 182, 208, 238, 188, 138, 68, 184, 255, 17, 212, 200, 130, 196, 165, 188, 164, 153, 174, 94, + 38, 227, 221, 203, 118, 159, 119, 95, 226, 200, 125, 36, 252, 3, 253, 66, 87, 152, 92, 4, + 153, 185, 149, 212, 144, 240, 128, 100, 85, 5, 88, 106, 86, 84, 20, 149, 51, 41, 81, 83, + 214, 98, 213, 10, 24, 50, 53, 236, 98, 212, 135, 44, 174, 235, 5, 143, 35, 12, 151, 159, + 126, 55, 109, 28, 231, 145, 47, 245, 105, 191, 143, 133, 1, 0, 0, ]); export const initialWitnessMap: WitnessMap = new Map([ diff --git a/noir/noir-repo/acvm-repo/acvm_js/test/shared/complex_foreign_call.ts b/noir/noir-repo/acvm-repo/acvm_js/test/shared/complex_foreign_call.ts index 27abd72305f..c75a5964347 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/test/shared/complex_foreign_call.ts +++ b/noir/noir-repo/acvm-repo/acvm_js/test/shared/complex_foreign_call.ts @@ -2,13 +2,15 @@ import { WitnessMap } from '@noir-lang/acvm_js'; // See `complex_brillig_foreign_call` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 84, 75, 10, 132, 48, 12, 125, 177, 163, 35, 179, 154, 35, 8, 51, 7, 232, 204, - 9, 188, 139, 184, 83, 116, 233, 241, 173, 152, 98, 12, 213, 141, 21, 244, 65, 232, 39, 175, 233, 35, 73, 155, 3, 32, - 204, 48, 206, 18, 158, 19, 175, 37, 60, 175, 228, 209, 30, 195, 143, 226, 197, 178, 103, 105, 76, 110, 160, 209, 156, - 160, 209, 247, 195, 69, 235, 29, 179, 46, 81, 243, 103, 2, 239, 231, 225, 44, 117, 150, 241, 250, 201, 99, 206, 251, - 96, 95, 161, 242, 14, 193, 243, 40, 162, 105, 253, 219, 12, 75, 47, 146, 186, 251, 37, 116, 86, 93, 219, 55, 245, 96, - 20, 85, 75, 253, 136, 249, 87, 249, 105, 231, 220, 4, 249, 237, 132, 56, 20, 224, 109, 113, 223, 88, 82, 153, 34, 64, - 34, 14, 164, 69, 172, 48, 2, 23, 243, 6, 31, 25, 5, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 84, 65, 14, 132, 32, 12, 108, 101, 117, 205, 158, + 246, 9, 38, 187, 15, 96, 247, 5, 254, 197, 120, 211, 232, 209, 231, 139, 113, 136, 181, 65, + 47, 98, 162, 147, 52, 20, 24, 202, 164, 45, 48, 205, 200, 157, 49, 124, 227, 44, 129, 207, + 152, 75, 120, 94, 137, 209, 30, 195, 143, 227, 197, 178, 103, 105, 76, 110, 160, 209, 156, + 160, 209, 247, 195, 69, 235, 29, 179, 46, 81, 243, 103, 2, 239, 231, 225, 44, 117, 150, 97, + 254, 196, 152, 99, 157, 176, 87, 168, 188, 147, 224, 121, 20, 209, 180, 254, 109, 70, 75, + 47, 178, 186, 251, 37, 116, 86, 93, 219, 55, 245, 96, 20, 85, 75, 253, 8, 255, 171, 246, + 121, 231, 220, 4, 249, 237, 132, 56, 28, 224, 109, 113, 223, 180, 164, 50, 165, 0, 137, 17, + 72, 139, 88, 97, 4, 198, 90, 226, 196, 33, 5, 0, 0, ]); export const initialWitnessMap: WitnessMap = new Map([ [1, '0x0000000000000000000000000000000000000000000000000000000000000001'], diff --git a/noir/noir-repo/acvm-repo/acvm_js/test/shared/fixed_base_scalar_mul.ts b/noir/noir-repo/acvm-repo/acvm_js/test/shared/fixed_base_scalar_mul.ts index c0859f50135..46e1f66fb21 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/test/shared/fixed_base_scalar_mul.ts +++ b/noir/noir-repo/acvm-repo/acvm_js/test/shared/fixed_base_scalar_mul.ts @@ -1,8 +1,8 @@ // See `fixed_base_scalar_mul_circuit` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 77, 138, 91, 10, 0, 32, 16, 2, 109, 171, 175, 46, 221, 209, 247, 229, 130, 130, - 140, 200, 92, 0, 11, 157, 228, 35, 127, 212, 200, 29, 61, 116, 76, 220, 217, 250, 171, 91, 113, 160, 66, 104, 242, 97, - 0, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 77, 138, 81, 10, 0, 48, 8, 66, 87, 219, 190, 118, 233, + 29, 61, 43, 3, 5, 121, 34, 207, 86, 231, 162, 198, 157, 124, 228, 71, 157, 220, 232, 161, + 227, 226, 206, 214, 95, 221, 74, 0, 116, 58, 13, 182, 105, 0, 0, 0, ]); export const initialWitnessMap = new Map([ [1, '0x0000000000000000000000000000000000000000000000000000000000000001'], diff --git a/noir/noir-repo/acvm-repo/acvm_js/test/shared/foreign_call.ts b/noir/noir-repo/acvm-repo/acvm_js/test/shared/foreign_call.ts index 0be8937b57d..527f26b4ae3 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/test/shared/foreign_call.ts +++ b/noir/noir-repo/acvm-repo/acvm_js/test/shared/foreign_call.ts @@ -2,10 +2,11 @@ import { WitnessMap } from '@noir-lang/acvm_js'; // See `simple_brillig_foreign_call` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 143, 177, 10, 192, 32, 16, 67, 227, 21, 74, 233, 212, 79, 177, 127, 208, 159, - 233, 224, 226, 32, 226, 247, 139, 168, 16, 68, 93, 244, 45, 119, 228, 142, 144, 92, 0, 20, 50, 7, 237, 76, 213, 190, - 50, 245, 26, 175, 218, 231, 165, 57, 175, 148, 14, 137, 179, 147, 191, 114, 211, 221, 216, 240, 59, 63, 107, 221, 115, - 104, 181, 103, 244, 43, 36, 10, 38, 68, 108, 25, 253, 238, 136, 1, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 143, 65, 10, 192, 32, 12, 4, 77, 10, 165, 244, 212, + 167, 216, 31, 244, 51, 61, 120, 241, 32, 226, 251, 85, 140, 176, 136, 122, 209, 129, 144, + 176, 9, 97, 151, 84, 225, 74, 69, 50, 31, 48, 35, 85, 251, 164, 235, 53, 94, 218, 247, 75, + 163, 95, 150, 12, 153, 179, 227, 191, 114, 195, 222, 216, 240, 59, 63, 75, 221, 251, 208, + 106, 207, 232, 150, 65, 100, 53, 33, 2, 9, 69, 91, 82, 144, 1, 0, 0, ]); export const initialWitnessMap: WitnessMap = new Map([ [1, '0x0000000000000000000000000000000000000000000000000000000000000005'], diff --git a/noir/noir-repo/acvm-repo/acvm_js/test/shared/memory_op.ts b/noir/noir-repo/acvm-repo/acvm_js/test/shared/memory_op.ts index b5ab64b3447..f2e5ab4af49 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/test/shared/memory_op.ts +++ b/noir/noir-repo/acvm-repo/acvm_js/test/shared/memory_op.ts @@ -1,9 +1,10 @@ // See `memory_op_circuit` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 145, 187, 17, 0, 32, 8, 67, 195, 111, 31, 220, 192, 253, 167, 178, 144, 2, - 239, 236, 132, 194, 52, 129, 230, 93, 8, 6, 64, 176, 101, 225, 28, 78, 49, 43, 238, 154, 225, 254, 166, 209, 205, 165, - 98, 174, 212, 177, 188, 187, 92, 255, 173, 92, 173, 190, 93, 82, 80, 78, 123, 14, 127, 60, 97, 1, 210, 144, 46, 242, - 19, 3, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 81, 201, 13, 0, 32, 8, 147, 195, 125, 112, 3, 247, + 159, 74, 141, 60, 106, 226, 79, 120, 216, 132, 180, 124, 154, 82, 168, 108, 212, 57, 2, + 122, 129, 157, 201, 181, 150, 59, 186, 179, 189, 161, 101, 251, 82, 176, 175, 196, 121, 89, + 118, 185, 246, 91, 185, 26, 125, 187, 64, 80, 134, 29, 195, 31, 79, 24, 2, 250, 167, 252, + 27, 3, 0, 0, ]); export const initialWitnessMap = new Map([ diff --git a/noir/noir-repo/acvm-repo/acvm_js/test/shared/pedersen.ts b/noir/noir-repo/acvm-repo/acvm_js/test/shared/pedersen.ts index 5150d24131c..0882874136e 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/test/shared/pedersen.ts +++ b/noir/noir-repo/acvm-repo/acvm_js/test/shared/pedersen.ts @@ -1,7 +1,8 @@ // See `pedersen_circuit` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 93, 74, 135, 9, 0, 48, 8, 75, 171, 224, 255, 15, 139, 27, 196, 64, 200, 100, 0, 15, - 133, 80, 57, 89, 219, 127, 39, 173, 126, 235, 236, 247, 151, 48, 224, 71, 90, 33, 97, 0, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 93, 74, 7, 6, 0, 0, 8, 108, 209, 255, 63, 156, 54, 233, + 56, 55, 17, 26, 18, 196, 241, 169, 250, 178, 141, 167, 32, 159, 254, 234, 238, 255, 87, + 112, 52, 63, 63, 101, 105, 0, 0, 0, ]); export const initialWitnessMap = new Map([[1, '0x0000000000000000000000000000000000000000000000000000000000000001']]); diff --git a/noir/noir-repo/acvm-repo/acvm_js/test/shared/schnorr_verify.ts b/noir/noir-repo/acvm-repo/acvm_js/test/shared/schnorr_verify.ts index 2127de66f69..8f5667bd888 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/test/shared/schnorr_verify.ts +++ b/noir/noir-repo/acvm-repo/acvm_js/test/shared/schnorr_verify.ts @@ -1,17 +1,21 @@ // See `schnorr_verify_circuit` integration test in `acir/tests/test_program_serialization.rs`. export const bytecode = Uint8Array.from([ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 77, 210, 7, 74, 3, 1, 20, 69, 209, 177, 247, 222, 123, 239, 189, 119, 141, 93, 99, - 220, 133, 251, 95, 130, 152, 103, 78, 32, 3, 195, 33, 4, 66, 248, 239, 254, 20, 69, 209, 84, 212, 158, 216, 206, 223, - 234, 219, 204, 146, 239, 91, 170, 111, 103, 245, 109, 101, 27, 219, 217, 193, 250, 219, 197, 110, 246, 176, 151, 125, - 236, 231, 0, 7, 57, 196, 97, 142, 112, 148, 99, 28, 231, 4, 39, 57, 197, 105, 206, 112, 150, 115, 156, 231, 2, 23, - 185, 196, 101, 174, 112, 149, 107, 92, 231, 6, 55, 185, 197, 109, 238, 112, 151, 123, 220, 231, 1, 15, 121, 196, 99, - 158, 240, 148, 103, 60, 231, 5, 47, 121, 197, 107, 222, 240, 150, 119, 188, 231, 3, 75, 124, 228, 83, 195, 142, 121, - 158, 125, 126, 225, 43, 223, 248, 206, 15, 126, 178, 204, 47, 86, 248, 237, 119, 43, 76, 127, 105, 47, 189, 165, 181, - 116, 150, 198, 234, 125, 117, 249, 47, 233, 41, 45, 165, 163, 52, 148, 126, 210, 78, 186, 73, 51, 233, 37, 173, 164, - 147, 52, 146, 62, 210, 70, 186, 72, 19, 233, 33, 45, 164, 131, 52, 144, 253, 23, 139, 218, 238, 217, 60, 123, 103, - 235, 236, 156, 141, 179, 239, 166, 93, 183, 237, 185, 107, 199, 125, 251, 29, 218, 237, 216, 94, 167, 118, 58, 183, - 207, 165, 93, 174, 237, 113, 107, 135, 123, 247, 47, 185, 251, 147, 59, 191, 184, 239, 155, 187, 126, 184, 103, 217, - 29, 235, 55, 171, 223, 173, 104, 184, 231, 255, 243, 7, 236, 52, 239, 128, 225, 3, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 77, 210, 7, 78, 2, 1, 20, 69, 81, 236, 189, 247, 222, + 123, 239, 93, 177, 33, 34, 238, 194, 253, 47, 193, 200, 147, 67, 194, 36, 147, 163, 33, 33, + 228, 191, 219, 82, 168, 63, 63, 181, 183, 197, 223, 177, 147, 191, 181, 183, 149, 69, 159, + 183, 213, 222, 238, 218, 219, 206, 14, 118, 178, 139, 141, 183, 135, 189, 236, 99, 63, 7, + 56, 200, 33, 14, 115, 132, 163, 28, 227, 56, 39, 56, 201, 41, 78, 115, 134, 179, 156, 227, + 60, 23, 184, 200, 37, 46, 115, 133, 171, 92, 227, 58, 55, 184, 201, 45, 110, 115, 135, 187, + 220, 227, 62, 15, 120, 200, 35, 30, 243, 132, 167, 60, 227, 57, 47, 120, 201, 43, 94, 243, + 134, 183, 188, 227, 61, 31, 248, 200, 39, 22, 249, 204, 151, 166, 29, 243, 188, 250, 255, + 141, 239, 44, 241, 131, 101, 126, 178, 194, 47, 86, 249, 237, 123, 171, 76, 127, 105, 47, + 189, 165, 181, 116, 150, 198, 26, 125, 245, 248, 45, 233, 41, 45, 165, 163, 52, 148, 126, + 210, 78, 186, 73, 51, 233, 37, 173, 164, 147, 52, 146, 62, 210, 70, 186, 72, 19, 233, 33, + 45, 164, 131, 52, 144, 253, 151, 11, 245, 221, 179, 121, 246, 206, 214, 217, 57, 27, 103, + 223, 109, 187, 238, 218, 115, 223, 142, 135, 246, 59, 182, 219, 169, 189, 206, 237, 116, + 105, 159, 107, 187, 220, 218, 227, 222, 14, 143, 238, 95, 116, 247, 23, 119, 126, 115, 223, + 146, 187, 150, 221, 179, 226, 142, 141, 155, 53, 238, 86, 104, 186, 231, 255, 243, 7, 100, + 141, 232, 192, 233, 3, 0, 0, ]); export const initialWitnessMap = new Map([ diff --git a/noir/noir-repo/acvm-repo/acvm_js/test/shared/witness_compression.ts b/noir/noir-repo/acvm-repo/acvm_js/test/shared/witness_compression.ts index 36b9a0284af..f9d66c2c8d0 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/test/shared/witness_compression.ts +++ b/noir/noir-repo/acvm-repo/acvm_js/test/shared/witness_compression.ts @@ -4,19 +4,22 @@ // assert(x != y); // x + y // } +// +// Regenerate this byte array by going to the Noir integration tests and running `/test_programs/execution_success/witness_compression` +// after recompiling Noir to print the witness byte array to be written to file after execution export const expectedCompressedWitnessMap = Uint8Array.from([ - 31, 139, 8, 0, 0, 0, 0, 0, 2, 255, 173, 208, 187, 13, 128, 48, 12, 4, 80, 190, 153, 199, 142, 237, 196, 238, 88, 133, - 8, 103, 255, 17, 64, 34, 5, 61, 62, 233, 164, 171, 94, 113, 105, 122, 51, 63, 61, 198, 134, 127, 193, 37, 206, 202, - 235, 199, 34, 40, 204, 94, 179, 35, 225, 9, 217, 154, 10, 176, 180, 162, 168, 40, 42, 87, 86, 34, 87, 214, 106, 205, - 42, 24, 50, 57, 118, 49, 234, 3, 219, 2, 173, 61, 240, 175, 20, 103, 209, 13, 151, 252, 77, 33, 208, 1, 0, 0, + 31, 139, 8, 0, 0, 0, 0, 0, 2, 255, 173, 206, 185, 13, 0, 48, 8, 67, 209, 144, 107, 30, 146, + 44, 144, 253, 167, 162, 65, 130, 158, 239, 198, 174, 158, 44, 45, 178, 211, 254, 222, 90, + 203, 17, 206, 186, 29, 252, 53, 64, 107, 114, 150, 46, 206, 122, 6, 24, 73, 44, 193, 220, + 1, 0, 0, ]); export const expectedWitnessMap = new Map([ - [1, '0x0000000000000000000000000000000000000000000000000000000000000001'], - [2, '0x0000000000000000000000000000000000000000000000000000000000000002'], - [3, '0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000'], - [4, '0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000'], - [5, '0x0000000000000000000000000000000000000000000000000000000000000001'], - [6, '0x0000000000000000000000000000000000000000000000000000000000000003'], + [0, '0x0000000000000000000000000000000000000000000000000000000000000001'], + [1, '0x0000000000000000000000000000000000000000000000000000000000000002'], + [2, '0x0000000000000000000000000000000000000000000000000000000000000001'], + [3, '0x0000000000000000000000000000000000000000000000000000000000000001'], + [4, '0x0000000000000000000000000000000000000000000000000000000000000000'], + [5, '0x0000000000000000000000000000000000000000000000000000000000000003'], ]); diff --git a/noir/noir-repo/compiler/noirc_driver/src/contract.rs b/noir/noir-repo/compiler/noirc_driver/src/contract.rs index 66e8dc0e730..9a0e25a321b 100644 --- a/noir/noir-repo/compiler/noirc_driver/src/contract.rs +++ b/noir/noir-repo/compiler/noirc_driver/src/contract.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; -use acvm::acir::circuit::Circuit; +use acvm::acir::circuit::Program; use fm::FileId; use noirc_abi::{Abi, ContractEvent}; use noirc_errors::debug_info::DebugInfo; @@ -45,10 +45,10 @@ pub struct ContractFunction { pub abi: Abi, #[serde( - serialize_with = "Circuit::serialize_circuit_base64", - deserialize_with = "Circuit::deserialize_circuit_base64" + serialize_with = "Program::serialize_program_base64", + deserialize_with = "Program::deserialize_program_base64" )] - pub bytecode: Circuit, + pub bytecode: Program, pub debug: DebugInfo, } diff --git a/noir/noir-repo/compiler/noirc_driver/src/lib.rs b/noir/noir-repo/compiler/noirc_driver/src/lib.rs index c9494a64b41..bc3062e5807 100644 --- a/noir/noir-repo/compiler/noirc_driver/src/lib.rs +++ b/noir/noir-repo/compiler/noirc_driver/src/lib.rs @@ -3,7 +3,7 @@ #![warn(unreachable_pub)] #![warn(clippy::semicolon_if_nothing_returned)] -use acvm::acir::circuit::ExpressionWidth; +use acvm::acir::circuit::{ExpressionWidth, Program}; use clap::Args; use fm::{FileId, FileManager}; use iter_extended::vecmap; @@ -298,7 +298,7 @@ pub fn compile_main( if options.print_acir { println!("Compiled ACIR for main (unoptimized):"); - println!("{}", compiled_program.circuit); + println!("{}", compiled_program.program); } Ok((compiled_program, warnings)) @@ -414,7 +414,7 @@ fn compile_contract_inner( name, custom_attributes, abi: function.abi, - bytecode: function.circuit, + bytecode: function.program, debug: function.debug, is_unconstrained: modifiers.is_unconstrained, }); @@ -487,7 +487,8 @@ pub fn compile_no_check( Ok(CompiledProgram { hash, - circuit, + // TODO(https://github.com/noir-lang/noir/issues/4428) + program: Program { functions: vec![circuit] }, debug, abi, file_map, diff --git a/noir/noir-repo/compiler/noirc_driver/src/program.rs b/noir/noir-repo/compiler/noirc_driver/src/program.rs index 8d509d3bf68..6f527297dcb 100644 --- a/noir/noir-repo/compiler/noirc_driver/src/program.rs +++ b/noir/noir-repo/compiler/noirc_driver/src/program.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use acvm::acir::circuit::Circuit; +use acvm::acir::circuit::Program; use fm::FileId; use noirc_errors::debug_info::DebugInfo; @@ -19,10 +19,10 @@ pub struct CompiledProgram { pub hash: u64, #[serde( - serialize_with = "Circuit::serialize_circuit_base64", - deserialize_with = "Circuit::deserialize_circuit_base64" + serialize_with = "Program::serialize_program_base64", + deserialize_with = "Program::deserialize_program_base64" )] - pub circuit: Circuit, + pub program: Program, pub abi: noirc_abi::Abi, pub debug: DebugInfo, pub file_map: BTreeMap, diff --git a/noir/noir-repo/test_programs/execution_success/witness_compression/Nargo.toml b/noir/noir-repo/test_programs/execution_success/witness_compression/Nargo.toml new file mode 100644 index 00000000000..7d6ba0c1938 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/witness_compression/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "witness_compression" +type = "bin" +authors = [""] +compiler_version = ">=0.24.0" + +[dependencies] \ No newline at end of file diff --git a/noir/noir-repo/test_programs/execution_success/witness_compression/Prover.toml b/noir/noir-repo/test_programs/execution_success/witness_compression/Prover.toml new file mode 100644 index 00000000000..8c12ebba6cf --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/witness_compression/Prover.toml @@ -0,0 +1,2 @@ +x = "1" +y = "2" diff --git a/noir/noir-repo/test_programs/execution_success/witness_compression/src/main.nr b/noir/noir-repo/test_programs/execution_success/witness_compression/src/main.nr new file mode 100644 index 00000000000..f18d4b902a5 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/witness_compression/src/main.nr @@ -0,0 +1,7 @@ +// This test should be used to regenerate the serialized witness used in the `acvm_js` integration tests. +// The `acvm_js` test file containing the serialized witness should be also called `witness_compression`. +// After recompiling Noir, you can manually print the witness byte array to be written to file after execution. +fn main(x : Field, y : pub Field) -> pub Field { + assert(x != y); + x + y +} diff --git a/noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs b/noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs index 255b6131fd6..b76d0eccc29 100644 --- a/noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs +++ b/noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs @@ -1,6 +1,6 @@ use std::io::{self, Write}; -use acir::circuit::Circuit; +use acir::circuit::Program; use acir::native_types::WitnessMap; use bn254_blackbox_solver::Bn254BlackBoxSolver; use clap::Args; @@ -66,10 +66,10 @@ pub(crate) fn execute_program_from_witness( foreign_call_resolver_url: Option<&str>, ) -> Result { let blackbox_solver = Bn254BlackBoxSolver::new(); - let circuit: Circuit = Circuit::deserialize_circuit(bytecode) + let program: Program = Program::deserialize_program(bytecode) .map_err(|_| CliError::CircuitDeserializationError())?; execute_circuit( - &circuit, + &program.functions[0], inputs_map.clone(), &blackbox_solver, &mut DefaultForeignCallExecutor::new(true, foreign_call_resolver_url), diff --git a/noir/noir-repo/tooling/acvm_cli/src/errors.rs b/noir/noir-repo/tooling/acvm_cli/src/errors.rs index 035388d05f7..923046410ea 100644 --- a/noir/noir-repo/tooling/acvm_cli/src/errors.rs +++ b/noir/noir-repo/tooling/acvm_cli/src/errors.rs @@ -32,7 +32,7 @@ pub(crate) enum CliError { FilesystemError(#[from] FilesystemError), /// Error related to circuit deserialization - #[error("Error: failed to deserialize circuit")] + #[error("Error: failed to deserialize circuit in ACVM CLI")] CircuitDeserializationError(), /// Error related to circuit execution diff --git a/noir/noir-repo/tooling/backend_interface/src/proof_system.rs b/noir/noir-repo/tooling/backend_interface/src/proof_system.rs index 485381006df..211708aa846 100644 --- a/noir/noir-repo/tooling/backend_interface/src/proof_system.rs +++ b/noir/noir-repo/tooling/backend_interface/src/proof_system.rs @@ -3,7 +3,7 @@ use std::io::Write; use std::path::Path; use acvm::acir::{ - circuit::{Circuit, ExpressionWidth}, + circuit::{ExpressionWidth, Program}, native_types::WitnessMap, }; use acvm::FieldElement; @@ -17,7 +17,7 @@ use crate::cli::{ use crate::{Backend, BackendError}; impl Backend { - pub fn get_exact_circuit_size(&self, circuit: &Circuit) -> Result { + pub fn get_exact_circuit_size(&self, program: &Program) -> Result { let binary_path = self.assert_binary_exists()?; self.assert_correct_version()?; @@ -26,8 +26,8 @@ impl Backend { // Create a temporary file for the circuit let circuit_path = temp_directory.join("circuit").with_extension("bytecode"); - let serialized_circuit = Circuit::serialize_circuit(circuit); - write_to_file(&serialized_circuit, &circuit_path); + let serialized_program = Program::serialize_program(program); + write_to_file(&serialized_program, &circuit_path); GatesCommand { crs_path: self.crs_directory(), bytecode_path: circuit_path } .run(binary_path) @@ -55,7 +55,7 @@ impl Backend { #[tracing::instrument(level = "trace", skip_all)] pub fn prove( &self, - circuit: &Circuit, + program: &Program, witness_values: WitnessMap, ) -> Result, BackendError> { let binary_path = self.assert_binary_exists()?; @@ -72,9 +72,9 @@ impl Backend { // Create a temporary file for the circuit // - let bytecode_path = temp_directory.join("circuit").with_extension("bytecode"); - let serialized_circuit = Circuit::serialize_circuit(circuit); - write_to_file(&serialized_circuit, &bytecode_path); + let bytecode_path = temp_directory.join("program").with_extension("bytecode"); + let serialized_program = Program::serialize_program(program); + write_to_file(&serialized_program, &bytecode_path); // Create proof and store it in the specified path let proof_with_public_inputs = @@ -82,7 +82,8 @@ impl Backend { .run(binary_path)?; let proof = bb_abstraction_leaks::remove_public_inputs( - circuit.public_inputs().0.len(), + // TODO(https://github.com/noir-lang/noir/issues/4428) + program.functions[0].public_inputs().0.len(), &proof_with_public_inputs, ); Ok(proof) @@ -93,7 +94,7 @@ impl Backend { &self, proof: &[u8], public_inputs: WitnessMap, - circuit: &Circuit, + program: &Program, ) -> Result { let binary_path = self.assert_binary_exists()?; self.assert_correct_version()?; @@ -108,9 +109,9 @@ impl Backend { write_to_file(&proof_with_public_inputs, &proof_path); // Create a temporary file for the circuit - let bytecode_path = temp_directory.join("circuit").with_extension("bytecode"); - let serialized_circuit = Circuit::serialize_circuit(circuit); - write_to_file(&serialized_circuit, &bytecode_path); + let bytecode_path = temp_directory.join("program").with_extension("bytecode"); + let serialized_program = Program::serialize_program(program); + write_to_file(&serialized_program, &bytecode_path); // Create the verification key and write it to the specified path let vk_path = temp_directory.join("vk"); @@ -128,7 +129,7 @@ impl Backend { pub fn get_intermediate_proof_artifacts( &self, - circuit: &Circuit, + program: &Program, proof: &[u8], public_inputs: WitnessMap, ) -> Result<(Vec, FieldElement, Vec), BackendError> { @@ -140,9 +141,9 @@ impl Backend { // Create a temporary file for the circuit // - let bytecode_path = temp_directory.join("circuit").with_extension("bytecode"); - let serialized_circuit = Circuit::serialize_circuit(circuit); - write_to_file(&serialized_circuit, &bytecode_path); + let bytecode_path = temp_directory.join("program").with_extension("bytecode"); + let serialized_program = Program::serialize_program(program); + write_to_file(&serialized_program, &bytecode_path); // Create the verification key and write it to the specified path let vk_path = temp_directory.join("vk"); diff --git a/noir/noir-repo/tooling/backend_interface/src/smart_contract.rs b/noir/noir-repo/tooling/backend_interface/src/smart_contract.rs index 5af75e48389..f6beeeb09d9 100644 --- a/noir/noir-repo/tooling/backend_interface/src/smart_contract.rs +++ b/noir/noir-repo/tooling/backend_interface/src/smart_contract.rs @@ -3,11 +3,11 @@ use crate::{ cli::{ContractCommand, WriteVkCommand}, Backend, BackendError, }; -use acvm::acir::circuit::Circuit; +use acvm::acir::circuit::Program; use tempfile::tempdir; impl Backend { - pub fn eth_contract(&self, circuit: &Circuit) -> Result { + pub fn eth_contract(&self, program: &Program) -> Result { let binary_path = self.assert_binary_exists()?; self.assert_correct_version()?; @@ -15,9 +15,9 @@ impl Backend { let temp_directory_path = temp_directory.path().to_path_buf(); // Create a temporary file for the circuit - let bytecode_path = temp_directory_path.join("circuit").with_extension("bytecode"); - let serialized_circuit = Circuit::serialize_circuit(circuit); - write_to_file(&serialized_circuit, &bytecode_path); + let bytecode_path = temp_directory_path.join("program").with_extension("bytecode"); + let serialized_program = Program::serialize_program(program); + write_to_file(&serialized_program, &bytecode_path); // Create the verification key and write it to the specified path let vk_path = temp_directory_path.join("vk"); @@ -38,7 +38,7 @@ mod tests { use std::collections::BTreeSet; use acvm::acir::{ - circuit::{Circuit, ExpressionWidth, Opcode, PublicInputs}, + circuit::{Circuit, ExpressionWidth, Opcode, Program, PublicInputs}, native_types::{Expression, Witness}, }; @@ -59,8 +59,9 @@ mod tests { assert_messages: Default::default(), recursive: false, }; + let program = Program { functions: vec![circuit] }; - let contract = get_mock_backend()?.eth_contract(&circuit)?; + let contract = get_mock_backend()?.eth_contract(&program)?; assert!(contract.contains("contract VerifierContract")); diff --git a/noir/noir-repo/tooling/debugger/src/dap.rs b/noir/noir-repo/tooling/debugger/src/dap.rs index 7c722ed0a61..ea3204ebbbc 100644 --- a/noir/noir-repo/tooling/debugger/src/dap.rs +++ b/noir/noir-repo/tooling/debugger/src/dap.rs @@ -607,8 +607,13 @@ pub fn run_session( file_map: program.file_map, warnings: program.warnings, }; - let mut session = - DapSession::new(server, solver, &program.circuit, &debug_artifact, initial_witness); + let mut session = DapSession::new( + server, + solver, + &program.program.functions[0], + &debug_artifact, + initial_witness, + ); session.run_loop() } diff --git a/noir/noir-repo/tooling/nargo/src/artifacts/contract.rs b/noir/noir-repo/tooling/nargo/src/artifacts/contract.rs index 020ce49662f..c0316a6d1a2 100644 --- a/noir/noir-repo/tooling/nargo/src/artifacts/contract.rs +++ b/noir/noir-repo/tooling/nargo/src/artifacts/contract.rs @@ -1,4 +1,4 @@ -use acvm::acir::circuit::Circuit; +use acvm::acir::circuit::Program; use noirc_abi::{Abi, ContractEvent}; use noirc_driver::{CompiledContract, ContractFunction}; use serde::{Deserialize, Serialize}; @@ -50,10 +50,10 @@ pub struct ContractFunctionArtifact { pub abi: Abi, #[serde( - serialize_with = "Circuit::serialize_circuit_base64", - deserialize_with = "Circuit::deserialize_circuit_base64" + serialize_with = "Program::serialize_program_base64", + deserialize_with = "Program::deserialize_program_base64" )] - pub bytecode: Circuit, + pub bytecode: Program, #[serde( serialize_with = "DebugInfo::serialize_compressed_base64_json", diff --git a/noir/noir-repo/tooling/nargo/src/artifacts/program.rs b/noir/noir-repo/tooling/nargo/src/artifacts/program.rs index d8dc42ec214..046db1cd8fa 100644 --- a/noir/noir-repo/tooling/nargo/src/artifacts/program.rs +++ b/noir/noir-repo/tooling/nargo/src/artifacts/program.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use acvm::acir::circuit::Circuit; +use acvm::acir::circuit::Program; use fm::FileId; use noirc_abi::Abi; use noirc_driver::CompiledProgram; @@ -21,10 +21,10 @@ pub struct ProgramArtifact { pub abi: Abi, #[serde( - serialize_with = "Circuit::serialize_circuit_base64", - deserialize_with = "Circuit::deserialize_circuit_base64" + serialize_with = "Program::serialize_program_base64", + deserialize_with = "Program::deserialize_program_base64" )] - pub bytecode: Circuit, + pub bytecode: Program, #[serde( serialize_with = "DebugInfo::serialize_compressed_base64_json", @@ -37,14 +37,14 @@ pub struct ProgramArtifact { } impl From for ProgramArtifact { - fn from(program: CompiledProgram) -> Self { + fn from(compiled_program: CompiledProgram) -> Self { ProgramArtifact { - hash: program.hash, - abi: program.abi, - noir_version: program.noir_version, - bytecode: program.circuit, - debug_symbols: program.debug, - file_map: program.file_map, + hash: compiled_program.hash, + abi: compiled_program.abi, + noir_version: compiled_program.noir_version, + bytecode: compiled_program.program, + debug_symbols: compiled_program.debug, + file_map: compiled_program.file_map, } } } @@ -55,7 +55,7 @@ impl From for CompiledProgram { hash: program.hash, abi: program.abi, noir_version: program.noir_version, - circuit: program.bytecode, + program: program.bytecode, debug: program.debug_symbols, file_map: program.file_map, warnings: vec![], diff --git a/noir/noir-repo/tooling/nargo/src/ops/optimize.rs b/noir/noir-repo/tooling/nargo/src/ops/optimize.rs index 2d0c4c43d25..cfaaf27ea98 100644 --- a/noir/noir-repo/tooling/nargo/src/ops/optimize.rs +++ b/noir/noir-repo/tooling/nargo/src/ops/optimize.rs @@ -1,17 +1,22 @@ use iter_extended::vecmap; use noirc_driver::{CompiledContract, CompiledProgram}; -pub fn optimize_program(mut program: CompiledProgram) -> CompiledProgram { - let (optimized_circuit, location_map) = acvm::compiler::optimize(program.circuit); - program.circuit = optimized_circuit; - program.debug.update_acir(location_map); - program +/// TODO(https://github.com/noir-lang/noir/issues/4428): Need to update how these passes are run to account for +/// multiple ACIR functions + +pub fn optimize_program(mut compiled_program: CompiledProgram) -> CompiledProgram { + let (optimized_circuit, location_map) = + acvm::compiler::optimize(std::mem::take(&mut compiled_program.program.functions[0])); + compiled_program.program.functions[0] = optimized_circuit; + compiled_program.debug.update_acir(location_map); + compiled_program } pub fn optimize_contract(contract: CompiledContract) -> CompiledContract { let functions = vecmap(contract.functions, |mut func| { - let (optimized_bytecode, location_map) = acvm::compiler::optimize(func.bytecode); - func.bytecode = optimized_bytecode; + let (optimized_bytecode, location_map) = + acvm::compiler::optimize(std::mem::take(&mut func.bytecode.functions[0])); + func.bytecode.functions[0] = optimized_bytecode; func.debug.update_acir(location_map); func }); diff --git a/noir/noir-repo/tooling/nargo/src/ops/test.rs b/noir/noir-repo/tooling/nargo/src/ops/test.rs index 8ddcb5cf8d2..8cf2934da4d 100644 --- a/noir/noir-repo/tooling/nargo/src/ops/test.rs +++ b/noir/noir-repo/tooling/nargo/src/ops/test.rs @@ -28,18 +28,23 @@ pub fn run_test( foreign_call_resolver_url: Option<&str>, config: &CompileOptions, ) -> TestStatus { - let program = compile_no_check(context, config, test_function.get_id(), None, false); - match program { - Ok(program) => { + let compiled_program = compile_no_check(context, config, test_function.get_id(), None, false); + match compiled_program { + Ok(compiled_program) => { // Run the backend to ensure the PWG evaluates functions like std::hash::pedersen, // otherwise constraints involving these expressions will not error. let circuit_execution = execute_circuit( - &program.circuit, + // TODO(https://github.com/noir-lang/noir/issues/4428) + &compiled_program.program.functions[0], WitnessMap::new(), blackbox_solver, &mut DefaultForeignCallExecutor::new(show_output, foreign_call_resolver_url), ); - test_status_program_compile_pass(test_function, program.debug, circuit_execution) + test_status_program_compile_pass( + test_function, + compiled_program.debug, + circuit_execution, + ) } Err(err) => test_status_program_compile_fail(err, test_function), } diff --git a/noir/noir-repo/tooling/nargo/src/ops/transform.rs b/noir/noir-repo/tooling/nargo/src/ops/transform.rs index 9267ed7e045..274286a46e4 100644 --- a/noir/noir-repo/tooling/nargo/src/ops/transform.rs +++ b/noir/noir-repo/tooling/nargo/src/ops/transform.rs @@ -2,16 +2,21 @@ use acvm::acir::circuit::ExpressionWidth; use iter_extended::vecmap; use noirc_driver::{CompiledContract, CompiledProgram}; +/// TODO(https://github.com/noir-lang/noir/issues/4428): Need to update how these passes are run to account for +/// multiple ACIR functions + pub fn transform_program( - mut program: CompiledProgram, + mut compiled_program: CompiledProgram, expression_width: ExpressionWidth, ) -> CompiledProgram { - let (optimized_circuit, location_map) = - acvm::compiler::compile(program.circuit, expression_width); + let (optimized_circuit, location_map) = acvm::compiler::compile( + std::mem::take(&mut compiled_program.program.functions[0]), + expression_width, + ); - program.circuit = optimized_circuit; - program.debug.update_acir(location_map); - program + compiled_program.program.functions[0] = optimized_circuit; + compiled_program.debug.update_acir(location_map); + compiled_program } pub fn transform_contract( @@ -19,9 +24,11 @@ pub fn transform_contract( expression_width: ExpressionWidth, ) -> CompiledContract { let functions = vecmap(contract.functions, |mut func| { - let (optimized_bytecode, location_map) = - acvm::compiler::compile(func.bytecode, expression_width); - func.bytecode = optimized_bytecode; + let (optimized_bytecode, location_map) = acvm::compiler::compile( + std::mem::take(&mut func.bytecode.functions[0]), + expression_width, + ); + func.bytecode.functions[0] = optimized_bytecode; func.debug.update_acir(location_map); func }); diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/codegen_verifier_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/codegen_verifier_cmd.rs index f0fe2e0ea78..259e209b65a 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/codegen_verifier_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/codegen_verifier_cmd.rs @@ -64,7 +64,13 @@ pub(crate) fn run( let program = nargo::ops::transform_program(program, expression_width); - let smart_contract_string = backend.eth_contract(&program.circuit)?; + // TODO(https://github.com/noir-lang/noir/issues/4428): + // We do not expect to have a smart contract verifier for a foldable program with multiple circuits. + // However, in the future we can expect to possibly have non-inlined ACIR functions during compilation + // that will be inlined at a later step such as by the ACVM compiler or by the backend. + // Add appropriate handling here once the compiler enables multiple ACIR functions. + assert_eq!(program.program.functions.len(), 1); + let smart_contract_string = backend.eth_contract(&program.program)?; let contract_dir = workspace.contracts_directory_path(package); create_named_dir(&contract_dir, "contract"); diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/compile_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/compile_cmd.rs index 9b7bf9cdb0c..54e8535f094 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/compile_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/compile_cmd.rs @@ -214,10 +214,10 @@ pub(super) fn save_program( circuit_dir: &Path, only_acir_opt: bool, ) { - let program_artifact = ProgramArtifact::from(program.clone()); if only_acir_opt { - only_acir(&program_artifact, circuit_dir); + only_acir(program.program, circuit_dir); } else { + let program_artifact = ProgramArtifact::from(program.clone()); save_program_to_file(&program_artifact, &package.name, circuit_dir); } } diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/debug_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/debug_cmd.rs index 2c4937b6f16..1f448105ee2 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/debug_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/debug_cmd.rs @@ -235,7 +235,7 @@ pub(crate) fn debug_program( noir_debugger::debug_circuit( &blackbox_solver, - &compiled_program.circuit, + &compiled_program.program.functions[0], debug_artifact, initial_witness, ) diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/execute_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/execute_cmd.rs index 1be2fbf61d9..022bf7b761e 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/execute_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/execute_cmd.rs @@ -136,8 +136,9 @@ pub(crate) fn execute_program( let initial_witness = compiled_program.abi.encode(inputs_map, None)?; + // TODO(https://github.com/noir-lang/noir/issues/4428) let solved_witness_err = nargo::ops::execute_circuit( - &compiled_program.circuit, + &compiled_program.program.functions[0], initial_witness, &blackbox_solver, &mut DefaultForeignCallExecutor::new(true, foreign_call_resolver_url), diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/fs/program.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/fs/program.rs index 1fb57ae6685..77005e8d5af 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/fs/program.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/fs/program.rs @@ -1,6 +1,6 @@ use std::path::{Path, PathBuf}; -use acvm::acir::circuit::Circuit; +use acvm::acir::circuit::Program; use nargo::artifacts::{contract::ContractArtifact, program::ProgramArtifact}; use noirc_frontend::graph::CrateName; @@ -18,13 +18,10 @@ pub(crate) fn save_program_to_file>( } /// Writes the bytecode as acir.gz -pub(crate) fn only_acir>( - program_artifact: &ProgramArtifact, - circuit_dir: P, -) -> PathBuf { +pub(crate) fn only_acir>(program: Program, circuit_dir: P) -> PathBuf { create_named_dir(circuit_dir.as_ref(), "target"); let circuit_path = circuit_dir.as_ref().join("acir").with_extension("gz"); - let bytes = Circuit::serialize_circuit(&program_artifact.bytecode); + let bytes = Program::serialize_program(&program); write_to_file(&bytes, &circuit_path); circuit_path diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/fs/witness.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/fs/witness.rs index 1a2cf88f4a1..52b5c385e5d 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/fs/witness.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/fs/witness.rs @@ -1,6 +1,6 @@ use std::path::{Path, PathBuf}; -use acvm::acir::native_types::WitnessMap; +use acvm::acir::native_types::{WitnessMap, WitnessStack}; use nargo::constants::WITNESS_EXT; use super::{create_named_dir, write_to_file}; @@ -14,7 +14,9 @@ pub(crate) fn save_witness_to_dir>( create_named_dir(witness_dir.as_ref(), "witness"); let witness_path = witness_dir.as_ref().join(witness_name).with_extension(WITNESS_EXT); - let buf: Vec = witnesses.try_into()?; + // TODO(https://github.com/noir-lang/noir/issues/4428) + let witness_stack: WitnessStack = witnesses.into(); + let buf: Vec = witness_stack.try_into()?; write_to_file(buf.as_slice(), &witness_path); diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/info_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/info_cmd.rs index 391e8061a07..49924622392 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/info_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/info_cmd.rs @@ -276,8 +276,9 @@ fn count_opcodes_and_gates_in_program( Ok(ProgramInfo { name: package.name.to_string(), expression_width, - acir_opcodes: compiled_program.circuit.opcodes.len(), - circuit_size: backend.get_exact_circuit_size(&compiled_program.circuit)?, + // TODO(https://github.com/noir-lang/noir/issues/4428) + acir_opcodes: compiled_program.program.functions[0].opcodes.len(), + circuit_size: backend.get_exact_circuit_size(&compiled_program.program)?, }) } @@ -292,7 +293,8 @@ fn count_opcodes_and_gates_in_contract( .map(|function| -> Result<_, BackendError> { Ok(FunctionInfo { name: function.name, - acir_opcodes: function.bytecode.opcodes.len(), + // TODO(https://github.com/noir-lang/noir/issues/4428) + acir_opcodes: function.bytecode.functions[0].opcodes.len(), circuit_size: backend.get_exact_circuit_size(&function.bytecode)?, }) }) diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/prove_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/prove_cmd.rs index e413db0e5f3..9847977deef 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/prove_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/prove_cmd.rs @@ -138,11 +138,11 @@ pub(crate) fn prove_package( Format::Toml, )?; - let proof = backend.prove(&compiled_program.circuit, solved_witness)?; + let proof = backend.prove(&compiled_program.program, solved_witness)?; if check_proof { let public_inputs = public_abi.encode(&public_inputs, return_value)?; - let valid_proof = backend.verify(&proof, public_inputs, &compiled_program.circuit)?; + let valid_proof = backend.verify(&proof, public_inputs, &compiled_program.program)?; if !valid_proof { return Err(CliError::InvalidProof("".into())); diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/verify_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/verify_cmd.rs index 3e23c9a3e9f..7202a179aae 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/verify_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/verify_cmd.rs @@ -102,7 +102,7 @@ fn verify_package( let proof = load_hex_data(&proof_path)?; - let valid_proof = backend.verify(&proof, public_inputs, &compiled_program.circuit)?; + let valid_proof = backend.verify(&proof, public_inputs, &compiled_program.program)?; if valid_proof { Ok(()) diff --git a/noir/noir-repo/tooling/nargo_cli/src/errors.rs b/noir/noir-repo/tooling/nargo_cli/src/errors.rs index c2996f53420..40fb7886405 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/errors.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/errors.rs @@ -1,4 +1,4 @@ -use acvm::acir::native_types::WitnessMapError; +use acvm::acir::native_types::WitnessStackError; use hex::FromHexError; use nargo::{errors::CompileError, NargoError}; use nargo_toml::ManifestError; @@ -22,9 +22,9 @@ pub(crate) enum FilesystemError { #[error(transparent)] InputParserError(#[from] InputParserError), - /// WitnessMap serialization error + /// WitnessStack serialization error #[error(transparent)] - WitnessMapSerialization(#[from] WitnessMapError), + WitnessStackSerialization(#[from] WitnessStackError), #[error("Error: could not deserialize build program: {0}")] ProgramSerializationError(String), diff --git a/noir/noir-repo/tooling/noir_js_backend_barretenberg/package.json b/noir/noir-repo/tooling/noir_js_backend_barretenberg/package.json index d94999f324b..e5619262287 100644 --- a/noir/noir-repo/tooling/noir_js_backend_barretenberg/package.json +++ b/noir/noir-repo/tooling/noir_js_backend_barretenberg/package.json @@ -42,7 +42,7 @@ "lint": "NODE_NO_WARNINGS=1 eslint . --ext .ts --ignore-path ./.eslintignore --max-warnings 0" }, "dependencies": { - "@aztec/bb.js": "0.26.3", + "@aztec/bb.js": "portal:../../../../barretenberg/ts", "@noir-lang/types": "workspace:*", "fflate": "^0.8.0" }, diff --git a/noir/noir-repo/tooling/noir_js_backend_barretenberg/src/index.ts b/noir/noir-repo/tooling/noir_js_backend_barretenberg/src/index.ts index af03743eb2f..bfdf1005a93 100644 --- a/noir/noir-repo/tooling/noir_js_backend_barretenberg/src/index.ts +++ b/noir/noir-repo/tooling/noir_js_backend_barretenberg/src/index.ts @@ -45,7 +45,6 @@ export class BarretenbergBackend implements Backend { } const { Barretenberg, RawBuffer, Crs } = await import('@aztec/bb.js'); const api = await Barretenberg.new(this.options); - const [_exact, _total, subgroupSize] = await api.acirGetCircuitSizes(this.acirUncompressedBytecode); const crs = await Crs.new(subgroupSize + 1); await api.commonInitSlabAllocator(subgroupSize); diff --git a/noir/noir-repo/yarn.lock b/noir/noir-repo/yarn.lock index 49485193532..ad12edebc85 100644 --- a/noir/noir-repo/yarn.lock +++ b/noir/noir-repo/yarn.lock @@ -221,19 +221,18 @@ __metadata: languageName: node linkType: hard -"@aztec/bb.js@npm:0.26.3": - version: 0.26.3 - resolution: "@aztec/bb.js@npm:0.26.3" +"@aztec/bb.js@portal:../../../../barretenberg/ts::locator=%40noir-lang%2Fbackend_barretenberg%40workspace%3Atooling%2Fnoir_js_backend_barretenberg": + version: 0.0.0-use.local + resolution: "@aztec/bb.js@portal:../../../../barretenberg/ts::locator=%40noir-lang%2Fbackend_barretenberg%40workspace%3Atooling%2Fnoir_js_backend_barretenberg" dependencies: comlink: ^4.4.1 commander: ^10.0.1 debug: ^4.3.4 tslib: ^2.4.0 bin: - bb.js: dest/node/main.js - checksum: 74c2b7ef5405f56472cf7c41d1c13261df07b1d5019e3ede9b63d218378e0fb73ccf5c52f1cc524505efad5799b347b497349d7c9b6fe82286014b1574f12309 + bb.js: ./dest/node/main.js languageName: node - linkType: hard + linkType: soft "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.11, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.8.3": version: 7.23.5 @@ -4396,7 +4395,7 @@ __metadata: version: 0.0.0-use.local resolution: "@noir-lang/backend_barretenberg@workspace:tooling/noir_js_backend_barretenberg" dependencies: - "@aztec/bb.js": 0.26.3 + "@aztec/bb.js": "portal:../../../../barretenberg/ts" "@noir-lang/types": "workspace:*" "@types/node": ^20.6.2 "@types/prettier": ^3 diff --git a/noir/scripts/test_native.sh b/noir/scripts/test_native.sh index e8c3f27b4b7..5b1bb1b180a 100755 --- a/noir/scripts/test_native.sh +++ b/noir/scripts/test_native.sh @@ -14,4 +14,4 @@ RUSTFLAGS=-Dwarnings cargo clippy --workspace --locked --release ./.github/scripts/cargo-binstall-install.sh cargo-binstall cargo-nextest --version 0.9.67 -y --secure -cargo nextest run --locked --release -E '!test(hello_world_example)' +cargo nextest run --locked --release -E '!test(hello_world_example) & !test(simple_verifier_codegen)' diff --git a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap index 677772fdfe7..52635a4e1ea 100644 --- a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap +++ b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap @@ -9,18 +9,18 @@ exports[`ContractClass creates a contract class from a contract compilation arti "selector": { "value": 2381782501 }, - "bytecode": "0x1f8b08000000000000ffed9d779c14c5baf77b6141647645ccd9c5848ae232647681c19c30a38888b02c2b28b0443163961ccc19094ace02028a80184ecec993f4783ce9de7bcef9dc3fee7bef1b7c6fd74c3d777f5b542f3b6bd7f09b9deacfa776aa9fadeee75bbf7eba3a5577fd330882a22033b50cd319c1fe93fc3fa57fcbbfd9d425c67595bbe42cca13ce1679c2d9324f388bf384b3559e70b6ce13ce43f284b34d9e701e1a23a7626b11d49fe2e66deb40d7b8191379a669491e685a9a679a1e96079ab60bf2a38d3a3c4f38dbe709e71179c279649e701e95279c47e709e73179c2796c9e701e97279cc7e709e70979c279629e709e94279c27e709e72979c2796a9e7096e50967873ce13c2d4f384fcf13ce33f284f3cc3ce13c2b46ce4ec0d951ff9ead7fcfd1bfe7ea5f297b9efe3d5fff76d6752cd6f31728ae30a9873449e37f5dc3d42d4cddc3d4c3f85fcf30f50a53ef30f5d1ff2bd3ffab08536598fa86a95f98fa6b0d0684e9c2305d14a68bc37449982e0dd36561ba3c4c5784e9ca305d15a6abc334304cd784e9da305d17a6ebc37443986e0cd34d611a14a69bc3744b980687e9d6300d31586e0bd3d030dd1ea66161ba234cc3c334224c55611a19a6ea308d0a534d98ee0cd3e8308d09d35d61ba3b4c63c3342e4ce3c3541ba609619a18a649619a1ca629619a1aa67bc2342d4cf786e9be30dd6f68f640981e0cd343617ad8e09c1ea647c2f468981e0bd3e3617a224c4f86e9a9303d1da619619a19a659619a1da639619a1ba679619a1fa605615a18a667c2f46c989e0bd3f3617a214c2f86e9a530bd1ca657c2f46a985e0bd3eb617a43b3c88eb0284c6f8669719896846969989685e9ad30bd1da6e5615a11a695615a15a6d5615a13a6b5615a17a6f561da10a68d61da14a6cd617a274c5bc2b4354cdbc2f46e98b6876947987686e9bd30bd1fa65d61fa204cbbc3b4274c7bc3f46198f685e9a3307d1ca64fc2f46998be15a66f87e93b61fa6e98be17a6ef1b9aff204c3f0cd38fc2f4636dfb89fefda92e2bf7ef7e16a69febfc2ff4ef2ff5efaff4ef67c632bf0ed36f0cdb6fc3f43bc3f6fb307daef35fe8df3fe8df2ff5ef1ff5ef57faf74ffaf7cffaf72ffaf7affaf76ffaf75ff4efbfeadf7fd3bf7fd7bfffd0bfff0cd3e60e997c9ba06e4a0531b551dd6ad2cf7e44fc8e41fd4969d152ff4f7ecbb4bd58cfcbaf68d74acfb732ecadf57c6b633d6df47c1bc3de5ecfb737ec47eaf9230dfbd17afe68c37eac9e3fd6b09fa1e7cf007b22807bc3daae6c2db5a9086c12af2dc0d64adb5a82adb5ac0e6c87685b2bb0c9f66d0db643b5ed10b0b5d5b636604b68dba1a265984ab42d15c4152be523d47a4be35eaf7e5e7658fcbc23d57adb39e23d3c7ede516abded1df0aaf83842afeb70889b23b5ad3dd88ed2b623c076b4b61d09b663b4ed28b01dab6d4783ed386d3b066cc76bdbb1603b41db8e03db89da763cd84ed2b613c076b2b69d08b653b4ed24b09daa6d2783ad4cdb4e019b6e728353c1769ab69581ed746deb00b633b4ed34b09da96da783ed2c6d3b036cd2fe9e0936395f3c4bdb54db7168112ca3edd26ea59791361b6ce7487b0db673a5ad065b2769a7c1761ef816dbf9d0d688adb3b649bba5fed747e753415cfb49b246adb722eef5866b56ebed1bff7ad3cf1cfb05755aa7c04f0568d55fe763ecd7d4057d17e9247ec45e0cf92ba1ac94133de4d823ecea1853a9f3fd1b58ae8fb15c2994a9b4d43f15c45bffbe064f5f83b915e4ddc46cd7ae3e661b3d651db383a1ac197b721ed41c637620703888d99e3e661b3d651db33550d68c3d39176e8e317b1b703888d92a37319b2cf7319bb96f1604f6d893eba1e618b3638023fe98edee63b6f153d631fb189435634fae899b63cc4e038ef863b667953f3768f49475cc2e80b266ecc9fd99e618b34f02878398adf1ed6ca3a7ac63f60d286bc69edc2b6c8e31fb2c70c41fb3bd1dc56c571fb341e6196810d8634fee5b37c7985d0c1cf1c7ec487f7fb6f153d631bb03ca9ab127cf509a63ccaed779f59ce127fa39c34960fba9b69d0cbcf1c776757747b19df4b19de91b1204f61895e779cd31b63fd07915c7bf80fe0862fba5b67500dbafb4ed34b07da66da743bd1cec03557e1f68f494f53ef01b286bc6b23c5b6e8efbc08f80c341cc56fb986df49475ccfe0dca9ab127fd1c9a63ccfe1e381cc46c8d8fd9464f59c7ec7f425933f6ced6f9e618b3d2d7549d2f7ca1cf17ce05db1fb4ad13d8bed4b6f3c0f6476d3b1f6c5f695b67b0fd49db2e00db9fb5ad1c6c7fd1b62e60fbabb625c1f6376deb0ab67fd1b66e60fb576deb0eb67fd3b61e60fbbbb6f504db3fb4ad17d8fea96dbdb54d3def92be5772deda06f85341bcdb56fa5dcaba65be4b0e7cb7337cb7cba1eff686eff616df4907be13e043a622633e05f9a45b9ef252e0415fdde2f7d555d5bd6bd0f8ba77039eee0eea9e001f8de1e90e3c3de2e749f7ffed19ff7ad3dbb8aba169027c75857af57250af22f025eb9679f1570a366c5b7b59187bc7cf982c025fb26e99ef0d8c62c3b65edeb992fd471d0f3b16d5f13ad897d2e744e24fbe5b261cddc02e65aee850c7d649b395c0fff1b8d7c3b0398acb745c882f59b7cc8bbf12a84f8fdc33261bcbd8dd6074d54614812f59b7f75db71d248fc77107d73ad6364d7c57e4c0776fc37737c337b69d3235746ceb0dccb15f73ea635b65fceb2dc7eb13b936143f78fe80d77071d5097dcbb5a1f8117b31e4af29aa2b2be5440f6987855dc5b26c4b643797eb652c570a652a2cf54f05f1d6bfd2e0a93498d536b9088e850ef687740c54181c32df0db4ab8cd0ae02b49332678376aedab33e068fccf7001e69c77a028fab6ba2289e5c5c8f1dc8379ec3e2f5b3fc1fcf035c6daf2e06a3ccdbb6576f60b49dab38b89e69f05ca53b308aad0ff07475a459d476ed4ae2db41aca4db23f121e7e6b2fff600bb94e9ad5fa8536de55dd056ba88118c47991a7bcd1bff764aa6afc1bb67c183dbcec175551747f1588ef76fbe0ee28d35b35dea6e6815758fc7555bded5e09179f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f199f2761bf2d29d78384d1ecffe6ea3e7ffafb877a5db27ef55ce7ff38ed0f962cc7fe31d20fe25ca3cec550a6b4455dd9ff0ffdc1cce754d847b2875bedd2db12fb63a6605efc615f2bdc960cfd9dca62f39d1ce9ea799bfa0698fa8ea6d9f7b387455317fd9f51d3224353ec8f7f9ec1a3e2b4b2651d9b8b677fd93e8b44ad241fe7b3bdd2c01eebf16f9764bd67d62d82faed071e675cf5df91b65a9e975718be8ba1cc892deab68df4ad923186bb1acb61bf1f59b72c732ed82b8d75b7d3cb0a472b63fd3d615929730ab4a97b5ad469e6a0ad4c66db771d9f9bc77f1cce3cc7ef9a054f17e071d1ce383adf28c77d20eee7f866ff34db798c94c1be7d0efa5536d8df49fc7966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563ce6b3567cbfb61b09638efa3ea49f67c8b7ca64fde9ef05b7a8f3ebfa399c3c73ea64d419df1dfd678bbab29b75be24d8bfbf43d4b674f57d8aa86d29fef0db33f82cc8c573dd22f025eb4e5ab4907c596cbe33cff15d8c0d21cff1bb1aba76b368ea6a7fc567aca829eeafdd0d1e7c361af56d9fa46173d977282a2ec41fee4b49b0491edf8f76b19df15862f6eb117ff8fcfa3b5adb7681ab6d9f2c77d96ee0775352c1fef18ddf53f921b47d3fd679ecc3817d47beb0fc5fa6869e538b7eaace0ebeaf595e04eb92ed6bfbb6e700608dc977175c57914e030c0d8a21ff798bbab2524eca8ad6c2aef611f9060cb29bcb7537962b8532fd2cf54f05f1d6dffcd66a7f83596d939f419c7d01c77f576d52bf088dce058da48ce36f365afb579afd0ab11d6d6d949165f15b747f85362aaaffa8ed18e0fa3826ebb61dc7cce34263fa79167a3fadff82f622ee7e5aff053184fdb40263fd9d60fdc2d53a883eb64899ff67acdf3c279765b01fd8ffec27f03d97a4ce67734e7eb0aeaf6ce7e4b85c54dd15337e072d152333c604b2e079829469abb5966d5619c1dddbb26c69c4b2a295f9adb092607ffddc7c672db3cff737ea22718ddf20973247425ddc9cb764ce015d7d532e057552f9a4a5ae52e638d8d74ed0f9046c27dc6fcfb1fc5fa686ce01710cf70be3af737afb5e049c29f083be2f06d6987c7741df720e287ec45e0cf9b35bd6959572a287682dec6a1f91f328643797ab30962b8532032cf54f05f1d6ff4283e74283596d939321cece817ee8aedaea01111a75028da40cde53b47d07d476afc3d5fb1b51e752f8fe92797e85c74937e74df6f358f3be9aed1ca193c18fe7083da19d4d58ca9af70be5781967bf617c57a227f8c577255c7dbbb90fe89682793c2f3898be5d7cc756f98b1a33a14f0e7c478d99900bdfed0ddfed73e8db6bee3567d2dcc11804e9f7cff09ba56a6ae8bc14c72590e55a00a38bb11c1241fd6f8f1f8811c77790e55a02a38be343b6df3eef098cb25c3130ba78b714c7df680c237e63188ff3c2e8e05bb15d9afaad58bca7d71a1899ded9c467538700a38bf3e2a6beab87e7f36de0d7d5b8445db3604c02a32c772830bab8378ed7328d61c4eb2259ae2d30ba788695edf84ef8ed79bcb7ec92b1a163bbe3be28c96cefbd54bae569f05c037d3b18d730ad05de673c90167dddf23478ee83be1ddcf74b6b81e30c1e480b7c36e862dcc34450ff39dc8178f0f9a52c770430a61c31f6cf8231058cff73af18180738624c65c1380018c57e14303ab8ff9a661c900523dea794e58e06c68b1c315e9805e345c028cb1d038c2eeea526c06f63182f064659ee5860bcc411e3c559305e028cb2dc71c078a923c64bb260bc141865b9e381f132478c9766c1781930ca722700e3e58e182fcb82f1726094e54e04c62b1c315e9e05e315c028cb9d048c573a62bc220bc62b8151963b1918af72c47865168c5701a32c770a305eed88f1aa2c18af064659ee54601ce888f1ea2c180702a32c57068cd738621c9805e335c028cb7500c66b1d315e9305e3b5c028cb9d068cd73962bc360bc6eb8051963b1d18af77c4785d168cd703a32c770630dee088f1fa2c186f004659ee4c60bcd111e30d5930de088cb2dc59c0789323c61bb360bc09186fb4300e72c47853168c838051963b0f186f8e9f317d2d3d280bc69b81e796f879d29add9c05cf2d6e79d2dfd5bbd9e2ebd6f87da5b7c5e0a0f175bf157886c4cf93de16b766c1230ca5b01c6a765bfc8c69cd8664c1781bf00c8d9f27add96d59f00c05cd6eb368767bfc8c69cd8666c1783bf00c8b9f27add9ed59f00c03cd6eb7687647fc8c69cd8665c17807f00c8f9f27add91d59f00c0fea34bbc3a2d988f819d39a0dcf827104f054c5cf93d66c44163c55a0d9088b6623e3674c6b569505e348e0a98e9f27add9c82c78aa41b39116cd46c5cf98d6ac3a0bc651c053133f4f5ab35159f0d48066a32c9add193f635ab39a2c18ef049ed1f1f3a435bb330b9ed1a0d99d16cdc6c4cf98d66c74168c6380e7aef879d29a8dc982e72ed06c8c45b3bb1d31de9505e3dd169eb8bf937d97c5d73847751f1b34beeec2500acb613f89f18e18c765c1381e186539ec2751eb88717c168cb5c028cb251c3336d44fa2167c4f88df77ba5daa0d1aafcf04b73c0df69340df131d69312168bc1613ddf234d84f027d4f72a4c5c4a0f15a4c029ec90eb448808fc6f00843292c87fd24a638629c9c05e3146094e5b09fc454478c53b2609c0a8cb21cf693b8c711e3d42c18ef0146590efb494c73c4784f168cd3805196c37e12f73a629c9605e3bdc028cb613f89fb1c31de9b05e37dc028cb613f89fb1d31de9705e3fdc028cb613f89071c31de9f05e303c028cb613f89071d313e9005e383c028cb613f89871c313e9805e343c028cb613f89871d313e9405e3c3c028cb613f89e98e181fce82713a30ca72d84fe211478cd3b3607c04186539ec27f1a823c647b2607c141865b9bb1d333674fdf26833f71d75add2dc7d475d973477df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f771cee4fb3107be13e043a622633e0579612885e5eef68ccd9a1179cae2e329c7baa3afc709eafeb885a7c851ddd1d713047517867c637c2c0f18711ff73a369dd1b18ec9a6322a9e271df13c9105cf93c0f394239e27b3e0790a789e8e9f271d534f65c1230ca5b0dcdd79c0f8581e307a1dbd8e4c8c5ec7c2d1d1337a46cfe8190f06633eb4e19e312fe231d95446c533237e9eb4664f67c133033493e56e71cb986c2aa3e299193f4f5ab31959f0cc04cd66583473c0986c2aa3e299153f4f5ab39959f0cc02cd665a3473c0986c2aa3e2991d3f4f5ab35959f0cc06cd66593473c0986c2aa3e299133f4f5ab3d959f0cc01cd665b3473c0986c2aa3e2991b3f4f5ab33959f0cc05cde6583473c0986c2aa3e299173f4f5ab3b959f0cc03cde65a3473c0986c2aa3e2991f3f4f5ab37959f0cc07cde6593473c0986c2aa3e259103f4f5ab3f959f02c00cde65b346365bc3b0f181fcb0346c73a269bcaa878163ae2599005cf42e079c611cfc22c789e019e67e3e749c7d43359f00843292c77771e303e96078c5e47af2313a3d7b17074f48c9ed13366c7f8781e30fa6ded1959191d5c5f35f80ecd33cddc77d43b34cddd77d43b34cdddb78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c33f97e2e7edfc96cbf31f31cf0b8f8e68da37a96abf53eafd7f5758cfa29ad5e30b47ac6d0aa14ca3c0ffabde040bf22f02beb9679f1972d7347026647be938785eb3814ea2f3e1e33f450fe5f7454f7a8b6fec566ee3baaad6feebea3dafae6eedbc7b98ff342f0ede3dcc77921f8f671eee39cc537e65b0575e7edf2fd53b58e9774be58cf4bf9c7c12e65261f92f96d17f87dc8856fbf0ff9634521f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7395f9c633c54e6802730788206781690f14c25e3994dc6339a8c672819cfb5643c1791f13c48c6d38d8c670219cf48329e9bc978ae24e3b9808ca71f19cf34329ede643c73c878ee22e3798a8c671819cff5643c9790f13c4cc69324e39944c6338a8ce756329eabc97852643cf791f1f424e339878c671c19cf5c329eb3c9788693f13c4dc6732319cf61643cedc8782e23e379828ce77c329e0a329e47c878e693f14c21e3b9938ce736329e72329e6bc8783a93f15c48c6f300194f77329e79643cb5643c33c878aac8780691f19c4bc67305194f4b329ebe643c0bc978ee21e3e943c633868ca71319cfed643cd791f15c4cc6f310194f57329e89643c33c978aac9780693f15c45c6d39f8ce75e329e5e643c63c9783a92f1dc41c67303194f2ebe679a0d4f09194f2919cfa5643c8f92f14c27e3e942c633998c6716194f0d19cf10329e81643c03c878ee27e3e941c6339e8c670419cf4d643c4f92f11c4ec6d39e8ce772329e22029e44b0ff182609f8ff73606b612cab3efb3aa743ddff5fd6f616b0cc2b3adfd2b2ee97c126df927dc5b22ceaf432d425a5f3e5df6c4aeb84be52302ffe4a80e315129ecbc978da93f11c4ec6f32419cf4d643c23c878c693f1f420e3b99f8c670019cf40329e21643c35643cb3c8782693f17421e3994ec6f32819cfa5643ca5643c25643ccf91f1dc40c67307194f47329eb1643cbdc878ee25e3e94fc6731519cf60329e6a329e99643c13c978ba92f13c44c6733119cf75643cb793f17422e31943c6d3878ce71e329e85643c7dc9785a92f15c41c6732e19cf20329e2a329e19643cb5643cf3c878ba93f13c40c67321194f67329e6bc878cac9786e23e3b9938c670a19cf7c329e47c8782ac878ce27e379828ce732329e76643c8791f1dc48c6f33419cf70329eb3c978e692f18c23e339878ca72719cf7d643c29329eabc9786e25e31945c633898c2749c6f33019cf25643cd793f10c23e3798a8ce72e329e39643cbdc978a691f1f423e3b9808ce74a329e9bc9784692f14c20e3e946c6f32019cf45643cd792f10c25e3194dc6339b8c672a19cf02329e4a0bcf738e78e47d7759b7cc3f47e2dbc1762857eb7dd5519d5ed3eb6aa5d72bfce2af18ca4c6f9bf955cf3f7059e132bf4f80efe6bc061abde6a82eb23d8a8ced83be5f72e4db1c9f4fe65f6ae6bedb19bedb1588eff686eff605e2dbc7b98ff342f0ede3dcc77921f8f671eee39cc9b7836b83247e274da622633e0579bc5e70f17d3947f5ac779df8758cfa29ad5e37b432afad4aa1ccaba0dfeb0ef4b35d7bcabcf8cb96b9230133c64559106f5cbc117f9d92aadfe1a1a0eb1b86be58af458e348d3a862c6ae6bea38e21cddd77d431a4b9fbf671eee3bc107cfb38f7715e08be7d9cfb3867f2fda6cec778dd588e3ed4f345b91e7813fc2ed1f9a218fdaa752dd6eb2ad6eb168e25609732ff1b9e6bfa7ddeeff371f9f6c7361fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be99e3dccc4b7ff1b381cd557ffea858ccc5bb0407d377542c3677df51b1d8dc7dfb38f771cee47ba903df09f02153437dfc9602cf62073c8eea997eb6b1cca8d373469d4aa10c1ee39739a86711f89575cbfc32e091a912785cc44163b639f22c20e3994ac6339b8c673419cf50329e6bc9782e22e379908ca71b19cf04329e91643c3793f15c49c67301194f3f329e69643cbdc978e690f1dc45c6f31419cf30329eebc9782e21e379988c2749c633898c671419cfad643c5793f1a4c878ee23e3e949c6730e19cf38329eb9643cc3c9789e26e3b9918ce730329e76643c9791f13c41c6733e194f0519cf23643cf3c978a690f1dc49c6731b194f3919cf22329e6bc8783a93f15c48c6f300194f77329e79643cb5643c33c878aac8780691f19c4bc67305194f4b329ebe643c0bc978ee21e3e943c633868ca71319cfed643cd791f15c4cc6f310194f57329e89643c33c978aac9780693f1bc4ec67315194f7f329e7bc9787a91f18c25e3e948c6730719cf0d643c25643ca5643c9792f13c4ac6339d8ca70b19cf64329e59643c35643c43c8780692f10c20e3b99f8ca70719cf78329e11643c3791f13c49c67338194f7b329ecbc9788a087812c1feeffe27e0ffaf834dde517f0e6c6fe9fc62b0b5b0f868a9f3cbc056acf3b28e43c2f46287fdd78d3ab97a2f1f7da5605efc9500c75b243c9793f1b427e3399c8ce749329e9bc8784690f18c27e3e941c6733f19cf00329e81643c43c8786ac8786691f14c26e3e942c6339d8ce751329e4bc9784ac9784ac8786e20e3b9838ca72319cf58329e5e643cf792f1f427e3b98a8ce775329ec1643cd5643c33c9782692f17425e379888ce762329eebc8786e27e3e944c633868ca70f19cf3d643c0bc978fa92f1b424e3b9828ce75c329e41643c55643c33c8786ac978e691f17427e379808ce742329ece643cd790f12c22e32927e3b98d8ce74e329e29643cf3c9781e21e3a920e3399f8ce709329ecbc878da91f11c46c6732319cfd3643cc3c978e692f18c23e339878ca72719cf7d643c29329eabc9786e25e31945c633898c2749c6f33019cf25643cd793f10c23e3798a8ce72e329e39643cbdc978a691f1f423e3b9808ce74a329e9bc9784692f14c20e3e946c6f32019cf45643cd792f10c25e3194dc6339b8c672a19cf02329ecadcf024d5bbedd2d73a002e9c52905f063c8b1ce8e3a89ee5f85d83af635cafd2ea6d43abd70dad4aa1cc52d0ef6d07fa15815f59b7cc8bbf7c64563c8feabced3b108f92308a6d915b9ef47efb68507f6a68bf7d1b785cb46b8eea99debf961b757ad4a2bb94c1585deea09eb67d47e697c376c83766c5f384ce0b6b02ca3d41c228b6656e79d2fbd71341fda9a1fd6b39f0b8687f1cd533bd7fad30eaf48445772983b1bac2413d6dfb8eccaf80ed906fcc8ae7499d17d604947b9284516c6fbbe5e996803acbd4d0feb502785cb43f8eea99debf561a757ad2a2bb94c1585de9a09eb67d47e657c276f0cc9ed9c6ac78e4d98eb026a0dc53248c625bee94a75b7902ea2c5343edd84ae071d1ce3bd23ddd8ead32eaf49445772983b1baca413d6dfb8eccafb2f82e0be2d5627523b4586de1599d632dc45fb6cc4bf390d9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398a994167c523dfae14d604947b9a84516c2bdcf2a4df0b7a3aa83f1519f329c8af069e950ef47154cf741ff235469d9eb6e82e6570ff5ae3a09eb67d47e6d7c076c88679551e327b9d9bc6ac7866e8bcb026a0dc0c1246b1ad74cb936ec76604f5a786dab135c0e3a29d7754cf743bb6d6a8d30c8bee5206f7afb50eea69db77647e2d6c07cfec996dcc8a67a6ce0b6b02cacd246114db6aa73cc9f4fb8d3383fa5343edd85ae071d1ce3bd23ddd8ead33ea34d3a2bb94c1585de7a09eb67d47e6d7c176c88679551e327b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5ee7c2d159f1ccd279614d40b959248c625be394a76bfab9c3aca0fed4d0738775c0b336769ecc730707baa79f3bac37ea34cba2bb94c1fd6bbd837adaf61d995f0fdba1b933afca43661f1bb961f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503cb3755e5813506e3609a3d8d6bae5497ff76076507f6aa8dfce7ae059e7401f47f54cf7dbd960d469b645772983fbd70607f5b4ed3b32bf01b68367f6cc3666c53347e7853501e5e690308a6d9d5b9e743b3627a83f35d48e6d001e17edbca37aa6dbb18d469de65874973218ab1b1dd4d3b6efc8fc46d80e9ed933db9815cf5c9d17d604949b4bc228b6f56e79d2edd8dca0fed4503bb611785cb4f38eea996ec73619759a6bd15dca60ac6e72504fdbbe23f39b603b7866cf6c63563cf3745e5813506e1e09a3d836b8e54926a0ce3235d48e6d021e17edbca37aa6dbb1cd469de65974973218ab9b1dd4d3b6efc8fc66d80ef9c6ac78e6ebbcb026a0dc7c1246b16d74cb93debfe607f5a786f6afcdc0e3a2fd7154cff4fef58e51a7f916dda50cc6ea3b0eea69db7764fe1dd80ef9c6ac7816e8bcb026a0dc021246b16d72cb93debf1604f5a786f6af7780c745fbe3a89ee9fd6b8b51a70516dda50cc6ea1607f5b4ed3b32bf05b643be312b9e853a2fac0928b79084516c78bc58e888a7d4e029b56871b07cabf90a9d2fd1bf09f87f0530ba6a0f171a8c328f318ebcae356b67f0b433343b98be55fd2b75fe30fd8bdbab121819b657bb1c68d6dee0696f6876307d2b2dfaeafce1fa17b7575f6064d85eed81c741fbdc2d61f0a8a9a1f38d2d8ef57154cff4f9c6d6c0ae3b1e87a40c1ebbb73aa8a7ed5c42e6b7c276f0cc9ed9c6ac7806e9bcb026a0dc201246b1e175cab6f879ba250c1e3535d48e6d73ac8fa37aa6dbb17703bbeedb40772983b1faae837a16815f59b7ccbf0bdb211be65579c8ec756e1ab3e219acf3c29a8072834918c5b61578b6c7cfd32d61f0a8a9a1766cbb637d1cd533dd8eed08ecba6f07dda50cee5f3b1cd4b308fccaba657e076c876c9857e521b3d7b969cc8a6788ce0b6b02ca0d216114dbbbc0b333769ecc7840c8a3a686dab19d8ef57153cf4c3bf65e60d77d27e82e6570ff7acf413d8bc0afac5be6df83ede0993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999b59f10cd579614d40b9a1248c62db013cefc7ce9379ee803c6a6ae8b9c3fb8ef57153cfcc73875d815df7f741772983b1bacb413d8bc0afac5be677c176f0cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccdac7886e9bcb026a0dc301246b1bd073c1fc4cfd32d61f0a8a9a1e70e1f38d6c7513dd3cf1d760776dd3f00dda50cc6ea6e07f52c02bfb26e99df0ddb61b767f6cc1666c5335ce7853501e58693308a6d17f0ec899d27f3fc1479d4d4503bb6c7b13e6eea9969c7f60676ddf780ee52066375af837a16815f59b7ccef85ed900df3aa3c64f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce85a3b3e2a9d279614d40b92a1246b1ed069e0f63e7e95a9e3078d45464cca720ffa1637ddcd433f3dc615f60d7fd43d05dcae0feb5cf413d8bc0afac5be6f7c17668eeccabf290d9c7466e987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398a992136144fb5ce0b6b02ca5593308a6d2ff07c143f4fb784c1a3a622633e05f98f1cebe3a89ee97e3b1f0776dd3f02dda50cee5f1f3ba86711f89575cbfcc7b01d3cb367b6312b9e1a9d17d60494ab216114db3ee0f9247e9e64c2e0515343edd8278ef57154cf743bf66960d7fd13d05dca60ac7eeaa09e45e057d62df39fc276c83766c5335ae7853501e54693308aed63e0711077699e528347e63f21f0ade66b75be44ffe2f6aa054686ed559a03cdda193ced0ccd0ea66f55ff093a7f98fec5ed35011819b657bb1c68d6dee0696f6876307d2b2d26eafce1fa17b7d7446064d85eed73a0d9c16c0f0fe6be7d30e3d46b7ef0342f3a889a171d44cd8bbce6549a3b38be24f1581600034e29c87f0a3cdf8e9f277d5feed32c78be0d3cdf8a9fa78ba37a96abf57e07d8e35aafd2eabb86569f1a5a95421964f8ae03fd8ac0afac5be6c59f67f6cc51cc786e2bac0928f70909a3d8be053c2eda0d55f7f3f5ba64fdadc2f4d951757e5d3c2fc17bc5adf47a8543fc154399896575657fa7d94ae0ffb2dd547df6193647ef3077b13db79379f15712e4ecde6d83f792510b17cf9bb23deeefb3f07c1d1f4f39eee7e86bafa3ba67f3ec6faf8527c6ba77897aeeb927febaa7db8fce7a5db27eb58ffefb514e35ef86fb9eb41f9d8d3a17439981657565ff03da0f5b5be17adf94737273df6c11d4b567c255a6ede633a1afb55dca7d04e5b1cda9d0bfb87f56405d5db58b51f798b05d34db6e97da9bcf254ddfa5a0cb47a49ad99e53a08e9516ee4a026e8cc75cee67b26edb33b24a434736cd705b7f64d1b1af85bb2f0137e37eddd7d0914db303edd7832cdc8308b819f7eb41868e6c9a1d68bf1e6ce11e4cc0cdb85f0f367464d3ec40fbf5100bf710026ec6fd7a88a1239b6607daaf875ab887127033eed7430d1dd9343bd07e3dccc23d8c809b71bf1e66e8c8a6d981f6ebe116eee104dc8cfbf5f0a0be8e6c9a1d68bfaeb27057117033eed755868e6c9a1d68bfaeb67057137033eed7d5868e6c9a1d68bfaeb170d7107033eed735868e6c9a1d68bf1e6de11e4dc0cdb85f37b6df3eeb7e5d6be1ae25e066dcaf6b0d1dd9343bd07e3dc1c23d81809b71bf9e60e8c8a6d981f6eb8916ee8904dc8cfbf544434736cd6cfbb5a37709b37eb7f163a7fa64c698fe380b9e0f81c7454c398a837247fd5cd27d53f7185a7d6c68856377ec05fd1cf48569f09b04e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333f337e97119faf48b98f4818c586cfa45cdce75775bf40af4bd6df2a4c038fa9f3bb3776bfc9f222c35f0a38c45f319439e1d4bab2d76bb69260ffed866371e3b6dc1d7b1d32dbd28c7f99177f25509f3dc0e3e0fdfc34cf5e8367af450b7cef341edfc9916e344e96abefe31d1ad46de7dd467d50d30f62f75f5fd32243d30f1cfb4e04f5b7a730e094823cf2b87836eca89ee9b66097512753e35228d311eab9cb413d8bc0afac5be677018f4c2d80c7550c06064f60d147a64a329ea9643ca3c978ce20e3194ac6731c19cfb5643c8792f15c44c6f320194f37329e09643c23c9784e25e3b9998ce748329e2bc9782e20e32926e3e947c6338d8ca73719cf5d643c6791f10c23e3398f8ce704329eebc97812643c9790f13c4cc69324e39944c6338a8ca70319cfad643c4793f15c4dc6d39a8c2745c6731f194f4f329e73c878c691f19c4dc6339c8ce724329e1bc9780e23e36947c6731919cf23643c15643ce793f14c21e3b9938ce774329edbc878cac9788e25e3b9868ca73319cf85643c6dc8781e20e3e94ec6534bc65345c6730a19cf20329e73c9788e20e3b9828ca725194f5f329e7bc878fa90f18c21e3e944c6732619cfed643cc793f15c47c6d3968ce762329e3d643c0f91f17425e39948c6534dc6b38f8ca78c8c673019cf51643c5791f1b422e3e94fc6732f194f2f329eb1643c1dc978ee20e339918ce706329e12329e52329e4bc978a693f17421e3994cc65343c6731a19cf10329e63c8780692f11c42c633808ce77e329e1e643ce3c9784690f19c4cc6731319cfe1643cedc9782e27e32922e04904fb7f8b2901ffdf0b36f966d087606b61599f3ca796f2eab8b8b8c3feeb6e6159f7071606d4e97da84b4ae7cbbfd994d6097da5605efc9500c707243c9793f1b427e3399c8ce726329e93c9784690f18c27e3e941c6733f19cf00329e43c8780692f11c43c633848ce734329e1a329ec9643c5dc878a693f15c4ac6534ac65342c6730319cf89643c7790f17424e3194bc6d38b8ce75e329efe643cadc878ae22e3398a8c6730194f1919cf3e329e6a329e89643c5dc9781e22e3d943c67331194f5b329eebc8788e27e3b99d8ce74c329e4e643c63c878fa90f1dc43c6d3978ca72519cf15643c4790f19c4bc633888ce714329e2a329e5a329eee643c0f90f1b421e3b9908ca73319cf35643cc792f19493f1dc46c6733a19cf9d643c53c878ce27e3a920e379848ce732329e76643c8791f1dc48c6731219cf70329eb3c978c691f19c43c6d3938ce73e329e14194f6b329eabc9788e26e3b9958ca70319cf28329e49643c49329e87c9782e21e34990f15c4fc6730219cf79643cc3c878ce22e3b98b8ca73719cf34329e7e643cc5643c1790f15c49c6732419cfcd643ca792f18c24e39940c6d38d8ce741329e8bc8780e25e3b9968ce738329ea1643c6790f18c26e3994ac65349c6d3c2e0c1ffab77c3f6e8bc7c3ba818fe3f49772e6fa7d72565e419b1ba57f19e6153f5dde9a8beef0575530ae677427d85fd3de079cf11cffb068fe9bb04f295a0d90ec3a618b73b62dc6130cafc766014fd7600cf0e473c3b0d1ed37709e4fb8266ef1a36c5b8cd11e3bb06a3cc6f0346d1ef5de079d711cf7683c7f45d02f941a0d956c3a618b73862dc6a30cafc166014fdb602cf56473cdb0c1ed37709e4078366ef1836c5b8d911e33b06a3cc6f0646d1ef1de079c711cf1683c7f45d02f921a0d926c3a618373a62dc6430cafc466014fd3601cf26473c9b0d1ed37709e48782661b0c9b625cef887183c128f3eb8151f4db003c1b1cf16c34784cdf25901f069aad336c8a71ad23c67506a3ccaf0546d16f1df0ac73c4b3dee0317d97407e3868b6c6b029c6d58e18d7188c32bf1a1845bf35c0b3c611cf5a83c7f45d02f92ad06c9561538c2b1d31ae3218657e25308a7eab806795239ed5068fe9bb04f2d5a0d90ac3a618973b625c6130cafc726014fd5600cf0a473c2b0d1ed37709e46b40b3b70d9b627ccb11e3db06a3ccbf058ca2dfdbc0f3b6239ee5068fe9bb04f2a341b365864d312e75c4b8cc6094f9a5c028fa2d039e658e78de32784cdf2590af05cd961836c5b8d811e3128351e61703a3e8b704789638e2596af098be4b203f01347bd3b029c6458e18df3418657e11308a7e6f02cf9b8e78161b3ca6ef12c84f04cdde306c8af175478c6f188c32ff3a308a7e6f00cf1b8e7816193ca6ef12c8df0836e1ed03b6d774be37d85ed5f95e607b45e77b82ed659def01b69774be3bd85ed4f96e607b41e7bb82ed799d4f82ed399def02b66775be1fd89ed1f9fe605ba8f329b02dd0f901609baff317826d9ece5f04b6b93a7f31d8e6e8fc25609badf397826d96ce5f06b6993a7f39d866e8fc15607b5ae7af04db533a7f15d89ed4f9abc1f684ce0f04dbe33a7f0dd81ed3f96bc1f6a8ce5f07b6bb75fe7ab0dda2f33780ed639dbf096c9fe8fccd60fb54e76f05dbb774fe36b07d5be76f07db7774fe0eb07d57e74780ed7b3a3f126cdfd7f95160fb81cedf09b61feafc18b0fd48e7ef02db8f757e2cd87ea2f3e3c0f6539d1f0fb69fe9fc24b0fd5ce72783ed173a3f056cbfd4f9a960fb95cedf03b6cf747e1ad87eadf3f782ed373a7f1fd87eabf3f783ed773aff00d87eaff30f82ed739d7f086c5fe8fcc360fb83ce4f07db973aff08d8fea8f3d2aea976f64f3a5f16c4dbce7e15d44d65e05bfca9327fd6f9d6461959b618ca9ca53b14aa671cea5ba6d20e4bbbac6cd20ebf063669875f059bb4c3af804ddae197c126edf04b609376f845b0493bfc02d8a41d7e1e6cd20e3f073669879f059bb4c3cf802da5f30bc126edf002b0493b3c1f6cd20ecf039bb4c373c126edf01cb0493b3c1b6cd20ecf029bb4c333c126edf00cb0493bfc34d8a41d7e0a6cd20e3f093669879f009bb4c38f834ddae1c7c026edf0a3609376f86eb0493b7c0bd8647ff90a6cd2367f0c36699b3f019bb4cd9f824ddae66f814ddae66f834ddae6ef804ddae6ef824ddae6ef814ddae6ef834ddae61f804ddae61f824ddae61f814ddae61f836d9cceff046cd236ff146cd236ff0c6cd236ff1c6cd236ff026cd236ff126cd236ff0a6cd2367f0636699b7f0d36699b7f0336699b7f0b36699b7f0736699b7f0f36699b3f079bb4cd5f804ddae63f80ed119d97b6ba0dd8e459b19acabfe184e3f0b4005fc2920ae26dfb714a411eeb2e532519cf1c329ed1643c2f91f19c41c633948ce738329e43c978de20e39940c6b3908c671919cf52329ed7c9784e25e3d940c6b39e8ce748329ef7c8787692f15c40c6534cc6338b8ce705329eb3c8788691f19c47c67302194f828c673e19cf12329ec5643caf92f17420e35947c6b3968ce768329e1d643cdbc9785a93f17c45c633838ce71c329ee7c878ce26e3194ec6731219cf61643cedc8782ac878ce27e3994bc6f32619cf22329e97c9784e27e35943c6b39a8ca79c8ce758329e77c978b691f17426e36943c6f314194f2d19cf33643c55643ca790f10c22e339978ce708329e96643c7dc9786e21e3994dc6f322194f27329e33c9785691f1ac24e3f9928ce778329ead643c5bc878da92f1ec21e39948c6b3808ca79a8ce735329e7d643c65643c83c9788e22e36945c6f33119cf4c329ee7c9785690f12c27e339918ce71d329ecd643c25643ca5643cf3c8786ac8785e21e3398d8c670819cf31643c8790f13c4dc6f32c19cfdb643c6f91f19c4cc6b3898c672319cfe1643cedc9787691f1bc4fc65344c093008e006cf2ff966093eff0ec03db173abf076cf20d9f37c0f6b9ce3f02b6872cb616163e61980e367957f60bb0c9fd9987c126ef4c7c0e36396f10ff6a7e6587fdf95bc032e2a7a5851ffd7d6ee1923c6e6f592615c4bbbdd1572ab07ff3aec8603cd83cef93f1ec22e3694fc6733819cf46329e4d643c2793f1bc45c6f33619cfb3643c4f93f11c42c6730c19cf10329ed3c8785e21e3a921e39947c6534ac65342c6b3998ce71d329e13c9789693f1ac20e3799e8c672619cfc7643cadc8788e22e3194cc65346c6b38f8ce735329e6a329e05643c13c978f690f1b425e3d942c6b3958ce778329e2fc9785692f1ac22e339938ca71319cf8b643cb3c9786e21e3e94bc6d3928ce708329e73c9780691f19c42c65345c6f30c194f2d19cf53643c6dc8783a93f16c23e379978ce758329e72329ed5643c6bc8784e27e379998c671119cf9b643c73c978ce27e3a920e36947c6731819cf49643cc3c978ce26e3798e8ce71c329e19643c5f91f1b426e3d94ec6b3838ce768329eb5643cebc8783a90f1bc4ac6b3988c670919cf7c329e0419cf09643ce791f10c23e3398b8ce705329e59643cc5643c1790f1ec24e3798f8ce748329ef5643c1bc8784e25e3799d8c672919cf32329e85643c13c878de20e339948ce738329ea1643c6790f1bc44c6339a8c670e194f25194f0b0bcf3e473cf2ad1859b7ccef6be6be771abe771688efed86efed05e27b9be17b5b81f8de62f8de5220be371bbe371788ef8d86ef8d05e27bbde17b7d81f85e6bf85e5b20be571bbe571788ef9586ef9505e27bb9e17b7981f87ecbf0fd5681f85e6af85e5a20be171bbe171788ef4586ef4505e29bf9fa5b7d274cfa2aefd2bf09f87f0530bee188719fc128f36f00a3d8f07bd4158e78a2aedd2b087c2b2de45e963cf34cc0ff2b81d1554c55188c326f8ba99dc053e98827ea9e4325816fa585bc8b2d7d2a13f07f1c7fd9554c551a8c326f8ba9edc0d3d7114fd4bd92be04be9516f2eeb3bcf39780ffe378ebae62aaafc128f3b698da063c831cf144dde31944e05b6921df0a936fd224e0ff383ea3ab981a6430cabc2da670fcdcc18e78a2ee4d0d26f0adb4906fedca372f13f07f1cbfc9554c0d361865de1653387edc10473c51f7d48610f8565ac8b360f9467b02fe3f14185dc5d4108351e66d3185e3dd0c75c413752f7028816fa5c5309d973e5609f8ff3060741553430d4699b7c5d47ae019e68827ea1ee63002df4a8be13a2fef7024e0ffc381d1554c0d331865de16536b8167b8239ea87bafc3097c2b2daa747e8dfe4dc0ffab80d1554c0d371865de1653ab81a7ca114fd43de32a02df4a8b6a9d976fce25e0ff38fefb70478c5506a3cc0f0746b1ad049e6a473c51f7baab097c2b2de4dbfe2bf46f02fe8fe3b1ba8aa96a8351e66d3185e341d738e289ba475f43e05b69315ae7654c9804fc7f3430ba8aa91a8351e66d3185e3578e76c413f56c6134816fa5857c9b6b99fe4dc0ff6b81d1554c8d361865de16534b81a7d611cf628367b1458b83e55b69217db997e8df04fc7f0230ba8aa95a8351e66d31b518782638e2897a963381c0b7d242beadfda6fe4dc0ff2702a3ab989a6030cabc2da61601cf44473c51cfa026e6c077d4f3945cf88e7a36900bdf51f7b973e13bea9e6d2e7c47dd7fcc85efa87b69b9f01d755f2817bea3ee71e4c277d4f57a2e7c475d7be6c277d475542e7c475d13e4c277d4f96d2e7c479dabe5c277d479876fcf7d7b1eb7ef8379ee50a8edf9c13c861ecc6389bf36f0d706b9f2ed8f25feda2057be0bf5dac0b7e7b96fcfe5faab2888be1e7bcb91efa5866f99c7e72c4b1df95e6cf896797c66b0d891ef45866f99c7fbdf8b1cf92e357ccbfca21cf86e67f86e9743dfed0ddfed2dbe1d6cef6422a87ffd2d0c38a5208f31f0a6032d1cd5b35cad77895ed7d731aed776dfc6dc5f4aa1cc12d0cf75db21eb36db8e7c64c6b8288acf7779027cc877c9944d9e1fbf063669f75f059bf40b78056c726c7a196cf24cea25b0c933ab17c1365ae73f069b3c3bc63efbf2fc7f1bd8aa741efb8a0fd7f92d6093be54d84759fac36d069bf469c4beb1d22f7523d8a46f31f6c994fee1ebc1267dfcb12fa0bca7b1166cf2ae0df64193f7a556836d8fce63df27f90ecd4ab04dd7f91560fb83ce2f07db833a7f0bd87eaff35f81ed773abf086c0fe8fc9b60fbadce2f01dbfd3aff02d87ea3f3cf83ed3e9d7f0e6cf7ea3cbecbf66b9d7f1f6c9fe93cbe43354de77782ed573a8fefeedca3f3dbc1f64b9d7f166c5375fe19b04dd1f98560fb85ce2f00dbcf757e3ed826ebfc3cb0fd4ce7e7826d92cecf01db4f757e36d8c6ebfc2cb0fd44e767826d9ccecf00db589d7f1a6c3fd6f9a7c0f6239dff126c77e9fc62b0b5d0f9a560933123b19f4ab1cebf05b6563a8ffd8fe4fbfe13c17688ce4f005b1b9daf059b7c1b6e34d8643ce81ab02574be1a6c253a5f0536393f1b0e3619ff6418d8e45c6a28d80ed7f9216093f39ec16093f12c07814dbe41da176c47e97c25d8e4dbfa15603b46e7f7814dc61c7b036cf2ddba3d6093b1981f069b7caf7a3ad84ed4f93f804dc66179106c27ebfcefc1768aceff0e6cf20dcf07c056a6f3bf055b079dbf1f6ca7e9fc6fc0266364dd07b63374fe5eb0c9d8c1bf069b7ceff933b075d4f969603b5be77f0536194be41eb0c9f8a0bf045b279d9f0a36f90ef714b09daff3bf009b8cf7f773b0c9378627834dc675fb19d8bae8fc24b02575fea760ebaaf3e3c1d64de77f02b6ee3a3f0e6c3d747e2cd87aeafc8fc1d64be77f04b6de3a2fed8cda9fd57ebe57cfa782f8cecb94bf0f83fa5343d706c2803c719e6b97020ffada1d7bdd93e9f37ad9ef5be8f54a0ced06dfbb62f79db9a6f840afab58af7797e1bb18ca9cad1b07b59c1cf35beae5f618cbe17d2c59b72c7301d8df37d6dd4ed7f70347f5dd65300937ea2065ced34cead8f8039d6f03cbc4c896be3e96580b40439c52901706375a25cbf1bcb7313c1f00cfeed87932d7eb2e6202f7adb8afd7cdfbb866ac9542995da0dffb0ef4c37d5dd62df3e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333fb3e2d9abf3f85c59caed256114db6ee071719f1f9fc3cafad5739df74fadf3bb3b76bff59fefb5d2eb2d37ea5c0c65be86674e7b74be04fe2fdb2d6a5b3a784ed8e0b6147f25501f7c16b4d711cf6e8367b7450bc997c5e63b39d28dc6c972d597453d63df63e8bad7a2a9abfd75b75e5791a129eeaf1f1a3cf86cb404783fd2bf0958cf47500707fb78837121fe705fda0d36c97f088c2eb6331e4ba43d90e7e1f86c5acafcca782e1effb64f96bb6c37de833aa582fde3bb18cafc0edabecf751efb86ec05ddfe61f9bf4c0d3da716fd549d77c45fe7f4f6dd0e9c29f083bedf05d6987cd77b87a64827f123f662c8ff1dfa734839d143b416761caf1cd9cde53e34962b85323b2df54f05f1d67f87c1b3c36056dbe44b88b37fc0f1df559bb43342a30b402329b31b34dae38867b7c1231ce24f9591eddfda2823cb164399ff056d94aa8bb4f3524fecdb82c70057c731f125eb9679dbb9f107c068d651c5c7c063ea7877c7ce9b5ffdbf0e29cbfc62bb1e57ff2f59773bbdac7004c6facb61fdc2d53a883eb6fccff62dab5bbfcbfe657b8c3a0b0bea2c65da95657e559c5daaf3d99ceb1facebb6a873fd9d0e781241fd6b6f3535747cc763cc7bf07f2953fecda62e8eea596e3b76bd6fd4a914ca74847a3a388f69f05de01de0dbc536472de41c6a97a1453194e95096f995b6234a47bc56fd202775495acf07cb2d7591321dcbeaead206ec7132b9dc6eef429dd47a775bea2a65ce2babd3a5b3ce27603be17d93be96ffcbd4507b8063f16c8dbfcee9edbb053853e0077dbf03ac31f9aef72d1039df173f622f867c65595d5929277a88d6c2aef61179e70fd9cde57619cb9542996d96faa78278ebbfd5e0d96a30ab6dd2a5ac2e2f71e4b2dddc16a15139682465f0feb11cdbf1bd3bdb717fb723eea8e3fe6e6034db4d3c7771c9b6c76033efa1dace07a50c9e934999abca32bfaa9d4d58ca9af7865ddcc7c4775003a84760d455268c0107d786ddf0da49da29f1d319ecbb755e74ee6c68570c650695657e1d9e775bef5d9ad777784d21dce6be85ef7e0c29abe3c6b11377ebdf12b07da27f1d5da775b3dd33140edb3dc3e16575ecb8ac707d6ca98b798ddc22d8ff9efad74659bcefd6d07266de1c8752e9fb8951cee607af79627b57a34b793932b508ecf70b3e34d88b82fdc7dc94fd0063cebc8fd2d9580fde47a92dcbfc4a9b649655dbfedf8faad347b6a36887ed09c6e487c098d2f9f26f3675b1d55fe6c59f62fcc8a8839bb62bf3be5236f781f7008f8bb6dd511b5d8ec7d836b1adb77795edf8ffa1a1550e9fd75a8ff9e633f736463e1edfc96adbfd279b16bb2c3cae9ea34469b1cbe23b3e2d7a8cb41d3f6c5ae4b2ef439416ef5b7cc7a8450ddef76c488bf72c3c2eee4535a4c57b16dff169d1b3bca1e71aa8c54e0b8fab7b0f515a88bf6c99df27606e63e4e3f1ddadca769fcca6c50e0b8fabebe6282d76587cc7a745971e788fae212db65b78e2bf3fd7b016db2dbee3d3a2576fbc87d79016ef5a785c3dd38dd2e25d8bef18e36294ed5e8e4d8b6d169e6d39d6629bc5778ce7873d6cf7da6c5a6cb5f038b8efdaa0165b2dbe63d46204de776d488b2d169e2d39d6628bc5777c5a5475b7dd13b669f18e85c7d53de1282ddeb1f88e4f8b11bd94efcd8dd062b38567738eb5d86cf11de335543a2e3635428b4d169e4d39d66293c5777c5a54a7cfb53636428b8d169e8d39d662a3c5777c5a94a78fa91b1aa1c5060bcf861c6bb1c1e23bc6b8485f4fae6f8416eb2d3ceb73acc57a8bef188f23e9b858d7082dd65978d6e5588b7516dff1695193beffb4b6115aacb5f0accdb1166b2dbe63bce7928e8b358dd0628d85674d8eb55863f11d9f165dd3c7d4d58dd062b58567758eb5586df11d9f16a3d2cfc45635428b55169e5539d66295c5778ce79de9f6626523b45869e15999632d565a7cc778de99be7fb1a2115aacb0f0acc8b1162b2cbe636c3bd3e79dcb1ba1c5720bcff21c6bb1dce23bc6f3ceb4166f37428bb72d3c6fe7588bb72dbe633cef4c1f47de6a84166f59785c8d8112a5c55b16df31c645baed5cd6082d96597896e5588b6516df31ded74ab79d4b1ba1c5520b8fabf11aa2b4586af11de3f548fa1edf924668b1c4c2b324c75a2cb1f88ef15951fa1c7c7123b4586ce1599c632d1683ef3db1fbcef4e7161fd217eb7c438b6228734a87ccaff4c58ad251d681fdcab02e6fc65e974cbfb24511757913ea2265ce80bab4099c8c51d4cd515dd331f306d449adf7234b5da5cc391dea74e9a4f309d8261f836e7d2cff97a9c8984f415ef453757e2dfe3aa763f555e04c811ff4fd0ab0c6e4bb0bfa2ed249fc88bd18f2bd3bd4959572a287682dec6a1f795de791dd5c6eb1b15c299479dd52ff54106ffd5f33785e3398d3ef3d409c491cb969bb324caf4768743e682465b0cfde478e78cc3e84c221fe5419d9fead8d32d88752ca5c086d14f62b957a2682fdfb4d3a6acbba20bbac5be6c55f29d8f600a35947151f9f41df4f192b42c69150361917a22baca7a7615375ede5a8aee24bd62df3bd8051c6a9e8997bc66463197b188c8aa78f03cd70ec0d991a3a5ef4019ede0e781cd5337d1caa30ead4cba8532994c1771b2b1cd4b308fccaba65be027cbbd8e6a8851c93cf31b4288632c38df3c7281d651d2a7e7b5aead2cf715d64ddd22ef5cb81ef4ac37777c37722a8bf9d83a0e1fdab1298fb3a6056ebed1fff7acbf1bc4d624afc74873a0d000de2aa13ae4bcef30618da16437e2a9ce74939292bc72f6157b12cdb12d9cde5fa18cb9542997e96faa78278ebdfdfe0e96f30ab6d72179cdb39d81fd231d0cfe090f9eea05dff08edfa817652068f7f3d1c69d7d7e091f91ec023e7381560937305e14fc0ffbbe680db6cf72a2cdc62c371e27a5818bbc7cf983ed7e96130ca7c7760145b5fe0a974a499b9adcf31f4c1e3726ba38c2c5b0c6566c1b1316129abf6bb8e4575f56aa9edb1bd3ba6dbf4d60ef4c2711a03d02730340c402fa9672b073c6d83bab11a274fa99d34e2ce51378cca3c7a14b46203137f8b2cd5680136ccb7b4d882a0fe9094c5609321295b81ad85210b0e8529e565483b1772a11eb2ee6283b30db0c4e91b87f394a9a1d03904785c84b20a1d19d25387ce2d93c64c1985f1d1cae06c4aeca8ffb56ca05cd4ba5c6d07739f48c1bc1983c58efcb784faa6605efca96d53aaf313468cbc7bc0a43ba78e1b357eca6414cadcb1315f14d4df00e66f94e0ae763a0c00ac30360ead8c7a618321ff930dd3367ece6e3866aea94d00fe646a0bba1dea4037b57e19fb76e488b163af9b5a3576ccc84ba78e1f39654ced78dc9a6d0ce5a2b6b4fcbf35d86c4d3c965513365bb8ec21169b6dc25186db804d8e5c87824d78da82ad25e4a5bcb9659c846b4758bfec52ea7f4a9c56bae287047521208763d5aeaafd577d3e569d06a9a18ed5d0c66a73aaa18bd51d433534b1fa8a9d1a7a580d35ac86163e21c80c1dac860a3e39c80c05acbe7651166486f63d2dc80cdd7b4690199af72ce0fb36309f1d644ebbd4d0ba9d82ccd0b9ead6a57a755d7de64dbd5baf4edfd56d0175caab2ef1d4e9a73aed549717eaf685ba95a54ee9d4e9b23a1554a76fea72a4bfd67a40982e0cd34561ba384c9784e9d2305d16a6cbc3744598ae0cd35561ba3a4c03c3744d98ae0dd37561ba3e4c3784e9c630dd14648677be39c80cbfae867fbe35c80c0d7d5b901936faf62033a4f41d4166b8e911416628ea91416698ea51416608eb3b83ccf0d66382cc30b9770799a176c70599e17ad570d86a986c357cb61ae6570d09ac861456430dab6189d510c66a08643534f2fd4166c8653564f3434166d8e7e9617a244c8f86e9b1303d1ea627c2f46490191e5c0d1b3e23c80c33ae861f9f1d64862b9f1b64863757c39eabe1d0d530e96af87435acba1ae65d0dffae86857f314c2f85e9e520f348423d8a518f28d4ed7ff5184cdda27e33c8dc3a5f12641e71ab47feaa0b84ea12a2bac8ac08325da8549732d5c54e7539545d30559754d545577559565db8559776d5c55fbdf2a05e0151afc4a85784d42b53ea1532f54a9d7ac550bd26aa5ebb54af11abd7aa770799dbe27b83cca352753b5c3d1a50b7ccd5edfb4fc3f4ad201393df09d377c3f4bd307d3f4c3f08d30f83ccb0c66ab863355cb21a5a590dc3ac866c564339aba1a0d5b0d19f0599a1a7d5d0d5bf0d324362ff3e4c9f87e98b2033bcf69761fa6398be0ad39fc2f4e730fd254c7f0dd3dfc2f42f61fad730fd5b98fe1ea67f84e99f41dd30dbd8909ca05b1f7d05138c983265d4b80953caa6d4968d9b3a76ca980963ef2b9b3666cae8b2da7b464daa195b3b0d17feb65e58c6081f3069d288fbcac68caf1e756f59edd42965b5356555b553c757d73b88ff452f74d2fe1e475457473bfbcf6f42fa7f9be8f450dd2ecae8eb57345cb792964d10e488a62cd4a365d32a34491fc1e452f7c6cc7970d9e4b1b553cacacbc6877fc3036fedb451d59dcbf07f934391274f299b3c65c4a4296535936ac79575e98ceb7db86d132af15f6dddc09c7942d3c4e9a8bfb3d4a410fbe5a94d50e03f4e6d1a69ebb26f40dab6ac694ecbca9a50c3b39ab2d0954d24bca92c5296c953aba64c1a31724af4c2b77e9385ef684a35c737b19a27776882b3d39bb2d0800e4d23bca329ce6666e12cf86f5a25cf6384550600", + "bytecode": "0x1f8b08000000000000ffed9d779815c5b6f67b604064cf8898b3830915c56118e20cb03127cc2822220cc3080a0c51cc98250773468292b380802020a227e7e4497a3c9e74ef3de73cf78ffbddfb05bfdbb577ad3bef14d5c3ecb16bf3eed9d5cf53b3abd754f7fad5dbabab53755741909efe19a6029d6f19a6b3820327f97f52ff967eb3a94b8ceb2a75c95990239c2d7284b3658e7016e60867ab1ce16c9d239c87e508679b1ce13c3c464ec5d622a83fc5cddbd681ae713326724cd3a21cd0b438c7343d2207346d17e4461b75648e70b6cf11cea37284f3e81ce13c2647388fcd11cee37284f3f81ce13c2147384fcc11ce937284f3e41ce13c2547384fcd11ced37284f3f41ce12cc911ce0e39c279468e709e99239c67e508e7d939c2794e8c9c9d80b3a3fe3d57ff9ea77fcfd7bf52f602fd7ba1feedaceb58a8e72f525c61520f69ca8cff750d537998ba85a9bbf1bf1e61ea19a65e61eaadff57a2ff5711a6ca30f50953df30f5d31af40fd3c561ba244c9786e9b2305d1ea62bc2746598ae0ad3d561ba264cd786694098ae0bd3f561ba214c3786e9a630dd1ca65bc234304cb786e9b6300d0ad3ed611a6cb0dc11a62161ba334c43c37457988685697898aac234224cd5611a19a69a30dd1da651611a1da67bc2746f98c684696c98c685a9364ce3c334214c13c334294c93c334254cf785696a98ee0fd303617ad0d0eca1303d1ca647c2f4a8c1392d4c8f85e9f1303d11a627c3f454989e0ed333617a364cd3c334234c33c3342b4cb3c334274c73c3342f4cf3c3b4204ccf85e9f930bd10a617c3f452985e0ed32b617a354caf85e9f530bd11a637c3f49666911d616198de0ed3a2302d0ed392302d0dd33b617a374ccbc2b43c4c2bc2b4324cabc2b43a4c6bc2b4364cebc2b43e4c1bc2b4314c9bc2f45e983687694b98b686e9fd306d0bd3f630ed08d30761da19a65d61fa304cbbc3b4274c7bc3f45198f685e9e330ed0fd32761fa344cdf0ad3b7c3f49d307d374cdf0bd3f70dcd7f10a61f86e94761fab1b6fd44fffe549795fb773f0bd3cf75fe17faf797faf757faf73363995f87e93786edb761fa9d61fb7d983ed7f92ff4ef1ff4ef97faf78ffaf72bfdfb27fdfb67fdfb17fdfb57fdfb37fdfb2ffaf75ff5efbfe9dfbfebdf7fe8df7f8669538774be4d5037258398daa8f29ad4b31f11bf63507f525ab4d4ff93df126d2fd4f3f22bdab5d2f3ad0c7b6b3ddfda584f1b3ddfc6b0b7d7f3ed0dfbd17afe68c37eac9e3fd6b01fafe78f37ec67e9f9b3c09e08e0deb0b62b5b4b6d2a009bc46b0bb0b5d2b696606b2dab03db61dad60a6cb27d5b83ed706d3b0c6c6db5ad0dd812da76b86819a6226d4b0671c54ae970b5dee2b8d7ab9f971d113fef08b5de768e788f8c9f77a45a6f7b07bc2a3e8ed2eb3a12e2e6686d6b0fb663b4ed28b01dab6d4783ed386d3b066cc76bdbb1603b41db8e03db89da763cd84ed2b613c076b2b69d08b653b4ed24b09daa6d2783ed346d3b056ca76bdba9602bd1b6d3c0a69bdce074b09da16d25603b53db3a80ed2c6d3b036c676bdb99603b47dbce029bb4bf67834dce17cfd136d5761c5e00cb68bbb45ba965a4cd06db79d25e83ed7c69abc1d649da69b05d00bec57621b43562ebac6dd26ea9fff5d6f96410d77e5256a3d65b11f77ac335abf5f6897fbda9678e7d833aad93e0a702b4eaa7f331f66bea82be0b74123f622f84fcd55056ca891e72ec1176758ca9d4f97e0d2cd7db58ae18ca545aea9f0ce2ad7f1f83a78fc1dc0af26e62b66b571fb38d9e328ed94150d68c3d390f6a8e313b00381cc46c0f1fb38d9e328ed91a286bc69e9c0b37c798bd03381cc46c959b982d2bf5319bbe6f1604f6d893eba1e618b3a38123fe98ede663b6f153c631fb049435634fae899b63cc4e058ef863b647953f3768f49471ccce87b266ecc9fd99e618b34f03878398adf1ed6ca3a78c63f62d286bc69edc2b6c8e31fb3c70c41fb3bd1cc56c571fb341fa196810d8634fee5b37c7985d041cf1c7ec087f7fb6f153c631bb1dca9ab127cf509a63ccaed379f59ce127fa39c32960fba9b69d0abcf1c776753747b15de6633bdd372408ec312acff39a636c7fa8f32a8e7f01fd11c4f64b6deb00b65f69db1960fb4cdbce847a39d807aafc3ed0e829e37de03750d68c6579b6dc1cf7811f01878398adf631dbe829e398fd1b9435634ffa3934c798fd3d703888d91a1fb38d9e328ed9ff84b266ec9dabf3cd3166a5afa93a5ff8429f2f9c0fb63f685b27b07da96d1780ed8fda7621d8bed2b6ce60fb93b65d04b63f6b5b29d8fea26d5dc0f6576d2b03dbdfb4ad2bd8fe45dbcac1f6afdad60d6cffa66dddc1f6776deb01b67f685b4fb0fd53db7a699b7ade257dafe4bcb50df0278378b7adf4bb9475cb7c972cf86e67f86e9745dfed0ddfed2dbecb1cf84e800f990a8cf924e4cbdcf29416030ffa2a8fdf575755f7ae41e3eb5e0e3cdd1cd43d013e1ac3d30d78bac7cf93eaffdb23fef5a6b6715743d304f8ea0af5eae9a05e05e04bd62df3e2af186cd8b6f6b430f68a9fb1ac007cc9ba65be17308a0ddb7a79e74af61f753cec5850c7eb605f4a9d13893ff96e997094835dca5cd5a18ead93662b82ffe371afbb61731497a9b8105fb26e99177f45509feed9672c6b2c633783d1551b5100be64ddde77dd76903c1ec71d5ceb58db34f15d9105dfbd0cdfe5866f6c3b656ae8d8d60b9863bfe6d4c7b6caf8d75b8ad727726d287ef0fc01afe1e2aa13fa966b43f123f642c85f57505756ca891ed20e0bbb8a65d996c86e2ed7d358ae18ca5458ea9f0ce2ad7fa5c1536930ab6d72091c0b1dec0fa918a8303864be1cb4ab8cd0ae02b49332e78276aedab3de068fcc77071e69c77a008fab6ba2289e6c5c8f1dcc379ec3e2f5b3fc1fcf035c6daf2e06a3ccdbb6572f60b49dab38b89e69f05ca51b308aad37f07475a459d476ed4ae2db41aca4da23f121e7e6b2ff7607bb94e9a55fa8536de53dd056ba88118c47991a7bcd1bff762a4b5d8377cb8007b79d83ebaa2e8ee2b114efdf7c1dc41b6b66bbd4cdd02aea1e8fabb6bcabc123f3e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333f333e4fc27e5b52ae3b09a3d9ffcdd57dfed4f70ff5ba64fdeab9ceff71da1facac14fbc7483f88f38d3a174299e2167565ff3ff407339f53611fc9ee6eb54b6d4bec8f998479f1877dad705b32f4772a89cd77d90857cfdbd437c0d47734cdbe9fdd2d9abae8ff8c9a16189a627ffc0b0c1e15a7952debd85c3cfbcbf459246a25f9389fed1507f6588f7fbb94d57b66dd22a8df7ee071c655ff1d69abe5797985e1bb10ca9cdca26edb48df2a1963b8abb11cf6fb9175cb32e783bdd258773bbdac70b432d6df03969532a7419bbaa7459d660edacab24cfbaee373f3f88fc3e9e7f85d33e0e9023c2eda1947e71ba5b80fc4fd1cdfec9f663b8f9132d8b7cf41bfca06fb3b893fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8ac77cd68aefd796933066a9ef43ea79867cab4cd69ffa5e708b3abfae9fc3c933a74e469df1ddd17fb6a82bbb49e78b8203fb3b446d4b57dfa788da96e20fbf3d83cf825c3cd72d005fb2ee328b16922f89cd77fa39be8bb121e4397e5743d7728ba6aef6577cc68a9ae2fedacde0c167a351dff629336c2efb0e45c585f8c37da90c6c92c7f7a35d6c673c9698fd7ac41f3ebffe8ed6b65de06adb9795ba6c37f0bb29c9e0c0f8c6efa9fc10dabe1feb3cf6e1c0be235f58fe2f5343cfa9453f556707dfd72c2d8075c9f6b57ddbb33fb0c6e4bb0baeab40a7fe86068590ffbc455d59292765456b6157fb887c0306d9cde5ba19cb154399be96fa278378eb6f7e6bb59fc1acb6c9cf20cebe80e3bfab36a96f8446e7834652c6f1371badfd2bcd7e85d88eb636cac8b2f82dbabf421b15d57fd4760c707d1c9375db8e63e671a131fd3cf3bd9fd67f417b11773fadff8218c27e5a81b1fe4eb07ee16a1d441f5ba4ccff33d66f9e93cb32d80fec7ff613f89e4b99ce67724e7ea8aeaf6ce7e4b85c54dd15337e072d192333c604b2e079829469abb5966d5619c1ddcbb26c71c4b2a295f9adb0a2e040fddc7c672dbdcff733ea22718ddf20973247435ddc9cb7a4cf015d7d532e097552f9324b5da5cc09b0af9da4f309d84eb8df9e67f9bf4c0d9d03e218ee17c75fe7d4f6bd043893e0077d5f0aac31f9ee82bee51c50fc88bd10f2e7b6ac2b2be5440fd15ad8d53e22e751c86e2e57612c570c65fa5bea9f0ce2adffc506cfc506b3da26a7429c9d07fdd05db5d5fd2334ea041a4919bca768fb0ea8ed5e87abf737a2cea5f0fd25f3fc0a8f936ece9bece7b1e67d35db394227831fcf117a403b9bb09435ef17caf132ce7ec3f8ae440ff08bef4ab8fa76736fd02d09f3785e70287dbbf88eadf217356642ef2cf88e1a33211bbedb1bbedb67d1b7d7dc6bcea4b983310852ef9fe1374bd5d4d079298e4b20cbb500461763392482fadf1e3f18238eef20cbb5044617c7874cbf7dde031865b9426074f16e298ebfd11846fcc6301ee785d1c1b762bb34f55bb1784faf353032bdb389cfa60e034617e7c54d7d570fcfe7dbc0afab7189ba66c058068cb2dce1c0e8e2de385ecb348611af8b64b9b6c0e8e21956a6e33be1b7e7f1deb24bc6868eed8efba294657aefa5d22d4f83e71ae8dbc1b886292df03ee3c1b4e8e396a7c1731ff4ede0be5f4a0b1c67f0605ae0b34117e31e2682facfe10ec683cf2f65b9a38031e988b15f068c4960fc9f7bc5c0d8df11633203c6fec028f66380d1c1fdd71463ff0c18f13ea52c772c305ee288f1e20c182f014659ee386074712f35017e1bc3782930ca72c703e3658e182fcd80f1326094e54e00c6cb1d315e9601e3e5c028cb9d088c573862bc3c03c62b8051963b0918af74c47845068c5702a32c7732305ee588f1ca0c18af024659ee1460bcda11e35519305e0d8cb2dca9c0788d23c6ab3360bc061865b9d380f15a478cd764c0782d30ca72a703e300478cd766c038001865b91260bcce11e3800c18af034659ae03305eef88f1ba0c18af074659ee0c60bcc111e3f51930de008cb2dc99c078a323c61b3260bc111865b9b380f126478c3766c0781330ca726703e3cd8e186fca80f1666094e5ce01c65b1c31de9c01e32dc078b38571a023c65b32601c088cb2dc05c0786bfc8ca96be9811930de0a3cb7c5cf93d2ecd60c786e73cb93faaedead165fb7c7ef2bb52d06058daffbedc033387e9ed4b6b83d031e612886e550b33be2674c69363803c63b806748fc3c29cdeec880670868768745b33be3674c69362403c63b816768fc3c29cdeecc8067286876a745b3bbe2674c69363403c6bb806758fc3c29cdeeca80675850a7d95d16cd86c7cf98d26c58068cc381a72a7e9e9466c333e0a902cd865b341b113f634ab3aa0c1847004f75fc3c29cd4664c0530d9a8db06836327ec69466d519308e049e9af879529a8dcc80a706341b69d1eceef819539ad564c07837f08c8a9f27a5d9dd19f08c02cdeeb668363a7ec69466a332601c0d3cf7c4cf93d26c74063cf78066a32d9addeb88f19e0c18efb5f0c4fd9dec7b2cbec63aaafb98a0f175178662580efb498c73c4383603c671c028cb613f895a478ce33260ac0546592ee198b1a17e12b5e07b7cfcbe53ed526dd0787dc6bbe569b09f04fa9ee0488bf141e3b598e096a7c17e12e87ba2232d26048dd76222f04c72a045027c348647188a6139ec2731d911e3a40c182703a32c87fd24a638629c9c01e3146094e5b09fc47d8e18a764c0781f30ca72d84f62aa23c6fb32609c0a8cb21cf693b8df11e3d40c18ef0746590efb493ce088f1fe0c181f0046590efb493ce888f1810c181f0446590efb493ce488f1c10c181f0246590efb493cec88f1a10c181f0646590efb493ce288f1e10c181f0146590efb493cea88f1910c181f0546590efb494c73c4f868068cd3805196c37e128f39629c9601e363c028cb613f89c71d313e9601e3e3c028cbddeb98b1a1eb97c79bb9efa86b95e6ee3beabaa4b9fbf671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98f7326df4f38f09d001f321518f349c80b43312c77af676cd68cc853121f4f29d61d7d3d4950f7272d3c058eea8ebe9e22a8bb30e41ae31339c0786f0e307a1dd37d109bc2a8789e76c4f354063c4f03cf338e789ece80e719e079367e9e544c3d93018f3014c372f7e600e31339c0e875f43a32317a1df34747cfe8193da3673c148cb9d0867bc69c88c7b2a6322a9ee9f1f3a4347b36039ee9a0992c779b5bc6b2a6322a9e19f1f3a4349b9e01cf0cd06cba4533078c654d65543c33e3e749693623039e99a0d90c8b660e18cb9acaa87866c5cf93d26c66063cb340b39916cd1c3096359551f1cc8e9f27a5d9ac0c78668366b32c9a39602c6b2aa3e299133f4f4ab3d919f0cc01cd665b3473c058d65446c533377e9e94667332e0990b9acdb168e680b1aca98c8a675efc3c29cde666c0330f349b6bd1cc016359531915cffcf879529acdcb80673e6836cfa2192be3bd39c0f8440e303ad6b1aca98c8a6781239ef919f02c009ee71cf12cc880e739e0793e7e9e544c3d97018f3014c372f7e600e31339c0e875f43a32317a1df34747cfe8193d63668c4fe600a3dfd69e9195d1c1f55583efd03cd7cc7d47bd43d3dc7d47bd43d3dc7dfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc73993ef17e2f75d96e937665e001e17dfbc7154cf52b5de17f5babe8e513fa5d54b8656cf195a1543991741bf971ce857007e65dd322ffe3265ee48c0ecc877d911e13a0e87fa8b8f270c3d94ff971dd53daaad7fb999fb8e6aeb9bbbefa8b6beb9fbf671eee33c1f7cfb38f7719e0fbe7d9cfb3867f18df95641dd79bb7cff54ade3159d2fd4f352fe49b04b994987a57fdb057e1f72e1dbef43fe58910fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671ce17e7180f9559e0090c9ea0019ef9643c53c8786691f18c22e31942c6733d19cf25643c0f93f19493f18c27e31941c6732b19cfd5643c1791f1f425e3994ac6d38b8c673619cf3d643ccf90f10c25e3b9918ce732329e47c978cac8782692f18c24e3b99d8ce75a329e2419cf03643c3dc878ce23e3194bc633878ce75c329e61643ccf92f1dc4cc67304194f3b329e2bc8789e22e3b9908ca7828ce731329e79643c93c978ee26e3b9838ca7948ce73a329ece643c1793f13c44c6d38d8c672e194f2d19cf74329e2a329e81643ce793f15c45c6d3928ca70f19cf02329efbc8787a93f18c26e3e944c6732719cf0d643c9792f13c42c6d3958c670219cf0c329e6a329e41643cd790f1f423e3b99f8ca72719cf18329e8e643c7791f1dc44c6938def9966c25344c6534cc6733919cfe3643cd3c878ba90f14c22e39949c65343c633988c6700194f7f329e07c978ba93f18c23e3194ec6730b19cfd3643c4792f1b427e3b9928ca7808027111c38864902feff02d85a18cbaacfbeceee50f7ff57b5bd052cf39aceb7b4acfb55b0c9b7645fb32c8b3abd0a7549ea7ce9379b523aa1af24cc8bbf22e0788d84e74a329ef6643c4792f13c4dc6730b19cf70329e71643cddc9781e24e3e94fc633808c6730194f0d19cf4c329e49643c5dc878a691f13c4ec67339194f31194f1119cf0b643c3791f1dc45c6d3918c670c194f4f329efbc978fa91f15c43c633888ca79a8c670619cf04329eae643c8f90f15c4ac6730319cf9d643c9dc8784693f1f426e3b98f8c6701194f1f329e96643c5791f19c4fc633908ca78a8c673a194f2d19cf5c329e6e643c0f91f15c4cc6d3998ce73a329e52329e3bc878ee26e3994cc6338f8ce731329e0a329e0bc9789e22e3b9828ca71d19cf11643c3793f13c4bc6338c8ce75c329e39643c63c978ce23e3e941c6f300194f928ce75a329edbc9784692f14c24e32923e379948ce732329e1bc9788692f13c43c6730f19cf6c329e5e643c53c978fa92f15c44c6733519cfad643c23c878c693f19493f13c4cc6730919cff5643c43c8784691f1cc22e39942c6339f8ca7d2c2f382231e79df5dd62df32f90f876b01d4ad57a5f7754a737f4ba5ae9f50abff82b8432d3daa67fd5f30f5c56b8ccef13e0bb396f80466f38aa8b6c8f0263fba0ef571cf936c7e793f9579ab9ef7686ef7679e2bbbde1bb7d9ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb3867f2ede0daa00cbf93265381319f843c5e2fb8f8be9ca37ad6bb4efc3a46fd94566f1a5a99d756c550e675d0ef4d07fad9ae3d655efc65cadc918019e3a22488372ede8abf4e65aadfe1e1a0eb5b86be58af858e348d3a862c6ce6bea38e21cddd77d431a4b9fbf671eee33c1f7cfb38f7719e0fbe7d9cfb3867f2fdb6cec778dd588a3ed4f345b91e781bfc2ed6f98218fdaa752dd2eb2ad4eb168ec5609732ff1b9e6bfa7ddeeff371f9f6c7361fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe99e3dccc4b7ff17381cd557ffea858ccc6bb0487d277542c3677df51b1d8dc7dfb38f771cee47b8903df09f02153437dfc9600cf22073c8eea997ab6b1d4a8d30b469d8aa10c1ee3973aa86701f89575cbfc52e091a912785cc44163b639f2cc27e39942c6338b8c671419cf10329eebc9782e21e379988ca79c8c673c19cf08329e5bc978ae26e3b9888ca72f19cf54329e5e643cb3c978ee21e379868c672819cf8d643c9791f13c4ac65346c633918c672419cfed643cd792f124c9781e20e3e941c6731e19cf58329e39643cc3c8789e25e3b9998ce708329e76643c5790f13c45c67321194f0519cf63643cf3c8782693f1dc4dc67307194f2919cf42329eebc8783a93f15c4cc6f310194f37329eb9643cb5643cd3c978aac8780692f19c4fc67315194f4b329e3e643c0bc878ee23e3e94dc6339a8ca71319cf9d643c3790f15c4ac6f308194f57329e09643c33c878aac9780691f1bc49c6730d194f3f329efbc9787a92f18c21e3e948c6731719cf4d643c45643cc5643c9793f13c4ec6338d8ca70b19cf24329e99643c35643c83c9780690f1f427e379908ca73b19cf38329ee1643cb790f13c4dc67324194f7b329e2bc9780a087812c181effe27e0ff6f824dde517f016cefe8fc22b0b5b0f868a9f34bc156a8f3b28ec3c2f4728703d78d3ab97a2f1f7d25615efc1501c73b243c5792f1b427e339928ce769329e5bc8788693f18c23e3e94ec6f320194f7f329e01643c83c9786ac8786692f14c22e3e942c6338d8ce771329ecbc9788ac9788ac8786e22e3b98b8ca72319cf18329e9e643cf793f1f423e3b9868ce74d329e41643cd5643c33c8782690f17425e379848ce752329e1bc878ee24e3e944c6339a8ca73719cf7d643c0bc878fa90f1b424e3b98a8ce77c329e81643c55643cd3c9786ac978e692f17423e379888ce762329ece643cd791f12c24e32925e3b9838ce76e329ec9643cf3c8781e23e3a920e3b9908ce729329e2bc878da91f11c41c6733319cfb3643cc3c878e690f18c25e3398f8ca70719cf03643c49329e6bc9786e27e31949c633918ca78c8ce751329ecbc8786e24e3194ac6f30c19cf3d643cb3c9787a91f14c25e3e94bc6731119cfd5643cb792f18c20e3194fc6534ec6f33019cf25643cd793f10c21e31945c6338b8c670a19cf7c329ecaecf094a977dba5af75005c382521bf1478163ad0c7513d4bf1bb065fc7b85ea5d5bb86566f1a5a15439925a0dfbb0ef42b00bfb26e99177fb9c8ac781ed779db77201e276114db42b73ca9fdf6f1a0fed4d07efb2ef0b868d71cd533b57f2d33eaf4b845772983b1bacc413d6dfb8ecc2f83ed906bcc8ae7299d17d604947b8a84516c4bddf2a4f6afa782fa5343fbd732e071d1fe38aa676aff5a6ed4e9298bee52066375b9837adaf61d995f0edb21d79815cfd33a2fac0928f73409a3d8de75cb539e803acbd4d0feb51c785cb43f8eea99dabf5618757adaa2bb94c1585de1a09eb67d47e657c076f0cc9ed9c6ac78e4d98eb026a0dc33248c625be694a7bc34017596a9a1766c05f0b868e71de99e6ac7561a757ac6a2bb94c1585de9a09eb67d47e6575a7c9704f16ab1aa115aacb2f0accab216e22f53e62539c8ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9ebac26afb3d7d9ebec758e83d9ebec758e62f63a7b9da3981974563cf2ed4a614d40b9674918c5b6dc2d4feabda06783fa5381319f84fc2ae059e1401f47f54cf5215f6dd4e9598bee5206f7afd50eea69db77647e356c874c9857e620b3d7b969cc8a67bace0b6b02ca4d276114db0ab73ca9766c7a507f6aa81d5b0d3c2eda7947f54cb5636b8c3a4db7e82e6570ff5ae3a09eb67d47e6d7c076f0cc9ed9c6ac7866e8bcb026a0dc0c1246b1ad72ca53967abf7146507f6aa81d5b033c2eda7947baa7dab1b5469d665874973218ab6b1dd4d3b6efc8fc5ad80e9930afcc4166afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9eb9c3f3a2b9e993a2fac0928379384516cab9df2744d3d779819d49f1a7aeeb01678d6c4ce937eeee040f7d4738775469d665a749732b87fad73504fdbbe23f3eb603b3477e69539c8ec63233bcc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5cc101b8a6796ce0b6b02cacd226114db1ab73ca9ef1ecc0aea4f0df5db59073c6b1de8e3a89ea97e3beb8d3acdb2e82e6570ff5aefa09eb67d47e6d7c376f0cc9ed9c6ac7866ebbcb026a0dc6c1246b1ad75cb936ac76607f5a786dab1f5c0e3a29d7754cf543bb6c1a8d36c8bee5206637583837adaf61d99df00dbc1337b661bb3e299a3f3c29a8072734818c5b6ce2d4faa1d9b13d49f1a6ac736008f8b76de513d53edd846a34e732cba4b198cd58d0eea69db77647e236c07cfec996dcc8a67aece0b6b02cacd256114db7ab73c6509a8b34c0db5631b81c7453befa89ea9766c9351a7b916dda50cc6ea2607f5b4ed3b32bf09b643ae312b9e793a2fac0928378f84516c1bdcf2a4f6af7941fda9a1fd6b13f0b8687f1cd533b57fbd67d4699e45772983b1fa9e837adaf61d997f0fb643ae312b9ef93a2fac0928379f84516c1bddf2a4f6aff941fda9a1fdeb3de071d1fe38aa676affda6cd469be45772983b1bad9413d6dfb8ecc6f86ed906bcc8a6781ce0b6b02ca2d2061141b1e2f1638e22936788a2d5a1c2adf6abe42e78bf46f02fe5f018caedac30506a3cc638c23af6bcdda193ced0ccd0ea56f55ff4a9d3f42ffe2f6aa044686edd52e0b9ab53778da1b9a1d4adf4a8b3e3a7fa4fec5edd5071819b6577be071d03e97270c1e353574beb1d9b13e8eea993adfd812d875c7e39094c163f71607f5b49d4bc8fc16d80e9ed933db9815cf409d17d604941b48c22836bc4ed91a3f4f79c2e0515343edd856c7fa38aa67aa1d7b3fb0ebbe1574973218abef3ba86701f89575cbfcfbb01d32615e9983cc5ee7a6312b9e413a2fac0928378884516c5b80675bfc3ce50983474d0db563db1cebe3a89ea9766c7b60d77d1be82e6570ffdaeea09e05e057d62df3db613b64c2bc320799bdce4d63563c83755e5813506e3009a3d8de079e1db1f3a4c703421e3535d48eed70ac8f9b7aa6dbb10f02bbee3b40772983fbd7070eea59007e65dd32ff016c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a6788ce0b6b02ca0d216114db76e0d9193b4ffab903f2a8a9a1e70e3b1debe3a69ee9e70ebb02bbee3b41772983b1bacb413d0bc0afac5be677c176f0cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccdac7886eabcb026a0dc501246b17d003c1fc6cf539e3078d4d4d073870f1debe3a89ea9e70ebb03bbee1f82ee52066375b7837a16805f59b7ccef86edb0db337b660bb3e219a6f3c29a8072c34818c5b60b78f6c4ce937e7e8a3c6a6aa81ddbe3581f37f54cb7637b03bbee7b40772983b1bad7413d0bc0afac5be6f7c276c88479650e327b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5ee7fcd159f154e9bcb026a05c1509a3d87603cf47b1f3742d4d183c6a2a30e69390ffc8b13e6eea997eeeb02fb0ebfe11e82e6570ffdae7a09e05e057d62df3fb603b3477e69539c8ec63233bcc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5cc101b8aa75ae7853501e5aa4918c5b617783e8e9fa73c61f0a8a9c0984f42fe63c7fa38aa67aadfcefec0aefbc7a0bb94c1fd6bbf837a16805f59b7ccef87ede0993db38d59f1d4e8bcb026a05c0d09a3d8f601cf27f1f394250c1e3535d48e7de2581f47f54cb5639f0676dd3f01dda50cc6eaa70eea59007e65dd32ff296c875c63563ca3745e5813506e1409a3d8f6038f83b84bf1141b3c32ff09816f355fabf345fa17b7572d30326cafe22c68d6cee069676876287dabfa8fd7f923f42f6eaff1c0c8b0bdda6541b3f6064f7b43b343e95b693141e78fd4bfb8bd260023c3f66a9f05cd0e657b7828f7ed4319a75ef343a779c121d4bce0106a5ee035a7d2dcc1f1a50c8f650130e09484fca7c0f3edf87952f7e53ecd80e7dbc0f3adf879ba38aa67a95aef77803daef52aadbe6b68f5a9a15531944186ef3ad0af00fccaba655efc7966cf1cc58ce7b6c29a80729f90308aed5bc0e3a2dd5075bf50af4bd6df2a4c9f1d53e7d7c5f312bc57dc4aaf5738c45f219499505257f6779aad08fe2fdb4dd5679f6173f40e7317db733b99177f4541d6eedd36782f19b570f1bc29d3e3fe3e0bcfd7f1f194e27e8ebef63aaa7b26cffef65a7862ac7b97a8e79e7be2af7baafde8acd725eb57fbe8bf1fe354f372dcf7a4fde86cd4b910ca0c28a92bfb1fd07ed8da0ad7fba69c939bfb668ba0ae3d13ae126d379f097daded52ee63288f6d4e85fec5fdb302eaeaaa5d8cbac784eda2d976bbd4de7c2e69fa2e065d3e26d5ccf69c0275acb470571270633c66733f9375db9e91551a3ab26986dbfa638b8e7d2cdc7d08b819f7eb3e868e6c9a1d6cbf1e68e11e48c0cdb85f0f347464d3ec60fbf5200bf720026ec6fd7a90a1239b6607dbaf075bb807137033eed7830d1dd9343bd87e3dc4c23d84809b71bf1e62e8c8a6d9c1f6eba116eea104dc8cfbf550434736cd0eb65f0fb3700f23e066dcaf8705f57564d3ec60fb759585bb8a809b71bfae327464d3ec60fb75b585bb9a809b71bfae367464d3ec60fb758d85bb86809b71bfae317464d3ec60fbf5280bf728026ec6fdbab1fdf659f7eb5a0b772d0137e37e5d6be8c8a6d9c1f6ebf116eef104dc8cfbf578434736cd0eb65f4fb0704f20e066dcaf27183ab26966dbaf1dbd4b98f1bb8dfb9dea931e637a7f063c1f018f8b98721407a58efab9a4faa6ee31b4da6f68856377ec05fd1cf48569f09b04e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333f337e97119faf48b98f4918c586cfa45cdce75775bf48af4bd6df2a4c038eabf3bb3776bf65a50586bf247088bf422873d2e975656fd46c45c181db0dc7e2c66db93bf63aa4b7a519ff322ffe8aa03e7b80c7c1fbf9299ebd06cf5e8b16f8de693cbecb46b8d1b8ac547d1feff0a06e3bef36ea839a7e18bbfffa9a16189a7ee8d87722a8bf3d8501a724e491c7c5b36147f54cb505bb8c3a991a1743998e50cf5d0eea59007e65dd32bf0b78646a013cae62303078028b3e325592f14c21e31945c6731619cf10329e13c878ae27e3399c8ce712329e87c978cac978c693f18c20e3399d8ce756329ea3c978ae26e3b9888ca7908ca72f19cf54329e5e643cf790f19c43c633948ce702329e93c8786e24e34990f15c46c6f328194f1919cf44329e91643c1dc8786e27e339968ce75a329ed6643c49329e07c8787a90f19c47c633968ce75c329e61643ca790f1dc4cc67304194f3b329e2bc8781e23e3a920e3b9908c673219cfdd643c6792f1dc41c6534ac6733c19cf75643c9dc9782e26e36943c6f310194f37329e5a329e2a329ed3c8780692f19c4fc6731419cf55643c2dc978fa90f1dc47c6d39b8c6734194f27329eb3c978ee24e339918ce706329eb6643c9792f1ec21e379848ca72b19cf04329e6a329e7d643c25643c83c8788e21e3b9868ca715194f3f329efbc9787a92f18c21e3e948c6731719cfc9643c3791f11491f11493f15c4ec6338d8ca70b19cf24329e1a329e33c8780693f11c47c633808ce730329efe643c0f92f17427e31947c6339c8ce754329e5bc8788e24e3694fc67325194f01014f2238f05b4c09f8ff5eb0c937833e025b0bcbfae439b59457c7c5451d0e5c770bcbba3fb430a04e3ba12e499d2ffd66534a27f4958479f157041c1f92f05c49c6d39e8ce748329e5bc8784e25e3194ec6338e8ca73b19cf83643cfdc9780e23e31940c6731c19cf60329e33c8786ac8782691f17421e39946c67339194f31194f1119cf4d643c2793f1dc45c6d3918c670c194f4f329efbc978fa91f1b422e3b9868ce718329e41643c25643cfbc878aac9782690f17425e379848c670f19cfa5643c6dc9786e20e339918ce74e329eb3c9783a91f18c26e3e94dc6731f194f1f329e96643c5791f11c45c6733e19cf40329ed3c878aac8786ac978ba91f13c44c6d3868ce762329ece643cd791f11c4fc6534ac6730719cf99643c7793f14c26e3b9908ca7828ce731329e2bc878da91f11c41c6733319cf29643cc3c878ce25e3194bc6731e194f0f329e07c87892643cadc978ae25e339968ce776329e0e643c23c9782692f19491f13c4ac67319194f828ce746329e93c8782e20e3194ac6730e19cf3d643cbdc878a692f1f425e32924e3b9888ce76a329ea3c9786e25e3399d8c670419cf78329e72329e87c9782e21e3399c8ce77a329e13c8788690f19c45c6338a8c670a194f25194f0b8307ffafde0ddba3f3f2eda042f8ff44ddb9bc9d5e97949167c4ea5ec507864dd57787a3fa7e10d44d4998df01f515f60f80e703473c3b0d1ed37711e42b41b3ed864d316e73c4b8dd6094f96dc028fa6d079eed8e7876183ca6ef22c8f701cdde376c8a71ab23c6f70d4699df0a8ca2dffbc0f3be239e6d068fe9bb08f20341b32d864d316e76c4b8c56094f9cdc028fa6d019e2d8e78b61a3ca6ef22c80f02cdde336c8a719323c6f70c4699df048ca2df7bc0f39e239ecd068fe9bb08f28341b38d864d316e70c4b8d16094f90dc028fa6d049e8d8e7836193ca6ef22c80f01cdd61b36c5b8ce11e37a8351e6d701a3e8b71e78d63be2d960f098be8b203f14345b6bd814e31a478c6b0d46995f038ca2df5ae059eb88679dc163fa2e82fc30d06cb561538cab1c31ae3618657e15308a7eab8167b5239e35068fe9bb08f255a0d94ac3a6185738625c6930cafc0a6014fd5602cf4a473cab0c1ed37711e4ab41b3e5864d312e73c4b8dc6094f965c028fa2d079ee58e7856183ca6ef22c8d78066ef1a36c5f88e23c6770d46997f071845bf7781e75d473ccb0c1ed37711e44781664b0d9b625ce28871a9c128f34b8051f45b0a3c4b1df1bc63f098be8b205f0b9a2d366c8a719123c6c506a3cc2f0246d16f31f02c76c4b3c4e0317d17417e3c68f6b661538c0b1d31be6d30cafc426014fdde069eb71df12c32784cdf45909f009abd65d814e39b8e18df321865fe4d6014fdde029eb71cf12c34784cdf4590bf196cc2db1b6c6fe87c2fb0bdaef33dc1f69acef700dbab3adf1d6cafe87c37b0bdacf3e5607b49e7bb82ed459d2f03db0b3adf056ccfeb7c5fb03da7f3fdc0b640e793609baff3fdc1364fe72f06db5c9dbf046c7374fe52b0cdd6f9cbc0364be72f07db4c9dbf026c3374fe4ab04dd7f9abc0f6acce5f0db66774fe1ab03dadf3d782ed299d1f00b62775fe3ab03da1f3d783ed719dbf016cf7eafc8d60bb4de76f02db7e9dbf056c9fe8fcad60fb54e76f07dbb774fe0eb07d5be7ef04db7774fe2eb07d57e78783ed7b3a3f026cdfd7f99160fb81cedf0db61feafc68b0fd48e7ef01db8f757e0cd87ea2f363c1f6539d1f07b69fe9fc44b0fd5ce72781ed173a3f196cbfd4f92960fb95cedf07b6cf747e2ad87eadf3f783ed373aff00d87eabf30f82ed773aff10d87eaff30f83ed739d7f046c5fe8fca360fb83ce4f03db973aff18d8fea8f3d2aea976f64f3a5f12c4dbce7e15d44d25e05bfca9327fd6f9d6461959b610ca9ca33b14aa671cea5ba6d20e4bbbac6cd20ebf013669875f079bb4c3af814ddae157c126edf02b609376f865b0493bfc12d8a41d7e116cd20ebf003669879f079bb4c3cf812da9f30bc026edf07cb0493b3c0f6cd20ecf059bb4c373c026edf06cb0493b3c0b6cd20ecf049bb4c333c026edf074b0493bfc2cd8a41d7e066cd20e3f0d3669879f029bb4c34f824ddae127c026edf0e3609376f85eb0493b7c1bd8647ff90a6cd236ef079bb4cd9f804ddae64fc1266df3b7c0266df3b7c1266df377c0266df377c1266df3f7c0266df3f7c1266df30fc0266df30fc1266df38fc0266df38fc13656e77f0236699b7f0a36699b7f0636699b7f0e36699b7f0136699b7f0936699b7f0536699b3f039bb4cdbf069bb4cdbf019bb4cdbf059bb4cdbf039bb4cdbf079bb4cd9f834ddae62fc0266df31fc0f698ce4b5bdd066cf2ac584da5df70c271785a802f614906f1b6fd3825218f7597a9928c673619cf28329e57c878ce22e31942c6730219cfe1643c6f91f18c27e35940c6b3948c670919cf9b643ca793f1ac27e35947c6733419cf07643c3bc8782e22e32924e39949c6f31219cf39643c43c9782e20e339898c2741c6338f8c673119cf22329ed7c9783a90f1ac25e35943c6732c19cf76329e6d643cadc978be22e3994ec6731e19cf0b643ce792f10c23e339858ce708329e76643c15643c1792f1cc21e3799b8c672119cfab643c6792f1ac26e35945c6534ac6733c19cffb643c5bc9783a93f1b421e379868ca7968ce739329e2a329ed3c8780692f19c4fc67314194f4b329e3e643cb791f1cc22e379998ca71319cfd9643c2bc9785690f17c49c6732219cf16329ecd643c6dc978f690f14c20e3994fc6534dc6f30619cf3e329e12329e41643cc790f1b422e3d94fc633838ce745329ee5643ccbc8784e26e3798f8c6713194f11194f3119cf5c329e1a329ed7c878ce20e3194cc6731c19cf61643ccf92f13c4fc6f32e19cf3b643ca792f16c24e3d940c67324194f7b329e5d643c3bc9780a087812c011804dfedf126cf21d9e7d60fb42e7f7804dbee1f316d83ed7f9c7c0f688c5d6c2c2270cd3c026efca7e0136b93ff328d8e49d89cfc126e70de25fcdafe870207f0b5846fcb4b4f0a3bfcf2d5c92c7ed2dcb248378b737fa4a06f66fde15188c879a672719cf2e329ef6643c4792f16c20e3d948c6732a19cf3b643cef92f13c4fc6f32c19cf61643cc791f10c26e339838ce735329e1a329eb9643cc5643c45643c9bc878de23e339998c671919cf72329e17c9786690f1ec27e36945c6730c19cf20329e12329e7d643c6f90f15493f1cc27e39940c6b3878ca72d19cf66329e2d643c2792f17c49c6b3828c672519cfd9643c9dc8785e26e39945c6731b194f1f329e96643c4791f19c4fc633908ce734329e2a329ee7c8786ac9789e21e36943c6d3998c672b19cffb643cc793f19492f1ac22e3594dc6732619cfab643c0bc978de26e39943c67321194f05194f3b329e23c8784e21e31946c6732e19cf0b643ce791f14c27e3f98a8ca73519cf36329eed643cc792f1ac21e3594bc6d3818ce775329e45643c8bc978e691f124c8784e22e3b9808c672819cf39643c2f91f1cc24e32924e3b9888c670719cf07643c4793f1ac23e3594fc6733a19cf9b643c4bc8789692f12c20e3194fc6f31619cfe1643c2790f10c21e3398b8ce715329e51643cb3c9782ac9785a5878f639e2916fc5c8ba657e5f33f7bdc3f0bd234f7c6f337c6fcb13df5b0ddf5bf3c4f766c3f7e63cf1bdc9f0bd294f7c6f307c6fc813dfeb0cdfebf2c4f71ac3f79a3cf1bdcaf0bd2a4f7caf307cafc813dfcb0cdfcbf2c4f73b86ef77f2c4f712c3f7923cf1bdc8f0bd284f7c2f347c2fcc13dfccd7dfea3b61d2577997fe4dc0ff2b80f12d478cfb0c46997f0b18c586dfa3ae70c41375ed5e41e05b6921f7b2e4996702fe5f098cae62aac26094795b4ced009e4a473c51f71c2a097c2b2de45d6ce9539980ffe3f8cbae62aad26094795b4c6d039e3e8e78a2ee95f421f0adb490779fe59dbf04fc1fc75b7715537d0c4699b7c5d456e019e88827ea1ecf4002df4a0bf956987c932601ffc7f1195dc5d4408351e66d3185e3e70e72c413756f6a10816fa5857c6b57be799980ffe3f84dae626a90c128f3b698c2f1e3063be289baa73698c0b7d2429e05cb37da13f0ff21c0e82aa6061b8c326f8b291cef6688239ea87b8143087c2b2d86eabcf4b14ac0ff8702a3ab981a6230cabc2da6d601cf50473c51f7308712f8565a0cd37979872301ff1f068cae626aa8c128f3b6985a033cc31cf144dd7b1d46e05b6951a5f3abf56f02fe5f058cae626a98c128f3b6985a053c558e78a2ee195711f8565a54ebbc7c732e01ffc7f1df873962ac3218657e18308a6d05f0543be289bad75d4de05b6921dff65fae7f13f07f1c8fd5554c551b8c326f8b291c0fbac6114fd43dfa1a02df4a8b513a2f63c224e0ffa380d1554cd5188c326f8b291cbf7294239ea8670ba3087c2b2de4db5c4bf56f02fe5f0b8cae626a94c128f3b6985a023cb58e7816193c8b2c5a1c2adf4a0be9cbbd58ff26e0ffe381d1554cd51a8c326f8ba945c033de114fd4b39cf104be9516f26dedb7f56f02fe3f01185dc5d4788351e66d31b510782638e2897a0635210bbea39ea764c377d4b3816cf88ebacf9d0ddf51f76cb3e13beafe63367c47dd4bcb86efa8fb42d9f01d758f231bbea3aed7b3e13beada331bbea3aea3b2e13bea9a201bbea3ce6fb3e13bea5c2d1bbea3ce3b7c7beedbf3b87d1fca73877c6dcf0fe531f4501e4bfcb581bf36c8966f7f2cf1d706d9f29dafd706be3dcf7e7b2ed75f0541f4f5d83b8e7c2f317ccb3c3e6759e2c8f722c3b7cce33383458e7c2f347ccb3cdeff5ee8c877b1e15be61766c1773bc377bb2cfa6e6ff86e6ff1ed607b972582fad7dfc2805312f218036f3bd0c2513d4bd57a17eb757d1de37a6df76dccfda518ca2c06fd5cb71db26eb3edc845668c8b82f87c9726c0877c974cd9e4f9f11b609376ff75b049bf80d7c026c7a657c126cfa45e019b3cb37a196ca3747e3fd8e4d931f6d997e7ff5bc156a5f3d8577c98ce6f069bf4a5c23ecad21f6e13d8a44f23f68d957ea91bc0267d8bb14fa6f40f5f0736e9e38f7d01e53d8d356093776db00f9abc2fb50a6c7b741efb3ec9776856806d9ace2f07db1f747e19d81ed6f9dbc0f67b9dff0a6cbfd3f985607b48e7df06db6f757e31d81ed4f997c0f61b9d7f116c0fe8fc0b60bb5fe7f15db65febfc4eb07da6f3f80ed5549ddf01b65fe93cbebb739fce6f03db2f75fe79b04dd1f9e7c03659e71780ed173a3f1f6c3fd7f979609ba4f373c1f6339d9f03b6893a3f1b6c3fd5f959601ba7f333c1f6139d9f01b6b13a3f1d6c6374fe59b0fd58e79f01db8f74fe4bb0dda3f38bc0d642e797804dc68cc47e2a853aff0ed85ae93cf63f92effb4f00db613a3f1e6c6d74be166cf26db8516093f1a06bc096d0f96ab015e97c15d8e4fc6c18d864fc93a1609373a921603b52e707834dce7b06814dc6b31c0836f906691fb01da3f39560936feb5780ed389ddf07361973ec2db0c977ebf6804dc6627e146cf2bdea69603b59e7ff00361987e561b09daaf3bf07db693aff3bb0c9373c1f025b89ceff166c1d74fe41b09da1f3bf019b8c91f500d8ced2f9fbc1266307ff1a6cf2bde7cfc0d651e7a782ed5c9dff15d8642c91fbc026e383fe126c9d747e0ad8e43bdc93c176a1ceff026c32dedfcfc126df189e043619d7ed6760eba2f313c156a6f33f055b579d1f07b6729dff09d8bae9fc58b075d7f93160eba1f33f065b4f9dff11d87ae9bcb4336a7f56fbf95e3d9f0ce23b2f53fe3e0aea4f0d5d1b0803f2c479ae5d0c3ce86b77ec752f4b9dd7cb7edf42af57626837f8de15bbeff435c5877a5d857abdbb0cdf8550e65cdd38a8e5e498df522fb7c7580eef63c9ba65998bc0bed358773b5ddf0f1dd57797c124dca88394b94033a963e30f74be0d2c13235beafa58622d000d714a425e18dc6855568ae7bd8de1f9107876c7ce93be5e771113b86fc57dbd6edec73563ad18caec02fd763ad00ff77559b7cc8b3fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8a67afcee3736529b79784516cbb81c7c57d7e7c0e2beb57cf75769e5ee77777ec7eeb3fdf6ba5d75b6ad4b910ca7c0dcf9cf6e87c11fc5fb65bd4b674f09cb0c16d29fe8aa03ef82c68af239edd06cf6e8b16922f89cd77d908371a9795aabe2cea19fb1e43d7bd164d5dedafbbf5ba0a0c4d717ffdc8e0c167a345c0fbb1fe4dc07a3e863a38d8c71b8c0bf187fbd26eb049fe236074b19df15822ed813c0fc767d352e657c673f1f8b77d59a9cb76e303a853323830be0ba1ccefa0edfb5ce7b16fc85ed0ed1f96ffcbd4d0736ad14fd5797bfc754e6ddf6dc099043fe8fb7d608dc977bd77680a74123f622f84fcdfa13f8794133d446b61c7f1ca91dd5cee2363b96228b3c352ff64106ffdb71b3cdb0d66b54dbe8438fb071cff5db5493b2234ba08349232bb41a33d8e78761b3cc221fe5419d9fead8d32b26c2194f95fd046a9ba483b2ff5c4be2d780c70751c135fb26e99b79d1b7f088c661d557c0c38ae8e7777ecbcb9d5ffebb092f42fb6eb71f5ff9275b7d3cb0a4760acbf14d62f5cad83e863cbff6cdf92baf5bbec5fb6c7a8b3b0a0ce52a65d49fa57c5d9e53a9fc9b9fea1ba6e8b3ad7dfe1802711d4bff6565343c7773cc67ce080c7513d4b6dc7ae9d469d8aa14c47a8a783f39806df05de0ebe5d6c73d442cea176195a1442990e25e95f693ba274c46bd50fb3529732ebf960a9a52e52a663495d5dda803d4e2697dbed7da8935aef6e4b5da5cc052575ba74d6f9046c27bc6fd2c7f27f991a6a0f702c9e2df1d739b57d37036712fca0eff7803526dff5be0522e7fbe247ec8590af2ca92b2be5440fd15ad8d53e22effc21bbb9dc2e63b96228b3d552ff64106ffdb7183c5b0c66b54dba94d4e5258e5cb69b5b23342a058da40cde3f96633bbe77673beeef76c41d75dcdf0d8c66bb89e72e2ed9f6186ce63d54dbf9a094c1733229734d49fa57b5b3094b59f3deb08bfb98f80e6a00f5088cbaca8431e0e0dab01caf9da49d123f9dc1be5be745e7ce86768550666049fad7e179b7f5dea5797d87d714c26dee5bf8eec7e0923a6e1c3b71b7fe2d02db27fad7d1755ab9ed9ea170d8ee190e2ba963c765856bbfa52ee635728be0c07bea5f1b65f1be5b43cb9979731c4aa5ef2746399b1fbce689ed5d8d2ea5a5c8d422b0df2ff8c8602f080e1c7353f6038c39f33e4a67633d781fa5b624fd2b6d9259566dfb7f3fa64e1fd98ea21db62718931f016352e74bbfd9d4c5567f99177f8af163a30e6edaaef4fb4a99dc07de033c2eda76476d74291e63dbc4b6de5e55b6e3ff478656597c5e6b3de69bcfdcdb18f9787c9755dbee3fd9b4d865e171f51c254a8b5d16dff169d17d84edf861d362a785676796b5d869f11da3163578dfb3212d3eb0f0b8b817d590161f587cc7a7458fd2869e6ba0163b2c3caeee3d446921fe3265de49c0dcc6c8c7e3bbbcca769fcca6c5760b8fabebe6282db65b7cc7a74597ee788fae212db65978e2bf3fd7b016db2cbee3d3a2672fbc87d79016ef5b785c3dd38dd2e27d8bef18e362a4ed5e8e4d8bad169ead59d662abc5778ce787dd6df7da6c5a6cb1f038b8efdaa0165b2cbe63d46238de776d488bcd169ecd59d662b3c5777c5a5475b3dd13b669f19e85c7d53de1282ddeb3f88e4f8be13d95ef4d8dd0629385675396b5d864f11de335542a2e3636428b8d169e8d59d662a3c5777c5a54a7ceb53634428b0d169e0d59d66283c5777c5a94a68ea9eb1ba1c57a0bcffa2c6bb1dee23bc6b8485d4fae6b8416eb2c3cebb2acc53a8bef188f23a9b858db082dd65a78d666598bb516dff1695193baffb4a6115aacb1f0acc9b2166b2cbe63bce7928a8bd58dd062b585677596b5586df11d9f165d53c7d4558dd0629585675596b55865f11d9f162353cfc45636428b95169e9559d662a5c5778ce79da9f6624523b45861e15991652d56587cc778de99ba7fb1bc115a2cb7f02ccfb216cb2dbe636c3b53e79dcb1aa1c5320bcfb22c6bb1cce23bc6f3ce9416ef36428b772d3cef66598b772dbe633cef4c1d47de698416ef58785c8d8112a5c53b16df31c645aaed5cda082d965a789666598ba516df31ded74ab59d4b1aa1c5120b8fabf11aa2b45862f11de3f548ea1edfe24668b1d8c2b338cb5a2cb6f88ef15951ea1c7c5123b45864e15994652d1681ef3db1fb4ef7e7161fd217eb42438b4228735a87f4aff4c58ad251d681fdcab02e6fc75e9774bfb2851175791bea2265ce82bab4099c8c5154eea8aea998790beaa4d6fbb1a5ae52e6bc0e75ba74d2f9046c93fda05b6fcbff652a30e6939017fd549ddf88bfcea9587d1d3893e0077dbf06ac31f9ee82be0b74123f622f847caf0e7565a59ce8215a0bbbda47ded4796437975b642c570c65deb4d43f19c45bff370c9e370ce6d47b0f106712476edaae34d39b111a5d081a4919ecb3f7b1231eb30fa170883f5546b67f6ba30cf6a1943217431b85fd4aa59e89e0c07e938edab22ec82eeb9679f1570cb63dc068d651c5c767d0f753c68a907124944dc685e80aebe961d8545d7b3aaaabf89275cb7c4f6094712a7a649fb1acb18cdd0d46c5d3db816638f6864c0d1d2f7a034f2f073c8eea993a0e551875ea69d4a918cae0bb8d150eea59007e65dd325f01be5d6c73d4428ec9e7195a14429961c6f963948eb20e15bf3d2c75e9ebb82eb26e6997fa66c177a5e1bb9be13b11d4dfce41d0f0fe5509cc7d1c30abf5f68b7fbda578de2631257eba419dfa830671d509d725e779fd0d6d0b213f05cef3a49c9495e397b0ab58966d89ece672bd8de58aa14c5f4bfd9341bcf5ef67f0f43398d536b907ceed1cec0fa918e86b70c87c37d0ae5f84767d413b2983c7bfee8eb4eb63f0c87c77e091739c0ab0c9b982f027e0ff5db3c06db67b15166eb1e13871dd2d8cdde2674c9deb74371865be1b308aad0ff0543ad2ccdcd6e719fae071b9b55146962d843233e1d898b09455fb5dc782ba7ab5d4f6d8de1dd36d7a6b077ae1388d01e813181a06a097d4b395039eb641dd588d9326d74e1c7ef7c89b46a61f3d0a5aa18189bf05966ab4001be65b5a6c41507f48ca42b0c99094adc0d6c2900587c294f232a49d0bb9500f5977a1c1d90658e2f48dc379cad450e81c063c2e4259858e0ce9a943e7b689a3278fc4f8686570362576d4ff5a36502e6a5daeb683b94f2461de8cc14247fe5b427d93302ffed4b629d6f9f1c347dcdb7fe2dd53c68e1c3779120a65eed8982f08ea6f00f3374a70573b1d060056181b875646bdb0c190ffc986691b3f67398e996b6a13803f99da826e873bd04dad5fc6be1d317ccc981ba6548d193de2f229e3464c1e5d3b0eb7661b43b9a82d2dff6f0d365b138f65d584cd162e7b98c5669b7094e136609323d7e160139eb6606b0979296f6e1927e1da11d62fbb94fa9f12a795aef861415d08c8e158b5ab6aff559f8f55a7416aa86335b4b1da9c6ae86275c7500d4dacbe62a7861e56430daba1854f0ad24307aba1824f0dd24301abaf5d9404e9a17dcf08d243f79e15a487e63d07f8be0dcce706e9d32e35b46ea7203d74aeba75a95e5d579f7953efd6abd377755b409df2aa4b3c75faa94e3bd5e585ba7da16e65a9533a75baac4e05d5e99bba1ce9a7b5ee1fa68bc37449982e0dd36561ba3c4c5784e9ca305d15a6abc3744d98ae0dd380305d17a6ebc37443986e0cd34d61ba394cb704e9e19d6f0dd2c3afabe19f6f0fd24343df11a4878dbe33480f297d57901e6e7a78901e8a7a44901ea67a64901ec2faee203dbcf5e8203d4ceebd417aa8ddb1417ab85e351cb61a265b0d9fad86f9554302ab2185d550c36a58623584b11a02590d8dfc60901e72590dd9fc48901ef6795a981e0bd3e3617a224c4f86e9a9303d1da4870757c3864f0fd2c38cabe1c76705e9e1cae704e9e1cdd5b0e76a3874354cba1a3e5d0dabae867957c3bfab61e15f0ed32b617a35483f92508f62d4230a75fb5f3d0653b7a8df0ed2b7ce1707e947dcea91bfea02a1ba84a82e32cb8374172ad5a54c75b1535d0e55174cd5255575d1555d9655176ed5a55d75f157af3ca85740d42b31ea1521f5ca947a854cbd52a75e3154af89aad72ed56bc4eab5eadd41fab6f8de20fda854dd0e578f06d42d7375fbfed3307d2b48c7e477c2f4dd307d2f4cdf0fd30fc2f4c3203dacb11aee580d97ac865656c330ab219bd550ce6a2868356cf467417ae8693574f56f83f490d8bf0fd3e761fa22480faffd6598fe18a6afc2f4a730fd394c7f09d35fc3f4b730fd4b98fe354cff16a6bf87e91f61fa675037cc36362427e9d6475fc104c3274f1e3976fce492c9b52563a78c993c7afc98074aa68e9e3caaa4f6be91136bc6d44ec585bfad179631c2fb4f9c38fc8192d1e3aa47de5f523b6572496d4d4955ed9471d5f50ee27fd10b9d72a0c7e1d5d5d1cefef39b90fedf263a3d5cb78b32fafa550dd7ada865130439aa290b756fd9b40a4dd44730b9d4bd397d1e5c32694cede492d29271e1dff0c05b3b756475e712fcdfa450e449934b264d1e3e717249cdc4dab1255d3ae37a1f6ddb844afc575b3730679fd434713aeaef2c3529c47e797a1314f88fd39b46dabae41b90b62d699ad3929226d4f09ca62c747513096f29899465d294aac913878f981cbdf0eddf64e1bb9a52cd714dace6a91d9ae0eccca62cd4bf43d308ef6a8ab31919380bfe1bc78b38aa8c550600", "isInternal": false }, { "selector": { "value": 2603445359 }, - "bytecode": "0x1f8b08000000000000ffed9d77741cd775c667d158164b1024c15ea046b3015c2c1a0136b0774a9464f5429004455a24419150b32c4bb224f7debbe516cbbdf758a97612274e1c3b96bbe36e4b2eca3f39ce49cef1c97bb3ef1a1f1e67d658682e78077be79c8b7d73f7eddcdffbe6ce9bd9f766074f054190098a4bb5b18b8273177abfcfbde69fded296e0b6f29c9c99947056a584b33a259c3529e1ac4d09675d4a3827a58473724a38a724c869d9aa82914bd2bc5319744d9a319b324deb53a0692e659a4e4b81a60d413afaa8e929e16c4c09e78c9470ce4c09e7ac947036a58473764a38e7a484736e4a38e7a584737e4a3817a48473614a3817a58473714a3897a484b339259c17a484f3c294705e9412ce8b53c27949829c2b8173a97b7d867b5de65e97bbd715ee953eb3cabdb6b836d6b8f55663ab2d9bb136efbd82b176631dc63abdf7ba8c751b5b63acc7bdd7ecdeeb35b6d6d83a63eb8d6d30b6d1e9b0c9d866635b8c6d35b6cdd876633b8ced34b6cbd86e637b8ced35b6cfd87e63971abbccd80163971bbbc2d895c69e69ec2a63571bbbc6d8b51ecb75c6ae377683b11b8ddd64ec6663078df51b3b64ecb0b123c6068c1d35768bb163c68e1b7b96b15b8d9d3076d2d8296383c64e1bbbcdd81963678d0d19bbddd81dc6ee347697b1bb3dcd9e6dec1e63cf3176afc7f95c63f719bbdfd803c69e67ec41630f197bd8d8f38dbdc0d80b8dbdc8d88b8dbdc4d84b8dbdccd8cb8dbdc2d82b8dbdcad8ab8dbdc6d86b8dbdced8eb8dbdc1d81b8dbdc9d89b8dbdc5d85b8dbdcdb1d081f07663ef30f688b1771a7b97b1771b7b8fb1f71afb0b63ef33f6a8b1f71bfb80b10f1afb90b10f1bfb88b18f1afb98b18f1bfb84b14f1afb94b14f1bfb8cb1cf1afb9cb1cf1bfb82b12f1afb4b635f32f698b1bf32f6d7c6fec6d8df1afb3b637f6feccbc6be62ec1f8cfda3b17f32f65563ff6cec5f8c7dcdd3fc5f8dfd9bb1af1bfb77e7fb867bfda6ab4be362ff61ec5baefcb87bfdb67bfd8e7bfdaef799ef19fbbee7fb81b11f7abe1f19fb4f57feb17bfd897bfda97bfd997bfdb97bfd857bfda57bfd957bfdb57b7dc2bd3ee95e7fe35e7feb5e7fe75e7fef5e9f32765953b13c39185efa8284faa88ea3793ba742e22f0d462e568b6af71ebd363b7f8d5ba757d2aed6add77afe3ab75ee76d67b25b9fecf91bdd7aa3e79fe9d6677afe26b7dee4f9e7b8f5399eff62b77e31f8b3018cb93abff5553b57067c94af55e0ab75be6af0d5d1e6c037c9f96ac147fbb70e7c539c6f12f8a63adf64f0659d6f0a6969acdef9fa82a47225df6fb79b4b7abb6e1e6a5af2bc87ed761b9878a727cf3b60b7dbc8c06bf36386dbd674c89b99ced708be59ce37037cae0bfad331677db39d6f16f8e6385f13f8e63adf6cf0cd73be39e09bef7c73c1b7c0f9e6816fa1f3cd07df22e75b00bec5ceb7107c4b9c6f11f89a9d6f31f82e70be25e0bbd0f99ac147f7b85c00be8b9def42f05de27c17818ffada8bc147d78697389fed272667e033ce4f7d54f819ea9fc1b78cfa66f02da77e197c2ba84f06df4a884dbe55d0af90afc5f9a88fb2eff5ba725f90d43151088f89b5496fd76cd96e777df2db0de7ed3604c35af7419cb5a0d546574ef0dea0368c9d714671c85f03e55d5097ea911e749e21767b3e59e7ca1b4b7caed7fb5c0eeaac8b687f5f906cfbd77b3ceb3de65a683f4fceb617346747bd949db357435d3ff7e89a6722e6ec5ee060c8d92ecdd9512f65e7ec00d4f5738fae7b2762ce5e071c0c39dbcf93b385bce66c718c2c08a2738fbefb4cc49c3d061cc9e76ca7e6ece897b273f601a8ebe71e7dff9d88397b0770249fb3ddfd7a6d30eaa5ec9c7d05d4f5738fc6622662ce3e041c0c393ba0fdeca897b273f66d50d7cf3d1a179c8839fb6ae0483e677b9872b65d733628ce77064174eed118f544ccd9478023f99c3dace3b3a35fcaced9cf435d3ff768be6422e6ec475cd9ce337cc3cd332c04df379d6f11f0269fdb473a9872bba0b95dbc0f2408a27394e6ee26626e3fe6ca368f1f877b0fc8f76de7bb007cdf71be0bc1f75de7bb08dac5700cf4eb3130eaa5ec63e0fb50d7cf659a479e88c7c0d7818321670f6bce8e7a293b679f80ba7eeed13d0d1331677f041c0c393ba0393beaa5ec9cfd03d4f5736f992b4fc49ca5fb4aedf5c28fddf5c20af0fdc4f95682efa7ceb70a7c3f73be16f0fddcf95ac1f70be75b0dbe5f3a5f1e7cbf72be36f0fddaf90ae07bc2f9dac1f7a4f37580ef37ced709bedf3a5f17f87ee77cdde0fbbdf3ad01df53ced7e37c76be8beebdfaaaf3d97d4b1af505c9ee5bbac792b64debabc621768317bb611c63377ab11b2362b730c4ce420c5a32de7a1f945b7879f2b960e4ef3f28d6eae463b5dbb6b706a36ffb6ae0c933b43d0b3146c393079eb6e479c27b7d0bc96f37dcc7ad9ea65988d50aed6a6768570662d1b6699de2e5c087fd777b046347f28c850cc4a26dd37a0730920fcf27745ea7e3c79e0f97668679198ea5f09a88e2d1b3bf886335f8a9ceef670db3ad706cf5f03e9e5bdb3c1f535e867941b168dbb44ef1eaa13d6de3cf58182d63de63e4ea2332108bb6edc7c6e3bd65fc351bd57ecd81ef3cf44985b1f649f5c0361ed72971fb5a4a6c8ef355066250df469a17c04f7566bb1f24d8be6d07f4bb0cc75fa1dceb37ec0f92cfe3421e8febd1f0b4030fc7b1cf74bce6f1bcffc720d95cebf4b46af3b4ca419d0ed0af9341bf52d721144f99955999955999955999955999955999955999955999955999955999955999e533e3fd1738bf49f5560961245f017838c6f9c3e747b96dd1f6edbcce77605e27f9798b421ee72ce91ec3e55e9b6ba0ce9399e1ba3f80f9747f6e10e73457f16a37aafb2cea8373e76239e710e3e681a3e62f9b138b5d38cc35df669fa1629f43d6eae9ba2a425386fb5446689af134c5fb14577a3c364fe7550fb371ccfd953b17895a5139c9b93dbcc78077bf14fb0fca85aa6064ff81e799aec4638f9cc3a4f9f22e2f760dd4f99fccf0bea17b51e9ff1cfaf73cd93adddeb6e933cbc1dfed6dbbc17d96386abdedb7c267a9ceff419ffaf6aae04f9a71dcff81fd72006dc5a50fca386f9efc79b8388fdf5e064f27f070f4334cd71b793c06929ec7eff6b48aba8ea13a5da05f37837e51d7a2b44ef194599995599995599995599995599995599995599995599995599995599995593e33fe569458b350af2084719cee7d08e733e8f92fb47d3baff3d2aae1b8dcf37034e7b4c26b730dd4f95ad570dd57ba727d70eefd0e71fb92613eafe4bea478f5d01e9c0be2fa3d7787c7d311a105959b138b5d9cc74f5ee3e179fc764fd74284a65cc72bceb1a2a678bcb6793c38375a1f9c7b6f4916b6331ef70ec5e505c5c363a9037c54c6df4773ec673c97f8f7f5503c9cbf7ed469db1070edfb429eb3df58036dea0bcecdef1aa8f361e8fb3eeaca780f07de3bf258c4fbb4949aa726fd589e65972fcefbae05ce3e8883b1d7016b42b1db3076c619c5217f0d94bf54355c97ea911ea435b1db63849e0986ecfee7dabccfe5a04e4f44fbfb8264dbdfebf1f47acc769f7c02f2ec3138ff73f5493d311a2d078da80e5e0771dd93e7f791fefd8d78df5e9d5707af59a8ce57a08f8abb7f34ea9e43aef358dc3d8751d7c69dc0e8b7d1bfcfb3d2efd37a1cfa8ba4efd37a1c7208efd30abcedaf80ed13575d107f6ea13adff3b6ef5f93d367f03e30aaf343e82f1adc3d8bf5c1b9d7df78cfd4787cbf8abb4f9ae2e1750d1edb7faeed96790dd4ef4b9019730259f03a81eafccadb67dd31dcab233efb64cc6749ab1657c6ef2fbe7e56871ef84c5f223a148ff95eaf2d94d73dd016aaf35fde3560f2d72dc56bc0e4db3af29a84fa818e88b6529dff8663ed0f708d47fb09bf77d4559ffb3e2da5ae01493fdbe6f17e3e30c696f07ce0daeae1bafe737e49eb729f0fdce57d4ee2f381ff17f2ac0eee43e7eaabd7c568b40234a23af8db203a8fe0b37ca3ce315cf7f6c79d63a29e4189fd7343f5f8b3f9e36a51d70854873e8bd708b31c7383d3d9afeb8f17d2f932c9fb86f1b712ad10177f2bd1caa4671e74eb8375bc2e389fb1f34cb1e39e399d1f87d871cf9c1e8fd88d5eecc6718cad9aabe6923467782672f8fb337c66a95d4a5d9712430e3e579502c6ea1430d6a480b136058c7529609c9402c6c929609c9202c6a92960cc02e3f93cb733e85318ab3e5cfbabd4b506c66e61d2a29cffdfc1fcbf544a5efb606c86ef74a1162dc1e8b5c0ef791ccf7e28f77fbd1003feef821929609c9902c65929606c4a01e3ec1430ce4901e3dc1430ce4b01e3fc14302e4801e3c214302e4a01e3e214302e490163730a182f4801e3852960bc28058c17a780f19214302e55c6441857f23216c6ca687938fee7dfd3f99f630c3cf9a87b4e997e7b52f6ff5b637e3e69db589f1b87f796f0fe4fb8a7f76c3b8e7b47ca7db65da9ffb7cac458182b23d77decf83b9ed1f0e0ef22a37e5bc3c058182b23d7ef5ff0377aa3e1e902cd3a233463602c8c9591eb5eb972efe5c47bfabb223463602c8c9511efab4e9027d4acbb0c9e35a0597784660c8c85b13272dd979c8518a3e1e901cdd64468c6c058182b23d36fdb42cd7acae0c1df80f54468c6c058182ba3e559cba4596f193c6b41b3de08cd2431224fd2cfc9ee8d88c5f19bc172db4e0cc83825058c5353c088f74970f45fa5ee93e8e5d5a730567db8f657a9fb243036c3ef63422df0f7107f4e8bf5bc3c25ef93c0d81b98b4c0dfabfc392d36000fc7ef67b21063343cc49083cfcd4801e3cc1430ce4a0163530a1867a780714e0a18e7a680715e0a18e7a78071410a1817a68071510a1817a78071490a18f1bb2ac3b562c9ef2f1b2678ecb8ef2a133d76dcf792891e5bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73c97143b0d63fcca38f11891a739399e3cb61d63f509687b5f044f86a9ed186b9380b61343da1837a680716d0a1855c7e23d886361b43c9b99783695c1b31978b630f16c2e83670bf06c4d9e27cca92d65f010430e3eb736058c1b53c0a83aaa8e921855c7cad1511995511995f17c30a6a10f57c654e46361ac8c96675bf23ca1665bcbe0d9069ad1e7da78190b6365b43cdb93e70935db5606cf76d06c5b84660c8c85b1325a9e1dc9f3849a6d2f83670768b63d423306c6c258192dcfcee47942cd7694c1b31334db11a119036361ac8c966757f23ca1663bcbe0d9059aed8cd08c81b1305646cbb33b799e50b35d65f0ec06cd764568c6c058182ba3e5d9933c4fa8d9ee3278f68066bb233463602c8c95d1f2ec4d9e27d46c4f193c7b41b33d119a313016c6ca6879f625cf136ab6b70c9e7da0d9de08cda432ae4d01e3c6143032eb58182ba3e5d9cfc4b3af0c9efdc0732913cffe32782e059ecb92e70973ead232788821079f5b9b02c68d2960541d5547498caa63e5e8a88ccaa88ce531f6a58051f7b5324a6564f87e55f23734974ef0d80d5eec860a891df71b9a891e5bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73c9714fb40f2b10be53e63e600f0703cf386a99d79bbddcbddb6fe98a07e56ab2b3cad2ef5b4ca419dcb41bf2b18f4cb405cda36ad53bc72999f2180992976619ad9c614683fc5d8e8e961e35fc9d4f6b8befeca091e3baeaf9fe8b1e3fafa891e5bf35cf3bc12626b9e6b9e57426ccd73cd7329b1b15c1b0c5fb7d3f34fed369ee9ca356e1d59c94f752e9b547c6d08f418e288adc7909e2b2a21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad792e2fcf311faac68127f07882123c1b84f1ec16c6b34318cf1a613c8b85f1740ae3992b8ca7208c6786309eadc278a608e3592e8ca75a18cf26613c79613c7b85f12c11c6b34218cf3c613c3385f14c15c653238c67b3309ed5c278f609e3d9238ca75718cf52613c3dc278b609e3e912c6335f184fbb309e59c278560ae3c90ae36915c6532b8c67a7309e16613ccb84f1ec17c6b34e18cf02613c4dc278ea85f1e484f1d409e3592f8c6797309eedc278ba85f12c14c6d3218c67b6309e55c278a609e36910c6b34518cf24613c8b84f1cc11c6335d184fa3309ec9c278c6e37943e5f06404f06483739f499685f70f80afcafbacedafda9a86dfbfcaf9abe03357bb7275c4b6af021ffd36fcea88cfa24e57415bfa5c39fff49650278cd507eb14af1e38ae16c2734018cf64613c8dc278a60be399238c6791309e49c278b608e36910c6334d18cf2a613cb385f17408e359288ca75b18cf76613cbb84f1ac17c653278c27278ca75e184f93309e05c278d609e3d92f8c6799309e16613c3b85f1d40ae36915c69315c6b35218cf2c613cedc278e60be3e912c6b34d184f8f309ea5c2787a85f1ec11c6b34f18cf6a613c9b85f1d408e3992a8c67a6309e79c2785608e359228c67af309ebc309e4dc278aa85f12c17c6334518cf56613c3384f11484f1cc15c6d3298c67b1309e35c2787608e3d92d8c6783309eaa081e86ff7f19f2d0fd6bb46d5a3f202436c37e08ffefe7354c6dbad66dabd66d97f8295e0dd4b9ce5d18d8fb51f0b3c4e5df6f88f7ce5d0b1a5dcbd416da1f196fff30c72ee07d950130049e3e41040fc7fda84ced1c918709feffd9bcd5ea3a4f2b7fdfe5a0ce35a0df750cfa45e5f69f8e01f79a4666cb43e70e62cd42bd0d4218c977252f4f78dc6e08462ea58edbeb8087a30f636a67787c5defb5694384ee540773f57a8676461d3bb47e3dec87b4315b9e4dae4cac59a8b7490823f9aee5e5098faf4dc1c8a5d4f1753df070f43f4ced0c8faf1bbc366d8ad09dea60aedec0d0cea86387d66f80fd903666cbb3d99589350bf5360b6124df75bc3c1d5968332da58eaf1b8087a3ff616a67787cdde8b5697384ee540773f5468676461d3bb47e23ec076556e62866cb43bf3121d62cd4db2284917cd7b3f274e4b3d0665a4af56337020f473fcfa47bd88fdde4b5694b84ee540773f5268676461d3bb47e5344ece620592d6e1e85163747f0dc3cce5a50bc7299af4921b3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaab35d5467d55975569d9360569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e6396a0b3e5a167c4106b16ea6d15c248be1b7879c2df056d0d462e196fbd0fca3703cf8d0cfa30b533bc87fca0d7a6ad11ba531d3cbe0e32b433ead8a1f583b01f0e96c17c530a9955e7b1315b1e7a562cb166a1de36218ce4bb919727ecc7b605239752fdd841e0e1e8e799da19f663fd5e9bb645e84e75f0f8ea676867d4b143eb144f9995398ed9f2d0ffb021d62cd4db2e84917c37b3f214c2df376e0f462ea5fab17ee03998384fb11f63d03decc70e796dda1ea13bd5c15c3dc4d0cea86387d60fc17e2887f9a61432abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3ea5c393a5b1efadf21c49a857a3b843092ef202b4f7b38efb02318b964bcf53e281f029efec4798af30e0cba87f30e87bd36ed88d09deae0f17598a19d51c70ead1f86fd30d1996f4a21b3e6c6f8306b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7314bc80dcbb3d39589350bf5760a61245f3f2f4ff8dc839dc1c8a5d47d3b8781e710833e4ced0cefdb39e2b5696784ee54078faf230ced8c3a7668fd08ec076556e62866cbb3cb9589350bf576096124df215e9eb01fdb158c5c4af563478087a39f676a67d88f0d786dda15a13bd5c15c1d606867d4b143eb03b01f945999a3982dcf6e5726d62cd4db2d84917c877979c27e6c77307229d58f0d000f473fcfd4ceb01f3beab5697784ee540773f528433ba38e1d5a3f0afb419995398ad9f2ec716562cd42bd3d4218c9778497a7908536d352aa1f3b0a3c1cfd3c533bc37eec16af4d7b2274a73a98abb730b433ead8a1f55b603fa48dd9f2ec756562cd42bdbd4218c937c0cb131e5f7b83914ba9e3eb16e0e1e87f98da191e5fc7bc36ed8dd09dea60ae1e636867d4b143ebc7603fa48dd9f2ec736562cd42bd7d4218c9779497273cbef605239752c7d731e0e1e87f98da191e5fc7bd36ed8bd09dea60ae1e676867d4b143ebc7613fa48dd9f2ec776562cd42bdfd4218c987e78bfd4c3c398f2717a1c5448cdde0c56ea890d88d5eecc60a89ad79ae795e09b135cf35cf2b21b6e6b9e67925c4aed45c53cd2b53f3cc79d43c731e35cfa8e62235ff6372b13bb15fa98258c798da894b1f94717c8e9635c278160be3e914c63357184f4118cf0c613c5384f12c17c6532d8c272f8c6789309e15c278e609e399298c67aa309e1a613cab85f1f40ae3592a8ca747184f97309ef9c278da85f1cc12c6b352184f56184fab309e5a613c2dc2789609e359278c6781309e26613cf5c27872c2780e08e3a913c6b35e184fb7309e85c2783a84f1cc16c6b34a18cf34613c0dc2782609e359248c678e309ee9c2781a85f14c16c69311c0930dcefd3d0afe9ea01a7c747fff7ef03dcb950f80af2a22066de738f868fc94b661fb9b754de73254c1676e8de07a56443c8a736bc467c743778cd507eb14af1e386e15c23359184fa3309ee9c278e608e359248c6792309e06613cd384f1ac12c6335b184f87309e85c278ba85f1ac17c653278ce780309e9c309e7a613c4dc2781608e359278c6799309e16613cb5c2785a85f16485f1ac14c6334b184fbb309ef9c278ba84f1f408e3592a8ca75718cf6a613c35c278a60ae399298c679e309e15c2789608e3c90be3a916c6b35c18cf14613c3384f11484f1cc15c6d3298c67b1309e35c278aa22780e30f1c43d4fe18080d8763d0fbad8250bef8fc7ef000f788cb47e0c18919778f24c3c71cfa0c80b886ddb4fdf25680e2e0befe3efb8b8722aef31d27a544ee17d69ab9978e29edbb15a406cab058d5dd23d0059781f7fb7c09553ab3d465a8fcaa9465e9ef07f4bb404239752f71ae131c7b10f99da99c7e32fc16768443e8bbac5d30a9fa13a1ef7c9c7f507144f9995398ed9f2d0dc05b1e2f96c3c7ef7361ac6a8f32b034fd83fb606239752fde331e0e1387f30b533ecc74e786d6a8dd09dea60ae9e606867d4b143eb2722623707c96a7172145a9c8ce03939ce5a50bc72990fa4905982ce9667952b136b16eaad12c248be3c2f4fd83fae0a462ea5fac793c0c371fe606a67d8279cf2dab42a4277aa83c7d7298676461d3bb47e0af64339cc2752c8ac3a8f8dd9f2d01832b166a15e410823f98eb1f214f25968332da5fab153c0c3d1cf33e91ef663835e9b0a11ba531d3cbe0619da1975ecd0fa20ec076556666556666556666556666556666556666556666556666556666556666596cd6c79e8b78dc49a857aed4218c9779295a738efd01e8c5c4acd3b0c020fc7bc0c93eee1bcc369af4ded11ba531dccd5d30ced8c3a7668fd34ec076556666556666556666556666556666556666556666556666556666556666596cd6c79e899dbc49a857a1d4218c9778a9727fcdd564730722935ef701a7838e66598da19ce3bdce6b5a9234277aa83b97a1b433ba38e1d5abf0df683322b7314b3e5a1675b116b16ea750a6124df202b4f71feb43318b994eac76e031e8e7e9e49f7b01f3be3b5a9334277aa83b97a86a19d51c70ead9f81fd500ef3891432abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3ea5c393a5b1efa9f6bc49a857a5d4218c9779a95a73d9c77e80a462ea5e61dce000fc7bc0c93eee1bcc359af4d5d11ba531d3cbece32b433ead8a1f5b3b01f263af38914326b6e8c0fb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb384dcb03cddae4cac59a8d72d84917cb7f1f284cf3de80e462ea5eedb390b3c6718f4616a6778dfce90d7a6ee08dda90e1e5f430ced8c3a76687d08f683322b7314b3e559e3cac49a857a6b843092ef0c2f4f210b6da6a5543f36043c1cfd3c533bc37eec76af4d6b2274a73a98abb733b433ead8a1f5db613fa48dd9f2f4b832b166a15e8f1046f2e179b9878927e7f1e422b4385fb1ed7aaf2bd7bbd72cbcdf0b8c5cfd618fc748eb98e3c84b3cbd4c3c0d1e4f438416e72bb66dff3a579ee65eb3f0fe3a60e4caa95e8f91d6a372aa0178d631f1347a3c8d115a9cafd8568bf5ae3cddbd66e1fdf5c0c89553eb3c465a8fcaa946e059cfc413d727ad1f87d871c7d778c48ecb95f188ad9aabe6aab96acea979e63c6a9e398f9a675473519a335c4785e3bd142300065cfaa08cdf1538ae3d99da998ffa3eb6de6b137e1fc33187f3f57d439995398e9969dca223ebc5267d028f879621662dc673dcb4d76b531ac64d4b319f4821b3ea3c36661bfb8ee4637764bdd8a44fe0f1d07207b3164ced0cfb833b83688d295e0eea609edec9d0ce0cc4a56dd3fa9db01fca613e914266d5796ccc36f65d89c72e3e4f1e63933e81c743cb5dcc5af0b4b3d81fdc1d446b4cf1725007f3f46e867666202e6d9bd6ef86fda0cccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccb2996dec67271ebb387e8fb1499fc0e3a1e5d9cc5af0b4b3387e7f4f10ad31c5cb411ddce7f730b433037169dbb47e0fec076556666556666556666556666556666556666556666556666556666556666596cd6c633f27f9d8e1ef713036e913783cb43c87590ba67686e3f7f706d11a53bc1cd4c17d7e2f433b331097b64debf7c27e5066658e62b6b19f9b78ece27c1ec6267d028f8796e7326bc1d3ce627f705f10ad31c5cb411ddce7f731b433037169dbb47e1fec8772984fa4905975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de39855e7cad1d9c6be3ff1d8ede1f83dc6267d028f8796fb99b5e0696771fcfe81205a638a97833a98a70f30b433037169dbb44ef12a81f9440a993537c68759734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59426ed8d8cf4b3e76f87b768c4dfa041e0f2dcf63d682a99de1fd2f0f06d11a53bc1cd4c13c7d90a19d19884bdba6f507613f28b3324731dbd80f251fbb90f562933e81c743cb43cc5a30b533ec0f1e0ea235a67839a883fbfc61867666202e6d9bd61f86fd903666dc7f99e46287f76d528c2af76a7dcf77e56af0bdc0956bc0f74257ae05df8b5cb90e7c2f76e549e07b09b48d7c2f75e595e07b992baf07dfcb5d791df85ee1cabde07ba52bf780ef55ae3c04be57bbf2ede07b8d2bdf01bed7baf29de07b9d2bdf05bed7bbf2dde07b832b3f1b7c6f74e57bc0f726577e0ef8deeccaf782ef2daefc5cf0bdd595ef03dfdb5cf97ef0bddd951f00df3b5c7929f81e89f0bdd3959f07be77b9f283e07bb72b1f00df7b5c790af8deebca53c1f71750a6d7f7b9723df81e75e51cf8deefcad3c0f701576e00df075d793af83ee4ca8de0fbb02bcf00df475c7926f83eeacab3c0f731576e02dfc75d7936f83ee1ca73c0f749579e0bbe4fb9f23cf07dda95e783ef33aebc007c9f75e585e0fb9c2b2f02dfe75d7931f8bee0ca4bc0f74557c6fdfb97aefc10f8a85f79187cd4af3c1f7cd4afbc007cd4afbc107cd4afbc087cd4afbc187cd4afbc047c94772f051fe5ddcbc04779f772f051debd027c9477af041fe5ddabc04779f76af051debd067c9477af051fe5ddebc04779f77af051debd017c94776f041fe5dd9bc04779f766f051debd057c94776f051fe5dddbc04779f776f051debd037c94778f808ff2ee9de0a3bc7b17f89a5df9dde0bbc095df03be0b5df9bde0bbc895b19fb9d895df07be4b5cf951f0515ff87ef03dc3953f00be65aefc41f02d77e50f816f852b7f187c2b5df923e05be5ca1f055f8b2b7f0c7cadaefc71f0ad76e54f802fefca9f045f9b2b7f0a7c0557fe34f8da5df933e0eb70e5cf82afd3953f07be2e57fe3cf8ba5df90be05be3ca5f041f9dc7a99fb1c7b33d2e4907d2c8faa8cdad116d21df64684b5f90ec351dc5a26dd37a3b30d23e288c3f6361b48c6d1ea3e5e964d00cf38a9652df993a81a7838187a99de177a62eaf4ded5e9b7250e719d0ce2e867666202e6d9bd6bb2036c73e472d6add7697795ad4601d7742b3e7d3523ad2366cfe1622dad2c3dc16da36f54b3de310bbdb8b9df762637f4c4ba9e3ab1b98d73030dbedf626bfddf0f85aebb645394571f2d0a675a041526dc2d819671487fc35509edf345c97ea911e74fe22769bcbb42f91ddff5ca7f7b91cd4e989687f5f906cfb7b3d9e5e8fd9ee9386a6610e86e321cc811e8f83d6f3a05d6f8c763da01dd5c1f35f0b93766b3c1e5a6f011ebac6e9021f5d2b103f5e67b58e03b7dfef75457093af1b185b22180bc93386d73a2d1e23ad1780917c6b80a79b49337f5f2ff3f4c1f3729d57873e5b037556c3b9311b51d71e774b33c3eda2efe07f0c92edd3eb18f4c2f18100f4093c0d03d08bda59cbc03335181e23383b3478a6ff9681cb07fa8f6400adc6c3c4d74c4433aac087e5ea085f108c1c0ac121591a0ac121d92a4f161c82a1faf6ab946d160d370c9c3c3ef4cc5303a70e9fb9fbf4d0c091bd83b72075ad478fa4712d4052f4d13239181eb4e90b929d8ca9f362954a9ec9f03a09dea73af9a7b7b431b5333ce94df1da54e7b52907756ae1bd290cedcc405cda36ad4f89889d6047146a3175145a4c8de0993ace5ae0c037f9f048a5f771f2a4ca6b0b1ed1d8263fcf136d10055c0adbcf3838fb9e3dd86b5d632605c33b9b7a4f7b456b77821d31b5672d3b226a47406d17644738ed88a63da9d9114b3b42694724ed08a41d71b4238c7644d18e20da11433b42d81c144700ed889f1de1b3237a9700db5781d77eabb667483b226747e0ec889bbdb2b25700f66ac45e7ddb2b453bfa61af10ec374b3bca60cfb6f64ac69ea5ed99d55e29da2b447b456faf70ed2cd506631b9dd69b8c6d36b6c5d85663db8c6d37b6c3d84e63bb8ced36b6c7d85e63fb8ced3776a9b1cb82e2e8fae5c6ae3076a5b1671abbcad8d5c6ae3176adb1eb8c5d6fec0663371abbc9d8cdc60e1aeb3776c8d86163478c0d183b6aec1663c78c1d37f62c63b706c53b744e1a3b656cd0d86963b7193b63ec6c509c31b333647646ccce80d9192f3bc36567b4ec0c969db1b233547646cace40dd1f146798ec4c919d19b2b3027616c08efadb51fe1706c5517c3b6aff92a0382a6f47e1eda8bb1d65b7a3ea7614dd8e9adb51723b2a6e47c1eda8b71de5b6a3da7614db8e5adb516a3b2a6d47a1eda8b31d657e24288e22db51633b4a6c4785ed28b01df5b5a3bc8f06c5515c3b6a6b4769eda8ac1d85b5a3ae7694d58eaada51543b6a6a4749eda8a81d05b5a39e7694d38e6ada514c3b6a694729eda8e4978c3d66ecaf8cfdb5b1bf31f6b7c6feced8df1bfbb2b1af18fb0763ff68ec9f82625efeb3b17f31f63563ff6aecdf8c7dddd8bf1bfb86b16f1afb0f63df32f6b8b16f1bfb8eb1ef1afb9eb1ef1bfb81b11f1afb91b1ff34f663633f31f653633f33f67363bf30f64b63bf32f66b634f187bd2d86f8cfdd6d8ef8cfdded853c1f0ec0676227f702b34d2de3f343470f2f450f3d060f3c9db4f0c1d3f7de2eee63b8f0f1d6b1ebc63e0ccd1138377e287dfe7ba2d9a46d874e64cffddcdc74f1d19b8ab79f0f6a1e6c1a3cd87066f3f75e42c7ee8cbee430bcf8dd87fe4487cb06f553d0dd2ef8e31e82fdde768826657e9b63d3116419e1acb8766568fad4197bab30e7d7bbfa278b5db7cf6c4e05073bef994f9db7fc27c66e0486b33be77d6887c76a8f9ec50ff99a1e6a367064f36b7b5e276af9d328646d4348de143ad4da36f79f0ffd2fd24f2250a0400", + "bytecode": "0x1f8b08000000000000ffed9d77741cc791c6679118164b1024c11ca04433015c2c12012630674a9464e5409004455a24419150b22c4bb224e79cb3e5749673ce675db4efce77bef339c83947c9e9feb9e77b77eff95df76c97f1a139b3c64253600db6e6bde2f6147aa77efd4d75ef6cf7ec301314b73f18cbb872b5b18b827337fa7b9f7bcd3fb5ad2dc163e539393329e1ac4a0967754a386b52c2599b12ceba94704e4a09e7e494704e4990d3b2550523b7a479a732e89a346336659ad6a740d35cca349d96024d1b82748c51d353c2d99812ce1929e19c9912ce5929e16c4a09e7ec9470ce4909e7dc9470ce4b09e7fc94702e4809e7c294702e4a09e7e294702e490967734a382f4809e78529e1bc28259c17a784f39204395702e752f7fa34f7baccbd2e77af2bdc2bbd67957b6d716dac71fbadc6565b36636ddedf0ac6da8d7518ebf4fed665acdbd81a633dee6fcdee6fbdc6d61a5b676cbdb10dc6363a1d3619db6c6c8bb1adc6b619db6e6c87b19dc67619db6d6c8fb1bdc6f619db6fec526397193b60ec72635718bbd2d8d38d5d65ec6a63d718bbd663b9ced8f5c66e3076a3b19b8cdd6ceca0b17e63878c1d3676c4d880b1a3c66e3176ccd87163cf3076abb113c64e1a3b656cd0d86963b7193b63ecacb12163b71bbbc3d89dc6ee3276b7a7d9338ddd63ec59c6eef5389f6dec3e63f71b7bc0d8738c3d68ec21630f1b7baeb1e7197bbeb117187ba1b117197bb1b197187ba9b197197bb9b157187ba5b157197bb5b1d7187badb1d7197bbdb137187ba3b137197bb3b1b73816ea086f35f636638f187bbbb177187ba7b177197bb7b1bf32f61e638f1a7bafb1f7197bbfb10f18fba0b10f19fbb0b18f18fba8b18f19fbb8b14f18fba4b14f19fbb4b1cf18fbacb1cf19fbbcb1bf36f605638f19fb1b637f6becef8cfdbdb17f30f68fc6be68ec4bc6fec9d83f1bfb17635f36f6afc6fecdd8573ccdffddd87f18fbaab1ff74beafb9d7afbbba342ff60d63df74e5c7ddebb7dcebb7ddeb77bcf77cd7d8f73cdff78dfdc0f3fdd0d88f5cf9c7eef527eef5a7eef567eef5e7eef517eef597eef557eef5d7eef509f7faa47bfd8d7bfdad7bfd9d7bfdbd7bb56baa973515cb9383e1ad2f48688cea389ab76b2a24fed260e466b5a8767fa3d766e7af71fbf44adad5bafd5acf5fe7f6ebbce34c76fb933d7fa3db6ff4fc33ddfe4ccfdfe4f69b3cff1cb73fc7f35fecf62f067f36803957e7b7be6ae7ca808ff2b50a7cb5ce570dbe3a3a1cf826395f2df8e8fcd6816f8af34d02df54e79b0cbeacf34d212d8dd53b5f5f9054aee4fbed7173491fd7ad434d4b9ef7b03d6e0313eff4e47907ec711b19786d7ecc70c79a0e7933d3f91ac137cbf96680cf0d417fee73d637dbf966816f8ef335816faef3cd06df3ce79b03bef9ce37177c0b9c6f1ef8163adf7cf02d72be05e05bec7c0bc1b7c4f91681afd9f91683ef02e75b02be0b9daf197c748fcb05e0bbd8f92e04df25ce7711f868acbd187c746d7889f3d971627206dee3fc344685efa1f1197ccb686c06df721a97c1b782c664f0ad84d8e45b05e30af95a9c8fc628fbb75e57ee0b92ea1385b04fac4dfab8e6c8f6b8eb933f6eb86eb72118d6ba0fe2ac05ad36ba7282f706b561ec8c338a43fe1a28ef82ba548ff4a0cf1962b79f27eb5c796389f7f57aefcb419d7511edef0b926dff7a8f67bdc75c0bede7c9d9f682e6eca8b7b273f66aa8ebe71e5df34cc49cdd0b1c0c39dba5393beaadec9c1d80ba7eeed175ef44ccd9eb80832167fb7972b690d79c2dce91054174eed1779f8998b3c78023f99cedd49c1dfd5676ce3e0075fddca3efbf133167ef008ee473b6bb5faf0d46bd959db32f83ba7eeed15ccc44ccd9878083216707749c1df55676cebe05eafab947f3821331675f091cc9e76c0f53ceb66bce06c5f5ce2088ce3d9aa39e8839fb0870249fb387757e76f45bd939fb59a8ebe71ead974cc49cfd902bdb7586afb9758685e0fbbaf32d02dee473fb4807536e1734b78bf7810441748ed2dadd44ccedc75cd9e6f1e370ef01f9bee57c1780efdbce7721f8bee37c1741bb18fa40bff681516f65f781ef415d3f97691d7922f681af020743ce1ed69c1df55676ce3e0175fddca37b1a2662cefe1038187276407376d45bd939fb47a8ebe7de32579e88394bf795daeb851fbbeb8515e0fb89f3ad04df4f9d6f15f87ee67c2de0fbb9f3b582ef17ceb71a7cbf74be3cf87ee57c6de0fbb5f315c0f784f3b583ef49e7eb00df6f9caf137cbf75be2ef0fdcef9bac1f77be75b03be3f385f8ff3d9f52ebaf7eacbce67cf2d69d417247b6ee91e4b3a36edaf1a87d80d5eec86718cdde8c56e8c88ddc2103b0b3168cb78fb7d506ee1e5c9e78291bfffa058ab938fd56edbde1a8cbeedab8127cfd0f62cc4180d4f1e78da92e709eff52d247fdcf01cb77a9a6621562bb4ab9da15d198845c7a67d8a97031f8edfed118c1dc9331632108b8e4dfb1dc0483efc3ca1cf75ea3ff6f37069669897a12f85d744148f9efd451cabc14f757e3f6b986d8563ab87bfe3676b9be763cacb302f28161d9bf6295e3db4a76dfc190ba365cc7b8c5c63440662d1b1fdd8d8df5bc65fb3519dd71cf8cec3985418eb98540f6ce3719d1277aea5c4e6f8bcca400c1adb48f302f8a9ce6cf783043bb6ed807197a1ff15cabd7ec3f120f93c2ee4b15f8f86a71d7838fa3e537fcde3e7fe9f826473add3d3aacdd32a07753a40bf4e06fd4a5d87503c6556666556666556666556666556666556666556666556666556666556666596cf8cf75fe0fa26d55b2584917c05e0e198e70f9f1fe58e45c7b7eb3adf86759de4d72d0a795cb3a47b0c977b6dae813a4f6686eb7e1fd6d3fdb5415cd35cc5abdda8eeb3a80fce5d8be55c438c5b078e5abf6c4e2c76e130d77a9b7d868a7d0e59aba7ebaa084d19ee5319a169c6d314ef535ce9f1d83c9d573dccc6b1f657ee5a246a45e524d7f6f01e03def3521c3f2817aa8291e3077ece74251e7be41a26ad977779b16ba0ceff6486cf0ddd8b4affcfa17fcf93add3ed1d9bdeb31cfcdddeb11bdc7b89a3d63b7e2bbc97eafc1f8ca96fad0afeac19c7fd1f382e07d056dcfaa08cebe6c97f0e17d7f1dbcbe0e9041e8e7186e97a238f7d20e975fc6e4faba8eb18aad305fa7533e817752d4afb144f99955999955999955999955999955999955999955999955999955999955999e533e36f4589350bf50a4218c7e9de87703d839eff42c7b7eb3a2fae1a8ecbbd0e476b4e2bbc36d7409daf540dd77db92bd707e7deef10772e19d6f34a9e4b8a570fedc1b520aedf7377783c1d115a50b939b1d8c575fce4351e5ec76ff7742d4468cad55f718d1535c5fedae6f1e0da687d70eebd255938ce78dc3b149717140ffb5207f8a88cbf8fe638cff859e2dfd743f170fdfa51a76d43c075ee0b79ce71630db4a92f3837bf6ba0ce0761ecfbb02be33d1c78efc863117fa7add43a35e9c7f22cbb7c71dd772d70f6411c8cbd0e58138add86b133ce280ef96ba0fc85aae1ba548ff420ad89ddf6117a2618b2fbef6bf3de97833a3d11edef0b926d7fafc7d3eb31db73f231c8b3c7e0f39f6b4cea89d16839684475f03a88eb9e3c7f8cf4ef6fc4fbf6eabc3a78cd4275be046354dcfda351f71c727d8ec5dd7318756ddc098c7e1bfdfb3c2bfd3eadc761bc48fa3eadc72187f03eadc03bfe0a383e71d505f19f2d54e7bbdef1fd6b727a0fde0746757e00e34583bb67b13e38f7fa1bef991a8fef5771f749533cbcaec1befd97da6e99d740fdbe049931279005af13a8ceafbc73d61dc3bd3ae2bd4fc6bc97b46a7165fcfee2eb6775e881f7f425a243b1cff77a6da1bcee81b6509dfff2ae0193bf6e295e0326dfd691d724340e7444b495eafc37f4b53fc2351e9d27fcde51577deedf692b750d48fad9368ff7f38131b684e703d7560fd7f59ff34b5a97fb7ce02eef7d129f0ffcbf906775701f3ad758bd2e46a315a011d5c1df06d1e7083ecb37ea3386ebdefeb8cf98a86750e2f8dc503dfe6cfebc5ad43502d5a1f7e235c22cc7dce074f6ebfaf385f47999e47dc3f85b8956888bbf956865d2330fbaf5c13e5e179ccfd879a6d871cf9cce8f43ecb8674e8f47ec462f76e338c656cd5573499a333c1339fcfd193eb3d46ea5ae4b892107efab4a0163750a186b52c0589b02c6ba14304e4a01e3e414304e4901e3d414306681f17c7eb633e85318ab3e5ce7abd4b506c66e61d2a29cffbf83f9ff522979ed83b119bed3855ab404a3d702bfe7713cfba1dcffeb8518f0ff2e989102c69929609c9502c6a61430ce4e01e39c1430ce4d01e3bc1430ce4f01e38214302e4c01e3a214302e4e01e392143036a780f18214305e9802c68b52c078710a182f4901e352654c8471252f6361ac8c9687e3fffc7b2affe718034f3eea9e53a6df9e94fdffad313f9fb46daccf8dc37b4b78ff4fb8a7f66c3b8e7b47ca7db65da9ff6f9589b1305646aefbd8f1773ca3e1c1df4546fdb68681b1305646aedfbfe06ff446c3d3059a754668c6c058182b23d7bd72e5decb89f7f4774568c6c058182b23de579d204fa85977193c6b40b3ee08cd18180b6365e4ba2f390b3146c3d3039aad89d08c81b1305646a6dfb6859af594c183bf01eb89d08c81b1305646cbb39649b3de3278d68266bd119a4962449ea49f93dd1b118be33783e5b69d1890714a0a18a7a68011ef93e018bf4add27d1cbab4f61acfa709daf52f749606c86dfc7845ae0ef21fe9216eb79794ade2781b137306981bf57f94b5a6c001e8edfcf6421c66878882107ef9b9102c69929609c9502c6a61430ce4e01e39c1430ce4d01e3bc1430ce4f01e38214302e4c01e3a214302e4e01e3921430e27755866bc592df5f364cf0d871df55267aecb8ef25133db6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae792e29761ae6f89571e231224f73723c796c3bc6ea13d0f6be089e0c53db31d626016d2786b4316e4c01e3da1430aa8ec57b10c7c268793633f16c2a836733f06c61e2d95c06cf16e0d99a3c4f98535bcae021861cbc6f6d0a1837a6805175541dadd92dffd436d55110631a745446655446653c1f8c6918c3953115f958182ba3e5d9963c4fa8d9d63278b68166f4be365ec6c258192dcff6e47942cdb695c1b31d34db16a119036361ac8c966747f23ca166dbcbe0d9019a6d8fd08c81b1305646cbb333799e50b31d65f0ec04cd764468c6c058182ba3e5d9953c4fa8d9ce32787681663b233463602c8c95d1f2ec4e9e27d46c57193cbb41b35d119a313016c6ca6879f624cf136ab6bb0c9e3da0d9ee08cd18180b6365b43c7b93e70935db5306cf5ed06c4f84660c8c85b1325a9e7dc9f3849aed2d83671f68b6374233a98c6b53c0b831058ccc3a16c6ca6879f633f1ec2b83673ff05ccac4b3bf0c9e4b81e7b2e479c29cbab40c1e62c8c1fbd6a68071630a185547d55112a3ea58393a2aa3322a63798c7d2960d473ad8c521919be5f95fc0dcda5133c768317bba14262c7fd8666a2c7d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf25c53e907cec42b9cf9839003c1ccfbc616a67de1ef77277ac3f25a89fd5ea0a4fab4b3dad7250e772d0ef0a06fd3210978e4dfb14af5ce6a70960668a5d98668e3105da4f31367a7ad8f85732b53d6eacbf7282c78e1beb277aecb8b17ea2c7d63cd73caf84d89ae79ae795105bf35cf35c4a6c2cd706c3d7edf4fc537b8ca7bb728ddb4756f2539dcb26155f1b02ed431cb1b50fe9674525c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cfe5e539e643d538f0041e4f50826783309eddc2787608e359238c67b1309e4e613c7385f11484f1cc10c6b35518cf14613ccb85f1540be3d9248c272f8c67af309e25c2785608e399278c67a6309ea9c2786a84f16c16c6b35a18cf3e613c7b84f1f40ae3592a8ca74718cf36613c5dc278e60be36917c6334b18cf4a613c59613cadc2786a85f1ec14c6d3228c6799309efdc278d609e359208ca749184fbd309e9c309e3a613ceb85f1ec12c6b35d184fb7309e85c2783a84f1cc16c6b34a18cf34613c0dc278b608e399248c6791309e39c278a60be36914c6335918cf783c6fa81c9e8c009e6c70ee33c9b2f0f703e0abf2de6bc7abb6a6e1bf5fe5fc55f09eab5db93ae2d857818f7e1b7e75c47b51a7aba02d7dae9c7f6a5ba813c6ea837d8a570f1c570be139208c67b2309e46613cd385f1cc11c6b34818cf24613c5b84f13408e399268c6795309ed9c2783a84f12c14c6d32d8c67bb309e5dc278d60be3a913c69313c6532f8ca74918cf02613ceb84f1ec17c6b34c184f8b309e9dc2786a85f1b40ae3c90ae359298c6796309e76613cf385f17409e3d9268ca74718cf52613cbdc278f608e3d9278c67b5309ecdc2786a84f14c15c6335318cf3c613c2b84f12c11c6b357184f5e18cf26613cd5c278960be399228c67ab309e19c2780ac278e60ae3e914c6b35818cf1a613c3b84f1ec16c6b341184f55040fc3ff7f19f2d0fd6b746cda3f202436c37908ffdfcf6b98da74ad3b56ad3b2ef153bc1aa8739dbb30b0f7a3e07b89cbbfdf10ef9dbb1634ba96a92d743e32def9618e5dc0fb2a0360083c7d82081e8efb5199da39220f13fcff67f356abeb3cadfc7397833ad7807ed731e81795db7fee03ee358dcc96873e3b88350bf536086124df95bc3c61bfdd108cdc4af5dbeb8087630c636a67d8bfaef7dab4214277aa83b97a3d433ba3fa0eed5f0fe7216dcc9667932b136b16ea6d12c248be6b7979c2feb52918b995ea5fd7030fc7f8c3d4ceb07fdde0b5695384ee540773f506867646f51ddabf01ce43da982dcf665726d62cd4db2c84917cd7f1f27464a1cdb495ea5f37000fc7f8c3d4ceb07fdde8b5697384ee540773f546867646f51ddabf11ce83322b7314b3e5a1df98106b16ea6d11c248beeb59793af25968336da5c6b11b8187639c67d23d1cc76ef2dab4254277aa83b97a13433ba3fa0eeddf1411bb3948568b9b47a1c5cd113c378fb31614af5ce66b52c8ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea6c37d55975569d55e724985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de39825e86c79e81931c49a857a5b853092ef065e9ef077415b83915bc6dbef83f2cdc07323833e4ced0cef213fe8b5696b84ee5407fbd741867646f51dda3f08e7e16019cc37a59059751e1bb3e5a167c5126b16ea6d13c248be1b7979c2716c5b30722b358e1d041e8e719ea99de138d6efb5695b84ee5407fb573f433ba3fa0eed533c6556e63866cb43ff870db166a1de76218ce4bb9995a710febe717b30722b358ef503cfc1c4798ae31883eee13876c86bd3f608dda90ee6ea21867646f51dda3f04e7a11ce69b52c8ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaa73e5e86c79e8ff0e21d62cd4db2184917c075979dac375871dc1c82de3edf741f910f0f427ce535c7760d03d5c7738ecb5694784ee5407fbd761867646f51dda3f0ce761a233df944266cd8df161d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e6396901b9667a72b136b16eaed14c248be7e5e9ef0b9073b83915ba9fb760e03cf21067d98da19deb773c46bd3ce08dda90ef6af230ced8cea3bb47f04ce83322b7314b3e5d9e5cac49a857abb843092ef102f4f388eed0a466ea5c6b123c0c331ce33b5331cc706bc36ed8ad09dea60ae0e30b433aaefd0fe009c076556e62866cbb3db9589350bf5760b6124df615e9e701cdb1d8cdc4a8d6303c0c331ce33b5331cc78e7a6dda1da13bd5c15c3dcad0cea8be43fb47e13c28b33247315b9e3dae4cac59a8b7470823f98ef0f214b2d066da4a8d63478187639c676a67388edde2b5694f84ee540773f516867646f51ddabf05ce43da982dcf5e5726d62cd4db2b84917c03bc3c61ffda1b8cdc4af5af5b808763fc616a67d8bf8e796dda1ba13bd5c15c3dc6d0cea8be43fbc7e03ca48dd9f2ec736562cd42bd7d4218c977949727ec5ffb82915ba9fe750c7838c61fa67686fdebb8d7a67d11ba531dccd5e30ced8cea3bb47f1cce43da982dcf7e5726d62cd4db2f84917cf879b19f8927e7f1e422b49888b11bbcd80d1512bbd18bdd5821b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d8959a6baa79656a9e398f9a67cea3e619d55ca4e67f4a2e76278e2b5510eb18533b71eb8332cecfd1b64618cf62613c9dc278e60ae32908e399218c678a309ee5c278aa85f1e485f12c11c6b34218cf3c613c3385f14c15c653238c67b5309e5e613c4b85f1f408e3e912c6335f184fbb309e59c278560ae3c90ae36915c6532b8ca74518cf32613ceb84f12c10c6d3248ca75e184f4e18cf01613c75c278d60be3e916c6b350184f87309ed9c2785609e399268ca74118cf24613c8b84f1cc11c6335d184fa3309ec9c278320278b2c1b9bf47c1df1354838feeefdf0fbe67b8f201f05545c4a0e31c071fcd9fd231ec78b3aee95c862a78cfad115ccf888847716e8d78ef78e88eb1fa609fe2d503c7ad4278260be36914c6335d18cf1c613c8b84f14c12c6d3208c679a309e55c278660be3e910c6b350184fb7309ef5c278ea84f11c10c69313c6532f8ca74918cf02613ceb84f12c13c6d3228ca756184fab309eac309e95c2786609e36917c6335f184f97309e1e613c4b85f1f40ae3592d8ca74618cf54613c3385f1cc13c6b34218cf12613c79613cd5c278960be399228c6786309e82309eb9c2783a85f12c16c6b346184f5504cf01269eb8e7291c1010dbeee74117bb65e1efe3f13bc0031e23ed1f0346e4259e3c134fdc3328f20262dbf6d377095a83cbc2dff1775c5c3995f718693f2aa7f0beb4d54c3c71cfed582d20b6d582e62ee91e802cfc1d7fb7c09553ab3d46da8fcaa9465e9ef0ff966809466ea5ee35c23ec7710e99da99c7fe97e03334229f45dde26985cf501d8ffbe4e3c6038aa7ccca1cc76c7968ed8258f1f36c3c7ef7361ac6a8cf57069e707c6c0d466ea5c6c763c0c3f1f9c1d4ce701c3be1b5a9354277aa83b97a82a19d517d87f64f44c46e0e92d5e2e428b43819c173729cb5a078e5321f4821b3049d2dcf2a5726d62cd45b2584917c795e9e707c5c158cdc4a8d8f278187e3f383a99de19870ca6bd3aa08dda90ef6af530ced8cea3bb47f0ace4339cc2752c8ac3a8f8dd9f2d01c32b166a15e410823f98eb1f214f25968336da5c6b153c0c331ce33e91e8e63835e9b0a11ba531dec5f830ced8cea3bb43f08e7419995599995599995599995599995599995599995599995599995599995599965335b1efa6d23b166a15ebb1046f29d64e529ae3bb40723b752eb0e83c0c3b12ec3a47bb8ee70da6b537b84ee540773f534433ba3fa0eed9f86f3a0cccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccb2992d0f3d739b58b350af430823f94ef1f284bfdbea08466ea5d61d4e030fc7ba0c533bc37587dbbc367544e84e7530576f63686754dfa1fddbe03c28b33247315b1e7ab615b166a15ea71046f20db2f214d74f3b83915ba971ec36e0e118e799740fc7b1335e9b3a2374a73a98ab6718da19d57768ff0c9c8772984fa4905975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de39855e7cad1d9f2d0ffb946ac59a8d72584917ca75979dac37587ae60e4566adde10cf070accb30e91eae3b9cf5dad415a13bd5c1fe7596a19d517d87f6cfc27998e8cc2752c8acb9313ecc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc1272c3f274bb32b166a15eb71046f2ddc6cb133ef7a03b18b995ba6fe72cf09c61d087a99de17d3b435e9bba2374a73ad8bf8618da19d577687f08ce83322b7314b3e559e3cac49a857a6b843092ef0c2f4f210b6da6add43836043c1ce33c533bc371ec76af4d6b2274a73a98abb733b433aaefd0feed701ed2c66c797a5c9958b350af470823f9f073b9878927e7f1e422b4385fb1ed7eaf2bd7bbd72cfcbd1718b9c6c31e8f91f631c79197787a99781a3c9e86082dce576cdbfe75ae3ccdbd66e1efeb80912ba77a3d46da8fcaa906e059c7c4d3e8f134466871be625b2dd6bbf274f79a85bfaf0746ae9c5ae731d27e544e3502cf7a269eb83169fd38c48eeb5fe3113b2e57c623b66aae9aabe6aa39a7e699f3a879e63c6a9e51cd4569ce701d15cef7528c001870eb83327e57e0b8f6646a673eeafbd87aaf4df87d0ce71cced7f70d6556e63866a6798b8eac179bf4093c1eda8698b518cf79d35eaf4d6998372dc57c2285ccaaf3d8986dec3b928fdd91f562933e81c743db1dcc5a30b5331c0fee0ca235a67839a883797a27433b3310978e4dfb77c2792887f9440a9955e7b131dbd877251ebbf83c798c4dfa041e0f6d77316bc1d3cee278707710ad31c5cb411dccd3bb19da9981b8746cdabf1bce83322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb66b6b19f9978ece2fc3dc6267d028f87b667326bc1d3cee2fcfd3d41b4c6142f0775f09cdfc3d0ce0cc4a563d3fe3d701e945999955999955999955999955999955999955999955999955999955999955936b38dfdace46387bfc7c1d8a44fe0f1d0f62c662d98da19cedfdf1b446b4cf1725007cff9bd0cedcc405c3a36eddf0be7419995398ad9c67e76e2b18beb79189bf4093c1eda9ecdac054f3b8be3c17d41b4c6142f0775f09cdfc7d0ce0cc4a563d3fe7d701eca613e914266d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d2b47671bfbfec463b787f3f7189bf4093c1edaee67d682a79dc5f9fb0782688d295e0eea609e3ec0d0ce0cc4a563d33ec5ab04e6132964d6dc181f66cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e6386609b961633f27f9d8e1efd93136e913783cb43d87590ba67686f7bf3c18446b4cf1725007f3f441867666202e1d9bf61f84f3a0ccca1cc56c633f947cec42d68b4dfa041e0f6d0f316bc1d4ce703c783888d698e2e5a00e9ef38719da9981b8746cda7f18ce43da98f1fc65928b1ddeb74931aadcabf53dd795abc1f73c57ae01dff35db9167c2f70e53af0bdd0952781ef45d036f2bdd8955782ef25aebc1e7c2f75e575e07b992bf782efe5aedc03be57b8f210f85ee9cab783ef55ae7c07f85eedca7782ef35ae7c17f85eebca7783ef75aefc4cf0bdde95ef01df1b5cf959e07ba32bdf0bbe37b9f2b3c1f76657be0f7c6f71e5fbc1f756577e007c6f73e5a5e07b24c2f776577e0ef8dee1ca0f82ef9dae7c007cef72e529e07bb72b4f05df5f41995edfe3caf5e07bd49573e07baf2b4f03dffb5cb9017cef77e5e9e0fb802b3782ef83ae3c037c1f72e599e0fbb02bcf02df475cb9097c1f75e5d9e0fb982bcf01dfc75d792ef83ee1caf3c0f749579e0fbe4fb9f202f07dda951782ef33aebc087c9f75e5c5e0fb9c2b2f01dfe75d19cfef5fbbf243e0a371e561f0d1b8f25cf0d1b8f23cf0d1b8f27cf0d1b8f202f0d1b8f242f0d1b8f222f051debd187c94772f011fe5dd4bc14779f732f051debd1c7c9477af001fe5dd2bc14779f72af051debd1a7c9477af011fe5dd6bc14779f73af051debd1e7c94776f001fe5dd1bc14779f726f051debd197c94776f011fe5dd5bc14779f736f051de3d023ecabbb7838ff2ee1de06b76e57782ef02577e17f82e74e57783ef2257c671e662577e0ff82e71e547c14763e17bc1f734577e1ff896b9f2fbc1b7dc953f00be15aefc41f0ad74e50f816f952b7f187c2daefc11f0b5baf247c1b7da953f06bebc2b7f1c7c6daefc09f0155cf993e06b77e54f81afc3953f0dbe4e57fe0cf8ba5cf9b3e0eb76e5cf816f8d2b7f1e7cf4394ee38cedcfb65f920ea491f5519b5b23da42bec9d096be20d96b3a8a45c7a6fd7660a47350187fc6c26819db3c46cbd3c9a019e6156da5be3375024f07030f533bc3ef4c5d5e9bdabd36e5a0ced3a09d5d0cedcc405c3a36ed77416c8e738e5ad4bae32ef3b4a8c13aee03cd7e9e96d2918e61f3b710d1961ee6b6d0b1695cea1987d8dd5eecbc171bc763da4af5af6e605ec3c06c8fdb9bfc71c3feb5d61d8b728ae2e4a14deb4083a4da84b133ce280ef96ba03cbf69b82ed5233de8f38bd86d2ed3b94476ff7d9ddefb7250a727a2fd7d41b2edeff5787a3d667b4e1a9a863918fa4398033d1e07ede741bbde18ed7a403baa839f7f2d4cdaadf17868bf0578e81aa70b7c74ad40fc789dd53a0edcfeb8d715c14dbe6e606c89602c24cf185eebb4788cb45f0046f2ad019e6e26cdfc73bdccd3073f97ebbc3af4de1aa8b31a3e1bb311756dbf5b9a196e177d07ff5390ec985ec7a017ce0f04a04fe06918805ed4ce5a069ea9c1f01cc1d9a1c133fdb70c5c3ed07f240368351e26be66229a51053e2c5747f88260e454084ec9d254084ec95679b2e0140cd5b75fa56cb368ba61e0e4f1a1a79f1a3875f8ccdda787068eec1dbc05a96b3d7a248d6b0192a28fb6c9c1f0a44d5f90ec624c9d17ab54f24c86d749c9f3b431b533fcd09be2b5a9ce6b530eead4c2dfa630b4330371e9d8b43f252276820351a8c5d4516831358267ea386b8113dfe4c39e4a7fc7c5932aaf2dd8a3b14d7e9e27da200ab8148e9f7170f66fb6b3d7bac64c0a864f368d9ef68ad69e043b636a3fb5ec8ca89d01b543909de1b4339af643cdce58da194a3b23696720ed8ca39d61b4338a7606d1ce18da19c2e6a038036867fcec0c9f9dd1bb04d8be0cbcf65bb5fd84b433727606ceceb8d92b2b7b0560af46ecd5b7bd52b4b31ff60ac17eb3b4b30cf6d3d65ec9d84f69fbc96aaf14ed15a2bda2b757b876956a83b18d4eeb4dc6361bdb626cabb16dc6b61bdb616ca7b15dc6761bdb636cafb17dc6f61bbbd4d865417176fd72635718bbd2d8d38d5d65ec6a63d718bbd6d875c6ae377683b11b8ddd64ec6663078df51b3b64ecb0b123c6068c1d35768bb163c68e1b7b86b15b83e21d3a278d9d323668ecb4b1db8c9d31763628ae98d91532bb226657c0ec8a975de1b22b5a7605cbae58d9152abb226557a0ee0f8a2b4c76a5c8ae0cd95501bb0a6067fded2cfff383e22cbe9db57f51509c95b7b3f076d6ddceb2db59753b8b6e67cded2cb99d15b7b3e076d6dbce72db596d3b8b6d67aded2cb59d95b6b3d076d6d9ce323f12146791edacb19d25b6b3c27616d8cefada59de4783e22cae9db5b5b3b47656d6cec2da59573bcb6a6755ed2caa9d35b5b3a47656d4ce82da594f3bcb696735ed2ca69db5b4b3947656f20bc61e33f637c6fed6d8df19fb7b63ff60ec1f8d7dd1d8978cfd93b17f36f62f41312fffd5d8bf19fb8ab17f37f61fc6be6aec3f8d7dcdd8d78d7dc3d8378d3d6eec5bc6be6dec3bc6be6bec7bc6be6fec07c67e68ec47c67e6cec27c67e6aec67c67e6eec17c67e69ec57c67e6dec09634f1afb8db1df1afb9db1df1bfb4330bcba8183c81fdd0ecdb4f70f0d0d9c3c3dd43c34d87cf2f61343c74f9fb8bbf9cee343c79a07ef183873f4c4e09df8e6f7b8618b9611369d39d37f77f3f1534706ee6a1ebc7da879f068f3a1c1db4f1d398b6ffaa27bd3c27323f61f39121fec9b554f81f43b630cfa4bf73e5aa0d955ba6d4f8c45903f8ce54d33abc7d6a04bdda70e7d7bbfa278b5db7cf6c4e05073bef994f9b7ff8479cfc091d666fcdb5923f2d9a1e6b343fd67869a8f9e193cd9dcd68ac7bd76ca181a51d3348637b5368dbee5c1ff03d8e2fb122d0a0400", "isInternal": false } ], - "packedBytecode": "0x000000028df71de500000047d81f8b08000000000000ffed9d779c14c5baf77b6141647645ccd9c5848ae232647681c19c30a38888b02c2b28b0443163961ccc19094ace02028a80184ecec993f4783ce9de7bcef9dc3fee7bef1b7c6fd74c3d777f5b542f3b6bd7f09b9deacfa776aa9fadeee75bbf7eba3a5577fd330882a22033b50cd319c1fe93fc3fa57fcbbfd9d425c67595bbe42cca13ce1679c2d9324f388bf384b3559e70b6ce13ce43f284b34d9e701e1a23a7626b11d49fe2e66deb40d7b8191379a669491e685a9a679a1e96079ab60bf2a38d3a3c4f38dbe709e71179c279649e701e95279c47e709e73179c2796c9e701e97279cc7e709e70979c279629e709e94279c27e709e72979c2796a9e7096e50967873ce13c2d4f384fcf13ce33f284f3cc3ce13c2b46ce4ec0d951ff9ead7fcfd1bfe7ea5f297b9efe3d5fff76d6752cd6f31728ae30a9873449e37f5dc3d42d4cddc3d4c3f85fcf30f50a53ef30f5d1ff2bd3ffab08536598fa86a95f98fa6b0d0684e9c2305d14a68bc37449982e0dd36561ba3c4c5784e9ca305d15a6abc334304cd784e9da305d17a6ebc37443986e0cd34d611a14a69bc3744b980687e9d6300d31586e0bd3d030dd1ea66161ba234cc3c334224c55611a19a6ea308d0a534d98ee0cd3e8308d09d35d61ba3b4c63c3342e4ce3c3541ba609619a18a649619a1ca629619a1aa67bc2342d4cf786e9be30dd6f68f640981e0cd343617ad8e09c1ea647c2f468981e0bd3e3617a224c4f86e9a9303d1da619619a19a659619a1da639619a1ba679619a1fa605615a18a667c2f46c989e0bd3f3617a214c2f86e9a530bd1ca657c2f46a985e0bd3eb617a43b3c88eb0284c6f8669719896846969989685e9ad30bd1da6e5615a11a695615a15a6d5615a13a6b5615a17a6f561da10a68d61da14a6cd617a274c5bc2b4354cdbc2f46e98b6876947987686e9bd30bd1fa65d61fa204cbbc3b4274c7bc3f46198f685e9a3307d1ca64fc2f46998be15a66f87e93b61fa6e98be17a6ef1b9aff204c3f0cd38fc2f4636dfb89fefda92e2bf7ef7e16a69febfc2ff4ef2ff5efaff4ef67c632bf0ed36f0cdb6fc3f43bc3f6fb307daef35fe8df3fe8df2ff5ef1ff5ef57faf74ffaf7cffaf72ffaf7affaf76ffaf75ff4efbfeadf7fd3bf7fd7bfffd0bfff0cd3e60e997c9ba06e4a0531b551dd6ad2cf7e44fc8e41fd4969d152ff4f7ecbb4bd58cfcbaf68d74acfb732ecadf57c6b633d6df47c1bc3de5ecfb737ec47eaf9230dfbd17afe68c37eac9e3fd6b09fa1e7cf007b22807bc3daae6c2db5a9086c12af2dc0d64adb5a82adb5ac0e6c87685b2bb0c9f66d0db643b5ed10b0b5d5b636604b68dba1a265984ab42d15c4152be523d47a4be35eaf7e5e7658fcbc23d57adb39e23d3c7ede516abded1df0aaf83842afeb70889b23b5ad3dd88ed2b623c076b4b61d09b663b4ed28b01dab6d4783ed386d3b066cc76bdbb1603b41db8e03db89da763cd84ed2b613c076b2b69d08b653b4ed24b09daa6d2783ad4cdb4e019b6e728353c1769ab69581ed746deb00b633b4ed34b09da96da783ed2c6d3b036cd2fe9e0936395f3c4bdb54db7168112ca3edd26ea59791361b6ce7487b0db673a5ad065b2769a7c1761ef816dbf9d0d688adb3b649bba5fed747e753415cfb49b246adb722eef5866b56ebed1bff7ad3cf1cfb05755aa7c04f0568d55fe763ecd7d4057d17e9247ec45e0cf92ba1ac94133de4d823ecea1853a9f3fd1b58ae8fb15c2994a9b4d43f15c45bffbe064f5f83b915e4ddc46cd7ae3e661b3d651db383a1ac197b721ed41c637620703888d99e3e661b3d651db33550d68c3d39176e8e317b1b703888d92a37319b2cf7319bb96f1604f6d893eba1e618b3638023fe98edee63b6f153d631fb189435634fae899b63cc4e038ef863b667953f3768f49475cc2e80b266ecc9fd99e618b34f02878398adf1ed6ca3a7ac63f60d286bc69edc2b6c8e31fb2c70c41fb3bd1dc56c571fb341e6196810d8634fee5b37c7985d0c1cf1c7ec487f7fb6f153d631bb03ca9ab127cf509a63ccaed779f59ce127fa39c34960fba9b69d0cbcf1c776757747b19df4b19de91b1204f61895e779cd31b63fd07915c7bf80fe0862fba5b67500dbafb4ed34b07da66da743bd1cec03557e1f68f494f53ef01b286bc6b23c5b6e8efbc08f80c341cc56fb986df49475ccfe0dca9ab127fd1c9a63ccfe1e381cc46c8d8fd9464f59c7ec7f425933f6ced6f9e618b3d2d7549d2f7ca1cf17ce05db1fb4ad13d8bed4b6f3c0f6476d3b1f6c5f695b67b0fd49db2e00db9fb5ad1c6c7fd1b62e60fbabb625c1f6376deb0ab67fd1b66e60fb576deb0eb67fd3b61e60fbbbb6f504db3fb4ad17d8fea96dbdb54d3def92be5772deda06f85341bcdb56fa5dcaba65be4b0e7cb7337cb7cba1eff686eff616df4907be13e043a622633e05f9a45b9ef252e0415fdde2f7d555d5bd6bd0f8ba77039eee0eea9e001f8de1e90e3c3de2e749f7ffed19ff7ad3dbb8aba169027c75857af57250af22f025eb9679f1570a366c5b7b59187bc7cf982c025fb26e99ef0d8c62c3b65edeb992fd471d0f3b16d5f13ad897d2e744e24fbe5b261cddc02e65aee850c7d649b395c0fff1b8d7c3b0398acb745c882f59b7cc8bbf12a84f8fdc33261bcbd8dd6074d54614812f59b7f75db71d248fc77107d73ad6364d7c57e4c0776fc37737c337b69d3235746ceb0dccb15f73ea635b65fceb2dc7eb13b936143f78fe80d77071d5097dcbb5a1f8117b31e4af29aa2b2be5440f6987855dc5b26c4b643797eb652c570a652a2cf54f05f1d6bfd2e0a93498d536b9088e850ef687740c54181c32df0db4ab8cd0ae02b49332678376aedab33e068fccf7001e69c77a028fab6ba2289e5c5c8f1dc8379ec3e2f5b3fc1fcf035c6daf2e06a3ccdbb6576f60b49dab38b89e69f05ca53b308aad0ff07475a459d476ed4ae2db41aca4db23f121e7e6b2fff600bb94e9ad5fa8536de55dd056ba88118c47991a7bcd1bff764aa6afc1bb67c183dbcec175551747f1588ef76fbe0ee28d35b35dea6e6815758fc7555bded5e09179f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f199f2761bf2d29d78384d1ecffe6ea3e7ffafb877a5db27ef55ce7ff38ed0f962cc7fe31d20fe25ca3cec550a6b4455dd9ff0ffdc1cce754d847b2875bedd2db12fb63a6605efc615f2bdc960cfd9dca62f39d1ce9ea799bfa0698fa8ea6d9f7b387455317fd9f51d3224353ec8f7f9ec1a3e2b4b2651d9b8b677fd93e8b44ad241fe7b3bdd2c01eebf16f9764bd67d62d82faed071e675cf5df91b65a9e975718be8ba1cc892deab68df4ad923186bb1acb61bf1f59b72c732ed82b8d75b7d3cb0a472b63fd3d615929730ab4a97b5ad469e6a0ad4c66db771d9f9bc77f1cce3cc7ef9a054f17e071d1ce383adf28c77d20eee7f866ff34db798c94c1be7d0efa5536d8df49fc7966cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367e667563ce6b3567cbfb61b09638efa3ea49f67c8b7ca64fde9ef05b7a8f3ebfa399c3c73ea64d419df1dfd678bbab29b75be24d8bfbf43d4b674f57d8aa86d29fef0db33f82cc8c573dd22f025eb4e5ab4907c596cbe33cff15d8c0d21cff1bb1aba76b368ea6a7fc567aca829eeafdd0d1e7c361af56d9fa46173d977282a2ec41fee4b49b0491edf8f76b19df15862f6eb117ff8fcfa3b5adb7681ab6d9f2c77d96ee0775352c1fef18ddf53f921b47d3fd679ecc3817d47beb0fc5fa6869e538b7eaace0ebeaf595e04eb92ed6bfbb6e700608dc977175c57914e030c0d8a21ff798bbab2524eca8ad6c2aef611f9060cb29bcb7537962b8532fd2cf54f05f1d6dffcd66a7f83596d939f419c7d01c77f576d52bf088dce058da48ce36f365afb579afd0ab11d6d6d949165f15b747f85362aaaffa8ed18e0fa3826ebb61dc7cce34263fa79167a3fadff82f622ee7e5aff053184fdb40263fd9d60fdc2d53a883eb64899ff67acdf3c279765b01fd8ffec27f03d97a4ce67734e7eb0aeaf6ce7e4b85c54dd15337e072d152333c604b2e079829469abb5966d5619c1dddbb26c69c4b2a295f9adb092607ffddc7c672db3cff737ea22718ddf20973247425ddc9cb764ce015d7d532e057552f9a4a5ae52e638d8d74ed0f9046c27dc6fcfb1fc5fa686ce01710cf70be3af737afb5e049c29f083be2f06d6987c7741df720e287ec45e0cf9b35bd6959572a287682dec6a1f91f328643797ab30962b8532032cf54f05f1d6ff4283e74283596d939321cece817ee8aedaea01111a75028da40cde53b47d07d476afc3d5fb1b51e752f8fe92797e85c74937e74df6f358f3be9aed1ca193c18fe7083da19d4d58ca9af70be5781967bf617c57a227f8c577255c7dbbb90fe89682793c2f3898be5d7cc756f98b1a33a14f0e7c478d99900bdfed0ddfed73e8db6bee3567d2dcc11804e9f7cff09ba56a6ae8bc14c72590e55a00a38bb11c1241fd6f8f1f8811c77790e55a02a38be343b6df3eef098cb25c3130ba78b714c7df680c237e63188ff3c2e8e05bb15d9afaad58bca7d71a1899ded9c467538700a38bf3e2a6beab87e7f36de0d7d5b8445db3604c02a32c772830bab8378ed7328d61c4eb2259ae2d30ba788695edf84ef8ed79bcb7ec92b1a163bbe3be28c96cefbd54bae569f05c037d3b18d730ad05de673c90167dddf23478ee83be1ddcf74b6b81e30c1e480b7c36e862dcc34450ff39dc8178f0f9a52c770430a61c31f6cf8231058cff73af18180738624c65c1380018c57e14303ab8ff9a661c900523dea794e58e06c68b1c315e9805e345c028cb1d038c2eeea526c06f63182f064659ee5860bcc411e3c559305e028cb2dc71c078a923c64bb260bc141865b9e381f132478c9766c1781930ca722700e3e58e182fcb82f1726094e54e04c62b1c315e9e05e315c028cb9d048c573a62bc220bc62b8151963b1918af72c47865168c5701a32c770a305eed88f1aa2c18af064659ee54601ce888f1ea2c180702a32c57068cd738621c9805e335c028cb7500c66b1d315e9305e3b5c028cb9d068cd73962bc360bc6eb8051963b1d18af77c4785d168cd703a32c770630dee088f1fa2c186f004659ee4c60bcd111e30d5930de088cb2dc59c0789323c61bb360bc09186fb4300e72c47853168c838051963b0f186f8e9f317d2d3d280bc69b81e796f879d29add9c05cf2d6e79d2dfd5bbd9e2ebd6f87da5b7c5e0a0f175bf157886c4cf93de16b766c1230ca5b01c6a765bfc8c69cd8664c1781bf00c8d9f27add96d59f00c05cd6eb368767bfc8c69cd8666c1783bf00c8b9f27add9ed59f00c03cd6eb7687647fc8c69cd8665c17807f00c8f9f27add91d59f00c0fea34bbc3a2d988f819d39a0dcf827104f054c5cf93d66c44163c55a0d9088b6623e3674c6b569505e348e0a98e9f27add9c82c78aa41b39116cd46c5cf98d6ac3a0bc651c053133f4f5ab35159f0d48066a32c9add193f635ab39a2c18ef049ed1f1f3a435bb330b9ed1a0d99d16cdc6c4cf98d66c74168c6380e7aef879d29a8dc982e72ed06c8c45b3bb1d31de9505e3dd169eb8bf937d97c5d73847751f1b34beeec2500acb613f89f18e18c765c1381e186539ec2751eb88717c168cb5c028cb251c3336d44fa2167c4f88df77ba5daa0d1aafcf04b73c0df69340df131d69312168bc1613ddf234d84f027d4f72a4c5c4a0f15a4c029ec90eb448808fc6f00843292c87fd24a638629c9c05e3146094e5b09fc454478c53b2609c0a8cb21cf693b8c711e3d42c18ef0146590efb494c73c4784f168cd3805196c37e12f73a629c9605e3bdc028cb613f89fb1c31de9b05e37dc028cb613f89fb1d31de9705e3fdc028cb613f89071c31de9f05e303c028cb613f89071d313e9005e383c028cb613f89871c313e9805e343c028cb613f89871d313e9405e3c3c028cb613f89e98e181fce82713a30ca72d84fe211478cd3b3607c04186539ec27f1a823c647b2607c141865b9bb1d333674fdf26833f71d75add2dc7d475d973477df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f771cee4fb3107be13e043a622633e0579612885e5eef68ccd9a1179cae2e329c7baa3afc709eafeb885a7c851ddd1d713047517867c637c2c0f18711ff73a369dd1b18ec9a6322a9e271df13c9105cf93c0f394239e27b3e0790a789e8e9f271d534f65c1230ca5b0dcdd79c0f8581e307a1dbd8e4c8c5ec7c2d1d1337a46cfe8190f06633eb4e19e312fe231d95446c533237e9eb4664f67c133033493e56e71cb986c2aa3e299193f4f5ab31959f0cc04cd66583473c0986c2aa3e299153f4f5ab39959f0cc02cd665a3473c0986c2aa3e2991d3f4f5ab35959f0cc06cd66593473c0986c2aa3e299133f4f5ab3d959f0cc01cd665b3473c0986c2aa3e2991b3f4f5ab33959f0cc05cde6583473c0986c2aa3e299173f4f5ab3b959f0cc03cde65a3473c0986c2aa3e2991f3f4f5ab37959f0cc07cde6593473c0986c2aa3e259103f4f5ab3f959f02c00cde65b346365bc3b0f181fcb0346c73a269bcaa878163ae2599005cf42e079c611cfc22c789e019e67e3e749c7d43359f00843292c77771e303e96078c5e47af2313a3d7b17074f48c9ed13366c7f8781e30fa6ded1959191d5c5f35f80ecd33cddc77d43b34cddd77d43b34cdddb78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c33f97e2e7edfc96cbf31f31cf0b8f8e68da37a96abf53eafd7f5758cfa29ad5e30b47ac6d0aa14ca3c0ffabde040bf22f02beb9679f1972d7347026647be938785eb3814ea2f3e1e33f450fe5f7454f7a8b6fec566ee3baaad6feebea3dafae6eedbc7b98ff342f0ede3dcc77921f8f671eee39cc537e65b0575e7edf2fd53b58e9774be58cf4bf9c7c12e65261f92f96d17f87dc8856fbf0ff9634521f8f671eee3bc107cfb38f7715e08be7d9cfb382f04df3ece7d9c17826f1fe73ece0bc1b78f731fe785e0dbc7395f9c633c54e6802730788206781690f14c25e3994dc6339a8c672819cfb5643c1791f13c48c6d38d8c670219cf48329e9bc978ae24e3b9808ca71f19cf34329ede643c73c878ee22e3798a8c671819cff5643c9790f13c4cc69324e39944c6338a8ce756329eabc97852643cf791f1f424e339878c671c19cf5c329eb3c9788693f13c4dc6732319cf61643cedc8782e23e379828ce77c329e0a329e47c878e693f14c21e3b9938ce736329e72329e6bc8783a93f15c48c6f300194f77329e79643cb5643c33c878aac8780691f19c4bc67305194f4b329ebe643c0bc978ee21e3e943c633868ca71319cfed643cd791f15c4cc6f310194f57329e89643c33c978aac9780693f15c45c6d39f8ce75e329e5e643c63c9783a92f1dc41c67303194f2ebe679a0d4f09194f2919cfa5643c8f92f14c27e3e942c633998c6716194f0d19cf10329e81643c03c878ee27e3e941c6339e8c670419cf4d643c4f92f11c4ec6d39e8ce772329e22029e44b0ff182609f8ff73606b612cab3efb3aa743ddff5fd6f616b0cc2b3adfd2b2ee97c126df927dc5b22ceaf432d425a5f3e5df6c4aeb84be52302ffe4a80e315129ecbc978da93f11c4ec6f32419cf4d643c23c878c693f1f420e3b99f8c670019cf40329e21643c35643cb3c8782693f17421e3994ec6f32819cfa5643ca5643c25643ccf91f1dc40c67307194f47329eb1643cbdc878ee25e3e94fc6731519cf60329e6a329e99643c13c978ba92f13c44c6733119cf75643cb793f17422e31943c6d3878ce71e329e85643c7dc9785a92f15c41c6732e19cf20329e2a329e19643cb5643cf3c878ba93f13c40c67321194f67329e6bc878cac9786e23e3b9938c670a19cf7c329e47c8782ac878ce27e379828ce732329e76643c8791f1dc48c6f33419cf70329eb3c978e692f18c23e339878ca72719cf7d643c29329eabc9786e25e31945c633898c2749c6f33019cf25643cd793f10c23e3798a8ce72e329e39643cbdc978a691f1f423e3b9808ce74a329e9bc9784692f14c20e3e946c6f32019cf45643cd792f10c25e3194dc6339b8c672a19cf02329e4a0bcf738e78e47d7759b7cc3f47e2dbc1762857eb7dd5519d5ed3eb6aa5d72bfce2af18ca4c6f9bf955cf3f7059e132bf4f80efe6bc061abde6a82eb23d8a8ced83be5f72e4db1c9f4fe65f6ae6bedb19bedb1588eff686eff605e2dbc7b98ff342f0ede3dcc77921f8f671eee39cc9b7836b83247e274da622633e0579bc5e70f17d3947f5ac779df8758cfa29ad5e37b432afad4aa1ccaba0dfeb0ef4b35d7bcabcf8cb96b9230133c64559106f5cbc117f9d92aadfe1a1a0eb1b86be58af458e348d3a862c6ae6bea38e21cddd77d431a4b9fbf671eee3bc107cfb38f7715e08be7d9cfb3867f2fda6cec778dd588e3ed4f345b91e7813fc2ed1f9a218fdaa752dd6eb2ad6eb168e25609732ff1b9e6bfa7ddeeff371f9f6c7361fe785e0dbc7b98ff342f0ede3dcc77921f8f671eee3bc107cfb38f7715e08be99e3dccc4b7ff1b381cd557ffea858ccc5bb0407d377542c3677df51b1d8dc7dfb38f771cee47ba903df09f02153437dfc9602cf62073c8eea997eb6b1cca8d373469d4aa10c1ee39739a86711f89575cbfc32e091a912785cc44163b639f22c20e3994ac6339b8c673419cf50329e6bc9782e22e379908ca71b19cf04329e91643c3793f15c49c67301194f3f329e69643cbdc978e690f1dc45c6f31419cf30329eebc9782e21e379988c2749c633898c671419cfad643c5793f1a4c878ee23e3e949c6730e19cf38329eb9643cc3c9789e26e3b9918ce730329e76643c9791f13c41c6733e194f0519cf23643cf3c978a690f1dc49c6731b194f3919cf22329e6bc8783a93f15c48c6f300194f77329e79643cb5643c33c878aac8780691f19c4bc67305194f4b329ebe643c0bc978ee21e3e943c633868ca71319cfed643cd791f15c4cc6f310194f57329e89643c33c978aac9780693f1bc4ec67315194f7f329e7bc9787a91f18c25e3e948c6730719cf0d643c25643ca5643c9792f13c4ac6339d8ca70b19cf64329e59643c35643c43c8780692f10c20e3b99f8ca70719cf78329e11643c3791f13c49c67338194f7b329ecbc9788a087812c1feeffe27e0ffaf834dde517f0e6c6fe9fc62b0b5b0f868a9f3cbc056acf3b28e43c2f46287fdd78d3ab97a2f1f7da5605efc9500c75b243c9793f1b427e3399c8ce749329e9bc8784690f18c27e3e941c6733f19cf00329e81643c43c8786ac8786691f14c26e3e942c6339d8ce751329e4bc9784ac9784ac8786e20e3b9838ca72319cf58329e5e643cf792f1f427e3b98a8ce775329ec1643cd5643c33c9782692f17425e379888ce762329eebc8786e27e3e944c633868ca70f19cf3d643c0bc978fa92f1b424e3b9828ce75c329e41643c55643c33c8786ac978e691f17427e379808ce742329ece643cd790f12c22e32927e3b98d8ce74e329e29643cf3c9781e21e3a920e3399f8ce709329ecbc878da91f11c46c6732319cfd3643cc3c978e692f18c23e339878ca72719cf7d643c29329eabc9786e25e31945c633898c2749c6f33019cf25643cd793f10c23e3798a8ce72e329e39643cbdc978a691f1f423e3b9808ce74a329e9bc9784692f14c20e3e946c6f32019cf45643cd792f10c25e3194dc6339b8c672a19cf02329ecadcf024d5bbedd2d73a002e9c52905f063c8b1ce8e3a89ee5f85d83af635cafd2ea6d43abd70dad4aa1cc52d0ef6d07fa15815f59b7cc8bbf7c64563c8feabced3b108f92308a6d915b9ef47efb68507f6a68bf7d1b785cb46b8eea99debf961b757ad4a2bb94c1585deea09eb67d47e697c376c83766c5f384ce0b6b02ca3d41c228b6656e79d2fbd71341fda9a1fd6b39f0b8687f1cd533bd7fad30eaf48445772983b1bac2413d6dfb8eccaf80ed906fcc8ae7499d17d604947b9284516c6fbbe5e996803acbd4d0feb502785cb43f8eea99debf561a757ad2a2bb94c1585de9a09eb67d47e657c276f0cc9ed9c6ac78e4d98eb026a0dc53248c625bee94a75b7902ea2c5343edd84ae071d1ce3bd23ddd8ead32eaf49445772983b1baca413d6dfb8eccafb2f82e0be2d5627523b4586de1599d632dc45fb6cc4bf390d9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398a994167c523dfae14d604947b9a84516c2bdcf2a4df0b7a3aa83f1519f329c8af069e950ef47154cf741ff235469d9eb6e82e6570ff5ae3a09eb67d47e6d7c076c88679551e327b9d9bc6ac7866e8bcb026a0dc0c1246b1ad74cb936ec76604f5a786dab135c0e3a29d7754cf743bb6d6a8d30c8bee5206f7afb50eea69db77647e2d6c07cfec996dcc8a67a6ce0b6b02cacd246114db6aa73cc9f4fb8d3383fa5343edd85ae071d1ce3bd23ddd8ead33ea34d3a2bb94c1585de7a09eb67d47e6d7c176c88679551e327b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5ee7c2d159f1ccd279614d40b959248c625be394a76bfab9c3aca0fed4d0738775c0b336769ecc730707baa79f3bac37ea34cba2bb94c1fd6bbd837adaf61d995f0fdba1b933afca43661f1bb961f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503cb3755e5813506e3609a3d8d6bae5497ff76076507f6aa8dfce7ae059e7401f47f54cf7dbd960d469b645772983fbd70607f5b4ed3b32bf01b68367f6cc3666c53347e7853501e5e690308a6d9d5b9e743b3627a83f35d48e6d001e17edbca37aa6dbb18d469de65874973218ab1b1dd4d3b6efc8fc46d80e9ed933db9815cf5c9d17d604949b4bc228b6f56e79d2edd8dca0fed4503bb611785cb4f38eea996ec73619759a6bd15dca60ac6e72504fdbbe23f39b603b7866cf6c63563cf3745e5813506e1e09a3d836b8e54926a0ce3235d48e6d021e17edbca37aa6dbb1cd469de65974973218ab9b1dd4d3b6efc8fc66d80ef9c6ac78e6ebbcb026a0dc7c1246b16d74cb93debfe607f5a786f6afcdc0e3a2fd7154cff4fef58e51a7f916dda50cc6ea3b0eea69db7764fe1dd80ef9c6ac7816e8bcb026a0dc021246b16d72cb93debf1604f5a786f6af7780c745fbe3a89ee9fd6b8b51a70516dda50cc6ea1607f5b4ed3b32bf05b643be312b9e853a2fac0928b79084516c78bc58e888a7d4e029b56871b07cabf90a9d2fd1bf09f87f0530ba6a0f171a8c328f318ebcae356b67f0b433343b98be55fd2b75fe30fd8bdbab121819b657bb1c68d6dee0696f6876307d2b2dfaeafce1fa17b7575f6064d85eed81c741fbdc2d61f0a8a9a1f38d2d8ef57154cff4f9c6d6c0ae3b1e87a40c1ebbb73aa8a7ed5c42e6b7c276f0cc9ed9c6ac7806e9bcb026a0dc201246b1e175cab6f879ba250c1e3535d48e6d73ac8fa37aa6dbb17703bbeedb40772983b1faae837a16815f59b7ccbf0bdb211be65579c8ec756e1ab3e219acf3c29a8072834918c5b61578b6c7cfd32d61f0a8a9a1766cbb637d1cd533dd8eed08ecba6f07dda50cee5f3b1cd4b308fccaba657e076c876c9857e521b3d7b969cc8a6788ce0b6b02ca0d216114dbbbc0b333769ecc7840c8a3a686dab19d8ef57153cf4c3bf65e60d77d27e82e6570ff7acf413d8bc0afac5be6df83ede0993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999b59f10cd579614d40b9a1248c62db013cefc7ce9379ee803c6a6ae8b9c3fb8ef57153cfcc73875d815df7f741772983b1bacb413d8bc0afac5be677c176f0cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccdac7886e9bcb026a0dc301246b1bd073c1fc4cfd32d61f0a8a9a1e70e1f38d6c7513dd3cf1d760776dd3f00dda50cc6ea6e07f52c02bfb26e99df0ddb61b767f6cc1666c5335ce7853501e58693308a6d17f0ec899d27f3fc1479d4d4503bb6c7b13e6eea9969c7f60676ddf780ee52066375af837a16815f59b7ccef85ed900df3aa3c64f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce85a3b3e2a9d279614d40b92a1246b1ed069e0f63e7e95a9e3078d45464cca720ffa1637ddcd433f3dc615f60d7fd43d05dcae0feb5cf413d8bc0afac5be6f7c17668eeccabf290d9c7466e987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398a992136144fb5ce0b6b02ca5593308a6d2ff07c143f4fb784c1a3a622633e05f98f1cebe3a89ee97e3b1f0776dd3f02dda50cee5f1f3ba86711f89575cbfcc7b01d3cb367b6312b9e1a9d17d60494ab216114db3ee0f9247e9e64c2e0515343edd8278ef57154cf743bf66960d7fd13d05dca60ac7eeaa09e45e057d62df39fc276c83766c5335ae7853501e54693308aed63e0711077699e528347e63f21f0ade66b75be44ffe2f6aa054686ed559a03cdda193ced0ccd0ea66f55ff093a7f98fec5ed35011819b657bb1c68d6dee0696f6876307d2b2d26eafce1fa17b7d7446064d85eed73a0d9c16c0f0fe6be7d30e3d46b7ef0342f3a889a171d44cd8bbce6549a3b38be24f1581600034e29c87f0a3cdf8e9f277d5feed32c78be0d3cdf8a9fa78ba37a96abf57e07d8e35aafd2eabb86569f1a5a95421964f8ae03fd8ac0afac5be6c59f67f6cc51cc786e2bac0928f70909a3d8be053c2eda0d55f7f3f5ba64fdadc2f4d951757e5d3c2fc17bc5adf47a8543fc154399896575657fa7d94ae0ffb2dd547df6193647ef3077b13db79379f15712e4ecde6d83f792510b17cf9bb23deeefb3f07c1d1f4f39eee7e86bafa3ba67f3ec6faf8527c6ba77897aeeb927febaa7db8fce7a5db27eb58ffefb514e35ef86fb9eb41f9d8d3a17439981657565ff03da0f5b5be17adf94737273df6c11d4b567c255a6ede633a1afb55dca7d04e5b1cda9d0bfb87f56405d5db58b51f798b05d34db6e97da9bcf254ddfa5a0cb47a49ad99e53a08e9516ee4a026e8cc75cee67b26edb33b24a434736cd705b7f64d1b1af85bb2f0137e37eddd7d0914db303edd7832cdc8308b819f7eb41868e6c9a1d68bf1e6ce11e4cc0cdb85f0f367464d3ec40fbf5100bf710026ec6fd7a88a1239b6607daaf875ab887127033eed7430d1dd9343bd07e3dccc23d8c809b71bf1e66e8c8a6d981f6ebe116eee104dc8cfbf5f0a0be8e6c9a1d68bfaeb27057117033eed755868e6c9a1d68bfaeb67057137033eed7d5868e6c9a1d68bfaeb170d7107033eed735868e6c9a1d68bf1e6de11e4dc0cdb85f37b6df3eeb7e5d6be1ae25e066dcaf6b0d1dd9343bd07e3dc1c23d81809b71bf9e60e8c8a6d981f6eb8916ee8904dc8cfbf544434736cd6cfbb5a37709b37eb7f163a7fa64c698fe380b9e0f81c7454c398a837247fd5cd27d53f7185a7d6c68856377ec05fd1cf48569f09b04e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333f337e97119faf48b98f4818c586cfa45cdce75775bf40af4bd6df2a4c038fa9f3bb3776bfc9f222c35f0a38c45f319439e1d4bab2d76bb69260ffed866371e3b6dc1d7b1d32dbd28c7f99177f25509f3dc0e3e0fdfc34cf5e8367af450b7cef341edfc9916e344e96abefe31d1ad46de7dd467d50d30f62f75f5fd32243d30f1cfb4e04f5b7a730e094823cf2b87836eca89ee9b66097512753e35228d311eab9cb413d8bc0afac5be677018f4c2d80c7550c06064f60d147a64a329ea9643ca3c978ce20e3194ac6731c19cfb5643c8792f15c44c6f320194f37329e09643c23c9784e25e3b9998ce748329e2bc9782e20e32926e3e947c6338d8ca73719cf5d643c6791f10c23e3398f8ce704329eebc97812643c9790f13c4cc69324e39944c6338a8ca70319cfad643c4793f15c4dc6d39a8c2745c6731f194f4f329e73c878c691f19c4dc6339c8ce724329e1bc9780e23e36947c6731919cf23643c15643ce793f14c21e3b9938ce774329edbc878cac9788e25e3b9868ca73319cf85643c6dc8781e20e3e94ec6534bc65345c6730a19cf20329e73c9788e20e3b9828ca725194f5f329e7bc878fa90f18c21e3e944c6732619cfed643cc793f15c47c6d3968ce762329e3d643c0f91f17425e39948c6534dc6b38f8ca78c8c673019cf51643c5791f1b422e3e94fc6732f194f2f329eb1643c1dc978ee20e339918ce706329e12329e52329e4bc978a693f17421e3994cc65343c6731a19cf10329e63c8780692f11c42c633808ce77e329e1e643ce3c9784690f19c4cc6731319cfe1643cedc9782e27e32922e04904fb7f8b2901ffdf0b36f966d087606b61599f3ca796f2eab8b8b8c3feeb6e6159f7071606d4e97da84b4ae7cbbfd994d6097da5605efc9500c707243c9793f1b427e3399c8ce726329e93c9784690f18c27e3e941c6733f19cf00329e43c8780692f11c43c633848ce734329e1a329ec9643c5dc878a693f15c4ac6534ac65342c6730319cf89643c7790f17424e3194bc6d38b8ce75e329efe643cadc878ae22e3398a8c6730194f1919cf3e329e6a329e89643c5dc9781e22e3d943c67331194f5b329eebc8788e27e3b99d8ce74c329e4e643c63c878fa90f1dc43c6d3978ca72519cf15643c4790f19c4bc633888ce714329e2a329e5a329eee643c0f90f1b421e3b9908ca73319cf35643cc792f19493f1dc46c6733a19cf9d643c53c878ce27e3a920e379848ce732329e76643c8791f1dc48c6731219cf70329eb3c978c691f19c43c6d3938ce73e329e14194f6b329eabc9788e26e3b9958ca70319cf28329e49643c49329e87c9782e21e34990f15c4fc6730219cf79643cc3c878ce22e3b98b8ca73719cf34329e7e643cc5643c1790f15c49c6732419cfcd643ca792f18c24e39940c6d38d8ce741329e8bc8780e25e3b9968ce738329ea1643c6790f18c26e3994ac65349c6d3c2e0c1ffab77c3f6e8bc7c3ba818fe3f49772e6fa7d72565e419b1ba57f19e6153f5dde9a8beef0575530ae677427d85fd3de079cf11cffb068fe9bb04f295a0d90ec3a618b73b62dc6130cafc766014fd7600cf0e473c3b0d1ed37709e4fb8266ef1a36c5b8cd11e3bb06a3cc6f0346d1ef5de079d711cf7683c7f45d02f941a0d956c3a618b73862dc6a30cafc166014fdb602cf56473cdb0c1ed37709e4078366ef1836c5b8d911e33b06a3cc6f0646d1ef1de079c711cf1683c7f45d02f921a0d926c3a618373a62dc6430cafc466014fd3601cf26473c9b0d1ed37709e48782661b0c9b625cef887183c128f3eb8151f4db003c1b1cf16c34784cdf25901f069aad336c8a71ad23c67506a3ccaf0546d16f1df0ac73c4b3dee0317d97407e3868b6c6b029c6d58e18d7188c32bf1a1845bf35c0b3c611cf5a83c7f45d02f92ad06c9561538c2b1d31ae3218657e25308a7eab806795239ed5068fe9bb04f2d5a0d90ac3a618973b625c6130cafc726014fd5600cf0a473c2b0d1ed37709e46b40b3b70d9b627ccb11e3db06a3ccbf058ca2dfdbc0f3b6239ee5068fe9bb04f2a341b365864d312e75c4b8cc6094f9a5c028fa2d039e658e78de32784cdf2590af05cd961836c5b8d811e3128351e61703a3e8b704789638e2596af098be4b203f01347bd3b029c6458e18df3418657e11308a7e6f02cf9b8e78161b3ca6ef12c84f04cdde306c8af175478c6f188c32ff3a308a7e6f00cf1b8e7816193ca6ef12c8df0836e1ed03b6d774be37d85ed5f95e607b45e77b82ed659def01b69774be3bd85ed4f96e607b41e7bb82ed799d4f82ed399def02b66775be1fd89ed1f9fe605ba8f329b02dd0f901609baff317826d9ece5f04b6b93a7f31d8e6e8fc25609badf397826d96ce5f06b6993a7f39d866e8fc15607b5ae7af04db533a7f15d89ed4f9abc1f684ce0f04dbe33a7f0dd81ed3f96bc1f6a8ce5f07b6bb75fe7ab0dda2f33780ed639dbf096c9fe8fccd60fb54e76f05dbb774fe36b07d5be76f07db7774fe0eb07d57e74780ed7b3a3f126cdfd7f95160fb81cedf09b61feafc18b0fd48e7ef02db8f757e2cd87ea2f3e3c0f6539d1f0fb69fe9fc24b0fd5ce72783ed173a3f056cbfd4f9a960fb95cedf03b6cf747e1ad87eadf3f782ed373a7f1fd87eabf3f783ed773aff00d87eaff30f82ed739d7f086c5fe8fcc360fb83ce4f07db973aff08d8fea8f3d2aea976f64f3a5f16c4dbce7e15d44d65e05bfca9327fd6f9d6461959b618ca9ca53b14aa671cea5ba6d20e4bbbac6cd20ebf063669875f059bb4c3af804ddae197c126edf04b609376f845b0493bfc02d8a41d7e1e6cd20e3f073669879f059bb4c3cf802da5f30bc126edf002b0493b3c1f6cd20ecf039bb4c373c126edf01cb0493b3c1b6cd20ecf029bb4c333c126edf00cb0493bfc34d8a41d7e0a6cd20e3f093669879f009bb4c38f834ddae1c7c026edf0a3609376f86eb0493b7c0bd8647ff90a6cd2367f0c36699b3f019bb4cd9f824ddae66f814ddae66f834ddae6ef804ddae6ef824ddae6ef814ddae6ef834ddae61f804ddae61f824ddae61f814ddae61f836d9cceff046cd236ff146cd236ff0c6cd236ff1c6cd236ff026cd236ff126cd236ff0a6cd2367f0636699b7f0d36699b7f0336699b7f0b36699b7f0736699b7f0f36699b3f079bb4cd5f804ddae63f80ed119d97b6ba0dd8e459b19acabfe184e3f0b4005fc2920ae26dfb714a411eeb2e532519cf1c329ed1643c2f91f19c41c633948ce738329e43c978de20e39940c6b3908c671919cf52329ed7c9784e25e3d940c6b39e8ce748329ef7c8787692f15c40c6534cc6338b8ce705329eb3c8788691f19c47c67302194f828c673e19cf12329ec5643caf92f17420e35947c6b3968ce768329e1d643cdbc9785a93f17c45c633838ce71c329ee7c878ce26e3194ec6731219cf61643cedc8782ac878ce27e3994bc6f32619cf22329e97c9784e27e35943c6b39a8ca79c8ce758329e77c978b691f17426e36943c6f314194f2d19cf33643c55643ca790f10c22e339978ce708329e96643c7dc9786e21e3994dc6f322194f27329e33c9785691f1ac24e3f9928ce778329ead643c5bc878da92f1ec21e39948c6b3808ca79a8ce735329e7d643c65643c83c9788e22e36945c6f33119cf4c329ee7c9785690f12c27e339918ce71d329ecd643c25643ca5643cf3c8786ac8785e21e3398d8c670819cf31643c8790f13c4dc6f32c19cfdb643c6f91f19c4cc6b3898c672319cfe1643cedc9787691f1bc4fc65344c093008e006cf2ff966093eff0ec03db173abf076cf20d9f37c0f6b9ce3f02b6872cb616163e61980e367957f60bb0c9fd9987c126ef4c7c0e36396f10ff6a7e6587fdf95bc032e2a7a5851ffd7d6ee1923c6e6f592615c4bbbdd1572ab07ff3aec8603cd83cef93f1ec22e3694fc6733819cf46329e4d643c2793f1bc45c6f33619cfb3643c4f93f11c42c6730c19cf10329ed3c8785e21e3a921e39947c6534ac65342c6b3998ce71d329e13c9789693f1ac20e3799e8c672619cfc7643cadc8788e22e3194cc65346c6b38f8ce735329e6a329e05643c13c978f690f1b425e3d942c6b3958ce778329e2fc9785692f1ac22e339938ca71319cf8b643cb3c9786e21e3e94bc6d3928ce708329e73c9780691f19c42c65345c6f30c194f2d19cf53643c6dc8783a93f16c23e379978ce758329e72329ed5643c6bc8784e27e379998c671119cf9b643c73c978ce27e3a920e36947c6731819cf49643cc3c978ce26e3798e8ce71c329e19643c5f91f1b426e3d94ec6b3838ce768329eb5643cebc8783a90f1bc4ac6b3988c670919cf7c329e0419cf09643ce791f10c23e3398b8ce705329e59643cc5643c1790f1ec24e3798f8ce748329ef5643c1bc8784e25e3799d8c672919cf32329e85643c13c878de20e339948ce738329ea1643c6790f1bc44c6339a8c670e194f25194f0b0bcf3e473cf2ad1859b7ccef6be6be771abe771688efed86efed05e27b9be17b5b81f8de62f8de5220be371bbe371788ef8d86ef8d05e27bbde17b7d81f85e6bf85e5b20be571bbe571788ef9586ef9505e27bb9e17b7981f87ecbf0fd5681f85e6af85e5a20be171bbe171788ef4586ef4505e29bf9fa5b7d274cfa2aefd2bf09f87f0530bee188719fc128f36f00a3d8f07bd4158e78a2aedd2b087c2b2de45e963cf34cc0ff2b81d1554c55188c326f8ba99dc053e98827ea9e4325816fa585bc8b2d7d2a13f07f1c7fd9554c551a8c326f8ba9edc0d3d7114fd4bd92be04be9516f2eeb3bcf39780ffe378ebae62aaafc128f3b698da063c831cf144dde31944e05b6921df0a936fd224e0ff383ea3ab981a6430cabc2da670fcdcc18e78a2ee4d0d26f0adb4906fedca372f13f07f1cbfc9554c0d361865de1653387edc10473c51f7d48610f8565ac8b360f9467b02fe3f14185dc5d4108351e66d3185e3dd0c75c413752f7028816fa5c5309d973e5609f8ff3060741553430d4699b7c5d47ae019e68827ea1ee63002df4a8be13a2fef7024e0ffc381d1554c0d331865de16536b8167b8239ea87bafc3097c2b2daa747e8dfe4dc0ffab80d1554c0d371865de1653ab81a7ca114fd43de32a02df4a8b6a9d976fce25e0ff38fefb70478c5506a3cc0f0746b1ad049e6a473c51f7baab097c2b2de4dbfe2bf46f02fe8fe3b1ba8aa96a8351e66d3185e341d738e289ba475f43e05b69315ae7654c9804fc7f3430ba8aa91a8351e66d3185e3578e76c413f56c6134816fa5857c9b6b99fe4dc0ff6b81d1554c8d361865de16534b81a7d611cf628367b1458b83e55b69217db997e8df04fc7f0230ba8aa95a8351e66d31b518782638e2897a963381c0b7d242beadfda6fe4dc0ff2702a3ab989a6030cabc2da61601cf44473c51cfa026e6c077d4f3945cf88e7a36900bdf51f7b973e13bea9e6d2e7c47dd7fcc85efa87b69b9f01d755f2817bea3ee71e4c277d4f57a2e7c475d7be6c277d475542e7c475d13e4c277d4f96d2e7c479dabe5c277d479876fcf7d7b1eb7ef8379ee50a8edf9c13c861ecc6389bf36f0d706b9f2ed8f25feda2057be0bf5dac0b7e7b96fcfe5faab2888be1e7bcb91efa5866f99c7e72c4b1df95e6cf896797c66b0d891ef45866f99c7fbdf8b1cf92e357ccbfca21cf86e67f86e9743dfed0ddfed2dbe1d6cef6422a87ffd2d0c38a5208f31f0a6032d1cd5b35cad77895ed7d731aed776dfc6dc5f4aa1cc12d0cf75db21eb36db8e7c64c6b8288acf7779027cc877c9944d9e1fbf063669f75f059bf40b78056c726c7a196cf24cea25b0c933ab17c1365ae73f069b3c3bc63efbf2fc7f1bd8aa741efb8a0fd7f92d6093be54d84759fac36d069bf469c4beb1d22f7523d8a46f31f6c994fee1ebc1267dfcb12fa0bca7b1166cf2ae0df64193f7a556836d8fce63df27f90ecd4ab04dd7f91560fb83ce2f07db833a7f0bd87eaff35f81ed773abf086c0fe8fc9b60fbadce2f01dbfd3aff02d87ea3f3cf83ed3e9d7f0e6cf7ea3cbecbf66b9d7f1f6c9fe93cbe43354de77782ed573a8fefeedca3f3dbc1f64b9d7f166c5375fe19b04dd1f98560fb85ce2f00dbcf757e3ed826ebfc3cb0fd4ce7e7826d92cecf01db4f757e36d8c6ebfc2cb0fd44e767826d9ccecf00db589d7f1a6c3fd6f9a7c0f6239dff126c77e9fc62b0b5d0f9a560933123b19f4ab1cebf05b6563a8ffd8fe4fbfe13c17688ce4f005b1b9daf059b7c1b6e34d8643ce81ab02574be1a6c253a5f0536393f1b0e3619ff6418d8e45c6a28d80ed7f9216093f39ec16093f12c07814dbe41da176c47e97c25d8e4dbfa15603b46e7f7814dc61c7b036cf2ddba3d6093b1981f069b7caf7a3ad84ed4f93f804dc66179106c27ebfcefc1768aceff0e6cf20dcf07c056a6f3bf055b079dbf1f6ca7e9fc6fc0266364dd07b63374fe5eb0c9d8c1bf069b7ceff933b075d4f969603b5be77f0536194be41eb0c9f8a0bf045b279d9f0a36f90ef714b09daff3bf009b8cf7f773b0c9378627834dc675fb19d8bae8fc24b02575fea760ebaaf3e3c1d64de77f02b6ee3a3f0e6c3d747e2cd87aeafc8fc1d64be77f04b6de3a2fed8cda9fd57ebe57cfa782f8cecb94bf0f83fa5343d706c2803c719e6b97020ffada1d7bdd93e9f37ad9ef5be8f54a0ced06dfbb62f79db9a6f840afab58af7797e1bb18ca9cad1b07b59c1cf35beae5f618cbe17d2c59b72c7301d8df37d6dd4ed7f70347f5dd65300937ea2065ced34cead8f8039d6f03cbc4c896be3e96580b40439c52901706375a25cbf1bcb7313c1f00cfeed87932d7eb2e6202f7adb8afd7cdfbb866ac9542995da0dffb0ef4c37d5dd62df3e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333fb3e2d9abf3f85c59caed256114db6ee071719f1f9fc3cafad5739df74fadf3bb3b76bff59fefb5d2eb2d37ea5c0c65be86674e7b74be04fe2fdb2d6a5b3a784ed8e0b6147f25501f7c16b4d711cf6e8367b7450bc997c5e63b39d28dc6c972d597453d63df63e8bad7a2a9abfd75b75e5791a129eeaf1f1a3cf86cb404783fd2bf0958cf47500707fb78837121fe705fda0d36c97f088c2eb6331e4ba43d90e7e1f86c5acafcca782e1effb64f96bb6c37de833aa582fde3bb18cafc0edabecf751efb86ec05ddfe61f9bf4c0d3da716fd549d77c45fe7f4f6dd0e9c29f083bedf05d6987cd77b87a64827f123f662c8ff1dfa734839d143b416761caf1cd9cde53e34962b85323b2df54f05f1d67f87c1b3c36056dbe44b88b37fc0f1df559bb43342a30b402329b31b34dae38867b7c1231ce24f9591eddfda2823cb164399ff056d94aa8bb4f3524fecdb82c70057c731f125eb9679dbb9f107c068d651c5c7c063ea7877c7ce9b5ffdbf0e29cbfc62bb1e57ff2f59773bbdac7004c6facb61fdc2d53a883eb6fccff62dab5bbfcbfe657b8c3a0b0bea2c65da95657e559c5daaf3d99ceb1facebb6a873fd9d0e781241fd6b6f3535747cc763cc7bf07f2953fecda62e8eea596e3b76bd6fd4a914ca74847a3a388f69f05de01de0dbc536472de41c6a97a1453194e95096f995b6234a47bc56fd202775495acf07cb2d7591321dcbeaead206ec7132b9dc6eef429dd47a775bea2a65ce2babd3a5b3ce27603be17d93be96ffcbd4507b8063f16c8dbfcee9edbb053853e0077dbf03ac31f9aef72d1039df173f622f867c65595d5929277a88d6c2aef61179e70fd9cde57619cb9542996d96faa78278ebbfd5e0d96a30ab6dd2a5ac2e2f71e4b2dddc16a15139682465f0feb11cdbf1bd3bdb717fb723eea8e3fe6e6034db4d3c7771c9b6c76033efa1dace07a50c9e934999abca32bfaa9d4d58ca9af7865ddcc7c4775003a84760d455268c0107d786ddf0da49da29f1d319ecbb755e74ee6c68570c650695657e1d9e775bef5d9ad777784d21dce6be85ef7e0c29abe3c6b11377ebdf12b07da27f1d5da775b3dd33140edb3dc3e16575ecb8ac707d6ca98b798ddc22d8ff9efad74659bcefd6d07266de1c8752e9fb8951cee607af79627b57a34b793932b508ecf70b3e34d88b82fdc7dc94fd0063cebc8fd2d9580fde47a92dcbfc4a9b649655dbfedf8faad347b6a36887ed09c6e487c098d2f9f26f3675b1d55fe6c59f62fcc8a8839bb62bf3be5236f781f7008f8bb6dd511b5d8ec7d836b1adb77795edf8ffa1a1550e9fd75a8ff9e633f736463e1edfc96adbfd279b16bb2c3cae9ea34469b1cbe23b3e2d7a8cb41d3f6c5ae4b2ef439416ef5b7cc7a8450ddef76c488bf72c3c2eee4535a4c57b16dff169d1b3bca1e71aa8c54e0b8fab7b0f515a88bf6c99df27606e63e4e3f1ddadca769fcca6c50e0b8fabebe6282d76587cc7a745971e788fae212db65b78e2bf3fd7b016db2dbee3d3a2576fbc87d79016ef5a785c3dd38dd2e25d8bef18e36294ed5e8e4d8b6d169e6d39d6629bc5778ce7873d6cf7da6c5a6cb5f038b8efdaa0165b2dbe63d46204de776d488b2d169e2d39d6628bc5777c5a5475b7dd13b669f18e85c7d53de1282ddeb1f88e4f8b11bd94efcd8dd062b38567738eb5d86cf11de335543a2e3635428b4d169e4d39d66293c5777c5a54a7cfb53636428b8d169e8d39d662a3c5777c5a94a78fa91b1aa1c5060bcf861c6bb1c1e23bc6b8485f4fae6f8416eb2d3ceb73acc57a8bef188f23e9b858d7082dd65978d6e5588b7516dff1695193beffb4b6115aacb5f0accdb1166b2dbe63bce7928e8b358dd0628d85674d8eb55863f11d9f165dd3c7d4d58dd062b58567758eb5586df11d9f16a3d2cfc45635428b55169e5539d66295c5778ce79de9f6626523b45869e15999632d565a7cc778de99be7fb1a2115aacb0f0acc8b1162b2cbe636c3bd3e79dcb1ba1c5720bcff21c6bb1dce23bc6f3ceb4166f37428bb72d3c6fe7588bb72dbe633cef4c1f47de6a84166f59785c8d8112a5c55b16df31c645baed5cd6082d96597896e5588b6516df31ded74ab79d4b1ba1c5520b8fabf11aa2b4586af11de3f548fa1edf924668b1c4c2b324c75a2cb1f88ef15951fa1c7c7123b4586ce1599c632d1683ef3db1fbcef4e7161fd217eb7c438b6228734a87ccaff4c58ad251d681fdcab02e6fc65e974cbfb24511757913ea2265ce80bab4099c8c51d4cd515dd331f306d449adf7234b5da5cc391dea74e9a4f309d8261f836e7d2cff97a9c8984f415ef453757e2dfe3aa763f555e04c811ff4fd0ab0c6e4bb0bfa2ed249fc88bd18f2bd3bd4959572a287682dec6a1f795de791dd5c6eb1b15c299479dd52ff54106ffd5f33785e3398d3ef3d409c491cb969bb324caf4768743e682465b0cfde478e78cc3e84c221fe5419d9fead8d32d88752ca5c086d14f62b957a2682fdfb4d3a6acbba20bbac5be6c55f29d8f600a35947151f9f41df4f192b42c69150361917a22baca7a7615375ede5a8aee24bd62df3bd8051c6a9e8997bc66463197b188c8aa78f03cd70ec0d991a3a5ef4019ede0e781cd5337d1caa30ead4cba8532994c1771b2b1cd4b308fccaba65be027cbbd8e6a8851c93cf31b4288632c38df3c7281d651d2a7e7b5aead2cf715d64ddd22ef5cb81ef4ac37777c37722a8bf9d83a0e1fdab1298fb3a6056ebed1fff7acbf1bc4d624afc74873a0d000de2aa13ae4bcef30618da16437e2a9ce74939292bc72f6157b12cdb12d9cde5fa18cb9542997e96faa78278ebdfdfe0e96f30ab6d72179cdb39d81fd231d0cfe090f9eea05dff08edfa817652068f7f3d1c69d7d7e091f91ec023e7381560937305e14fc0ffbbe680db6cf72a2cdc62c371e27a5818bbc7cf983ed7e96130ca7c7760145b5fe0a974a499b9adcf31f4c1e3726ba38c2c5b0c6566c1b1316129abf6bb8e4575f56aa9edb1bd3ba6dbf4d60ef4c2711a03d02730340c402fa9672b073c6d83bab11a274fa99d34e2ce51378cca3c7a14b46203137f8b2cd5680136ccb7b4d882a0fe9094c5609321295b81ad85210b0e8529e565483b1772a11eb2ee6283b30db0c4e91b87f394a9a1d03904785c84b20a1d19d25387ce2d93c64c1985f1d1cae06c4aeca8ffb56ca05cd4ba5c6d07739f48c1bc1983c58efcb784faa6605efca96d53aaf313468cbc7bc0a43ba78e1b357eca6414cadcb1315f14d4df00e66f94e0ae763a0c00ac30360ead8c7a618321ff930dd3367ece6e3866aea94d00fe646a0bba1dea4037b57e19fb76e488b163af9b5a3576ccc84ba78e1f39654ced78dc9a6d0ce5a2b6b4fcbf35d86c4d3c965513365bb8ec21169b6dc25186db804d8e5c87824d78da82ad25e4a5bcb9659c846b4758bfec52ea7f4a9c56bae287047521208763d5aeaafd577d3e569d06a9a18ed5d0c66a73aaa18bd51d433534b1fa8a9d1a7a580d35ac86163e21c80c1dac860a3e39c80c05acbe7651166486f63d2dc80cdd7b4690199af72ce0fb36309f1d644ebbd4d0ba9d82ccd0b9ead6a57a755d7de64dbd5baf4edfd56d0175caab2ef1d4e9a73aed549717eaf685ba95a54ee9d4e9b23a1554a76fea72a4bfd67a40982e0cd34561ba384c9784e9d2305d16a6cbc3744598ae0cd35561ba3a4c03c3744d98ae0dd37561ba3e4c3784e9c630dd14648677be39c80cbfae867fbe35c80c0d7d5b901936faf62033a4f41d4166b8e911416628ea91416698ea51416608eb3b83ccf0d66382cc30b9770799a176c70599e17ad570d86a986c357cb61ae6570d09ac861456430dab6189d510c66a08643534f2fd4166c8653564f3434166d8e7e9617a244c8f86e9b1303d1ea627c2f46490191e5c0d1b3e23c80c33ae861f9f1d64862b9f1b64863757c39eabe1d0d530e96af87435acba1ae65d0dffae86857f314c2f85e9e520f348423d8a518f28d4ed7ff5184cdda27e33c8dc3a5f12641e71ab47feaa0b84ea12a2bac8ac08325da8549732d5c54e7539545d30559754d545577559565db8559776d5c55fbdf2a05e0151afc4a85784d42b53ea1532f54a9d7ac550bd26aa5ebb54af11abd7aa770799dbe27b83cca352753b5c3d1a50b7ccd5edfb4fc3f4ad201393df09d377c3f4bd307d3f4c3f08d30f83ccb0c66ab863355cb21a5a590dc3ac866c564339aba1a0d5b0d19f0599a1a7d5d0d5bf0d324362ff3e4c9f87e98b2033bcf69761fa6398be0ad39fc2f4e730fd254c7f0dd3dfc2f42f61fad730fd5b98fe1ea67f84e99f41dd30dbd8909ca05b1f7d05138c983265d4b80953caa6d4968d9b3a76ca980963ef2b9b3666cae8b2da7b464daa195b3b0d17feb65e58c6081f3069d288fbcac68caf1e756f59edd42965b5356555b553c757d73b88ff452f74d2fe1e475457473bfbcf6f42fa7f9be8f450dd2ecae8eb57345cb792964d10e488a62cd4a365d32a34491fc1e452f7c6cc7970d9e4b1b553cacacbc6877fc3036fedb451d59dcbf07f934391274f299b3c65c4a4296535936ac79575e98ceb7db86d132af15f6dddc09c7942d3c4e9a8bfb3d4a410fbe5a94d50e03f4e6d1a69ebb26f40dab6ac694ecbca9a50c3b39ab2d0954d24bca92c5296c953aba64c1a31724af4c2b77e9385ef684a35c737b19a27776882b3d39bb2d0800e4d23bca329ce6666e12cf86f5a25cf63845506009b2d6c6f00000028461f8b08000000000000ffed9d77741cd775c667d158164b1024c15ea046b3015c2c1a0136b0774a9464f5429004455a24419150b32c4bb224f7debbe516cbbdf758a97612274e1c3b96bbe36e4b2eca3f39ce49cef1c97bb3ef1a1f1e67d658682e78077be79c8b7d73f7eddcdffbe6ce9bd9f766074f054190098a4bb5b18b8273177abfcfbde69fded296e0b6f29c9c99947056a584b33a259c3529e1ac4d09675d4a3827a58473724a38a724c869d9aa82914bd2bc5319744d9a319b324deb53a0692e659a4e4b81a60d413afaa8e929e16c4c09e78c9470ce4c09e7ac947036a58473764a38e7a484736e4a38e7a584737e4a3817a48473614a3817a58473714a3897a484b339259c17a484f3c294705e9412ce8b53c27949829c2b8173a97b7d867b5de65e97bbd715ee953eb3cabdb6b836d6b8f55663ab2d9bb136efbd82b176631dc63abdf7ba8c751b5b63acc7bdd7ecdeeb35b6d6d83a63eb8d6d30b6d1e9b0c9d866635b8c6d35b6cdd876633b8ced34b6cbd86e637b8ced35b6cfd87e63971abbccd80163971bbbc2d895c69e69ec2a63571bbbc6d8b51ecb75c6ae377683b11b8ddd64ec6663078df51b3b64ecb0b123c6068c1d35768bb163c68e1b7b96b15b8d9d3076d2d8296383c64e1bbbcdd81963678d0d19bbddd81dc6ee347697b1bb3dcd9e6dec1e63cf3176afc7f95c63f719bbdfd803c69e67ec41630f197bd8d8f38dbdc0d80b8dbdc8d88b8dbdc4d84b8dbdccd8cb8dbdc2d82b8dbdcad8ab8dbdc6d86b8dbdced8eb8dbdc1d81b8dbdc9d89b8dbdc5d85b8dbdcdb1d081f07663ef30f688b1771a7b97b1771b7b8fb1f71afb0b63ef33f6a8b1f71bfb80b10f1afb90b10f1bfb88b18f1afb98b18f1bfb84b14f1afb94b14f1bfb8cb1cf1afb9cb1cf1bfb82b12f1afb4b635f32f698b1bf32f6d7c6fec6d8df1afb3b637f6feccbc6be62ec1f8cfda3b17f32f65563ff6cec5f8c7dcdd3fc5f8dfd9bb1af1bfb77e7fb867bfda6ab4be362ff61ec5baefcb87bfdb67bfd8e7bfdaef799ef19fbbee7fb81b11f7abe1f19fb4f57feb17bfd897bfda97bfd997bfdb97bfd857bfda57bfd957bfdb57b7dc2bd3ee95e7fe35e7feb5e7fe75e7fef5e9f32765953b13c39185efa8284faa88ea3793ba742e22f0d462e568b6af71ebd363b7f8d5ba757d2aed6add77afe3ab75ee76d67b25b9fecf91bdd7aa3e79fe9d6677afe26b7dee4f9e7b8f5399eff62b77e31f8b3018cb93abff5553b57067c94af55e0ab75be6af0d5d1e6c037c9f96ac147fbb70e7c539c6f12f8a63adf64f0659d6f0a6969acdef9fa82a47225df6fb79b4b7abb6e1e6a5af2bc87ed761b9878a727cf3b60b7dbc8c06bf36386dbd674c89b99ced708be59ce37037cae0bfad331677db39d6f16f8e6385f13f8e63adf6cf0cd73be39e09bef7c73c1b7c0f9e6816fa1f3cd07df22e75b00bec5ceb7107c4b9c6f11f89a9d6f31f82e70be25e0bbd0f99ac147f7b85c00be8b9def42f05de27c17818ffada8bc147d78697389fed272667e033ce4f7d54f819ea9fc1b78cfa66f02da77e197c2ba84f06df4a884dbe55d0af90afc5f9a88fb2eff5ba725f90d43151088f89b5496fd76cd96e777df2db0de7ed3604c35af7419cb5a0d546574ef0dea0368c9d714671c85f03e55d5097ea911e749e21767b3e59e7ca1b4b7caed7fb5c0eeaac8b687f5f906cfbd77b3ceb3de65a683f4fceb617346747bd949db357435d3ff7e89a6722e6ec5ee060c8d92ecdd9512f65e7ec00d4f5738fae7b2762ce5e071c0c39dbcf93b385bce66c718c2c08a2738fbefb4cc49c3d061cc9e76ca7e6ece897b273f601a8ebe71e7dff9d88397b0770249fb3ddfd7a6d30eaa5ec9c7d05d4f5738fc6622662ce3e041c0c393ba0fdeca897b273f66d50d7cf3d1a179c8839fb6ae0483e677b9872b65d733628ce77064174eed118f544ccd9478023f99c3dace3b3a35fcaced9cf435d3ff768be6422e6ec475cd9ce337cc3cd332c04df379d6f11f0269fdb473a9872bba0b95dbc0f2408a27394e6ee26626e3fe6ca368f1f877b0fc8f76de7bb007cdf71be0bc1f75de7bb08dac5700cf4eb3130eaa5ec63e0fb50d7cf659a479e88c7c0d7818321670f6bce8e7a293b679f80ba7eeed13d0d1331677f041c0c393ba0393beaa5ec9cfd03d4f5736f992b4fc49ca5fb4aedf5c28fddf5c20af0fdc4f95682efa7ceb70a7c3f73be16f0fddcf95ac1f70be75b0dbe5f3a5f1e7cbf72be36f0fddaf90ae07bc2f9dac1f7a4f37580ef37ced709bedf3a5f17f87ee77cdde0fbbdf3ad01df53ced7e37c76be8beebdfaaaf3d97d4b1af505c9ee5bbac792b64debabc621768317bb611c63377ab11b2362b730c4ce420c5a32de7a1f945b7879f2b960e4ef3f28d6eae463b5dbb6b706a36ffb6ae0c933b43d0b3146c393079eb6e479c27b7d0bc96f37dcc7ad9ea65988d50aed6a6768570662d1b6699de2e5c087fd777b046347f28c850cc4a26dd37a0730920fcf27745ea7e3c79e0f97668679198ea5f09a88e2d1b3bf886335f8a9ceef670db3ad706cf5f03e9e5bdb3c1f535e867941b168dbb44ef1eaa13d6de3cf58182d63de63e4ea2332108bb6edc7c6e3bd65fc351bd57ecd81ef3cf44985b1f649f5c0361ed72971fb5a4a6c8ef355066250df469a17c04f7566bb1f24d8be6d07f4bb0cc75fa1dceb37ec0f92cfe3421e8febd1f0b4030fc7b1cf74bce6f1bcffc720d95cebf4b46af3b4ca419d0ed0af9341bf52d721144f99955999955999955999955999955999955999955999955999955999955999e533e3fd1738bf49f5560961245f017838c6f9c3e747b96dd1f6edbcce77605e27f9798b421ee72ce91ec3e55e9b6ba0ce9399e1ba3f80f9747f6e10e73457f16a37aafb2cea8373e76239e710e3e681a3e62f9b138b5d38cc35df669fa1629f43d6eae9ba2a425386fb5446689af134c5fb14577a3c364fe7550fb371ccfd953b17895a5139c9b93dbcc78077bf14fb0fca85aa6064ff81e799aec4638f9cc3a4f9f22e2f760dd4f99fccf0bea17b51e9ff1cfaf73cd93adddeb6e933cbc1dfed6dbbc17d96386abdedb7c267a9ceff419ffaf6aae04f9a71dcff81fd72006dc5a50fca386f9efc79b8388fdf5e064f27f070f4334cd71b793c06929ec7eff6b48aba8ea13a5da05f37837e51d7a2b44ef194599995599995599995599995599995599995599995599995599995599995593e33fe569458b350af2084719cee7d08e733e8f92fb47d3baff3d2aae1b8dcf37034e7b4c26b730dd4f95ad570dd57ba727d70eefd0e71fb92613eafe4bea478f5d01e9c0be2fa3d7787c7d311a105959b138b5d9cc74f5ee3e179fc764fd74284a65cc72bceb1a2a678bcb6793c38375a1f9c7b6f4916b6331ef70ec5e505c5c363a9037c54c6df4773ec673c97f8f7f5503c9cbf7ed469db1070edfb429eb3df58036dea0bcecdef1aa8f361e8fb3eeaca780f07de3bf258c4fbb4949aa726fd589e65972fcefbae05ce3e8883b1d7016b42b1db3076c619c5217f0d94bf54355c97ea911ea435b1db63849e0986ecfee7dabccfe5a04e4f44fbfb8264dbdfebf1f47acc769f7c02f2ec3138ff73f5493d311a2d078da80e5e0771dd93e7f791fefd8d78df5e9d5707af59a8ce57a08f8abb7f34ea9e43aef358dc3d8751d7c69dc0e8b7d1bfcfb3d2efd37a1cfa8ba4efd37a1c7208efd30abcedaf80ed13575d107f6ea13adff3b6ef5f93d367f03e30aaf343e82f1adc3d8bf5c1b9d7df78cfd4787cbf8abb4f9ae2e1750d1edb7faeed96790dd4ef4b9019730259f03a81eafccadb67dd31dcab233efb64cc6749ab1657c6ef2fbe7e56871ef84c5f223a148ff95eaf2d94d73dd016aaf35fde3560f2d72dc56bc0e4db3af29a84fa818e88b6529dff8663ed0f708d47fb09bf77d4559ffb3e2da5ae01493fdbe6f17e3e30c696f07ce0daeae1bafe737e49eb729f0fdce57d4ee2f381ff17f2ac0eee43e7eaabd7c568b40234a23af8db203a8fe0b37ca3ce315cf7f6c79d63a29e4189fd7343f5f8b3f9e36a51d70854873e8bd708b31c7383d3d9afeb8f17d2f932c9fb86f1b712ad10177f2bd1caa4671e74eb8375bc2e389fb1f34cb1e39e399d1f87d871cf9c1e8fd88d5eecc6718cad9aabe6923467782672f8fb337c66a95d4a5d9712430e3e579502c6ea1430d6a480b136058c7529609c9402c6c929609c9202c6a92960cc02e3f93cb733e85318ab3e5cfbabd4b506c66e61d2a29cffdfc1fcbf544a5efb606c86ef74a1162dc1e8b5c0ef791ccf7e28f77fbd1003feef821929609c9902c65929606c4a01e3ec1430ce4901e3dc1430ce4b01e3fc14302e4801e3c214302e4a01e3e214302e490163730a182f4801e3852960bc28058c17a780f19214302e55c6441857f23216c6ca687938fee7dfd3f99f630c3cf9a87b4e997e7b52f6ff5b637e3e69db589f1b87f796f0fe4fb8a7f76c3b8e7b47ca7db65da9ffb7cac458182b23d77decf83b9ed1f0e0ef22a37e5bc3c058182b23d7ef5ff0377aa3e1e902cd3a233463602c8c9591eb5eb972efe5c47bfabb223463602c8c9511efab4e9027d4acbb0c9e35a0597784660c8c85b13272dd979c8518a3e1e901cdd64468c6c058182b23d36fdb42cd7acae0c1df80f54468c6c058182ba3e559cba4596f193c6b41b3de08cd2431224fd2cfc9ee8d88c5f19bc172db4e0cc83825058c5353c088f74970f45fa5ee93e8e5d5a730567db8f657a9fb243036c3ef63422df0f7107f4e8bf5bc3c25ef93c0d81b98b4c0dfabfc392d36000fc7ef67b21063343cc49083cfcd4801e3cc1430ce4a0163530a1867a780714e0a18e7a680715e0a18e7a78071410a1817a68071510a1817a78071490a18f1bb2ac3b562c9ef2f1b2678ecb8ef2a133d76dcf792891e5bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73c97143b0d63fcca38f11891a739399e3cb61d63f509687b5f044f86a9ed186b9380b61343da1837a680716d0a1855c7e23d886361b43c9b99783695c1b31978b630f16c2e83670bf06c4d9e27cca92d65f010430e3eb736058c1b53c0a83aaa8e921855c7cad1511995511995f17c30a6a10f57c654e46361ac8c96675bf23ca1665bcbe0d9069ad1e7da78190b6365b43cdb93e70935db5606cf76d06c5b84660c8c85b1325a9e1dc9f3849a6d2f83670768b63d423306c6c258192dcfcee47942cd7694c1b31334db11a119036361ac8c966757f23ca1663bcbe0d9059aed8cd08c81b1305646cbb33b799e50b35d65f0ec06cd764568c6c058182ba3e5d9933c4fa8d9ee3278f68066bb233463602c8c95d1f2ec4d9e27d46c4f193c7b41b33d119a313016c6ca6879f625cf136ab6b70c9e7da0d9de08cda432ae4d01e3c6143032eb58182ba3e5d9cfc4b3af0c9efdc0732913cffe32782e059ecb92e70973ead232788821079f5b9b02c68d2960541d5547498caa63e5e8a88ccaa88ce531f6a58051f7b5324a6564f87e55f23734974ef0d80d5eec860a891df71b9a891e5bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73c9714fb40f2b10be53e63e600f0703cf386a99d79bbddcbddb6fe98a07e56ab2b3cad2ef5b4ca419dcb41bf2b18f4cb405cda36ad53bc72999f2180992976619ad9c614683fc5d8e8e961e35fc9d4f6b8befeca091e3baeaf9fe8b1e3fafa891e5bf35cf3bc12626b9e6b9e57426ccd73cd7329b1b15c1b0c5fb7d3f34fed369ee9ca356e1d59c94f752e9b547c6d08f418e288adc7909e2b2a21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad792e2fcf311faac68127f07882123c1b84f1ec16c6b34318cf1a613c8b85f1740ae3992b8ca7208c6786309eadc278a608e3592e8ca75a18cf26613c79613c7b85f12c11c6b34218cf3c613c3385f14c15c653238c67b3309ed5c278f609e3d9238ca75718cf52613c3dc278b609e3e912c6335f184fbb309e59c278560ae3c90ae36915c6532b8c67a7309e16613ccb84f1ec17c6b34e18cf02613c4dc278ea85f1e484f1d409e3592f8c6797309eedc278ba85f12c14c6d3218c67b6309e55c278a609e36910c6b34518cf24613c8b84f1cc11c6335d184fa3309ec9c278c6e37943e5f06404f06483739f499685f70f80afcafbacedafda9a86dfbfcaf9abe03357bb7275c4b6af021ffd36fcea88cfa24e57415bfa5c39fff49650278cd507eb14af1e38ae16c2734018cf64613c8dc278a60be399238c6791309e49c278b608e36910c6334d18cf2a613cb385f17408e359288ca75b18cf76613cbb84f1ac17c653278c27278ca75e184f93309e05c278d609e3d92f8c6799309e16613c3b85f1d40ae36915c69315c6b35218cf2c613cedc278e60be3e912c6b34d184f8f309ea5c2787a85f1ec11c6b34f18cf6a613c9b85f1d408e3992a8c67a6309e79c2785608e359228c67af309ebc309e4dc278aa85f12c17c6334518cf56613c3384f11484f1cc15c6d3298c67b1309e35c2787608e3d92d8c6783309eaa081e86ff7f19f2d0fd6bb46d5a3f202436c37e08ffefe7354c6dbad66dabd66d97f8295e0dd4b9ce5d18d8fb51f0b3c4e5df6f88f7ce5d0b1a5dcbd416da1f196fff30c72ee07d950130049e3e41040fc7fda84ced1c918709feffd9bcd5ea3a4f2b7fdfe5a0ce35a0df750cfa45e5f69f8e01f79a4666cb43e70e62cd42bd0d4218c977252f4f78dc6e08462ea58edbeb8087a30f636a67787c5defb5694384ee540773f57a8676461d3bb47e3dec87b4315b9e4dae4cac59a8b7490823f9aee5e5098faf4dc1c8a5d4f1753df070f43f4ced0c8faf1bbc366d8ad09dea60aedec0d0cea86387d66f80fd903666cbb3d99589350bf5360b6124df75bc3c1d5968332da58eaf1b8087a3ff616a67787cdde8b5697384ee540773f5468676461d3bb47e23ec076556e62866cb43bf3121d62cd4db2284917cd7b3f274e4b3d0665a4af56337020f473fcfa47bd88fdde4b5694b84ee540773f5268676461d3bb47e5344ece620592d6e1e85163747f0dc3cce5a50bc7299af4921b3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaab35d5467d55975569d9360569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e6396a0b3e5a167c4106b16ea6d15c248be1b7879c2df056d0d462e196fbd0fca3703cf8d0cfa30b533bc87fca0d7a6ad11ba531d3cbe0e32b433ead8a1f583b01f0e96c17c530a9955e7b1315b1e7a562cb166a1de36218ce4bb919727ecc7b605239752fdd841e0e1e8e799da19f663fd5e9bb645e84e75f0f8ea676867d4b143eb144f9995398ed9f2d0ffb021d62cd4db2e84917c37b3f214c2df376e0f462ea5fab17ee03998384fb11f63d03decc70e796dda1ea13bd5c15c3dc4d0cea86387d60fc17e2887f9a61432abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3ea5c393a5b1efadf21c49a857a3b843092ef202b4f7b38efb02318b964bcf53e281f029efec4798af30e0cba87f30e87bd36ed88d09deae0f17598a19d51c70ead1f86fd30d1996f4a21b3e6c6f8306b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7314bc80dcbb3d39589350bf5760a61245f3f2f4ff8dc839dc1c8a5d47d3b8781e710833e4ced0cefdb39e2b5696784ee54078faf230ced8c3a7668fd08ec076556e62866cbb3cb9589350bf576096124df215e9eb01fdb158c5c4af563478087a39f676a67d88f0d786dda15a13bd5c15c1d606867d4b143eb03b01f945999a3982dcf6e5726d62cd4db2d84917c877979c27e6c77307229d58f0d000f473fcfd4ceb01f3beab5697784ee540773f528433ba38e1d5a3f0afb419995398ad9f2ec716562cd42bd3d4218c9778497a7908536d352aa1f3b0a3c1cfd3c533bc37eec16af4d7b2274a73a98abb730b433ead8a1f55b603fa48dd9f2ec756562cd42bdbd4218c937c0cb131e5f7b83914ba9e3eb16e0e1e87f98da191e5fc7bc36ed8dd09dea60ae1e636867d4b143ebc7603fa48dd9f2ec736562cd42bd7d4218c9779497273cbef605239752c7d731e0e1e87f98da191e5fc7bd36ed8bd09dea60ae1e676867d4b143ebc7613fa48dd9f2ec776562cd42bdfd4218c987e78bfd4c3c398f2717a1c5448cdde0c56ea890d88d5eecc60a89ad79ae795e09b135cf35cf2b21b6e6b9e67925c4aed45c53cd2b53f3cc79d43c731e35cfa8e62235ff6372b13bb15fa98258c798da894b1f94717c8e9635c278160be3e914c63357184f4118cf0c613c5384f12c17c6532d8c272f8c6789309e15c278e609e399298c67aa309e1a613cab85f1f40ae3592a8ca747184f97309ef9c278da85f1cc12c6b352184f56184fab309e5a613c2dc2789609e359278c6781309e26613cf5c27872c2780e08e3a913c6b35e184fb7309e85c2783a84f1cc16c6b34a18cf34613c0dc2782609e359248c678e309ee9c2781a85f14c16c69311c0930dcefd3d0afe9ea01a7c747fff7ef03dcb950f80af2a22066de738f868fc94b661fb9b754de73254c1676e8de07a56443c8a736bc467c743778cd507eb14af1e386e15c23359184fa3309ee9c278e608e359248c6792309e06613cd384f1ac12c6335b184f87309e85c278ba85f1ac17c653278ce780309e9c309e7a613c4dc2781608e359278c6799309e16613cb5c2785a85f16485f1ac14c6334b184fbb309ef9c278ba84f1f408e3592a8ca75718cf6a613c35c278a60ae399298c679e309e15c2789608e3c90be3a916c6b35c18cf14613c3384f11484f1cc15c6d3298c67b1309e35c278aa22780e30f1c43d4fe18080d8763d0fbad8250bef8fc7ef000f788cb47e0c18919778f24c3c71cfa0c80b886ddb4fdf25680e2e0befe3efb8b8722aef31d27a544ee17d69ab9978e29edbb15a406cab058d5dd23d0059781f7fb7c09553ab3d465a8fcaa9465e9ef07f4bb404239752f71ae131c7b10f99da99c7e32fc16768443e8bbac5d30a9fa13a1ef7c9c7f507144f9995398ed9f2d0dc05b1e2f96c3c7ef7361ac6a8f32b034fd83fb606239752fde331e0e1387f30b533ecc74e786d6a8dd09dea60ae9e606867d4b143eb2722623707c96a7172145a9c8ce03939ce5a50bc72990fa4905982ce9667952b136b16eaad12c248be3c2f4fd83fae0a462ea5fac793c0c371fe606a67d8279cf2dab42a4277aa83c7d7298676461d3bb47e0af64339cc2752c8ac3a8f8dd9f2d01832b166a15e410823f98eb1f214f25968332da5fab153c0c3d1cf33e91ef663835e9b0a11ba531d3cbe0619da1975ecd0fa20ec076556666556666556666556666556666556666556666556666556666556666596cd6c79e8b78dc49a857aed4218c9779295a738efd01e8c5c4acd3b0c020fc7bc0c93eee1bcc369af4ded11ba531dccd5d30ced8c3a7668fd34ec076556666556666556666556666556666556666556666556666556666556666596cd6c79e899dbc49a857a1d4218c9778a9727fcdd564730722935ef701a7838e66598da19ce3bdce6b5a9234277aa83b97a1b433ba38e1d5abf0df683322b7314b3e5a1675b116b16ea750a6124df202b4f71feb43318b994eac76e031e8e7e9e49f7b01f3be3b5a9334277aa83b97a86a19d51c70ead9f81fd500ef3891432abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3ea5c393a5b1efa9f6bc49a857a5d4218c9779a95a73d9c77e80a462ea5e61dce000fc7bc0c93eee1bcc359af4d5d11ba531d3cbece32b433ead8a1f5b3b01f263af38914326b6e8c0fb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb3e68632c7316b6e28731cb384dcb03cddae4cac59a8d72d84917cb7f1f284cf3de80e462ea5eedb390b3c6718f4616a6778dfce90d7a6ee08dda90e1e5f430ced8c3a76687d08f683322b7314b3e559e3cac49a857a6b843092ef0c2f4f210b6da6a5543f36043c1cfd3c533bc37eec76af4d6b2274a73a98abb733b433ead8a1f5db613fa48dd9f2f4b832b166a15e8f1046f2e179b9878927e7f1e422b4385fb1ed7aaf2bd7bbd72cbcdf0b8c5cfd618fc748eb98e3c84b3cbd4c3c0d1e4f438416e72bb66dff3a579ee65eb3f0fe3a60e4caa95e8f91d6a372aa0178d631f1347a3c8d115a9cafd8568bf5ae3cddbd66e1fdf5c0c89553eb3c465a8fcaa946e059cfc413d727ad1f87d871c7d778c48ecb95f188ad9aabe6aab96acea979e63c6a9e398f9a675473519a335c4785e3bd142300065cfaa08cdf1538ae3d99da998ffa3eb6de6b137e1fc33187f3f57d439995398e9969dca223ebc5267d028f879621662dc673dcb4d76b531ac64d4b319f4821b3ea3c36661bfb8ee4637764bdd8a44fe0f1d07207b3164ced0cfb833b83688d295e0eea609edec9d0ce0cc4a56dd3fa9db01fca613e914266d5796ccc36f65d89c72e3e4f1e63933e81c743cb5dcc5af0b4b3d81fdc1d446b4cf1725007f3f46e867666202e6d9bd6ef86fda0cccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccb2996dec67271ebb387e8fb1499fc0e3a1e5d9cc5af0b4b3387e7f4f10ad31c5cb411ddce7f730b433037169dbb47e0fec076556666556666556666556666556666556666556666556666556666556666596cd6c633f27f9d8e1ef713036e913783cb43c87590ba67686e3f7f706d11a53bc1cd4c17d7e2f433b331097b64debf7c27e5066658e62b6b19f9b78ece27c1ec6267d028f8796e7326bc1d3ce627f705f10ad31c5cb411ddce7f731b433037169dbb47e1fec8772984fa4905975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de39855e7cad1d9c6be3ff1d8ede1f83dc6267d028f8796fb99b5e0696771fcfe81205a638a97833a98a70f30b433037169dbb44ef12a81f9440a993537c68759734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59426ed8d8cf4b3e76f87b768c4dfa041e0f2dcf63d682a99de1fd2f0f06d11a53bc1cd4c13c7d90a19d19884bdba6f507613f28b3324731dbd80f251fbb90f562933e81c743cb43cc5a30b533ec0f1e0ea235a67839a883fbfc61867666202e6d9bd61f86fd903666dc7f99e46287f76d528c2af76a7dcf77e56af0bdc0956bc0f74257ae05df8b5cb90e7c2f76e549e07b09b48d7c2f75e595e07b992baf07dfcb5d791df85ee1cabde07ba52bf780ef55ae3c04be57bbf2ede07b8d2bdf01bed7baf29de07b9d2bdf05bed7bbf2dde07b832b3f1b7c6f74e57bc0f726577e0ef8deeccaf782ef2daefc5cf0bdd595ef03dfdb5cf97ef0bddd951f00df3b5c7929f81e89f0bdd3959f07be77b9f283e07bb72b1f00df7b5c790af8deebca53c1f71750a6d7f7b9723df81e75e51cf8deefcad3c0f701576e00df075d793af83ee4ca8de0fbb02bcf00df475c7926f83eeacab3c0f731576e02dfc75d7936f83ee1ca73c0f749579e0bbe4fb9f23cf07dda95e783ef33aebc007c9f75e585e0fb9c2b2f02dfe75d7931f8bee0ca4bc0f74557c6fdfb97aefc10f8a85f79187cd4af3c1f7cd4afbc007cd4afbc107cd4afbc087cd4afbc187cd4afbc047c94772f051fe5ddcbc04779f772f051debd027c9477af041fe5ddabc04779f76af051debd067c9477af051fe5ddebc04779f77af051debd017c94776f041fe5dd9bc04779f766f051debd057c94776f051fe5dddbc04779f776f051debd037c94778f808ff2ee9de0a3bc7b17f89a5df9dde0bbc095df03be0b5df9bde0bbc895b19fb9d895df07be4b5cf951f0515ff87ef03dc3953f00be65aefc41f02d77e50f816f852b7f187c2b5df923e05be5ca1f055f8b2b7f0c7cadaefc71f0ad76e54f802fefca9f045f9b2b7f0a7c0557fe34f8da5df933e0eb70e5cf82afd3953f07be2e57fe3cf8ba5df90be05be3ca5f041f9dc7a99fb1c7b33d2e4907d2c8faa8cdad116d21df64684b5f90ec351dc5a26dd37a3b30d23e288c3f6361b48c6d1ea3e5e964d00cf38a9652df993a81a7838187a99de177a62eaf4ded5e9b7250e719d0ce2e867666202e6d9bd6bb2036c73e472d6add7697795ad4601d7742b3e7d3523ad2366cfe1622dad2c3dc16da36f54b3de310bbdb8b9df762637f4c4ba9e3ab1b98d73030dbedf626bfddf0f85aebb645394571f2d0a675a041526dc2d819671487fc35509edf345c97ea911e74fe22769bcbb42f91ddff5ca7f7b91cd4e989687f5f906cfb7b3d9e5e8fd9ee9386a6610e86e321cc811e8f83d6f3a05d6f8c763da01dd5c1f35f0b93766b3c1e5a6f011ebac6e9021f5d2b103f5e67b58e03b7dfef75457093af1b185b22180bc93386d73a2d1e23ad1780917c6b80a79b49337f5f2ff3f4c1f3729d57873e5b037556c3b9311b51d71e774b33c3eda2efe07f0c92edd3eb18f4c2f18100f4093c0d03d08bda59cbc03335181e23383b3478a6ff9681cb07fa8f6400adc6c3c4d74c4433aac087e5ea085f108c1c0ac121591a0ac121d92a4f161c82a1faf6ab946d160d370c9c3c3ef4cc5303a70e9fb9fbf4d0c091bd83b72075ad478fa4712d4052f4d13239181eb4e90b929d8ca9f362954a9ec9f03a09dea73af9a7b7b431b5333ce94df1da54e7b52907756ae1bd290cedcc405cda36ad4f89889d6047146a3175145a4c8de0993ace5ae0c037f9f048a5f771f2a4ca6b0b1ed1d8263fcf136d10055c0adbcf3838fb9e3dd86b5d632605c33b9b7a4f7b456b77821d31b5672d3b226a47406d17644738ed88a63da9d9114b3b42694724ed08a41d71b4238c7644d18e20da11433b42d81c144700ed889f1de1b3237a9700db5781d77eabb667483b226747e0ec889bbdb2b25700f66ac45e7ddb2b453bfa61af10ec374b3bca60cfb6f64ac69ea5ed99d55e29da2b447b456faf70ed2cd506631b9dd69b8c6d36b6c5d85663db8c6d37b6c3d84e63bb8ced36b6c7d85e63fb8ced3776a9b1cb82e2e8fae5c6ae3076a5b1671abbcad8d5c6ae3176adb1eb8c5d6fec0663371abbc9d8cdc60e1aeb3776c8d86163478c0d183b6aec1663c78c1d37f62c63b706c53b744e1a3b656cd0d86963b7193b63ec6c509c31b333647646ccce80d9192f3bc36567b4ec0c969db1b233547646cace40dd1f146798ec4c919d19b2b3027616c08efadb51fe1706c5517c3b6aff92a0382a6f47e1eda8bb1d65b7a3ea7614dd8e9adb51723b2a6e47c1eda8b71de5b6a3da7614db8e5adb516a3b2a6d47a1eda8b31d657e24288e22db51633b4a6c4785ed28b01df5b5a3bc8f06c5515c3b6a6b4769eda8ac1d85b5a3ae7694d58eaada51543b6a6a4749eda8a81d05b5a39e7694d38e6ada514c3b6a694729eda8e4978c3d66ecaf8cfdb5b1bf31f6b7c6feced8df1bfbb2b1af18fb0763ff68ec9f82625efeb3b17f31f63563ff6aecdf8c7dddd8bf1bfb86b16f1afb0f63df32f6b8b16f1bfb8eb1ef1afb9eb1ef1bfb81b11f1afb91b1ff34f663633f31f653633f33f67363bf30f64b63bf32f66b634f187bd2d86f8cfdd6d8ef8cfdded853c1f0ec0676227f702b34d2de3f343470f2f450f3d060f3c9db4f0c1d3f7de2eee63b8f0f1d6b1ebc63e0ccd1138377e287dfe7ba2d9a46d874e64cffddcdc74f1d19b8ab79f0f6a1e6c1a3cd87066f3f75e42c7ee8cbee430bcf8dd87fe4487cb06f553d0dd2ef8e31e82fdde768826657e9b63d3116419e1acb8766568fad4197bab30e7d7bbfa278b5db7cf6c4e05073bef994f9db7fc27c66e0486b33be77d6887c76a8f9ec50ff99a1e6a367064f36b7b5e276af9d328646d4348de143ad4da36f79f0ffd2fd24f2250a0400", + "packedBytecode": "0x000000028df71de500000047d21f8b08000000000000ffed9d779815c5b6f67b604064cf8898b3830915c56118e20cb03127cc2822220cc3080a0c51cc98250773468292b380802020a227e7e4497a3c9e74ef3de73cf78ffbddfb05bfdbb577ad3bef14d5c3ecb16bf3eed9d5cf53b3abd754f7fad5dbabab53755741909efe19a6029d6f19a6b3820327f97f52ff967eb3a94b8ceb2a75c95990239c2d7284b3658e7016e60867ab1ce16c9d239c87e508679b1ce13c3c464ec5d622a83fc5cddbd681ae713326724cd3a21cd0b438c7343d2207346d17e4461b75648e70b6cf11cea37284f3e81ce13c2647388fcd11cee37284f3f81ce13c2147384fcc11ce937284f3e41ce13c2547384fcd11ced37284f3f41ce12cc911ce0e39c279468e709e99239c67e508e7d939c2794e8c9c9d80b3a3fe3d57ff9ea77fcfd7bf52f602fd7ba1feedaceb58a8e72f525c61520f69ca8cff750d537998ba85a9bbf1bf1e61ea19a65e61eaadff57a2ff5711a6ca30f50953df30f5d31af40fd3c561ba244c9786e9b2305d1ea62bc2746598ae0ad3d561ba264cd786694098ae0bd3f561ba214c3786e9a630dd1ca65bc234304cb786e9b6300d0ad3ed611a6cb0dc11a62161ba334c43c37457988685697898aac234224cd5611a19a69a30dd1da651611a1da67bc2746f98c684696c98c685a9364ce3c334214c13c334294c93c334254cf785696a98ee0fd303617ad0d0eca1303d1ca647c2f4a8c1392d4c8f85e9f1303d11a627c3f454989e0ed333617a364cd3c334234c33c3342b4cb3c334274c73c3342f4cf3c3b4204ccf85e9f930bd10a617c3f452985e0ed32b617a354caf85e9f530bd11a637c3f49666911d616198de0ed3a2302d0ed392302d0dd33b617a374ccbc2b43c4c2bc2b4324cabc2b43a4c6bc2b4364cebc2b43e4c1bc2b4314c9bc2f45e983687694b98b686e9fd306d0bd3f630ed08d30761da19a65d61fa304cbbc3b4274c7bc3f45198f685e9e330ed0fd32761fa344cdf0ad3b7c3f49d307d374cdf0bd3f70dcd7f10a61f86e94761fab1b6fd44fffe549795fb773f0bd3cf75fe17faf797faf757faf73363995f87e93786edb761fa9d61fb7d983ed7f92ff4ef1ff4ef97faf78ffaf72bfdfb27fdfb67fdfb17fdfb57fdfb37fdfb2ffaf75ff5efbfe9dfbfebdf7fe8df7f8669538774be4d5037258398daa8f29ad4b31f11bf63507f525ab4d4ff93df126d2fd4f3f22bdab5d2f3ad0c7b6b3ddfda584f1b3ddfc6b0b7d7f3ed0dfbd17afe68c37eac9e3fd6b01fafe78f37ec67e9f9b3c09e08e0deb0b62b5b4b6d2a009bc46b0bb0b5d2b696606b2dab03db61dad60a6cb27d5b83ed706d3b0c6c6db5ad0dd812da76b86819a6226d4b0671c54ae970b5dee2b8d7ab9f971d113fef08b5de768e788f8c9f77a45a6f7b07bc2a3e8ed2eb3a12e2e6686d6b0fb663b4ed28b01dab6d4783ed386d3b066cc76bdbb1603b41db8e03db89da763cd84ed2b613c076b2b69d08b653b4ed24b09daa6d2783ed346d3b056ca76bdba9602bd1b6d3c0a69bdce074b09da16d25603b53db3a80ed2c6d3b036c676bdb99603b47dbce029bb4bf67834dce17cfd136d5761c5e00cb68bbb45ba965a4cd06db79d25e83ed7c69abc1d649da69b05d00bec57621b43562ebac6dd26ea9fff5d6f96410d77e5256a3d65b11f77ac335abf5f6897fbda9678e7d833aad93e0a702b4eaa7f331f66bea82be0b74123f622f84fcd55056ca891e72ec1176758ca9d4f97e0d2cd7db58ae18ca545aea9f0ce2ad7f1f83a78fc1dc0af26e62b66b571fb38d9e328ed94150d68c3d390f6a8e313b00381cc46c0f1fb38d9e328ed91a286bc69e9c0b37c798bd03381cc46c959b982d2bf5319bbe6f1604f6d893eba1e618b3a38123fe98ede663b6f153c631fb049435634fae899b63cc4e058ef863b647953f3768f49471ccce87b266ecc9fd99e618b34f03878398adf1ed6ca3a78c63f62d286bc69edc2b6c8e31fb3c70c41fb3bd1cc56c571fb341fa196810d8634fee5b37c7985d041cf1c7ec087f7fb6f153c631bb1dca9ab127cf509a63ccaed379f59ce127fa39c32960fba9b69d0abcf1c776753747b15de6633bdd372408ec312acff39a636c7fa8f32a8e7f01fd11c4f64b6deb00b65f69db1960fb4cdbce847a39d807aafc3ed0e829e37de03750d68c6579b6dc1cf7811f01878398adf631dbe829e398fd1b9435634ffa3934c798fd3d703888d91a1fb38d9e328ed9ff84b266ec9dabf3cd3166a5afa93a5ff8429f2f9c0fb63f685b27b07da96d1780ed8fda7621d8bed2b6ce60fb93b65d04b63f6b5b29d8fea26d5dc0f6576d2b03dbdfb4ad2bd8fe45dbcac1f6afdad60d6cffa66dddc1f6776deb01b67f685b4fb0fd53db7a699b7ade257dafe4bcb50df0278378b7adf4bb9475cb7c972cf86e67f86e9745dfed0ddfed2dbecb1cf84e800f990a8cf924e4cbdcf29416030ffa2a8fdf575755f7ae41e3eb5e0e3cdd1cd43d013e1ac3d30d78bac7cf93eaffdb23fef5a6b6715743d304f8ea0af5eae9a05e05e04bd62df3e2af186cd8b6f6b430f68a9fb1ac007cc9ba65be17308a0ddb7a79e74af61f753cec5850c7eb605f4a9d13893ff96e997094835dca5cd5a18ead93662b82ffe371afbb61731497a9b8105fb26e99177f45509feed9672c6b2c633783d1551b5100be64ddde77dd76903c1ec71d5ceb58db34f15d9105dfbd0cdfe5866f6c3b656ae8d8d60b9863bfe6d4c7b6caf8d75b8ad727726d287ef0fc01afe1e2aa13fa966b43f123f642c85f57505756ca891ed20e0bbb8a65d996c86e2ed7d358ae18ca5458ea9f0ce2ad7fa5c1536930ab6d72091c0b1dec0fa918a8303864be1cb4ab8cd0ae02b49332e78276aedab3de068fcc77071e69c77a008fab6ba2289e6c5c8f1dcc379ec3e2f5b3fc1fcf035c6daf2e06a3ccdbb6572f60b49dab38b89e69f05ca51b308aad37f07475a459d476ed4ae2db41aca4da23f121e7e6b2ff7607bb94e9a55fa8536de53dd056ba88118c47991a7bcd1bff762a4b5d8377cb8007b79d83ebaa2e8ee2b114efdf7c1dc41b6b66bbd4cdd02aea1e8fabb6bcabc123f3e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333f333e4fc27e5b52ae3b09a3d9ffcdd57dfed4f70ff5ba64fdeab9ceff71da1facac14fbc7483f88f38d3a174299e2167565ff3ff407339f53611fc9ee6eb54b6d4bec8f998479f1877dad705b32f4772a89cd77d90857cfdbd437c0d47734cdbe9fdd2d9abae8ff8c9a16189a627ffc0b0c1e15a7952debd85c3cfbcbf459246a25f9389fed1507f6588f7fbb94d57b66dd22a8df7ee071c655ff1d69abe5797985e1bb10ca9cdca26edb48df2a1963b8abb11cf6fb9175cb32e783bdd258773bbdac70b432d6df03969532a7419bbaa7459d660edacab24cfbaee373f3f88fc3e9e7f85d33e0e9023c2eda1947e71ba5b80fc4fd1cdfec9f663b8f9132d8b7cf41bfca06fb3b893fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8ac77cd68aefd796933066a9ef43ea79867cab4cd69ffa5e708b3abfae9fc3c933a74e469df1ddd17fb6a82bbb49e78b8203fb3b446d4b57dfa788da96e20fbf3d83cf825c3cd72d005fb2ee328b16922f89cd77fa39be8bb121e4397e5743d7728ba6aef6577cc68a9ae2fedacde0c167a351dff629336c2efb0e45c585f8c37da90c6c92c7f7a35d6c673c9698fd7ac41f3ebffe8ed6b65de06adb9795ba6c37f0bb29c9e0c0f8c6efa9fc10dabe1feb3cf6e1c0be235f58fe2f5343cfa9453f556707dfd72c2d8075c9f6b57ddbb33fb0c6e4bb0baeab40a7fe86068590ffbc455d59292765456b6157fb887c0306d9cde5ba19cb154399be96fa278378eb6f7e6bb59fc1acb6c9cf20cebe80e3bfab36a96f8446e7834652c6f1371badfd2bcd7e85d88eb636cac8b2f82dbabf421b15d57fd4760c707d1c9375db8e63e671a131fd3cf3bd9fd67f417b11773fadff8218c27e5a81b1fe4eb07ee16a1d441f5ba4ccff33d66f9e93cb32d80fec7ff613f89e4b99ce67724e7ea8aeaf6ce7e4b85c54dd15337e072d192333c604b2e079829469abb5966d5619c1ddcbb26c71c4b2a295f9adb0a2e040fddc7c672dbdcff733ea22718ddf20973247435ddc9cb7a4cf015d7d532e097552f9324b5da5cc09b0af9da4f309d84eb8df9e67f9bf4c0d9d03e218ee17c75fe7d4f6bd043893e0077d5f0aac31f9ee82bee51c50fc88bd10f2e7b6ac2b2be5440fd15ad8d53e22e751c86e2e57612c570c65fa5bea9f0ce2adffc506cfc506b3da26a7429c9d07fdd05db5d5fd2334ea041a4919bca768fb0ea8ed5e87abf737a2cea5f0fd25f3fc0a8f936ece9bece7b1e67d35db394227831fcf117a403b9bb09435ef17caf132ce7ec3f8ae440ff08bef4ab8fa76736fd02d09f3785e70287dbbf88eadf217356642ef2cf88e1a33211bbedb1bbedb67d1b7d7dc6bcea4b983310852ef9fe1374bd5d4d079298e4b20cbb500461763392482fadf1e3f18238eef20cbb5044617c7874cbf7dde031865b9426074f16e298ebfd11846fcc6301ee785d1c1b762bb34f55bb1784faf353032bdb389cfa60e034617e7c54d7d570fcfe7dbc0afab7189ba66c058068cb2dce1c0e8e2de385ecb348611af8b64b9b6c0e8e21956a6e33be1b7e7f1deb24bc6868eed8efba294657aefa5d22d4f83e71ae8dbc1b886292df03ee3c1b4e8e396a7c1731ff4ede0be5f4a0b1c67f0605ae0b34117e31e2682facfe10ec683cf2f65b9a38031e988b15f068c4960fc9f7bc5c0d8df11633203c6fec028f66380d1c1fdd71463ff0c18f13ea52c772c305ee288f1e20c182f014659ee386074712f35017e1bc3782930ca72c703e3658e182fcd80f1326094e54e00c6cb1d315e9601e3e5c028cb9d088c573862bc3c03c62b8051963b0918af74c47845068c5702a32c7732305ee588f1ca0c18af024659ee1460bcda11e35519305e0d8cb2dca9c0788d23c6ab3360bc061865b9d380f15a478cd764c0782d30ca72a703e300478cd766c038001865b91260bcce11e3800c18af034659ae03305eef88f1ba0c18af074659ee0c60bcc111e3f51930de008cb2dc99c078a323c61b3260bc111865b9b380f126478c3766c0781330ca726703e3cd8e186fca80f1666094e5ce01c65b1c31de9c01e32dc078b38571a023c65b32601c088cb2dc05c0786bfc8ca96be9811930de0a3cb7c5cf93d2ecd60c786e73cb93faaedead165fb7c7ef2bb52d06058daffbedc033387e9ed4b6b83d031e612886e550b33be2674c69363803c63b806748fc3c29cdeec880670868768745b33be3674c69362403c63b816768fc3c29cdeecc8067286876a745b3bbe2674c69363403c6bb806758fc3c29cdeeca80675850a7d95d16cd86c7cf98d26c58068cc381a72a7e9e9466c333e0a902cd865b341b113f634ab3aa0c1847004f75fc3c29cd4664c0530d9a8db06836327ec69466d519308e049e9af879529a8dcc80a706341b69d1eceef819539ad564c07837f08c8a9f27a5d9dd19f08c02cdeeb668363a7ec69466a332601c0d3cf7c4cf93d26c74063cf78066a32d9addeb88f19e0c18efb5f0c4fd9dec7b2cbec63aaafb98a0f175178662580efb498c73c4383603c671c028cb613f895a478ce33260ac0546592ee198b1a17e12b5e07b7cfcbe53ed526dd0787dc6bbe569b09f04fa9ee0488bf141e3b598e096a7c17e12e87ba2232d26048dd76222f04c72a045027c348647188a6139ec2731d911e3a40c182703a32c87fd24a638629c9c01e3146094e5b09fc47d8e18a764c0781f30ca72d84f62aa23c6fb32609c0a8cb21cf693b8df11e3d40c18ef0746590efb493ce088f1fe0c181f0046590efb493ce888f1810c181f0446590efb493ce488f1c10c181f0246590efb493cec88f1a10c181f0646590efb493ce288f1e10c181f0146590efb493cea88f1910c181f0546590efb494c73c4f868068cd3805196c37e128f39629c9601e363c028cb613f89c71d313e9601e3e3c028cbddeb98b1a1eb97c79bb9efa86b95e6ee3beabaa4b9fbf671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98f7326df4f38f09d001f321518f349c80b43312c77af676cd68cc853121f4f29d61d7d3d4950f7272d3c058eea8ebe9e22a8bb30e41ae31339c0786f0e307a1dd37d109bc2a8789e76c4f354063c4f03cf338e789ece80e719e079367e9e544c3d93018f3014c372f7e600e31339c0e875f43a32317a1df34747cfe8193da3673c148cb9d0867bc69c88c7b2a6322a9ee9f1f3a4347b36039ee9a0992c779b5bc6b2a6322a9e19f1f3a4349b9e01cf0cd06cba4533078c654d65543c33e3e749693623039e99a0d90c8b660e18cb9acaa87866c5cf93d26c66063cb340b39916cd1c3096359551f1cc8e9f27a5d9ac0c78668366b32c9a39602c6b2aa3e299133f4f4ab3d919f0cc01cd665b3473c058d65446c533377e9e94667332e0990b9acdb168e680b1aca98c8a675efc3c29cde666c0330f349b6bd1cc016359531915cffcf879529acdcb80673e6836cfa2192be3bd39c0f8440e303ad6b1aca98c8a6781239ef919f02c009ee71cf12cc880e739e0793e7e9e544c3d97018f3014c372f7e600e31339c0e875f43a32317a1df34747cfe8193d63668c4fe600a3dfd69e9195d1c1f55583efd03cd7cc7d47bd43d3dc7d47bd43d3dc7dfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc73993ef17e2f75d96e937665e001e17dfbc7154cf52b5de17f5babe8e513fa5d54b8656cf195a1543991741bf971ce857007e65dd322ffe3265ee48c0ecc877d911e13a0e87fa8b8f270c3d94ff971dd53daaad7fb999fb8e6aeb9bbbefa8b6beb9fbf671eee33c1f7cfb38f7719e0fbe7d9cfb3867f18df95641dd79bb7cff54ade3159d2fd4f352fe49b04b994987a57fdb057e1f72e1dbef43fe58910fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671ce17e7180f9559e0090c9ea0019ef9643c53c8786691f18c22e31942c6733d19cf25643c0f93f19493f18c27e31941c6732b19cfd5643c1791f1f425e3994ac6d38b8c673619cf3d643ccf90f10c25e3b9918ce732329e47c978cac8782692f18c24e3b99d8ce75a329e2419cf03643c3dc878ce23e3194bc633878ce75c329e61643ccf92f1dc4cc67304194f3b329e2bc8789e22e3b9908ca7828ce731329e79643c93c978ee26e3b9838ca7948ce73a329ece643c1793f13c44c6d38d8c672e194f2d19cf74329e2a329e81643ce793f15c45c6d3928ca70f19cf02329efbc8787a93f18c26e3e944c6732719cf0d643c9792f13c42c6d3958c670219cf0c329e6a329e41643cd790f1f423e3b99f8ca72719cf18329e8e643c7791f1dc44c6938def9966c25344c6534cc6733919cfe3643cd3c878ba90f14c22e39949c65343c633988c6700194f7f329e07c978ba93f18c23e3194ec6730b19cfd3643c4792f1b427e3b9928ca7808027111c38864902feff02d85a18cbaacfbeceee50f7ff57b5bd052cf39aceb7b4acfb55b0c9b7645fb32c8b3abd0a7549ea7ce9379b523aa1af24cc8bbf22e0788d84e74a329ef6643c4792f13c4dc6730b19cf70329e71643cddc9781e24e3e94fc633808c6730194f0d19cf4c329e49643c5dc878a691f13c4ec67339194f31194f1119cf0b643c3791f1dc45c6d3918c670c194f4f329efbc978fa91f15c43c633888ca79a8c670619cf04329eae643c8f90f15c4ac6730319cf9d643c9dc8784693f1f426e3b98f8c6701194f1f329e96643c5791f19c4fc633908ca78a8c673a194f2d19cf5c329e6e643c0f91f15c4cc6d3998ce73a329e52329e3bc878ee26e3994cc6338f8ce731329e0a329e0bc9789e22e3b9828ca71d19cf11643c3793f13c4bc6338c8ce75c329e39643c63c978ce23e3e941c6f300194f928ce75a329edbc9784692f14c24e32923e379948ce732329e1bc9788692f13c43c6730f19cf6c329e5e643c53c978fa92f15c44c6733519cfad643c23c878c693f19493f13c4cc6730919cff5643c43c8784691f1cc22e39942c6339f8ca7d2c2f382231e79df5dd62df32f90f876b01d4ad57a5f7754a737f4ba5ae9f50abff82b8432d3daa67fd5f30f5c56b8ccef13e0bb396f80466f38aa8b6c8f0263fba0ef571cf936c7e793f9579ab9ef7686ef7679e2bbbde1bb7d9ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb3867f2ede0daa00cbf93265381319f843c5e2fb8f8be9ca37ad6bb4efc3a46fd94566f1a5a99d756c550e675d0ef4d07fad9ae3d655efc65cadc918019e3a22488372ede8abf4e65aadfe1e1a0eb5b86be58af858e348d3a862c6ce6bea38e21cddd77d431a4b9fbf671eee33c1f7cfb38f7719e0fbe7d9cfb3867f2fdb6cec778dd588a3ed4f345b91e781bfc2ed6f98218fdaa752dd2eb2ad4eb168ec5609732ff1b9e6bfa7ddeeff371f9f6c7361fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe99e3dccc4b7ff17381cd557ffea858ccc6bb0487d277542c3677df51b1d8dc7dfb38f771cee47b8903df09f02153437dfc9600cf22073c8eea997ab6b1d4a8d30b469d8aa10c1ee3973aa86701f89575cbfc52e091a912785cc44163b639f2cc27e39942c6338b8c671419cf10329eebc9782e21e379988ca79c8c673c19cf08329e5bc978ae26e3b9888ca72f19cf54329e5e643cb3c978ee21e379868c672819cf8d643c9791f13c4ac65346c633918c672419cfed643cd792f124c9781e20e3e941c6731e19cf58329e39643cc3c8789e25e3b9998ce708329e76643c5790f13c45c67321194f0519cf63643cf3c8782693f1dc4dc67307194f2919cf42329eebc8783a93f15c4cc6f310194f37329eb9643cb5643cd3c978aac8780692f19c4fc67315194f4b329e3e643c0bc878ee23e3e94dc6339a8ca71319cf9d643c3790f15c4ac6f308194f57329e09643c33c878aac9780691f1bc49c6730d194f3f329efbc9787a92f18c21e3e948c6731719cf4d643c45643cc5643c9793f13c4ec6338d8ca70b19cf24329e99643c35643c83c9780690f1f427e379908ca73b19cf38329ee1643cb790f13c4dc67324194f7b329e2bc9780a087812c181effe27e0ff6f824dde517f016cefe8fc22b0b5b0f868a9f34bc156a8f3b28ec3c2f4728703d78d3ab97a2f1f7d25615efc1501c73b243c5792f1b427e339928ce769329e5bc8788693f18c23e3e94ec6f320194f7f329e01643c83c9786ac8786692f14c22e3e942c6338d8ce771329ecbc9788ac9788ac8786e22e3b98b8ca72319cf18329e9e643cf793f1f423e3b9868ce74d329e41643cd5643c33c8782690f17425e379848ce752329e1bc878ee24e3e944c6339a8ca73719cf7d643c0bc878fa90f1b424e3b98a8ce77c329e81643c55643cd3c9786ac978e692f17423e379888ce762329ece643cd791f12c24e32925e3b9838ce76e329ec9643cf3c8781e23e3a920e3b9908ce729329e2bc878da91f11c41c6733319cfb3643cc3c878e690f18c25e3398f8ca70719cf03643c49329e6bc9786e27e31949c633918ca78c8ce751329ecbc8786e24e3194ac6f30c19cf3d643cb3c9787a91f14c25e3e94bc6731119cfd5643cb792f18c20e3194fc6534ec6f33019cf25643cd793f10c21e31945c6338b8c670a19cf7c329ecaecf094a977dba5af75005c382521bf1478163ad0c7513d4bf1bb065fc7b85ea5d5bb86566f1a5a15439925a0dfbb0ef42b00bfb26e99177fb9c8ac781ed779db77201e276114db42b73ca9fdf6f1a0fed4d07efb2ef0b868d71cd533b57f2d33eaf4b845772983b1bacc413d6dfb8ecc2f83ed906bcc8ae7299d17d604947b8a84516c4bddf2a4f6afa782fa5343fbd732e071d1fe38aa676aff5a6ed4e9298bee52066375b9837adaf61d995f0edb21d79815cfd33a2fac0928f73409a3d8de75cb539e803acbd4d0feb51c785cb43f8eea99dabf5618757adaa2bb94c1585de1a09eb67d47e657c076f0cc9ed9c6ac78e4d98eb026a0dc33248c625be694a7bc34017596a9a1766c05f0b868e71de99e6ac7561a757ac6a2bb94c1585de9a09eb67d47e6575a7c9704f16ab1aa115aacb2f0accab216e22f53e62539c8ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9ebac26afb3d7d9ebec758e83d9ebec758e62f63a7b9da3981974563cf2ed4a614d40b9674918c5b6dc2d4feabda06783fa5381319f84fc2ae059e1401f47f54cf5215f6dd4e9598bee5206f7afd50eea69db77647e356c874c9857e620b3d7b969cc8a67bace0b6b02ca4d276114db0ab73ca9766c7a507f6aa81d5b0d3c2eda7947f54cb5636b8c3a4db7e82e6570ff5ae3a09eb67d47e6d7c076f0cc9ed9c6ac7866e8bcb026a0dc0c1246b1ad72ca53967abf7146507f6aa81d5b033c2eda7947baa7dab1b5469d665874973218ab6b1dd4d3b6efc8fc5ad80e9930afcc4166afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9eb9c3f3a2b9e993a2fac0928379384516cab9df2744d3d779819d49f1a7aeeb01678d6c4ce937eeee040f7d4738775469d665a749732b87fad73504fdbbe23f3eb603b3477e69539c8ec63233bcc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5cc101b8a6796ce0b6b02cacd226114db1ab73ca9ef1ecc0aea4f0df5db59073c6b1de8e3a89ea97e3beb8d3acdb2e82e6570ff5aefa09eb67d47e6d7c376f0cc9ed9c6ac7866ebbcb026a0dc6c1246b1ad75cb936ac76607f5a786dab1f5c0e3a29d7754cf543bb6c1a8d36c8bee5206637583837adaf61d99df00dbc1337b661bb3e299a3f3c29a8072734818c5b6ce2d4faa1d9b13d49f1a6ac736008f8b76de513d53edd846a34e732cba4b198cd58d0eea69db77647e236c07cfec996dcc8a67aece0b6b02cacd256114db7ab73c6509a8b34c0db5631b81c7453befa89ea9766c9351a7b916dda50cc6ea2607f5b4ed3b32bf09b643ae312b9e793a2fac0928378f84516c1bdcf2a4f6af7941fda9a1fd6b13f0b8687f1cd533b57fbd67d4699e45772983b1fa9e837adaf61d997f0fb643ae312b9ef93a2fac0928379f84516c1bddf2a4f6aff941fda9a1fdeb3de071d1fe38aa676affda6cd469be45772983b1bad9413d6dfb8ecc6f86ed906bcc8a6781ce0b6b02ca2d2061141b1e2f1638e22936788a2d5a1c2adf6abe42e78bf46f02fe5f018caedac30506a3cc638c23af6bcdda193ced0ccd0ea56f55ff4a9d3f42ffe2f6aa044686edd52e0b9ab53778da1b9a1d4adf4a8b3e3a7fa4fec5edd5071819b6577be071d03e97270c1e353574beb1d9b13e8eea993adfd812d875c7e39094c163f71607f5b49d4bc8fc16d80e9ed933db9815cf409d17d604941b48c22836bc4ed91a3f4f79c2e0515343edd856c7fa38aa67aa1d7b3fb0ebbe1574973218abef3ba86701f89575cbfcfbb01d32615e9983cc5ee7a6312b9e413a2fac0928378884516c5b80675bfc3ce50983474d0db563db1cebe3a89ea9766c7b60d77d1be82e6570ffdaeea09e05e057d62df3db613b64c2bc320799bdce4d63563c83755e5813506e3009a3d8de079e1db1f3a4c703421e3535d48eed70ac8f9b7aa6dbb10f02bbee3b40772983fbd7070eea59007e65dd32ff016c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a6788ce0b6b02ca0d216114db76e0d9193b4ffab903f2a8a9a1e70e3b1debe3a69ee9e70ebb02bbee3b41772983b1bacb413d0bc0afac5be677c176f0cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfcccdac7886eabcb026a0dc501246b17d003c1fc6cf539e3078d4d4d073870f1debe3a89ea9e70ebb03bbee1f82ee52066375b7837a16805f59b7ccef86edb0db337b660bb3e219a6f3c29a8072c34818c5b60b78f6c4ce937e7e8a3c6a6aa81ddbe3581f37f54cb7637b03bbee7b40772983b1bad7413d0bc0afac5be6f7c276c88479650e327b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5ee7fcd159f154e9bcb026a05c1509a3d87603cf47b1f3742d4d183c6a2a30e69390ffc8b13e6eea997eeeb02fb0ebfe11e82e6570ffdae7a09e05e057d62df3fb603b3477e69539c8ec63233bcc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5ec63c3334731fbd8f0cc51cc3e363c7314b38f0dcf1cc5cc101b8aa75ae7853501e5aa4918c5b617783e8e9fa73c61f0a8a9c0984f42fe63c7fa38aa67aadfcefec0aefbc7a0bb94c1fd6bbf837a16805f59b7ccef87ede0993db38d59f1d4e8bcb026a05c0d09a3d8f601cf27f1f394250c1e3535d48e7de2581f47f54cb5639f0676dd3f01dda50cc6eaa70eea59007e65dd32ff296c875c63563ca3745e5813506e1409a3d8f6038f83b84bf1141b3c32ff09816f355fabf345fa17b7572d30326cafe22c68d6cee069676876287dabfa8fd7f923f42f6eaff1c0c8b0bdda6541b3f6064f7b43b343e95b693141e78fd4bfb8bd260023c3f66a9f05cd0e657b7828f7ed4319a75ef343a779c121d4bce0106a5ee035a7d2dcc1f1a50c8f650130e09484fca7c0f3edf87952f7e53ecd80e7dbc0f3adf879ba38aa67a95aef77803daef52aadbe6b68f5a9a15531944186ef3ad0af00fccaba655efc7966cf1cc58ce7b6c29a80729f90308aed5bc0e3a2dd5075bf50af4bd6df2a4c9f1d53e7d7c5f312bc57dc4aaf5738c45f219499505257f6779aad08fe2fdb4dd5679f6173f40e7317db733b99177f4541d6eedd36782f19b570f1bc29d3e3fe3e0bcfd7f1f194e27e8ebef63aaa7b26cffef65a7862ac7b97a8e79e7be2af7baafde8acd725eb57fbe8bf1fe354f372dcf7a4fde86cd4b910ca0c28a92bfb1fd07ed8da0ad7fba69c939bfb668ba0ae3d13ae126d379f097daded52ee63288f6d4e85fec5fdb302eaeaaa5d8cbac784eda2d976bbd4de7c2e69fa2e065d3e26d5ccf69c0275acb470571270633c66733f9375db9e91551a3ab26986dbfa638b8e7d2cdc7d08b819f7eb3e868e6c9a1d6cbf1e68e11e48c0cdb85f0f347464d3ec60fbf5200bf720026ec6fd7a90a1239b6607dbaf075bb807137033eed7830d1dd9343bd87e3dc4c23d84809b71bf1e62e8c8a6d9c1f6eba116eea104dc8cfbf550434736cd0eb65f0fb3700f23e066dcaf8705f57564d3ec60fb759585bb8a809b71bfae327464d3ec60fb75b585bb9a809b71bfae367464d3ec60fb758d85bb86809b71bfae317464d3ec60fbf5280bf728026ec6fdbab1fdf659f7eb5a0b772d0137e37e5d6be8c8a6d9c1f6ebf116eef104dc8cfbf578434736cd0eb65f4fb0704f20e066dcaf27183ab26966dbaf1dbd4b98f1bb8dfb9dea931e637a7f063c1f018f8b98721407a58efab9a4faa6ee31b4da6f68856377ec05fd1cf48569f09b04e2cf337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993d333f337e97119faf48b98f4918c586cfa45cdce75775bf48af4bd6df2a4c038eabf3bb3776bf65a50586bf247088bf422873d2e975656fd46c45c181db0dc7e2c66db93bf63aa4b7a519ff322ffe8aa03e7b80c7c1fbf9299ebd06cf5e8b16f8de693cbecb46b8d1b8ac547d1feff0a06e3bef36ea839a7e18bbfffa9a16189a7ee8d87722a8bf3d8501a724e491c7c5b36147f54cb505bb8c3a991a1743998e50cf5d0eea59007e65dd32bf0b78646a013cae62303078028b3e325592f14c21e31945c6731619cf10329e13c878ae27e3399c8ce712329e87c978cac978c693f18c20e3399d8ce756329ea3c978ae26e3b9888ca7908ca72f19cf54329e5e643cf790f19c43c633948ce702329e93c8786e24e34990f15c46c6f328194f1919cf44329e91643c1dc8786e27e339968ce75a329ed6643c49329e07c8787a90f19c47c633968ce75c329e61643ca790f1dc4cc67304194f3b329e2bc8781e23e3a920e3b9908c673219cfdd643c6792f1dc41c6534ac6733c19cf75643c9dc9782e26e36943c6f310194f37329e5a329e2a329ed3c8780692f19c4fc6731419cf55643c2dc978fa90f1dc47c6d39b8c6734194f27329eb3c978ee24e339918ce706329eb6643c9792f1ec21e379848ca72b19cf04329e6a329e7d643c25643c83c8788e21e3b9868ca715194f3f329efbc9787a92f18c21e3e948c6731719cfc9643c3791f11491f11493f15c4ec6338d8ca70b19cf24329e1a329e33c8780693f11c47c633808ce730329efe643c0f92f17427e31947c6339c8ce754329e5bc8788e24e3694fc67325194f01014f2238f05b4c09f8ff5eb0c937833e025b0bcbfae439b59457c7c5451d0e5c770bcbba3fb430a04e3ba12e499d2ffd66534a27f4958479f157041c1f92f05c49c6d39e8ce748329e5bc8784e25e3194ec6338e8ca73b19cf83643cfdc9780e23e31940c6731c19cf60329e33c8786ac8782691f17421e39946c67339194f31194f1119cf4d643c2793f1dc45c6d3918c670c194f4f329efbc978fa91f1b422e3b9868ce718329e41643c25643cfbc878aac9782690f17425e379848c670f19cfa5643c6dc9786e20e339918ce74e329eb3c9783a91f18c26e3e94dc6731f194f1f329e96643c5791f11c45c6733e19cf40329ed3c878aac8786ac978ba91f13c44c6d3868ce762329ece643cd791f11c4fc6534ac6730719cf99643c7793f14c26e3b9908ca7828ce731329e2bc878da91f11c41c6733319cf29643cc3c878ce25e3194bc6731e194f0f329e07c87892643cadc978ae25e339968ce776329e0e643c23c9782692f19491f13c4ac67319194f828ce746329e93c8782e20e3194ac6730e19cf3d643cbdc878a692f1f425e32924e3b9888ce76a329ea3c9786e25e3399d8c670419cf78329e72329e87c9782e21e3399c8ce77a329e13c8788690f19c45c6338a8c670a194f25194f0b8307ffafde0ddba3f3f2eda042f8ff44ddb9bc9d5e97949167c4ea5ec507864dd57787a3fa7e10d44d4998df01f515f60f80e703473c3b0d1ed37711e42b41b3ed864d316e73c4b8dd6094f96dc028fa6d079eed8e7876183ca6ef22c8f701cdde376c8a71ab23c6f70d4699df0a8ca2dffbc0f3be239e6d068fe9bb08f20341b32d864d316e76c4b8c56094f9cdc028fa6d019e2d8e78b61a3ca6ef22c80f02cdde336c8a719323c6f70c4699df048ca2df7bc0f39e239ecd068fe9bb08f28341b38d864d316e70c4b8d16094f90dc028fa6d049e8d8e7836193ca6ef22c80f01cdd61b36c5b8ce11e37a8351e6d701a3e8b71e78d63be2d960f098be8b203f14345b6bd814e31a478c6b0d46995f038ca2df5ae059eb88679dc163fa2e82fc30d06cb561538cab1c31ae3618657e15308a7eab8167b5239e35068fe9bb08f255a0d94ac3a6185738625c6930cafc0a6014fd5602cf4a473cab0c1ed37711e4ab41b3e5864d312e73c4b8dc6094f965c028fa2d079ee58e7856183ca6ef22c8d78066ef1a36c5f88e23c6770d46997f071845bf7781e75d473ccb0c1ed37711e44781664b0d9b625ce28871a9c128f34b8051f45b0a3c4b1df1bc63f098be8b205f0b9a2d366c8a719123c6c506a3cc2f0246d16f31f02c76c4b3c4e0317d17417e3c68f6b661538c0b1d31be6d30cafc426014fdde069eb71df12c32784cdf45909f009abd65d814e39b8e18df321865fe4d6014fdde029eb71cf12c34784cdf4590bf196cc2db1b6c6fe87c2fb0bdaef33dc1f69acef700dbab3adf1d6cafe87c37b0bdacf3e5607b49e7bb82ed459d2f03db0b3adf056ccfeb7c5fb03da7f3fdc0b640e793609baff3fdc1364fe72f06db5c9dbf046c7374fe52b0cdd6f9cbc0364be72f07db4c9dbf026c3374fe4ab04dd7f9abc0f6acce5f0db66774fe1ab03dadf3d782ed299d1f00b62775fe3ab03da1f3d783ed719dbf016cf7eafc8d60bb4de76f02db7e9dbf056c9fe8fcad60fb54e76f07dbb774fe0eb07d5be7ef04db7774fe2eb07d57e78783ed7b3a3f026cdfd7f99160fb81cedf0db61feafc68b0fd48e7ef01db8f757e0cd87ea2f363c1f6539d1f07b69fe9fc44b0fd5ce72781ed173a3f196cbfd4f92960fb95cedf07b6cf747e2ad87eadf3f783ed373aff00d87eabf30f82ed773aff10d87eaff30f83ed739d7f046c5fe8fca360fb83ce4f03db973aff18d8fea8f3d2aea976f64f3a5f12c4dbce7e15d44d25e05bfca9327fd6f9d6461959b610ca9ca33b14aa671cea5ba6d20e4bbbac6cd20ebf013669875f079bb4c3af814ddae157c126edf02b609376f865b0493bfc12d8a41d7e116cd20ebf003669879f079bb4c3cf812da9f30bc026edf07cb0493b3c0f6cd20ecf059bb4c373c026edf06cb0493b3c0b6cd20ecf049bb4c333c026edf074b0493bfc2cd8a41d7e066cd20e3f0d3669879f029bb4c34f824ddae127c026edf0e3609376f85eb0493b7c1bd8647ff90a6cd236ef079bb4cd9f804ddae64fc1266df3b7c0266df3b7c1266df377c0266df377c1266df3f7c0266df3f7c1266df30fc0266df30fc1266df38fc0266df38fc13656e77f0236699b7f0a36699b7f0636699b7f0e36699b7f0136699b7f0936699b7f0536699b3f039bb4cdbf069bb4cdbf019bb4cdbf059bb4cdbf039bb4cdbf079bb4cd9f834ddae62fc0266df31fc0f698ce4b5bdd066cf2ac584da5df70c271785a802f614906f1b6fd3825218f7597a9928c673619cf28329e57c878ce22e31942c6730219cfe1643c6f91f18c27e35940c6b3948c670919cf9b643ca793f1ac27e35947c6733419cf07643c3bc8782e22e32924e39949c6f31219cf39643c43c9782e20e339898c2741c6338f8c673119cf22329ed7c9783a90f1ac25e35943c6732c19cf76329e6d643cadc978be22e3994ec6731e19cf0b643ce792f10c23e339858ce708329e76643c15643c1792f1cc21e3799b8c672119cfab643c6792f1ac26e35945c6534ac6733c19cffb643c5bc9783a93f1b421e379868ca7968ce739329e2a329ed3c8780692f19c4fc67314194f4b329e3e643cb791f1cc22e379998ca71319cfd9643c2bc9785690f17c49c6732219cf16329ecd643c6dc978f690f14c20e3994fc6534dc6f30619cf3e329e12329e41643cc790f1b422e3d94fc633838ce745329ee5643ccbc8784e26e3798f8c6713194f11194f3119cf5c329e1a329ed7c878ce20e3194cc6731c19cf61643ccf92f13c4fc6f32e19cf3b643ca792f16c24e3d940c67324194f7b329e5d643c3bc9780a087812c011804dfedf126cf21d9e7d60fb42e7f7804dbee1f316d83ed7f9c7c0f688c5d6c2c2270cd3c026efca7e0136b93ff328d8e49d89cfc126e70de25fcdafe870207f0b5846fcb4b4f0a3bfcf2d5c92c7ed2dcb248378b737fa4a06f66fde15188c879a672719cf2e329ef6643c4792f16c20e3d948c6732a19cf3b643cef92f13c4fc6f32c19cf61643cc791f10c26e339838ce735329e1a329eb9643cc5643c45643c9bc878de23e339998c671919cf72329e17c9786690f1ec27e36945c6730c19cf20329e12329e7d643c6f90f15493f1cc27e39940c6b3878ca72d19cf66329e2d643c2792f17c49c6b3828c672519cfd9643c9dc8785e26e39945c6731b194f1f329e96643c4791f19c4fc633908ce734329e2a329ee7c8786ac9789e21e36943c6d3998c672b19cffb643cc793f19492f1ac22e3594dc6732619cfab643c0bc978de26e39943c67321194f05194f3b329e23c8784e21e31946c6732e19cf0b643ce791f14c27e3f98a8ca73519cf36329eed643cc792f1ac21e3594bc6d3818ce775329e45643c8bc978e691f124c8784e22e3b9808c672819cf39643c2f91f1cc24e32924e3b9888c670719cf07643c4793f1ac23e3594fc6733a19cf9b643c4bc8789692f12c20e3194fc6f31619cfe1643c2790f10c21e3398b8ce715329e51643cb3c9782ac9785a5878f639e2916fc5c8ba657e5f33f7bdc3f0bd234f7c6f337c6fcb13df5b0ddf5bf3c4f766c3f7e63cf1bdc9f0bd294f7c6f307c6fc813dfeb0cdfebf2c4f71ac3f79a3cf1bdcaf0bd2a4f7caf307cafc813dfcb0cdfcbf2c4f73b86ef77f2c4f712c3f7923cf1bdc8f0bd284f7c2f347c2fcc13dfccd7dfea3b61d2577997fe4dc0ff2b80f12d478cfb0c46997f0b18c586dfa3ae70c41375ed5e41e05b6921f7b2e4996702fe5f098cae62aac26094795b4ced009e4a473c51f71c2a097c2b2de45d6ce9539980ffe3f8cbae62aad26094795b4c6d039e3e8e78a2ee95f421f0adb490779fe59dbf04fc1fc75b7715537d0c4699b7c5d456e019e88827ea1ecf4002df4a0bf956987c932601ffc7f1195dc5d4408351e66d3185e3e70e72c413756f6a10816fa5857c6b57be799980ffe3f84dae626a90c128f3b698c2f1e3063be289baa73698c0b7d2429e05cb37da13f0ff21c0e82aa6061b8c326f8b291cef6688239ea87b8143087c2b2d86eabcf4b14ac0ff8702a3ab981a6230cabc2da6d601cf50473c51f7308712f8565a0cd37979872301ff1f068cae626aa8c128f3b6985a033cc31cf144dd7b1d46e05b6951a5f3abf56f02fe5f058cae626a98c128f3b6985a053c558e78a2ee195711f8565a54ebbc7c732e01ffc7f1df873962ac3218657e18308a6d05f0543be289bad75d4de05b6921dff65fae7f13f07f1c8fd5554c551b8c326f8b291c0fbac6114fd43dfa1a02df4a8b513a2f63c224e0ffa380d1554cd5188c326f8b291cbf7294239ea8670ba3087c2b2de4db5c4bf56f02fe5f0b8cae626a94c128f3b6985a023cb58e7816193c8b2c5a1c2adf4a0be9cbbd58ff26e0ffe381d1554cd51a8c326f8ba945c033de114fd4b39cf104be9516f26dedb7f56f02fe3f01185dc5d4788351e66d31b510782638e2897a0635210bbea39ea764c377d4b3816cf88ebacf9d0ddf51f76cb3e13beafe63367c47dd4bcb86efa8fb42d9f01d758f231bbea3aed7b3e13beada331bbea3aea3b2e13bea9a201bbea3ce6fb3e13bea5c2d1bbea3ce3b7c7beedbf3b87d1fca73877c6dcf0fe531f4501e4bfcb581bf36c8966f7f2cf1d706d9f29dafd706be3dcf7e7b2ed75f0541f4f5d83b8e7c2f317ccb3c3e6759e2c8f722c3b7cce33383458e7c2f347ccb3cdeff5ee8c877b1e15be61766c1773bc377bb2cfa6e6ff86e6ff1ed607b972582fad7dfc2805312f218036f3bd0c2513d4bd57a17eb757d1de37a6df76dccfda518ca2c06fd5cb71db26eb3edc845668c8b82f87c9726c0877c974cd9e4f9f11b609376ff75b049bf80d7c026c7a657c126cfa45e019b3cb37a196ca3747e3fd8e4d931f6d997e7ff5bc156a5f3d8577c98ce6f069bf4a5c23ecad21f6e13d8a44f23f68d957ea91bc0267d8bb14fa6f40f5f0736e9e38f7d01e53d8d356093776db00f9abc2fb50a6c7b741efb3ec9776856806d9ace2f07db1f747e19d81ed6f9dbc0f67b9dff0a6cbfd3f985607b48e7df06db6f757e31d81ed4f997c0f61b9d7f116c0fe8fc0b60bb5fe7f15db65febfc4eb07da6f3f80ed5549ddf01b65fe93cbebb739fce6f03db2f75fe79b04dd1f9e7c03659e71780ed173a3f1f6c3fd7f979609ba4f373c1f6339d9f03b6893a3f1b6c3fd5f959601ba7f333c1f6139d9f01b6b13a3f1d6c6374fe59b0fd58e79f01db8f74fe4bb0dda3f38bc0d642e797804dc68cc47e2a853aff0ed85ae93cf63f92effb4f00db613a3f1e6c6d74be166cf26db8516093f1a06bc096d0f96ab015e97c15d8e4fc6c18d864fc93a1609373a921603b52e707834dce7b06814dc6b31c0836f906691fb01da3f39560936feb5780ed389ddf07361973ec2db0c977ebf6804dc6627e146cf2bdea69603b59e7ff00361987e561b09daaf3bf07db693aff3bb0c9373c1f025b89ceff166c1d74fe41b09da1f3bf019b8c91f500d8ced2f9fbc1266307ff1a6cf2bde7cfc0d651e7a782ed5c9dff15d8642c91fbc026e383fe126c9d747e0ad8e43bdc93c176a1ceff026c32dedfcfc126df189e043619d7ed6760eba2f313c156a6f33f055b579d1f07b6729dff09d8bae9fc58b075d7f93160eba1f33f065b4f9dff11d87ae9bcb4336a7f56fbf95e3d9f0ce23b2f53fe3e0aea4f0d5d1b0803f2c479ae5d0c3ce86b77ec752f4b9dd7cb7edf42af57626837f8de15bbeff435c5877a5d857abdbb0cdf8550e65cdd38a8e5e498df522fb7c7580eef63c9ba65998bc0bed358773b5ddf0f1dd57797c124dca88394b94033a963e30f74be0d2c13235beafa58622d000d714a425e18dc6855568ae7bd8de1f9107876c7ce93be5e771113b86fc57dbd6edec73563ad18caec02fd763ad00ff77559b7cc8b3fcfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccfccc8a67afcee3736529b79784516cbb81c7c57d7e7c0e2beb57cf75769e5ee77777ec7eeb3fdf6ba5d75b6ad4b910ca7c0dcf9cf6e87c11fc5fb65bd4b674f09cb0c16d29fe8aa03ef82c68af239edd06cf6e8b16922f89cd77d908371a9795aabe2cea19fb1e43d7bd164d5dedafbbf5ba0a0c4d717ffdc8e0c167a345c0fbb1fe4dc07a3e863a38d8c71b8c0bf187fbd26eb049fe236074b19df15822ed813c0fc767d352e657c673f1f8b77d59a9cb76e303a853323830be0ba1ccefa0edfb5ce7b16fc85ed0ed1f96ffcbd4d0736ad14fd5797bfc754e6ddf6dc099043fe8fb7d608dc977bd77680a74123f622f84fcdfa13f8794133d446b61c7f1ca91dd5cee2363b96228b3c352ff64106ffdb71b3cdb0d66b54dbe8438fb071cff5db5493b2234ba08349232bb41a33d8e78761b3cc221fe5419d9fead8d32b26c2194f95fd046a9ba483b2ff5c4be2d780c70751c135fb26e99b79d1b7f088c661d557c0c38ae8e7777ecbcb9d5ffebb092f42fb6eb71f5ff9275b7d3cb0a4760acbf14d62f5cad83e863cbff6cdf92baf5bbec5fb6c7a8b3b0a0ce52a65d49fa57c5d9e53a9fc9b9fea1ba6e8b3ad7dfe1802711d4bff6565343c7773cc67ce080c7513d4b6dc7ae9d469d8aa14c47a8a783f39806df05de0ebe5d6c73d442cea176195a1442990e25e95f693ba274c46bd50fb3529732ebf960a9a52e52a663495d5dda803d4e2697dbed7da8935aef6e4b5da5cc052575ba74d6f9046c27bc6fd2c7f27f991a6a0f702c9e2df1d739b57d37036712fca0eff7803526dff5be0522e7fbe247ec8590af2ca92b2be5440fd15ad8d53e22effc21bbb9dc2e63b96228b3d552ff64106ffdb7183c5b0c66b54dba94d4e5258e5cb69b5b23342a058da40cde3f96633bbe77673beeef76c41d75dcdf0d8c66bb89e72e2ed9f6186ce63d54dbf9a094c1733229734d49fa57b5b3094b59f3deb08bfb98f80e6a00f5088cbaca8431e0e0dab01caf9da49d123f9dc1be5be745e7ce86768550666049fad7e179b7f5dea5797d87d714c26dee5bf8eec7e0923a6e1c3b71b7fe2d02db27fad7d1755ab9ed9ea170d8ee190e2ba963c765856bbfa52ee635728be0c07bea5f1b65f1be5b43cb9979731c4aa5ef2746399b1fbce689ed5d8d2ea5a5c8d422b0df2ff8c8602f080e1c7353f6038c39f33e4a67633d781fa5b624fd2b6d9259566dfb7f3fa64e1fd98ea21db62718931f016352e74bbfd9d4c5567f99177f8af163a30e6edaaef4fb4a99dc07de033c2eda76476d74291e63dbc4b6de5e55b6e3ff478656597c5e6b3de69bcfdcdb18f9787c9755dbee3fd9b4d865e171f51c254a8b5d16dff169d17d84edf861d362a785676796b5d869f11da3163578dfb3212d3eb0f0b8b817d590161f587cc7a7458fd2869e6ba0163b2c3caeee3d446921fe3265de49c0dcc6c8c7e3bbbcca769fcca6c5760b8fabebe6282db65b7cc7a74597ee788fae212db65978e2bf3fd7b016db2cbee3d3a2672fbc87d79016ef5b785c3dd38dd2e27d8bef18e362a4ed5e8e4d8bad169ead59d662abc5778ce787dd6df7da6c5a6cb1f038b8efdaa0165b2cbe63d46238de776d488bcd169ecd59d662b3c5777c5a5475b3dd13b669f19e85c7d53de1282ddeb3f88e4f8be13d95ef4d8dd0629385675396b5d864f11de335542a2e3636428b8d169e8d59d662a3c5777c5a54a7ceb53634428b0d169e0d59d66283c5777c5a94a68ea9eb1ba1c57a0bcffa2c6bb1dee23bc6b8485d4fae6b8416eb2c3cebb2acc53a8bef188f23a9b858db082dd65a78d666598bb516dff1695193baffb4a6115aacb1f0acc9b2166b2cbe63bce7928a8bd58dd062b585677596b5586df11d9f165d53c7d4558dd0629585675596b55865f11d9f162353cfc45636428b95169e9559d662a5c5778ce79da9f6624523b45861e15991652d56587cc778de99ba7fb1bc115a2cb7f02ccfb216cb2dbe636c3b53e79dcb1aa1c5320bcfb22c6bb1cce23bc6f3ce9416ef36428b772d3cef66598b772dbe633cef4c1d47de698416ef58785c8d8112a5c53b16df31c645aaed5cda082d965a789666598ba516df31ded74ab59d4b1aa1c5120b8fabf11aa2b45862f11de3f548ea1edfe24668b1d8c2b338cb5a2cb6f88ef15951ea1c7c5123b45864e15994652d1681ef3db1fb4ef7e7161fd217eb42438b4228735a87f4aff4c58ad251d681fdcab02e6fc75e9774bfb2851175791bea2265ce82bab4099c8c5154eea8aea998790beaa4d6fbb1a5ae52e6bc0e75ba74d2f9046c93fda05b6fcbff652a30e6939017fd549ddf88bfcea9587d1d3893e0077dbf06ac31f9ee82be0b74123f622f847caf0e7565a59ce8215a0bbbda47ded4796437975b642c570c65deb4d43f19c45bff370c9e370ce6d47b0f106712476edaae34d39b111a5d081a4919ecb3f7b1231eb30fa170883f5546b67f6ba30cf6a1943217431b85fd4aa59e89e0c07e938edab22ec82eeb9679f1570cb63dc068d651c5c767d0f753c68a907124944dc685e80aebe961d8545d7b3aaaabf89275cb7c4f6094712a7a649fb1acb18cdd0d46c5d3db816638f6864c0d1d2f7a034f2f073c8eea993a0e551875ea69d4a918cae0bb8d150eea59007e65dd325f01be5d6c73d4428ec9e7195a14429961c6f963948eb20e15bf3d2c75e9ebb82eb26e6997fa66c177a5e1bb9be13b11d4dfce41d0f0fe5509cc7d1c30abf5f68b7fbda578de2631257eba419dfa830671d509d725e779fd0d6d0b213f05cef3a49c9495e397b0ab58966d89ece672bd8de58aa14c5f4bfd9341bcf5ef67f0f43398d536b907ceed1cec0fa918e86b70c87c37d0ae5f84767d413b2983c7bfee8eb4eb63f0c87c77e091739c0ab0c9b982f027e0ff5db3c06db67b15166eb1e13871dd2d8cdde2674c9deb74371865be1b308aad0ff0543ad2ccdcd6e719fae071b9b55146962d843233e1d898b09455fb5dc782ba7ab5d4f6d8de1dd36d7a6b077ae1388d01e813181a06a097d4b395039eb641dd588d9326d74e1c7ef7c89b46a61f3d0a5aa18189bf05966ab4001be65b5a6c41507f48ca42b0c99094adc0d6c2900587c294f232a49d0bb9500f5977a1c1d90658e2f48dc379cad450e81c063c2e4259858e0ce9a943e7b689a3278fc4f8686570362576d4ff5a36502e6a5daeb683b94f2461de8cc14247fe5b427d93302ffed4b629d6f9f1c347dcdb7fe2dd53c68e1c3779120a65eed8982f08ea6f00f3374a70573b1d060056181b875646bdb0c190ffc986691b3f67398e996b6a13803f99da826e873bd04dad5fc6be1d317ccc981ba6548d193de2f229e3464c1e5d3b0eb7661b43b9a82d2dff6f0d365b138f65d584cd162e7b98c5669b7094e136609323d7e160139eb6606b0979296f6e1927e1da11d62fbb94fa9f12a795aef861415d08c8e158b5ab6aff559f8f55a7416aa86335b4b1da9c6ae86275c7500d4dacbe62a7861e56430daba1854f0ad24307aba1824f0dd24301abaf5d9404e9a17dcf08d243f79e15a487e63d07f8be0dcce706e9d32e35b46ea7203d74aeba75a95e5d579f7953efd6abd377755b409df2aa4b3c75faa94e3bd5e585ba7da16e65a9533a75baac4e05d5e99bba1ce9a7b5ee1fa68bc37449982e0dd36561ba3c4c5784e9ca305d15a6abc3744d98ae0dd380305d17a6ebc37443986e0cd34d61ba394cb704e9e19d6f0dd2c3afabe19f6f0fd24343df11a4878dbe33480f297d57901e6e7a78901e8a7a44901ea67a64901ec2faee203dbcf5e8203d4ceebd417aa8ddb1417ab85e351cb61a265b0d9fad86f9554302ab2185d550c36a58623584b11a02590d8dfc60901e72590dd9fc48901ef6795a981e0bd3e3617a224c4f86e9a9303d1da4870757c3864f0fd2c38cabe1c76705e9e1cae704e9e1cdd5b0e76a3874354cba1a3e5d0dabae867957c3bfab61e15f0ed32b617a35483f92508f62d4230a75fb5f3d0653b7a8df0ed2b7ce1707e947dcea91bfea02a1ba84a82e32cb8374172ad5a54c75b1535d0e55174cd5255575d1555d9655176ed5a55d75f157af3ca85740d42b31ea1521f5ca947a854cbd52a75e3154af89aad72ed56bc4eab5eadd41fab6f8de20fda854dd0e578f06d42d7375fbfed3307d2b48c7e477c2f4dd307d2f4cdf0fd30fc2f4c3203dacb11aee580d97ac865656c330ab219bd550ce6a2868356cf467417ae8693574f56f83f490d8bf0fd3e761fa22480faffd6598fe18a6afc2f4a730fd394c7f09d35fc3f4b730fd4b98fe354cff16a6bf87e91f61fa675037cc36362427e9d6475fc104c3274f1e3976fce492c9b52563a78c993c7afc98074aa68e9e3caaa4f6be91136bc6d44ec585bfad179631c2fb4f9c38fc8192d1e3aa47de5f523b6572496d4d4955ed9471d5f50ee27fd10b9d72a0c7e1d5d5d1cefef39b90fedf263a3d5cb78b32fafa550dd7ada865130439aa290b756fd9b40a4dd44730b9d4bd397d1e5c32694cede492d29271e1dff0c05b3b756475e712fcdfa450e449934b264d1e3e717249cdc4dab1255d3ae37a1f6ddb844afc575b3730679fd434713aeaef2c3529c47e797a1314f88fd39b46dabae41b90b62d699ad3929226d4f09ca62c747513096f29899465d294aac913878f981cbdf0eddf64e1bb9a52cd714dace6a91d9ae0eccca62cd4bf43d308ef6a8ab31919380bfe1bc78b38aa8c5506009b2d6c6f00000028471f8b08000000000000ffed9d77741cc791c6679118164b1024c11ca04433015c2c12012630674a9464e5409004455a24419150b22c4bb224e79cb3e5749673ce675db4efce77bef339c83947c9e9feb9e77b77eff95df76c97f1a139b3c64253600db6e6bde2f6147aa77efd4d75ef6cf7ec301314b73f18cbb872b5b18b827337fa7b9f7bcd3fb5ad2dc163e539393329e1ac4a0967754a386b52c2599b12ceba94704e4a09e7e494704e4990d3b2550523b7a479a732e89a346336659ad6a740d35cca349d96024d1b82748c51d353c2d99812ce1929e19c9912ce5929e16c4a09e7ec9470ce4909e7dc9470ce4b09e7fc94702e4809e7c294702e4a09e7e294702e490967734a382f4809e78529e1bc28259c17a784f39204395702e752f7fa34f7baccbd2e77af2bdc2bbd67957b6d716dac71fbadc6565b36636ddedf0ac6da8d7518ebf4fed665acdbd81a633dee6fcdee6fbdc6d61a5b676cbdb10dc6363a1d3619db6c6c8bb1adc6b619db6e6c87b19dc67619db6d6c8fb1bdc6f619db6fec526397193b60ec72635718bbd2d8d38d5d65ec6a63d718bbd663b9ced8f5c66e3076a3b19b8cdd6ceca0b17e63878c1d3676c4d880b1a3c66e3176ccd87163cf3076abb113c64e1a3b656cd0d86963b7193b63ecacb12163b71bbbc3d89dc6ee3276b7a7d9338ddd63ec59c6eef5389f6dec3e63f71b7bc0d8738c3d68ec21630f1b7baeb1e7197bbeb117187ba1b117197bb1b197187ba9b197197bb9b157187ba5b157197bb5b1d7187badb1d7197bbdb137187ba3b137197bb3b1b73816ea086f35f636638f187bbbb177187ba7b177197bb7b1bf32f61e638f1a7bafb1f7197bbfb10f18fba0b10f19fbb0b18f18fba8b18f19fbb8b14f18fba4b14f19fbb4b1cf18fbacb1cf19fbbcb1bf36f605638f19fb1b637f6becef8cfdbdb17f30f68fc6be68ec4bc6fec9d83f1bfb17635f36f6afc6fecdd8573ccdffddd87f18fbaab1ff74beafb9d7afbbba342ff60d63df74e5c7ddebb7dcebb7ddeb77bcf77cd7d8f73cdff78dfdc0f3fdd0d88f5cf9c7eef527eef5a7eef567eef5e7eef517eef597eef557eef5d7eef509f7faa47bfd8d7bfdad7bfd9d7bfdbd7bb56baa973515cb9383e1ad2f48688cea389ab76b2a24fed260e466b5a8767fa3d766e7af71fbf44adad5bafd5acf5fe7f6ebbce34c76fb933d7fa3db6ff4fc33ddfe4ccfdfe4f69b3cff1cb73fc7f35fecf62f067f36803957e7b7be6ae7ca808ff2b50a7cb5ce570dbe3a3a1cf826395f2df8e8fcd6816f8af34d02df54e79b0cbeacf34d212d8dd53b5f5f9054aee4fbed7173491fd7ad434d4b9ef7b03d6e0313eff4e47907ec711b19786d7ecc70c79a0e7933d3f91ac137cbf96680cf0d417fee73d637dbf966816f8ef335816faef3cd06df3ce79b03bef9ce37177c0b9c6f1ef8163adf7cf02d72be05e05bec7c0bc1b7c4f91681afd9f91683ef02e75b02be0b9daf197c748fcb05e0bbd8f92e04df25ce7711f868acbd187c746d7889f3d971627206dee3fc344685efa1f1197ccb686c06df721a97c1b782c664f0ad84d8e45b05e30af95a9c8fc628fbb75e57ee0b92ea1385b04fac4dfab8e6c8f6b8eb933f6eb86eb72118d6ba0fe2ac05ad36ba7282f706b561ec8c338a43fe1a28ef82ba548ff4a0cf1962b79f27eb5c796389f7f57aefcb419d7511edef0b926dff7a8f67bdc75c0bede7c9d9f682e6eca8b7b273f66aa8ebe71e5df34cc49cdd0b1c0c39dba5393beaadec9c1d80ba7eeed175ef44ccd9eb80832167fb7972b690d79c2dce91054174eed1779f8998b3c78023f99cedd49c1dfd5676ce3e0075fddca3efbf133167ef008ee473b6bb5faf0d46bd959db32f83ba7eeed15ccc44ccd9878083216707749c1df55676cebe05eafab947f3821331675f091cc9e76c0f53ceb66bce06c5f5ce2088ce3d9aa39e8839fb0870249fb387757e76f45bd939fb59a8ebe71ead974cc49cfd902bdb7586afb9758685e0fbbaf32d02dee473fb4807536e1734b78bf7810441748ed2dadd44ccedc75cd9e6f1e370ef01f9bee57c1780efdbce7721f8bee37c1741bb18fa40bff681516f65f781ef415d3f97691d7922f681af020743ce1ed69c1df55676ce3e0175fddca37b1a2662cefe1038187276407376d45bd939fb47a8ebe7de32579e88394bf795daeb851fbbeb8515e0fb89f3ad04df4f9d6f15f87ee67c2de0fbb9f3b582ef17ceb71a7cbf74be3cf87ee57c6de0fbb5f315c0f784f3b583ef49e7eb00df6f9caf137cbf75be2ef0fdcef9bac1f77be75b03be3f385f8ff3d9f52ebaf7eacbce67cf2d69d417247b6ee91e4b3a36edaf1a87d80d5eec86718cdde8c56e8c88ddc2103b0b3168cb78fb7d506ee1e5c9e78291bfffa058ab938fd56edbde1a8cbeedab8127cfd0f62cc4180d4f1e78da92e709eff52d247fdcf01cb77a9a6621562bb4ab9da15d198845c7a67d8a97031f8edfed118c1dc9331632108b8e4dfb1dc0483efc3ca1cf75ea3ff6f37069669897a12f85d744148f9efd451cabc14f757e3f6b986d8563ab87bfe3676b9be763cacb302f28161d9bf6295e3db4a76dfc190ba365cc7b8c5c63440662d1b1fdd8d8df5bc65fb3519dd71cf8cec3985418eb98540f6ce3719d1277aea5c4e6f8bcca400c1adb48f302f8a9ce6cf783043bb6ed807197a1ff15cabd7ec3f120f93c2ee4b15f8f86a71d7838fa3e537fcde3e7fe9f826473add3d3aacdd32a07753a40bf4e06fd4a5d87503c6556666556666556666556666556666556666556666556666556666556666596cf8cf75fe0fa26d55b2584917c05e0e198e70f9f1fe58e45c7b7eb3adf86759de4d72d0a795cb3a47b0c977b6dae813a4f6686eb7e1fd6d3fdb5415cd35cc5abdda8eeb3a80fce5d8be55c438c5b078e5abf6c4e2c76e130d77a9b7d868a7d0e59aba7ebaa084d19ee5319a169c6d314ef535ce9f1d83c9d573dccc6b1f657ee5a246a45e524d7f6f01e03def3521c3f2817aa8291e3077ece74251e7be41a26ad977779b16ba0ceff6486cf0ddd8b4affcfa17fcf93add3ed1d9bdeb31cfcdddeb11bdc7b89a3d63b7e2bbc97eafc1f8ca96fad0afeac19c7fd1f382e07d056dcfaa08cebe6c97f0e17d7f1dbcbe0e9041e8e7186e97a238f7d20e975fc6e4faba8eb18aad305fa7533e817752d4afb144f99955999955999955999955999955999955999955999955999955999955999e533e36f4589350bf50a4218c7e9de87703d839eff42c7b7eb3a2fae1a8ecbbd0e476b4e2bbc36d7409daf540dd77db92bd707e7deef10772e19d6f34a9e4b8a570fedc1b520aedf7377783c1d115a50b939b1d8c575fce4351e5ec76ff7742d4468cad55f718d1535c5fedae6f1e0da687d70eebd255938ce78dc3b149717140ffb5207f8a88cbf8fe638cff859e2dfd743f170fdfa51a76d43c075ee0b79ce71630db4a92f3837bf6ba0ce0761ecfbb02be33d1c78efc863117fa7add43a35e9c7f22cbb7c71dd772d70f6411c8cbd0e58138add86b133ce280ef96ba0fc85aae1ba548ff420ad89ddf6117a2618b2fbef6bf3de97833a3d11edef0b926d7fafc7d3eb31db73f231c8b3c7e0f39f6b4cea89d16839684475f03a88eb9e3c7f8cf4ef6fc4fbf6eabc3a78cd4275be046354dcfda351f71c727d8ec5dd7318756ddc098c7e1bfdfb3c2bfd3eadc761bc48fa3eadc72187f03eadc03bfe0a383e71d505f19f2d54e7bbdef1fd6b727a0fde0746757e00e34583bb67b13e38f7fa1bef991a8fef5771f749533cbcaec1befd97da6e99d740fdbe049931279005af13a8ceafbc73d61dc3bd3ae2bd4fc6bc97b46a7165fcfee2eb6775e881f7f425a243b1cff77a6da1bcee81b6509dfff2ae0193bf6e295e0326dfd691d724340e7444b495eafc37f4b53fc2351e9d27fcde51577deedf692b750d48fad9368ff7f38131b684e703d7560fd7f59ff34b5a97fb7ce02eef7d129f0ffcbf906775701f3ad758bd2e46a315a011d5c1df06d1e7083ecb37ea3386ebdefeb8cf98a86750e2f8dc503dfe6cfebc5ad43502d5a1f7e235c22cc7dce074f6ebfaf385f47999e47dc3f85b8956888bbf956865d2330fbaf5c13e5e179ccfd879a6d871cf9cce8f43ecb8674e8f47ec462f76e338c656cd5573499a333c1339fcfd193eb3d46ea5ae4b892107efab4a0163750a186b52c0589b02c6ba14304e4a01e3e414304e4901e3d414306681f17c7eb633e85318ab3e5ce7abd4b506c66e61d2a29cffbf83f9ff522979ed83b119bed3855ab404a3d702bfe7713cfba1dcffeb8518f0ff2e989102c69929609c9502c6a61430ce4e01e39c1430ce4d01e3bc1430ce4f01e38214302e4c01e3a214302e4e01e392143036a780f18214305e9802c68b52c078710a182f4901e352654c8471252f6361ac8c9687e3fffc7b2affe718034f3eea9e53a6df9e94fdffad313f9fb46daccf8dc37b4b78ff4fb8a7f66c3b8e7b47ca7db65da9ff6f9589b1305646aefbd8f1773ca3e1c1df4546fdb68681b1305646aedfbfe06ff446c3d3059a754668c6c058182b23d7bd72e5decb89f7f4774568c6c058182b23de579d204fa85977193c6b40b3ee08cd18180b6365e4ba2f390b3146c3d3039aad89d08c81b1305646a6dfb6859af594c183bf01eb89d08c81b1305646cbb39649b3de3278d68266bd119a4962449ea49f93dd1b118be33783e5b69d1890714a0a18a7a68011ef93e018bf4add27d1cbab4f61acfa709daf52f749606c86dfc7845ae0ef21fe9216eb79794ade2781b137306981bf57f94b5a6c001e8edfcf6421c66878882107ef9b9102c69929609c9502c6a61430ce4e01e39c1430ce4d01e3bc1430ce4f01e38214302e4c01e3a214302e4e01e3921430e27755866bc592df5f364cf0d871df55267aecb8ef25133db6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae792e29761ae6f89571e231224f73723c796c3bc6ea13d0f6be089e0c53db31d626016d2786b4316e4c01e3da1430aa8ec57b10c7c268793633f16c2a836733f06c61e2d95c06cf16e0d99a3c4f98535bcae021861cbc6f6d0a1837a6805175541dadd92dffd436d55110631a745446655446653c1f8c6918c3953115f958182ba3e5d9963c4fa8d9d63278b68166f4be365ec6c258192dcff6e47942cdb695c1b31d34db16a119036361ac8c966747f23ca166dbcbe0d9019a6d8fd08c81b1305646cbb333799e50b31d65f0ec04cd764468c6c058182ba3e5d9953c4fa8d9ce32787681663b233463602c8c95d1f2ec4e9e27d46c57193cbb41b35d119a313016c6ca6879f624cf136ab6bb0c9e3da0d9ee08cd18180b6365b43c7b93e70935db5306cf5ed06c4f84660c8c85b1325a9e7dc9f3849aed2d83671f68b6374233a98c6b53c0b831058ccc3a16c6ca6879f633f1ec2b83673ff05ccac4b3bf0c9e4b81e7b2e479c29cbab40c1e62c8c1fbd6a68071630a185547d55112a3ea58393a2aa3322a63798c7d2960d473ad8c521919be5f95fc0dcda5133c768317bba14262c7fd8666a2c7d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cf35cf25c53e907cec42b9cf9839003c1ccfbc616a67de1ef77277ac3f25a89fd5ea0a4fab4b3dad7250e772d0ef0a06fd3210978e4dfb14af5ce6a70960668a5d98668e3105da4f31367a7ad8f85732b53d6eacbf7282c78e1beb277aecb8b17ea2c7d63cd73caf84d89ae79ae795105bf35cf35c4a6c2cd706c3d7edf4fc537b8ca7bb728ddb4756f2539dcb26155f1b02ed431cb1b50fe9674525c4d63cd73caf84d89ae79ae795105bf35cf3bc12626b9e6b9e57426ccd73cdf34a88ad79ae795e09b135cfe5e539e643d538f0041e4f50826783309eddc2787608e359238c67b1309e4e613c7385f11484f1cc10c6b35518cf14613ccb85f1540be3d9248c272f8c67af309e25c2785608e399278c67a6309ea9c2786a84f16c16c6b35a18cf3e613c7b84f1f40ae3592a8ca74718cf36613c5dc278e60be36917c6334b18cf4a613c59613cadc2786a85f1ec14c6d3228c6799309efdc278d609e359208ca749184fbd309e9c309e3a613ceb85f1ec12c6b35d184fb7309e85c2783a84f1cc16c6b34a18cf34613c0dc278b608e399248c6791309e39c278a60be36914c6335918cf783c6fa81c9e8c009e6c70ee33c9b2f0f703e0abf2de6bc7abb6a6e1bf5fe5fc55f09eab5db93ae2d857818f7e1b7e75c47b51a7aba02d7dae9c7f6a5ba813c6ea837d8a570f1c570be139208c67b2309e46613cd385f1cc11c6b34818cf24613c5b84f13408e399268c6795309ed9c2783a84f12c14c6d32d8c67bb309e5dc278d60be3a913c69313c6532f8ca74918cf02613ceb84f1ec17c6b34c184f8b309e9dc2786a85f1b40ae3c90ae359298c6796309e76613cf385f17409e3d9268ca74718cf52613cbdc278f608e3d9278c67b5309ecdc2786a84f14c15c6335318cf3c613c2b84f12c11c6b357184f5e18cf26613cd5c278960be399228c67ab309e19c2780ac278e60ae3e914c6b35818cf1a613c3b84f1ec16c6b341184f55040fc3ff7f19f2d0fd6b746cda3f202436c37908ffdfcf6b98da74ad3b56ad3b2ef153bc1aa8739dbb30b0f7a3e07b89cbbfdf10ef9dbb1634ba96a92d743e32def9618e5dc0fb2a0360083c7d82081e8efb5199da39220f13fcff67f356abeb3cadfc7397833ad7807ed731e81795db7fee03ee358dcc96873e3b88350bf536086124df95bc3c61bfdd108cdc4af5dbeb8087630c636a67d8bfaef7dab4214277aa83b97a3d433ba3fa0eed5f0fe7216dcc9667932b136b16ea6d12c248be6b7979c2feb52918b995ea5fd7030fc7f8c3d4ceb07fdde0b5695384ee540773f506867646f51ddabf01ce43da982dcf665726d62cd4db2c84917cd7f1f27464a1cdb495ea5f37000fc7f8c3d4ceb07fdde8b5697384ee540773f546867646f51ddabf11ce83322b7314b3e5a1df98106b16ea6d11c248beeb59793af25968336da5c6b11b8187639c67d23d1cc76ef2dab4254277aa83b97a13433ba3fa0eeddf1411bb3948568b9b47a1c5cd113c378fb31614af5ce66b52c8ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea6c37d55975569d55e724985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de39825e86c79e81931c49a857a5b853092ef065e9ef077415b83915bc6dbef83f2cdc07323833e4ced0cef213fe8b5696b84ee5407fbd741867646f51dda3f08e7e16019cc37a59059751e1bb3e5a167c5126b16ea6d13c248be1b7979c2716c5b30722b358e1d041e8e719ea99de138d6efb5695b84ee5407fb573f433ba3fa0eed533c6556e63866cb43ff870db166a1de76218ce4bb9995a710febe717b30722b358ef503cfc1c4798ae31883eee13876c86bd3f608dda90ee6ea21867646f51dda3f04e7a11ce69b52c8ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaa73e5e86c79e8ff0e21d62cd4db2184917c075979dac375871dc1c82de3edf741f910f0f427ce535c7760d03d5c7738ecb5694784ee5407fbd761867646f51dda3f0ce761a233df944266cd8df161d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e6396901b9667a72b136b16eaed14c248be7e5e9ef0b9073b83915ba9fb760e03cf21067d98da19deb773c46bd3ce08dda90ef6af230ced8cea3bb47f04ce83322b7314b3e5d9e5cac49a857abb843092ef102f4f388eed0a466ea5c6b123c0c331ce33b5331cc706bc36ed8ad09dea60ae0e30b433aaefd0fe009c076556e62866cbb3db9589350bf5760b6124df615e9e701cdb1d8cdc4a8d6303c0c331ce33b5331cc78e7a6dda1da13bd5c15c3dcad0cea8be43fb47e13c28b33247315b9e3dae4cac59a8b7470823f98ef0f214b2d066da4a8d63478187639c676a67388edde2b5694f84ee540773f516867646f51ddabf05ce43da982dcf5e5726d62cd4db2b84917c03bc3c61ffda1b8cdc4af5af5b808763fc616a67d8bf8e796dda1ba13bd5c15c3dc6d0cea8be43fbc7e03ca48dd9f2ec736562cd42bd7d4218c977949727ec5ffb82915ba9fe750c7838c61fa67686fdebb8d7a67d11ba531dccd5e30ced8cea3bb47f1cce43da982dcf7e5726d62cd4db2f84917cf879b19f8927e7f1e422b49888b11bbcd80d1512bbd18bdd5821b135cf35cf2b21b6e6b9e67925c4d63cd73caf84d8959a6baa79656a9e398f9a67cea3e619d55ca4e67f4a2e76278e2b5510eb18533b71eb8332cecfd1b64618cf62613c9dc278e60ae32908e399218c678a309ee5c278aa85f1e485f12c11c6b34218cf3c613c3385f14c15c653238c67b5309e5e613c4b85f1f408e3e912c6335f184fbb309e59c278560ae3c90ae36915c6532b8ca74518cf32613ceb84f12c10c6d3248ca75e184f4e18cf01613c75c278d60be3e916c6b350184f87309ed9c2785609e399268ca74118cf24613c8b84f1cc11c6335d184fa3309ec9c278320278b2c1b9bf47c1df1354838feeefdf0fbe67b8f201f05545c4a0e31c071fcd9fd231ec78b3aee95c862a78cfad115ccf888847716e8d78ef78e88eb1fa609fe2d503c7ad4278260be36914c6335d18cf1c613c8b84f14c12c6d3208c679a309e55c278660be3e910c6b350184fb7309ef5c278ea84f11c10c69313c6532f8ca74918cf02613ceb84f12c13c6d3228ca756184fab309eac309e95c2786609e36917c6335f184f97309e1e613c4b85f1f40ae3592d8ca74618cf54613c3385f1cc13c6b34218cf12613c79613cd5c278960be399228c6786309e82309eb9c2783a85f12c16c6b346184f5504cf01269eb8e7291c1010dbeee74117bb65e1efe3f13bc0031e23ed1f0346e4259e3c134fdc3328f20262dbf6d377095a83cbc2dff1775c5c3995f718693f2aa7f0beb4d54c3c71cfed582d20b6d582e62ee91e802cfc1d7fb7c09553ab3d46da8fcaa9465e9ef0ff966809466ea5ee35c23ec7710e99da99c7fe97e03334229f45dde26985cf501d8ffbe4e3c6038aa7ccca1cc76c7968ed8258f1f36c3c7ef7361ac6a8cf57069e707c6c0d466ea5c6c763c0c3f1f9c1d4ce701c3be1b5a9354277aa83b97a82a19d517d87f64f44c46e0e92d5e2e428b43819c173729cb5a078e5321f4821b3049d2dcf2a5726d62cd45b2584917c795e9e707c5c158cdc4a8d8f278187e3f383a99de19870ca6bd3aa08dda90ef6af530ced8cea3bb47f0ace4339cc2752c8ac3a8f8dd9f2d01c32b166a15e410823f98eb1f214f25968336da5c6b153c0c331ce33e91e8e63835e9b0a11ba531dec5f830ced8cea3bb43f08e7419995599995599995599995599995599995599995599995599995599995599965335b1efa6d23b166a15ebb1046f29d64e529ae3bb40723b752eb0e83c0c3b12ec3a47bb8ee70da6b537b84ee540773f534433ba3fa0eed9f86f3a0cccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccb2992d0f3d739b58b350af430823f94ef1f284bfdbea08466ea5d61d4e030fc7ba0c533bc37587dbbc367544e84e7530576f63686754dfa1fddbe03c28b33247315b1e7ab615b166a15ea71046f20db2f214d74f3b83915ba971ec36e0e118e799740fc7b1335e9b3a2374a73a98ab6718da19d57768ff0c9c8772984fa4905975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de39855e7cad1d9f2d0ffb946ac59a8d72584917ca75979dac37587ae60e4566adde10cf070accb30e91eae3b9cf5dad415a13bd5c1fe7596a19d517d87f6cfc27998e8cc2752c8acb9313ecc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc1272c3f274bb32b166a15eb71046f2ddc6cb133ef7a03b18b995ba6fe72cf09c61d087a99de17d3b435e9bba2374a73ad8bf8618da19d577687f08ce83322b7314b3e559e3cac49a857a6b843092ef0c2f4f210b6da6add43836043c1ce33c533bc371ec76af4d6b2274a73a98abb733b433aaefd0feed701ed2c66c797a5c9958b350af470823f9f073b9878927e7f1e422b4385fb1ed7eaf2bd7bbd72cfcbd1718b9c6c31e8f91f631c79197787a99781a3c9e86082dce576cdbfe75ae3ccdbd66e1efeb80912ba77a3d46da8fcaa906e059c7c4d3e8f134466871be625b2dd6bbf274f79a85bfaf0746ae9c5ae731d27e544e3502cf7a269eb83169fd38c48eeb5fe3113b2e57c623b66aae9aabe6aa39a7e699f3a879e63c6a9e51cd4569ce701d15cef7528c001870eb83327e57e0b8f6646a673eeafbd87aaf4df87d0ce71cced7f70d6556e63866a6798b8eac179bf4093c1eda8698b518cf79d35eaf4d6998372dc57c2285ccaaf3d8986dec3b928fdd91f562933e81c743db1dcc5a30b5331c0fee0ca235a67839a883797a27433b3310978e4dfb77c2792887f9440a9955e7b131dbd877251ebbf83c798c4dfa041e0f6d77316bc1d3cee278707710ad31c5cb411dccd3bb19da9981b8746cdabf1bce83322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb332cb66b6b19f9978ece2fc3dc6267d028f87b667326bc1d3cee2fcfd3d41b4c6142f0775f09cdfc3d0ce0cc4a563d3fe3d701e945999955999955999955999955999955999955999955999955999955999955936b38dfdace46387bfc7c1d8a44fe0f1d0f62c662d98da19cedfdf1b446b4cf1725007cff9bd0cedcc405c3a36eddf0be7419995398ad9c67e76e2b18beb79189bf4093c1eda9ecdac054f3b8be3c17d41b4c6142f0775f09cdfc7d0ce0cc4a563d3fe7d701eca613e914266d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d2b47671bfbfec463b787f3f7189bf4093c1edaee67d682a79dc5f9fb0782688d295e0eea609e3ec0d0ce0cc4a563d33ec5ab04e6132964d6dc181f66cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e63866cd0d658e63d6dc50e6386609b961633f27f9d8e1efd93136e913783cb43d87590ba67686f7bf3c18446b4cf1725007f3f441867666202e1d9bf61f84f3a0ccca1cc56c633f947cec42d68b4dfa041e0f6d0f316bc1d4ce703c783888d698e2e5a00e9ef38719da9981b8746cda7f18ce43da98f1fc65928b1ddeb74931aadcabf53dd795abc1f73c57ae01dff35db9167c2f70e53af0bdd0952781ef45d036f2bdd8955782ef25aebc1e7c2f75e575e07b992bf782efe5aedc03be57b8f210f85ee9cab783ef55ae7c07f85eedca7782ef35ae7c17f85eebca7783ef75aefc4cf0bdde95ef01df1b5cf959e07ba32bdf0bbe37b9f2b3c1f76657be0f7c6f71e5fbc1f756577e007c6f73e5a5e07b24c2f776577e0ef8dee1ca0f82ef9dae7c007cef72e529e07bb72b4f05df5f41995edfe3caf5e07bd49573e07baf2b4f03dffb5cb9017cef77e5e9e0fb802b3782ef83ae3c037c1f72e599e0fbb02bcf02df475cb9097c1f75e5d9e0fb982bcf01dfc75d792ef83ee1caf3c0f749579e0fbe4fb9f202f07dda951782ef33aebc087c9f75e5c5e0fb9c2b2f01dfe75d19cfef5fbbf243e0a371e561f0d1b8f25cf0d1b8f23cf0d1b8f27cf0d1b8f202f0d1b8f242f0d1b8f222f051debd187c94772f011fe5dd4bc14779f732f051debd1c7c9477af001fe5dd2bc14779f72af051debd1a7c9477af011fe5dd6bc14779f73af051debd1e7c94776f001fe5dd1bc14779f726f051debd197c94776f011fe5dd5bc14779f736f051de3d023ecabbb7838ff2ee1de06b76e57782ef02577e17f82e74e57783ef2257c671e662577e0ff82e71e547c14763e17bc1f734577e1ff896b9f2fbc1b7dc953f00be15aefc41f0ad74e50f816f952b7f187c2daefc11f0b5baf247c1b7da953f06bebc2b7f1c7c6daefc09f0155cf993e06b77e54f81afc3953f0dbe4e57fe0cf8ba5cf9b3e0eb76e5cf816f8d2b7f1e7cf4394ee38cedcfb65f920ea491f5519b5b23da42bec9d096be20d96b3a8a45c7a6fd7660a47350187fc6c26819db3c46cbd3c9a019e6156da5be3375024f07030f533bc3ef4c5d5e9bdabd36e5a0ced3a09d5d0cedcc405c3a36ed77416c8e738e5ad4bae32ef3b4a8c13aee03cd7e9e96d2918e61f3b710d1961ee6b6d0b1695cea1987d8dd5eecbc171bc763da4af5af6e605ec3c06c8fdb9bfc71c3feb5d61d8b728ae2e4a14deb4083a4da84b133ce280ef96ba03cbf69b82ed5233de8f38bd86d2ed3b94476ff7d9ddefb7250a727a2fd7d41b2edeff5787a3d667b4e1a9a863918fa4398033d1e07ede741bbde18ed7a403baa839f7f2d4cdaadf17868bf0578e81aa70b7c74ad40fc789dd53a0edcfeb8d715c14dbe6e606c89602c24cf185eebb4788cb45f0046f2ad019e6e26cdfc73bdccd3073f97ebbc3af4de1aa8b31a3e1bb311756dbf5b9a196e177d07ff5390ec985ec7a017ce0f04a04fe06918805ed4ce5a069ea9c1f01cc1d9a1c133fdb70c5c3ed07f240368351e26be66229a51053e2c5747f88260e454084ec9d254084ec95679b2e0140cd5b75fa56cb368ba61e0e4f1a1a79f1a3875f8ccdda787068eec1dbc05a96b3d7a248d6b0192a28fb6c9c1f0a44d5f90ec624c9d17ab54f24c86d749c9f3b431b533fcd09be2b5a9ce6b530eead4c2dfa630b4330371e9d8b43f252276820351a8c5d4516831358267ea386b8113dfe4c39e4a7fc7c5932aaf2dd8a3b14d7e9e27da200ab8148e9f7170f66fb6b3d7bac64c0a864f368d9ef68ad69e043b636a3fb5ec8ca89d01b543909de1b4339af643cdce58da194a3b23696720ed8ca39d61b4338a7606d1ce18da19c2e6a038036867fcec0c9f9dd1bb04d8be0cbcf65bb5fd84b433727606ceceb8d92b2b7b0560af46ecd5b7bd52b4b31ff60ac17eb3b4b30cf6d3d65ec9d84f69fbc96aaf14ed15a2bda2b757b876956a83b18d4eeb4dc6361bdb626cabb16dc6b61bdb616ca7b15dc6761bdb636cafb17dc6f61bbbd4d865417176fd72635718bbd2d8d38d5d65ec6a63d718bbd6d875c6ae377683b11b8ddd64ec6663078df51b3b64ecb0b123c6068c1d35768bb163c68e1b7b86b15b83e21d3a278d9d323668ecb4b1db8c9d31763628ae98d91532bb226657c0ec8a975de1b22b5a7605cbae58d9152abb226557a0ee0f8a2b4c76a5c8ae0cd95501bb0a6067fded2cfff383e22cbe9db57f51509c95b7b3f076d6ddceb2db59753b8b6e67cded2cb99d15b7b3e076d6dbce72db596d3b8b6d67aded2cb59d95b6b3d076d6d9ce323f12146791edacb19d25b6b3c27616d8cefada59de4783e22cae9db5b5b3b47656d6cec2da59573bcb6a6755ed2caa9d35b5b3a47656d4ce82da594f3bcb696735ed2ca69db5b4b3947656f20bc61e33f637c6fed6d8df19fb7b63ff60ec1f8d7dd1d8978cfd93b17f36f62f41312fffd5d8bf19fb8ab17f37f61fc6be6aec3f8d7dcdd8d78d7dc3d8378d3d6eec5bc6be6dec3bc6be6bec7bc6be6fec07c67e68ec47c67e6cec27c67e6aec67c67e6eec17c67e69ec57c67e6dec09634f1afb8db1df1afb9db1df1bfb4330bcba8183c81fdd0ecdb4f70f0d0d9c3c3dd43c34d87cf2f61343c74f9fb8bbf9cee343c79a07ef183873f4c4e09df8e6f7b8618b9611369d39d37f77f3f1534706ee6a1ebc7da879f068f3a1c1db4f1d398b6ffaa27bd3c27323f61f39121fec9b554f81f43b630cfa4bf73e5aa0d955ba6d4f8c45903f8ce54d33abc7d6a04bdda70e7d7bbfa278b5db7cf6c4e05073bef994f9b7ff8479cfc091d666fcdb5923f2d9a1e6b343fd67869a8f9e193cd9dcd68ac7bd76ca181a51d3348637b5368dbee5c1ff03d8e2fb122d0a0400", "privateFunctions": [ { "selector": { @@ -37,8 +37,8 @@ exports[`ContractClass creates a contract class from a contract compilation arti "isInternal": false } ], - "id": "0x13d35e4219fbca20acd2fe6e4d4077b2dfd7d61da6262e9fb0c4e60f2f7928e3", + "id": "0x03b7c43dab6f954bfa4fbc60d65dedb4135c2a1646d5fafa63542d54d3dc8f69", "privateFunctionsRoot": "0x2dc1f38d7be98a8e72227d6f8aec393c60db813a1819c9c86b02a00cc18f6687", - "publicBytecodeCommitment": "0x1340525ead90736bb961f723384e234d2a74e81e37f6e1a6959cc750fbb27ec3" + "publicBytecodeCommitment": "0x049a5136226b013414c491bb452f8edffae98b96b6d4e95d56824303bf23f6cd" }" `; diff --git a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap index 8107be7d43c..7209a27a977 100644 --- a/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap +++ b/yarn-project/protocol-contracts/src/gas-token/__snapshots__/index.test.ts.snap @@ -2,10 +2,10 @@ exports[`GasToken returns canonical protocol contract 1`] = ` { - "address": AztecAddress<0x1d331783f36e24c4c692b4fa48ef8722797087a860641691baa70f4714f59905>, + "address": AztecAddress<0x1193c2d1b6ade061bb48cc31f1e74e036139347138b10490e3d2c66ea4a682c3>, "instance": { - "address": AztecAddress<0x1d331783f36e24c4c692b4fa48ef8722797087a860641691baa70f4714f59905>, - "contractClassId": Fr<0x0e4083b228e62201ad0460ca654736a259f51c64a26bf64e7e1fae0b6f0d2301>, + "address": AztecAddress<0x1193c2d1b6ade061bb48cc31f1e74e036139347138b10490e3d2c66ea4a682c3>, + "contractClassId": Fr<0x2785d55720db7d683c7ac34166a205943ed2e9551d7e85505a3da87f01d9a8d8>, "deployer": AztecAddress<0x0000000000000000000000000000000000000000000000000000000000000000>, "initializationHash": Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, "portalContractAddress": EthAddress<0x0000000000000000000000000000000000000000>, @@ -19,10 +19,10 @@ exports[`GasToken returns canonical protocol contract 1`] = ` exports[`GasToken returns canonical protocol contract 2`] = ` { "artifactHash": Fr<0x18af4bb0ca6fe07d0ae6da493b2c7b1af038ee904721dbba9b6e571e6d495726>, - "id": Fr<0x0e4083b228e62201ad0460ca654736a259f51c64a26bf64e7e1fae0b6f0d2301>, + "id": Fr<0x2785d55720db7d683c7ac34166a205943ed2e9551d7e85505a3da87f01d9a8d8>, "privateFunctions": [], "privateFunctionsRoot": Fr<0x15d28cad4c0736decea8997cb324cf0a0e0602f4d74472cd977bce2c8dd9923f>, - "publicBytecodeCommitment": Fr<0x01cbb57f7449ea71aabbf6b5b69d9d5ab7d82c640c751cf13ce9e850db32a66b>, + "publicBytecodeCommitment": Fr<0x23fec2b6523dd709bcd24045e212ef3a6bf2a8140b1fc294eb50d185cf1e38a2>, "version": 1, } `;