From bbf43637cb9ca97142dd778cf90c417455fb7dfe Mon Sep 17 00:00:00 2001 From: JinHwan Date: Tue, 12 Sep 2023 22:25:49 +0900 Subject: [PATCH] Refactor backend following updated contracts (#152) --- backend/Cargo.toml | 4 +- backend/README.md | 88 +- backend/examples/signatures.csv | 1 - backend/examples/verify_inclusion.rs | 14 +- backend/src/apis/address_ownership.rs | 38 + backend/src/apis/csv/assets.csv | 3 + backend/src/apis/csv/signatures.csv | 7 +- backend/src/apis/csv_parser.rs | 103 +- backend/src/apis/fetch.rs | 83 - backend/src/apis/mod.rs | 4 +- backend/src/apis/round.rs | 217 + backend/src/apis/snapshot.rs | 298 - .../src/contracts/abi/InclusionVerifier.json | 2 +- .../src/contracts/abi/SolvencyVerifier.json | 2 +- .../contracts/generated/inclusion_verifier.rs | 4944 ++++++++--------- backend/src/contracts/generated/mod.rs | 4 +- .../contracts/generated/solvency_verifier.rs | 4276 +++++++------- backend/src/contracts/mod.rs | 1 - backend/src/contracts/signer.rs | 31 +- backend/src/lib.rs | 2 +- backend/src/{contracts => }/tests.rs | 196 +- contracts/src/InclusionVerifier.sol | 2 +- contracts/src/InclusionVerifier.yul | 80 +- contracts/src/SolvencyVerifier.sol | 2 +- contracts/src/SolvencyVerifier.yul | 68 +- zk_prover/Cargo.toml | 4 +- zk_prover/examples/gen_inclusion_verifier.rs | 4 +- zk_prover/examples/gen_solvency_verifier.rs | 6 + .../inclusion_proof_solidity_calldata.json | 4 +- .../solvency_proof_solidity_calldata.json | 4 +- 30 files changed, 5233 insertions(+), 5259 deletions(-) delete mode 100644 backend/examples/signatures.csv create mode 100644 backend/src/apis/address_ownership.rs create mode 100644 backend/src/apis/csv/assets.csv delete mode 100644 backend/src/apis/fetch.rs create mode 100644 backend/src/apis/round.rs delete mode 100644 backend/src/apis/snapshot.rs rename backend/src/{contracts => }/tests.rs (54%) diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 97d0b345..eec1ddec 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -13,7 +13,7 @@ futures = "0.3.28" num-bigint = "0.4.3" serde = { version = "1.0.166", features = ["derive"] } snark-verifier-sdk = { git = "https://github.com/privacy-scaling-explorations/snark-verifier", version = "0.1.1" } -ethers = { version = "2.0.7", default_features = false, features = ["ethers-solc"] } +ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc"] } reqwest = { version = "0.11", features = ["json"] } serde_json = "1.0.64" tokio = { version = "1.7.1", features = ["full"] } @@ -21,4 +21,4 @@ base64 = "0.13" bincode = "1.3.3" [build-dependencies] -ethers = { version = "2.0.7", default_features = false, features = ["ethers-solc"] } +ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc"] } diff --git a/backend/README.md b/backend/README.md index 79155aaa..16b26423 100644 --- a/backend/README.md +++ b/backend/README.md @@ -2,18 +2,26 @@ This directory contains the backend implementation for the Summa Proof of Solvency protocol. -The core datastructure is the `Snapshot` struct, a data container for: +## Core Components -- the CEX liabilities, represented via a `MerkleSumTree` -- the CEX wallets, represented via the `WalletOwnershipProof` struct. -- the Trusted Setup parameters for the `MstInclusionCircuit` and `SolvencyCircuit` zk circuits. +### Round -Furthermore, the `Snapshot` struct contains the following methods: +The `Round` component represents a specific period or cycle in the Summa Proof of Solvency protocol. It encapsulates the state of the system at a given time, including the snapshot of assets and liabilities, as well as the associated proofs. + The `Round` struct integrates with the `Snapshot` and `SummaSigner` to facilitate the generation and submission of proofs to the contract. -- `generate_solvency_verifier` -> write the Solidity Verifier contract (for the `SolvencyProof`) to a file -- `generate_proof_of_solvency` -> generate the `SolvencyProof` for the current snapshot to be verified on-chain -- `generate_proof_of_inclusion` -> generate the `MstInclusionProof` for a specific user for the current snapshot to be verified off-chain -- `get_proof_of_address_ownership` -> generate the `AddressOwnershipProof` for a specific user for the current snapshot to be verified off-chain +Key Features: +- Initialization of a new round with specific parameters. +- Building a snapshot of the current state. +- Dispatching solvency proofs to the contract. +- Retrieving proofs of inclusion for specific users. + +### AddressOwnership + +The `AddressOwnership` component is responsible for managing and verifying the ownership of addresses. It ensures that addresses used in the protocol owned by the respective participants. This component interacts with the `SummaSigner` to submit proofs of address ownership to on-chain. + +Key Features: +- Initialization with specific signer details. +- Dispatching proofs of address ownership to the contract. ## Prerequisites @@ -27,49 +35,55 @@ wget https://trusted-setup-halo2kzg.s3.eu-central-1.amazonaws.com/hermez-raw-11 After downloading, pass the path to the desired file to the `Snapshot::new` method. If you are using the included `ptau` file, no additional steps are necessary. -## Important Notices - -### For Proof of Solvency +## Running Test -As of the current implementation, the `generate_proof_of_solvency` method does not directly fetch data about the balances of the wallets of the CEX. Instead, you can use the `fetch_asset_sums` function to retrieve balance information from the blockchain. Here's an example of how you might utilize it: +To build the binary executable and test it -```Rust -let asset_sums = fetch_asset_sums(client, token_contracts, exchange_addresses).await?; +``` +cargo build +SIGNATURE_VERIFICATION_MESSAGE="Summa proof of solvency for CryptoExchange" cargo test --release -- --nocapture ``` -Please note that the first element in the `asset_sums` array represents the ETH balance. - -Alternatively, you can create your own custom fetcher to retrieve the balances. - -### For Proof of Ownership +## Important Notices -To generate a signed message, you must first initialize the `SummaSigner` and use the `generate_signatures` method: +### Generating Verifiers for Backend -```Rust -let signatures = signer.generate_signatures().await.unwrap(); -``` +The following steps are optional and are only required if you need to update the verifier contracts for the backend: -The content of the message can be specified with the local variable `SIGNATURE_VERIFICATION_MESSAGE`. +1. **Build the Verifier Contracts**: + - Move to the `zk_prover` directory. + - Run the [`gen_solvency_verifier`](https://github.com/summa-dev/summa-solvency/blob/master/zk_prover/examples/gen_solvency_verifier.rs) and [`gen_inclusion_verifier`](https://github.com/summa-dev/summa-solvency/blob/master/zk_prover/examples/gen_inclusion_verifier.rs) located within the `zk_prover/examples`. + - For detailed instructions [building a solvency verifier contract](https://github.com/summa-dev/summa-solvency/tree/master/zk_prover#build-a-solvency-verifier-contract) and [building an inclusion verifier contract.](https://github.com/summa-dev/summa-solvency/tree/master/zk_prover#build-an-inclusion-verifier-contract) +2. **Deploy Contracts to Local Environment**: + - Navigate to the `contracts` directory + - Deploy the contracts to a Hardhat environment. This step will refresh the ABI files(`src/contracts/abi/*.json`) in the backend. +3. **Generate Rust Interface Files**: + - Move to the `backend` directory. + - Execute the build script in the backend. This will produce the Rust interface files: `inclusion_verifier.rs`, `solvency_verifier.rs`, and `summa_contract.rs`. -### For Generating Solvency Verifier +By completing these steps, the backend will be primed with the essential verifiers for its tasks. -The provided verifier found at `src/contracts/Verifier.json` is based on the trusted setup, `hermez-raw-11`. If you are working with a higher number of entries, you will need to generate a new verifier contract by using the `generate_solvency_verifier` method. +## Examples -Here's a brief example of how you might invoke this method: +### Running the Inclusion Verification -```Rust -Snapshot::generate_solvency_verifier("SolvencyVerifier.yul", "SolvencyVerifier.sol"); -``` +This example demonstrates how a user can verify the inclusion of their account in the Merkle Sum Tree. +In this example, the CEX provides the user with their `balances` and `username`, but not the `leaf_hash`. -This method creates two files, `SolvencyVerifier.yul` and `SolvencyVerifier.sol`, which will be used in `Summa.sol`. +The user will generate the `leaf_hash` themselves and then verify its inclusion in the tree. -## Usage +Make sure you have the required files: +- `backend/ptau/hermez-raw-11` +- `backend/src/apis/csv/assets.csv` +- `zk_prover/src/merkle_sum_tree/csv/entry_16.csv` -To build the binary executable and test it +To run the example: ``` -cargo build -SIGNATURE_VERIFICATION_MESSAGE="Summa proof of solvency for CryptoExchange" cargo test --release -- --nocapture +cargo run --example verify_inclusion ``` -The [buildscript](./build.rs) will automatically build the contract Rust interfaces from the [JSON ABIs](./src/contracts/abi/) and place them into [./src/contracts/generated](./src/contracts/generated) directory. The ABIs are updated on contract deployment from the [contracts subproject](./../contracts/README.md) by the [contract deployment script](./../contracts/scripts/deploy.ts). +On successful execution, you'll observe a message indicating the verification outcome: +``` +Verifying the proof result for User #0: true +``` diff --git a/backend/examples/signatures.csv b/backend/examples/signatures.csv deleted file mode 100644 index 63a38279..00000000 --- a/backend/examples/signatures.csv +++ /dev/null @@ -1 +0,0 @@ -address;signature diff --git a/backend/examples/verify_inclusion.rs b/backend/examples/verify_inclusion.rs index 321497ac..4262fed0 100644 --- a/backend/examples/verify_inclusion.rs +++ b/backend/examples/verify_inclusion.rs @@ -2,7 +2,7 @@ use halo2_proofs::halo2curves::{bn256::Fr as Fp, ff::PrimeField}; use num_bigint::BigUint; -use summa_backend::apis::snapshot::Snapshot; +use summa_backend::apis::round::Snapshot; use summa_solvency::{ circuits::{ merkle_sum_tree::MstInclusionCircuit, @@ -32,18 +32,14 @@ fn main() { const N_BYTES: usize = 8; let ptau_path = "./ptau/hermez-raw-11"; - let signature_csv_path = "./examples/signatures.csv"; + let asset_csv_path = "src/apis/csv/assets.csv"; let entry_csv_path = "../zk_prover/src/merkle_sum_tree/csv/entry_16.csv"; // CEX Generate the Merkle Sum Tree and then initialize the circuit. // Note that `signature_csv` is empty because this is only needed to generate π of Solvency, which is not the case here. - let snapshot = Snapshot::::new( - &entry_csv_path, - &signature_csv_path, - "Summa proof of solvency for CryptoExchange".to_string(), - &ptau_path, - ) - .unwrap(); + let snapshot = + Snapshot::::new(&asset_csv_path, &entry_csv_path, &ptau_path) + .unwrap(); let inclusion_proof = snapshot.generate_proof_of_inclusion(0 as usize).unwrap(); diff --git a/backend/src/apis/address_ownership.rs b/backend/src/apis/address_ownership.rs new file mode 100644 index 00000000..0f1b96dc --- /dev/null +++ b/backend/src/apis/address_ownership.rs @@ -0,0 +1,38 @@ +use crate::contracts::{generated::summa_contract::AddressOwnershipProof, signer::SummaSigner}; +use ethers::types::Address; +use std::{error::Error, result::Result}; + +use super::csv_parser::parse_signature_csv; + +pub struct AddressOwnership { + address_ownership_proofs: Vec, + signer: SummaSigner, +} + +impl AddressOwnership { + pub fn new( + signer_key: &str, + chain_id: u64, + rpc_url: &str, + summa_sc_address: Address, + signature_csv_path: &str, + ) -> Result> { + let address_ownership_proofs = parse_signature_csv(signature_csv_path)?; + + Ok(AddressOwnership { + address_ownership_proofs, + signer: SummaSigner::new(&[], signer_key, chain_id, rpc_url, summa_sc_address), + }) + } + + // This function dispatches the proof of address ownership. Before calling this function, + // ensure externally that the provided `addresses` in `address_ownership_proof` are not already registered + // on the Summa contract. + pub async fn dispatch_proof_of_address_ownership(&mut self) -> Result<(), Box> { + self.signer + .submit_proof_of_address_ownership(self.address_ownership_proofs.clone()) + .await?; + + Ok(()) + } +} diff --git a/backend/src/apis/csv/assets.csv b/backend/src/apis/csv/assets.csv new file mode 100644 index 00000000..bb2e38f0 --- /dev/null +++ b/backend/src/apis/csv/assets.csv @@ -0,0 +1,3 @@ +chain;asset_name;amount +ETH;ETH;556863 +ETH;USDT;556863 diff --git a/backend/src/apis/csv/signatures.csv b/backend/src/apis/csv/signatures.csv index efbdb4b2..613bc0a6 100644 --- a/backend/src/apis/csv/signatures.csv +++ b/backend/src/apis/csv/signatures.csv @@ -1,4 +1,3 @@ -address;signature -0x70997970C51812dc3A010C7d01b50e0d17dc79C8;0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c -0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC;0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b -0x90F79bf6EB2c4f870365E785982E1f101E93b906;0xeb648c7409f45ba9064707d22bdae23dff15517aaf0942b8507b60b9a924bbeb4c8f2ceafc26ede9fd9eb3232cc138500ded3e3c7b8555fa43b995bd15c234ff1c +chain;address;signature;message +ETH;0x70997970C51812dc3A010C7d01b50e0d17dc79C8;0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b;Summa proof of solvency for CryptoExchange +ETH;0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC;0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c;Summa proof of solvency for CryptoExchange diff --git a/backend/src/apis/csv_parser.rs b/backend/src/apis/csv_parser.rs index 6de52d5c..e28e1843 100644 --- a/backend/src/apis/csv_parser.rs +++ b/backend/src/apis/csv_parser.rs @@ -1,32 +1,76 @@ -use std::error::Error; -use std::fs::File; -use std::path::Path; +use std::{error::Error, fs::File, path::Path}; +use ethers::{ + abi::AbiEncode, + types::{Bytes, U256}, +}; use serde::Deserialize; +use crate::contracts::generated::summa_contract::{AddressOwnershipProof, Asset}; + #[derive(Debug, Deserialize)] -struct Record { +struct SignatureRecord { + chain: String, address: String, signature: String, + message: String, } pub fn parse_signature_csv>( path: P, -) -> Result<(Vec, Vec), Box> { +) -> Result, Box> { + let file = File::open(path)?; + let mut rdr = csv::ReaderBuilder::new().delimiter(b';').from_reader(file); + + let mut address_ownership_proofs = Vec::::new(); + + for result in rdr.deserialize() { + let record: SignatureRecord = result?; + + address_ownership_proofs.push(AddressOwnershipProof { + cex_address: record.address.to_string(), + chain: record.chain.to_string(), + signature: record.signature.parse()?, + message: Bytes::from(record.message.encode()), + }); + } + + Ok(address_ownership_proofs) +} + +#[derive(Debug, Deserialize)] +struct AssetRecord { + chain: String, + asset_name: String, + amount: String, +} + +pub fn parse_asset_csv, const N_ASSETS: usize>( + path: P, +) -> Result<[Asset; N_ASSETS], Box> { let file = File::open(path)?; let mut rdr = csv::ReaderBuilder::new().delimiter(b';').from_reader(file); - let mut signatures = Vec::::new(); - let mut addresses = Vec::::new(); + let mut assets_vec = Vec::with_capacity(N_ASSETS); for result in rdr.deserialize() { - let record: Record = result?; + let record: AssetRecord = result?; - signatures.push(record.signature); - addresses.push(record.address); + assets_vec.push(Asset { + asset_name: record.asset_name, + chain: record.chain, + amount: U256::from_dec_str(&record.amount)?, + }); } - Ok((addresses, signatures)) + let assets_array: [Asset; N_ASSETS] = assets_vec.try_into().map_err(|v: Vec| { + format!( + "The number of assets in CSV file does not match the expected count {:?}", + v + ) + })?; + + Ok(assets_array) } #[cfg(test)] @@ -34,16 +78,41 @@ mod tests { use super::*; #[test] - fn test_parse_csv_to_assets() { - // these signatures are from contracts/test/Summa.ts + fn test_parse_csv_to_signature() { let path = "src/apis/csv/signatures.csv"; - let (addresses, signatures) = parse_signature_csv(path).unwrap(); + let address_ownership = parse_signature_csv(path).unwrap(); + + let first_address_ownership = AddressOwnershipProof { + chain: "ETH".to_string(), + cex_address: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8".to_string(), + signature: + ("0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b").parse().unwrap(), + message: "Summa proof of solvency for CryptoExchange".encode().into(), + }; - assert_eq!(addresses[0], "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"); + assert_eq!(address_ownership[0], first_address_ownership); + } + + #[test] + fn test_parse_csv_to_assets() { + let path = "src/apis/csv/assets.csv"; + let assets = parse_asset_csv::<&str, 2>(path).unwrap(); assert_eq!( - signatures[0], - "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c" + assets[0], + Asset { + chain: "ETH".to_string(), + asset_name: "ETH".to_string(), + amount: U256::from(556863), + } + ); + assert_eq!( + assets[1], + Asset { + chain: "ETH".to_string(), + asset_name: "USDT".to_string(), + amount: U256::from(556863), + } ); } } diff --git a/backend/src/apis/fetch.rs b/backend/src/apis/fetch.rs deleted file mode 100644 index 90178296..00000000 --- a/backend/src/apis/fetch.rs +++ /dev/null @@ -1,83 +0,0 @@ -use futures::future::try_join_all; -use std::{error::Error, sync::Arc}; - -use ethers::{ - abi::Address, - contract::builders::ContractCall, - prelude::SignerMiddleware, - providers::{Http, Middleware, Provider}, - signers::LocalWallet, - types::{H160, U256}, -}; - -pub trait TokenBalance { - fn get_token_balance(&self, address: Address) -> ContractCall; -} - -/// This function takes a list of token contracts, addresses and returns the balances of that address for the queried contracts. -/// The first balance returned is the Ether (ETH) balance, followed by the balances of other specified token contracts. -/// -pub async fn fetch_asset_sums<'a, M: Middleware + 'a>( - client: Arc, LocalWallet>>, - token_contracts: Vec + Send>>, - exchange_addresses: Vec, -) -> Result, Box> { - let mut result: Vec = Vec::new(); - - let mut get_balance_futures = Vec::new(); - for addr in exchange_addresses.clone() { - get_balance_futures.push(client.get_balance(addr, None)); - } - let get_balances = try_join_all(get_balance_futures).await?; - let sum_eth_balance = get_balances - .into_iter() - .reduce(|acc, balance| acc + balance) - .unwrap(); - result.push(sum_eth_balance); - - // Most in case, the number of contracts is less than the number of asset addresses - // Iterating over contracts first is more efficient - let mut sum_token_balance = U256::zero(); - for contract in &token_contracts { - for addr in exchange_addresses.clone() { - let token_balance = contract.get_token_balance(addr).call().await.unwrap(); - sum_token_balance += token_balance; - } - result.push(sum_token_balance) - } - - Ok(result) -} - -#[cfg(test)] -mod tests { - use super::*; - - use crate::contracts::mock::mock_erc20::MockERC20; - use crate::contracts::tests::initialize_anvil; - - #[tokio::test] - async fn test_fetch_asset_sums() { - // Necessary to implement `get_balance_from_contract` for the `contracts` parameter by following trait - impl TokenBalance for MockERC20 { - fn get_token_balance(&self, address: Address) -> ContractCall { - self.balance_of(address) - } - } - - let (anvil, cex_addr_1, cex_addr_2, client, mock_erc20) = initialize_anvil().await; - - let asset_sums = fetch_asset_sums( - client.clone(), - vec![Box::new(mock_erc20)], - [cex_addr_1, cex_addr_2].to_vec(), - ) - .await - .unwrap(); - - assert_eq!(asset_sums[0], U256::from(556864)); - assert_eq!(asset_sums[1], U256::from(556863)); - - drop(anvil); - } -} diff --git a/backend/src/apis/mod.rs b/backend/src/apis/mod.rs index 11b3ba3b..712b5c53 100644 --- a/backend/src/apis/mod.rs +++ b/backend/src/apis/mod.rs @@ -1,3 +1,3 @@ +pub mod address_ownership; mod csv_parser; -mod fetch; -pub mod snapshot; +pub mod round; diff --git a/backend/src/apis/round.rs b/backend/src/apis/round.rs new file mode 100644 index 00000000..08c2a5e4 --- /dev/null +++ b/backend/src/apis/round.rs @@ -0,0 +1,217 @@ +use ethers::{ + abi::Address, + types::{Bytes, U256}, +}; +use halo2_proofs::{ + halo2curves::bn256::{Bn256, Fr as Fp, G1Affine}, + plonk::{ProvingKey, VerifyingKey}, + poly::kzg::commitment::ParamsKZG, +}; +use snark_verifier_sdk::CircuitExt; +use std::error::Error; + +use super::csv_parser::parse_asset_csv; +use crate::contracts::{generated::summa_contract::summa::Asset, signer::SummaSigner}; +use summa_solvency::{ + circuits::{ + merkle_sum_tree::MstInclusionCircuit, + solvency::SolvencyCircuit, + utils::{full_prover, gen_proof_solidity_calldata, generate_setup_artifacts}, + }, + merkle_sum_tree::MerkleSumTree, +}; + +pub(crate) type SetupArtifacts = ( + ParamsKZG, + ProvingKey, + VerifyingKey, +); + +#[derive(Debug, Clone)] +pub struct SolvencyProof { + public_inputs: Vec, + proof_calldata: Bytes, +} + +impl SolvencyProof { + pub fn get_public_inputs(&self) -> &Vec { + &self.public_inputs + } + + pub fn get_proof_calldata(&self) -> &Bytes { + &self.proof_calldata + } +} + +#[derive(Debug, Clone)] +pub struct MstInclusionProof { + public_inputs: Vec>, + proof: Vec, +} + +impl MstInclusionProof { + pub fn get_public_inputs(&self) -> &Vec> { + &self.public_inputs + } + + pub fn get_proof(&self) -> &Vec { + &self.proof + } +} + +pub struct Snapshot { + mst: MerkleSumTree, + assets_state: [Asset; N_ASSETS], + trusted_setup: [SetupArtifacts; 2], +} + +pub struct Round { + timestamp: u64, + snapshot: Snapshot, + signer: SummaSigner, +} + +impl + Round +where + [usize; N_ASSETS + 1]: Sized, + [usize; 2 * (1 + N_ASSETS)]: Sized, +{ + pub fn new( + signer_key: &str, + chain_id: u64, + rpc_url: &str, + summa_sc_address: Address, + entry_csv_path: &str, + asset_csv_path: &str, + params_path: &str, + timestamp: u64, + ) -> Result, Box> { + Ok(Round { + timestamp, + snapshot: Snapshot::::new( + asset_csv_path, + entry_csv_path, + params_path, + ) + .unwrap(), + signer: SummaSigner::new(&vec![], signer_key, chain_id, rpc_url, summa_sc_address), + }) + } + + pub fn get_timestamp(&self) -> u64 { + self.timestamp + } + + pub async fn dispatch_solvency_proof(&mut self) -> Result<(), &'static str> { + let proof: SolvencyProof = match self.snapshot.generate_proof_of_solvency() { + Ok(p) => p, + Err(_) => return Err("Failed to generate proof of solvency"), + }; + + let result = self + .signer + .submit_proof_of_solvency( + proof.public_inputs[0], + self.snapshot.assets_state.to_vec(), + proof.proof_calldata, + U256::from(self.get_timestamp()), + ) + .await; + + Ok(result.unwrap()) + } + + pub fn get_proof_of_inclusion( + &self, + user_index: usize, + ) -> Result { + Ok(self + .snapshot + .generate_proof_of_inclusion(user_index) + .unwrap()) + } +} + +impl + Snapshot +where + [usize; N_ASSETS + 1]: Sized, + [usize; 2 * (1 + N_ASSETS)]: Sized, +{ + pub fn new( + asset_csv_path: &str, + entry_csv_path: &str, + params_path: &str, + ) -> Result, Box> { + let assets_state = parse_asset_csv::<&str, N_ASSETS>(asset_csv_path).unwrap(); + let mst = MerkleSumTree::::new(entry_csv_path).unwrap(); + + let mst_inclusion_circuit = MstInclusionCircuit::::init_empty(); + let solvency_circuit = SolvencyCircuit::::init_empty(); + + // get k from ptau file name + let parts: Vec<&str> = params_path.split("-").collect(); + let last_part = parts.last().unwrap(); + let k = last_part.parse::().unwrap(); + + let mst_inclusion_setup_artifacts: SetupArtifacts = + generate_setup_artifacts(k, Some(params_path), mst_inclusion_circuit).unwrap(); + + let solvency_setup_artifacts_artifacts = + generate_setup_artifacts(10, Some(params_path), solvency_circuit).unwrap(); + + let trusted_setup = [ + mst_inclusion_setup_artifacts, + solvency_setup_artifacts_artifacts, + ]; + + Ok(Snapshot { + mst, + assets_state, + trusted_setup, + }) + } + + pub fn generate_proof_of_solvency(&self) -> Result { + let asset_sums = self + .assets_state + .iter() + .map(|asset| Fp::from_raw(asset.amount.0) as Fp) + .collect::>() + .try_into() + .unwrap(); + let circuit = SolvencyCircuit::::init(self.mst.clone(), asset_sums); + + let calldata = gen_proof_solidity_calldata( + &self.trusted_setup[1].0, + &self.trusted_setup[1].1, + circuit, + ); + + Ok(SolvencyProof { + proof_calldata: calldata.0, + public_inputs: calldata.1, + }) + } + + pub fn generate_proof_of_inclusion( + &self, + user_index: usize, + ) -> Result { + let circuit = + MstInclusionCircuit::::init(self.mst.clone(), user_index); + + let proof = full_prover( + &self.trusted_setup[0].0, + &self.trusted_setup[0].1, + circuit.clone(), + circuit.instances(), + ); + + Ok(MstInclusionProof { + public_inputs: circuit.instances(), + proof, + }) + } +} diff --git a/backend/src/apis/snapshot.rs b/backend/src/apis/snapshot.rs deleted file mode 100644 index b34a9810..00000000 --- a/backend/src/apis/snapshot.rs +++ /dev/null @@ -1,298 +0,0 @@ -use std::{ops::Add, path::Path}; - -use ethers::types::{Bytes, U256}; -use halo2_proofs::{ - halo2curves::bn256::{Bn256, Fr as Fp, G1Affine}, - plonk::{ProvingKey, VerifyingKey}, - poly::kzg::commitment::ParamsKZG, -}; -use snark_verifier_sdk::{evm::gen_evm_verifier_shplonk, CircuitExt}; - -use summa_solvency::{ - circuits::{ - merkle_sum_tree::MstInclusionCircuit, - solvency::SolvencyCircuit, - utils::{ - full_prover, gen_proof_solidity_calldata, generate_setup_artifacts, - write_verifier_sol_from_yul, - }, - }, - merkle_sum_tree::MerkleSumTree, -}; - -use crate::apis::csv_parser::parse_signature_csv; - -pub struct Snapshot { - mst: MerkleSumTree, - proof_of_address_ownership: AddressOwnershipProof, - trusted_setup: [SetupArtifcats; 2], // the first trusted setup relates to MstInclusionCircuit, the second related to SolvencyCircuit -} - -pub(crate) type SetupArtifcats = ( - ParamsKZG, - ProvingKey, - VerifyingKey, -); - -#[derive(Debug, Clone)] -pub struct SolvencyProof { - public_inputs: Vec, - proof_calldata: Bytes, -} - -impl SolvencyProof { - pub fn get_public_inputs(&self) -> &Vec { - &self.public_inputs - } - - pub fn get_proof_calldata(&self) -> &Bytes { - &self.proof_calldata - } -} - -#[derive(Debug, Clone)] -pub struct MstInclusionProof { - public_inputs: Vec>, - proof: Vec, -} - -impl MstInclusionProof { - pub fn get_public_inputs(&self) -> &Vec> { - &self.public_inputs - } - - pub fn get_proof(&self) -> &Vec { - &self.proof - } -} - -#[derive(Debug, Clone)] -pub struct AddressOwnershipProof { - addresses: Vec, - signatures: Vec, - message: String, -} - -impl AddressOwnershipProof { - pub fn get_addresses(&self) -> &Vec { - &self.addresses - } - - pub fn get_signatures(&self) -> &Vec { - &self.signatures - } - - pub fn get_message(&self) -> &String { - &self.message - } -} - -impl - Snapshot -where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, -{ - pub fn new( - entry_csv_path: &str, - signature_csv_path: &str, - message: String, - params_path: &str, - ) -> Result, Box> { - let (addresses, signatures) = parse_signature_csv(signature_csv_path).unwrap(); - - let mst = MerkleSumTree::::new(entry_csv_path).unwrap(); - - let mst_inclusion_circuit = MstInclusionCircuit::::init_empty(); - let solvency_circuit = SolvencyCircuit::::init_empty(); - - // get k from ptau file name - let parts: Vec<&str> = params_path.split("-").collect(); - let last_part = parts.last().unwrap(); - let k = last_part.parse::().unwrap(); - - let mst_inclusion_setup_artifacts: SetupArtifcats = - generate_setup_artifacts(k, Some(params_path), mst_inclusion_circuit).unwrap(); - - let solvency_setup_artifacts_artifacts = - generate_setup_artifacts(10, Some(params_path), solvency_circuit).unwrap(); - - let trusted_setup = [ - mst_inclusion_setup_artifacts, - solvency_setup_artifacts_artifacts, - ]; - - let proof_of_address_ownership = AddressOwnershipProof { - addresses, - signatures, - message, - }; - - Ok(Snapshot { - mst, - proof_of_address_ownership, - trusted_setup, - }) - } - - // For generating onchain verifier contract - pub fn generate_solvency_verifier( - &self, - yul_output_path: &str, - sol_output_path: &str, - ) -> Result<(), Box> { - let _deployment_code = gen_evm_verifier_shplonk::>( - &self.trusted_setup[1].0, - &self.trusted_setup[1].2, - vec![1 + N_ASSETS], - Some(Path::new(yul_output_path)), - ); - - write_verifier_sol_from_yul(yul_output_path, sol_output_path).unwrap(); - - Ok(()) - } - - pub fn generate_proof_of_solvency( - &self, - asset_contract_addresses: Vec, - asset_sums: [Fp; N_ASSETS], - ) -> Result<(SolvencyProof, Vec), &'static str> { - let circuit = SolvencyCircuit::::init(self.mst.clone(), asset_sums); - - let calldata = gen_proof_solidity_calldata( - &self.trusted_setup[1].0, - &self.trusted_setup[1].1, - circuit, - ); - - Ok(( - SolvencyProof { - proof_calldata: calldata.0, - public_inputs: calldata.1, - }, - asset_contract_addresses, - )) - } - - pub fn generate_proof_of_inclusion( - &self, - user_index: usize, - ) -> Result { - let circuit = - MstInclusionCircuit::::init(self.mst.clone(), user_index); - - let proof = full_prover( - &self.trusted_setup[0].0, - &self.trusted_setup[0].1, - circuit.clone(), - circuit.instances(), - ); - - Ok(MstInclusionProof { - public_inputs: circuit.instances(), - proof, - }) - } - - pub fn get_proof_of_address_ownership(&self) -> &AddressOwnershipProof { - &self.proof_of_address_ownership - } - - pub fn get_trusted_setup_for_mst_inclusion(&self) -> &SetupArtifcats { - &self.trusted_setup[0] - } - - pub fn get_trusted_setup_for_solvency(&self) -> &SetupArtifcats { - &self.trusted_setup[1] - } -} - -#[cfg(test)] -mod tests { - use super::*; - - const N_ASSETS: usize = 2; - const LEVELS: usize = 4; - const N_BYTES: usize = 8; - - fn initialize_snapshot() -> Snapshot { - let entry_csv = "../zk_prover/src/merkle_sum_tree/csv/entry_16.csv"; - let signature_csv = "src/apis/csv/signatures.csv"; - - Snapshot::::new( - entry_csv, - signature_csv, - "Summa proof of solvency for CryptoExchange".to_string(), - "ptau/hermez-raw-11", - ) - .unwrap() - } - - #[test] - fn test_generate_solvency_verifier() { - let snapshot = initialize_snapshot(); - - let yul_output_path = "artifacts/test_verifier.yul"; - let sol_output_path = "artifacts/test_verifier.sol"; - - snapshot - .generate_solvency_verifier(yul_output_path, sol_output_path) - .unwrap(); - - let yul_meta = std::fs::metadata(yul_output_path); - let sol_meta = std::fs::metadata(sol_output_path); - assert!(yul_meta.is_ok()); - assert!(sol_meta.is_ok()); - - std::fs::remove_file(yul_output_path).expect("Failed to remove Yul output file"); - std::fs::remove_file(sol_output_path).expect("Failed to remove Sol output file"); - } - - #[test] - fn test_generate_solvency_proof() { - let snapshot = initialize_snapshot(); - - let asset_addresses: Vec = vec![ - "0xe65267e87ed6fff28ff0d6edc39865d1d66274f5".to_string(), // ERC20 token address - "0x220b71671b649c03714da9c621285943f3cbcdc6".to_string(), // ERC20 token address - ]; - - // In this test, we assume that the balances of the address in the snapshot are 556863 for both assets - // In a live environment, Should fetch balances from on-chain via `fetch_asset_sums` method in `fetch.rs`. - let calldata: (SolvencyProof, Vec) = snapshot - .generate_proof_of_solvency( - asset_addresses.clone(), - [Fp::from(556863), Fp::from(556863)], - ) - .unwrap(); - - assert_eq!(calldata.0.public_inputs.len(), 1 + N_ASSETS); - assert_eq!(calldata.1.len(), asset_addresses.len()); - } - - #[test] - fn test_generate_inclusion_proof() { - let snapshot = initialize_snapshot(); - - let inclusion_proof = snapshot.generate_proof_of_inclusion(0).unwrap(); - let public_inputs = inclusion_proof.get_public_inputs(); - - assert_eq!(public_inputs.len(), 1); // 1 instance - assert_eq!(public_inputs[0].len(), 2); // 2 values - } - - #[test] - fn test_get_proof_of_address_ownership() { - let snapshot = initialize_snapshot(); - - let proof_of_address_ownership = snapshot.get_proof_of_address_ownership(); - - assert_eq!(proof_of_address_ownership.addresses.len(), 3); - assert_eq!(proof_of_address_ownership.signatures.len(), 3); - assert_eq!( - proof_of_address_ownership.message, - "Summa proof of solvency for CryptoExchange".to_string() - ); - } -} diff --git a/backend/src/contracts/abi/InclusionVerifier.json b/backend/src/contracts/abi/InclusionVerifier.json index 788af9b8..e752b6e8 100644 --- a/backend/src/contracts/abi/InclusionVerifier.json +++ b/backend/src/contracts/abi/InclusionVerifier.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/InclusionVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50615468806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e36600461532a565b610057565b604051901515815260200160405180910390f35b60006001610063615253565b6000805160206154138339815191526100d9565b6000805160206153f383398151915280831081831016908380096000805160206153f38339815191528384096000805160206153f383398151915284820990506000805160206153f38339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301527f28c894f41fc22dc4314404d520858054b873e3fa824b0b79c28069864128959c600083015260208501518060608401526040860151806080850152846101388284610077565b169450505060608501518060a084015260808601518060c08501528461015e8284610077565b169450505060a08501518060e084015260c086015180610100850152846101858284610077565b16945050506101206000830120610120830152610120820151818106610140840152806101608401525060e085015180610180840152610100860151806101a0850152846101d38284610077565b1694505050610120850151806101c0840152610140860151806101e0850152846101fd8284610077565b60a061016087012061020087018190528581066102208801526102408701521694506001915050610260830153602161024083012061026083018190528181066102808401526102a08301526101608501516102c083018190526101808601516102e08401819052846102708284610077565b16945050506101a0850151806103008401526101c0860151806103208501528461029a8284610077565b16945050506101e08501518061034084015261020086015180610360850152846102c48284610077565b169450505061022085015180610380840152610240860151806103a0850152846102ee8284610077565b16945050506101206102a08301206103c08301526103c08201518181066103e0840152806104008401525061026085015180610420840152610280860151806104408501528461033e8284610077565b16945050506102a0850151806104608401526102c086015180610480850152846103688284610077565b16945050506102e0850151806104a0840152610300860151806104c0850152846103928284610077565b1694505050610320850151806104e084015261034086015180610500850152846103bc8284610077565b16945050506103608501518061052084015261038086015180610540850152846103e68284610077565b1694505050610160610400830120610560830152610560820151818106610580840152806105a084015250806103a0860151066105c0830152806103c0860151066105e0830152806103e086015106610600830152806104008601510661062083015280610420860151066106408301528061044086015106610660830152806104608601510661068083015280610480860151066106a0830152806104a0860151066106c0830152806104c0860151066106e0830152806104e086015106610700830152806105008601510661072083015280610520860151066107408301528061054086015106610760830152806105608601510661078083015280610580860151066107a0830152806105a0860151066107c0830152806105c0860151066107e0830152806105e086015106610800830152806106008601510661082083015280610620860151066108408301528061064086015106610860830152806106608601510661088083015280610680860151066108a0830152806106a0860151066108c0830152806106c0860151066108e0830152806106e086015106610900830152806107008601510661092083015280610720860151066109408301528061074086015106610960830152806107608601510661098083015280610780860151066109a0830152806107a0860151066109c0830152806107c0860151066109e0830152806107e086015106610a008301526104806105a0830120610a20830152610a20820151818106610a4084015280610a60840152506001610a808301536021610a60830120610a808301819052818106610aa0840152610ac0830152610800850151610ae08301819052610820860151610b0084018190528461066f8284610077565b16945050506060610ac0830120610b20830152610b20820151818106610b4084015280610b608401525061084085015180610b8084015261086086015180610ba0850152846106be8284610077565b16945050508061058083015161058084015109610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d0084015108610d20830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d2084015109610d40830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d4084015109610d60830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff61058084015108610d80830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d4084015109610da0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb061058084015108610dc0830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d4084015109610de0830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc61058084015108610e00830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d4084015109610e20830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc61058084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d4084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e61058084015108610e80830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d4084015109610ea0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e761058084015108610ec0830152806001610d4084015109610ee0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058084015108610f00830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d4084015109610f20830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa261058084015108610f40830152610d808201518181610dc085015109905080610f608401528181610e0085015109905080610f808401528181610e4085015109905080610fa08401528181610e8085015109905080610fc08401528181610ec085015109905080610fe08401528181610f00850151099050806110008401528181610f40850151099050806110208401528181610d208501510990508061104084015250602061108083015260206110a083015260206110c08301526110408201516110e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6111008301526000805160206154138339815191526111208301528260016020611060850160c0611080870160055afa141692506110608201516000610d208401519050828261102086015109610d20850152828282099150610f408401519050828261100086015109610f40850152828282099150610f0084015190508282610fe086015109610f00850152828282099150610ec084015190508282610fc086015109610ec0850152828282099150610e8084015190508282610fa086015109610e80850152828282099150610e4084015190508282610f8086015109610e40850152828282099150610e0084015190508282610f6086015109610e00850152828282099150610dc084015190508282610d8086015109610dc085015282828209610d808501819052610d608501518493509091500961114083015280610dc0830151610da08401510961116083015280610e00830151610de08401510961118083015280610e40830151610e20840151096111a083015280610e80830151610e60840151096111c083015280610ec0830151610ea0840151096111e083015280610f00830151610ee08401510961120083015280610f40830151610f20840151096112208301528060208301516112008401510981818360408601516112208701510908611240840152506106e08201516105c0830151829190086112608301819052819080096112808301819052819080096112a0830152806112a0830151611260840151096112c0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad56112c0840151096112e0830152806107008301516105e0840151086113008301819052819080096113208301819052819080096113408301528061134083015161130084015109611360830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e861136084015109611380830152806113808301516112e0840151086113a08301528061060083015182036113a0840151086113c083018190526107808301518291096113e0830152806113e08301516103e084015109611400830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff96112c084015109611420830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113608401510961144083015280611440830151611420840151086114608301528061062083015182036114608401510861148083018190526107808301518291096114a0830152806114a0830151611400840151086114c0830152806114c08301516103e0840151096114e08301528061064083015182036112c08401510861150083018190526107a0830151829109611520830152806115208301516114e084015108611540830152806115408301516103e084015109611560830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561064084015109611580830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611300840151096115a0830152806115a0830151611580840151086115c083018190526106a08301518291086115e0830181905281908009611600830181905281908009611620830152806116208301516115e084015109611640830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e6661060084015109611660830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe6106208401510961168083015280611680830151611660840151086116a0830152806116a08301518203611640840151086116c083018190526107a08301518291096116e0830152806116e083015161156084015108611700830152806117008301516103e084015109611720830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961064084015109611740830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c861130084015109611760830152806117608301516117408401510861178083018190526106c08301518291086117a0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb02610600840151096117c0830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be610620840151096117e0830152806117e08301516117c0840151086118008301528061180083015182036117a08401510861182083018190526107a08301518291096118408301528061184083015161172084015108611860830152806118608301516103e0840151096118808301528061076083015182036001086118a083018190526107608301518291096118c08301528061076083015182036002086118e083018190526118c08301518291096119008301528061076083015182036004086119208301819052611900830151829109611940830152806105c0830151610680840151086119608301528061060083015182036119608401510861198083018190526119408301518291096119a0830152806119a0830151611880840151086119c0830152806119c08301516103e0840151096119e083015280610620830151820361066084015108611a008301819052611940830151829109611a2083015280611a208301516119e084015108611a4083015280611a408301516103e084015109611a60830152806107c08301516113c084015109611a8083015280611a80830151611a6084015108611aa083015280611aa08301516103e084015109611ac0830152806107c083015161148084015109611ae083015280611ae0830151611ac084015108611b0083015280611b008301516103e084015109611b20830152806107e083015161150084015109611b4083015280611b40830151611b2084015108611b6083015280611b608301516103e084015109611b80830152806107e08301516116c084015109611ba083015280611ba0830151611b8084015108611bc083015280611bc08301516103e084015109611be0830152806107e083015161182084015109611c0083015280611c00830151611be084015108611c2083015280611c208301516103e084015109611c40830152806107608301518203600308611c608301819052611900830151829109611c8083015280611c8083015161198084015109611ca083015280611ca0830151611c4084015108611cc083015280611cc08301516103e084015109611ce083015280611c80830151611a0084015109611d0083015280611d00830151611ce084015108611d2083015280611d208301516103e084015109611d40830152806107608301516118e084015109611d6083015280611d60830151611c6084015109611d8083015280611d8083015161192084015109611da083015280611da083015161064084015109611dc0830152806106408301518203600108611de08301819052611dc0830151829109611e0083015280611e00830151611d4084015108611e2083015280611e208301516103e084015109611e4083015280610640830151600209611e60830152806105c083015182036105e084015108611e808301819052611e60830151829109611ea0830152806105c0830151820361060084015108611ec083015280611ec08301518203611ea084015108611ee08301528061062083015182036105e084015108611f0083015280611f008301518203611ee084015108611f208301819052611da0830151829109611f4083015280611f40830151611e4084015108611f6083015280611f608301516103e084015109611f80830152806118c0830151611c6084015109611fa083015280611fa083015161192084015109611fc0830152806105e08301516105c084015108611fe0830152806106408301518203611fe0840151086120008301819052611fc083015182910961202083015280612020830151611f8084015108612040830152806120408301516103e0840151096120608301819052612020830151829108612080830152806120808301516103e0840151096120a0830152806108e083015182036001086120c083018190526112008301518291096120e0830152806120e08301516120a084015108612100830152806121008301516103e0840151096121208301526109408201518190800961214083015280610940830151820361214084015108612160830181905261114083015182910961218083015280612180830151612120840151086121a0830152806121a08301516103e0840151096121c0830152806109208301518203610940840151086121e08301819052611200830151829109612200830152806122008301516121c084015108612220830152806122208301516103e084015109612240830152806111408301518203600108612260830152806111808301516111608401510861228083018190526111a08301518291086122a083018190526111c08301518291086122c083018190526111e08301518291086122e0830152806122e08301518203612260840151086123008301528061022083015161082084015109612320830152806123208301516106a08401510861234083018190526102808301518291086123608301528061022083015161084084015109612380830152806123808301516105c0840151086123a083018190526102808301518291086123c083018190526123608301518291096123e08301528061022083015161086084015109612400830152806124008301516105e084015108612420830181905261028083015182910861244083018190526123e08301518291096124608301528061022083015161088084015109612480830152806124808301516106c0840151086124a083018190526102808301518291086124c083018190526124608301518291096124e08301819052610900830151829109612500830152806102208301516001096125208301528061252083015161058084015109612540830152806125408301516106a0840151086125608301819052610280830151829108612580830152806102208301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096125a0830152806125a0830151610580840151096125c0830152806125c08301516105c0840151086125e083018190526102808301518291086126008301819052612580830151829109612620830152806102208301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096126408301528061264083015161058084015109612660830152806126608301516105e08401510861268083018190526102808301518291086126a083018190526126208301518291096126c0830152806102208301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096126e0830152806126e083015161058084015109612700830152806127008301516106c084015108612720830181905261028083015182910861274083018190526126c083015182910961276083018190526108e0830151829109612780830152806127808301518203612500840151086127a083018190526123008301518291096127c0830152806127c0830151612240840151086127e0830152806127e08301516103e084015109612800830152806102208301516108a08401510961282083015280612820830151610640840151086128408301819052610280830151829108612860830152806102208301516108c08401510961288083015280612880830151611240840151086128a083018190526102808301518291086128c083018190526128608301518291096128e08301819052610960830151829109612900830152806102208301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612920830152806129208301516105808401510961294083015280612940830151610640840151086129608301819052610280830151829108612980830152806102208301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d096129a0830152806129a0830151610580840151096129c0830152806129c0830151611240840151086129e08301819052610280830151829108612a008301819052612980830151829109612a208301819052610940830151829109612a4083015280612a40830151820361290084015108612a608301819052612300830151829109612a8083015280612a8083015161280084015108612aa083015280612aa08301516103e084015109612ac0830152806109808301518203600108612ae08301819052611200830151829109612b0083015280612b00830151612ac084015108612b2083015280612b208301516103e084015109612b4083015261098082015181908009612b60830152806109808301518203612b6084015108612b808301819052611140830151829109612ba083015280612ba0830151612b4084015108612bc083015280612bc08301516103e084015109612be0830152806102208301516109c084015108612c0083018190526109a0830151829109612c2083015280610280830151610a0084015108612c408301819052612c20830151829109612c608301528061060083015161010009612c8083015280612c8083015182036105c084015108612ca08301819052610740830151829109612cc08301819052610220830151829108612ce08301819052610980830151829109612d008301528061028083015161072084015108612d208301819052612d00830151829109612d4083015280612d408301518203612c6084015108612d608301819052612300830151829109612d8083015280612d80830151612be084015108612da083015280612da08301516103e084015109612dc083015280610a0083015182036109c084015108612de08301819052611200830151829109612e0083015280612e00830151612dc084015108612e2083015280612e208301516103e084015109612e4083015280612300830151612de084015109612e60830152806109e083015182036109c084015108612e808301819052612e60830151829109612ea083015280612ea0830151612e4084015108612ec0830152610d0082015181908009612ee08301819052610d00830151829109612f008301819052610d00830151829109612f208301819052610d00830151829109612f4083015280610d00830151600109612f6083015280612ee0830151600109612f8083015280612f00830151600109612fa083015280612f20830151600109612fc083015280610d20830151612ec084015109612fe083015280610580830151610bc08401510961300083015280600161058084015109613020830152806130208301518203610b4084015108613040830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f61058084015109613060830152806130608301518203610b4084015108613080830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610580840151096130a0830152806130a08301518203610b40840151086130c0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610580840151096130e0830152806130e08301518203610b408401510861310083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610bc085015109610b4084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610bc08801510961058087015109089050806131208401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610bc085015109610b4084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610bc08801510961058087015109089050806131408401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610bc085015109610b4084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610bc088015109610580870151090861316084015250613040820151819060010961318083018190526130808301518291096131a083018190526131008301518291096131c0830152806001610b40840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058087015109089050806131e08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610bc085015109610b4084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610bc08801510961058087015109089050806132008401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610bc085015109610b4084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610bc08801510961058087015109089050806132208401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610bc085015109610b4084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610bc0880151096105808701510908613240840152506130c08201516131a08301518291900961326083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa361058085015109610b4084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105808801510961058087015109089050806132808401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e61058085015109610b4084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105808801510961058087015109089050806132a08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e861058085015109610b4084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105808801510961058087015109089050806132c08401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161961058085015109610b4084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105808801510961058087015109086132e0840152506131008201516131808301518291900961330083015261312082015181816131408501510990508061332084015281816131608501510990508061334084015281816131e0850151099050806133608401528181613180850151099050806133808401528181613200850151099050806133a08401528181613220850151099050806133c08401528181613240850151099050806133e084015281816132608501510990508061340084015281816132808501510990508061342084015281816132a08501510990508061344084015281816131a08501510990508061346084015281816132c08501510990508061348084015281816132e0850151099050806134a08401528181613300850151099050806134c0840152506020613500830152602061352083015260206135408301526134c08201516135608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6135808301526000805160206154138339815191526135a083015282600160206134e0850160c0613500870160055afa141692506134e08201516000613300840151905082826134a0860151096133008501528282820991506132e084015190508282613480860151096132e08501528282820991506132c084015190508282613460860151096132c08501528282820991506131a084015190508282613440860151096131a08501528282820991506132a084015190508282613420860151096132a08501528282820991506132808401519050828261340086015109613280850152828282099150613260840151905082826133e086015109613260850152828282099150613240840151905082826133c086015109613240850152828282099150613220840151905082826133a086015109613220850152828282099150613200840151905082826133808601510961320085015282828209915061318084015190508282613360860151096131808501528282820991506131e084015190508282613340860151096131e08501528282820991506131608401519050828261332086015109613160850152828282099150613140840151905082826131208601510961314085015282828209613120850181905261314085015190925083915082900890508181613160850151086135c0840152506131808201516131c0830151829190096135e08301526131e08201518061360084015250806132608301516131c0840151096136208301526132008201518181613220850151089050818161324085015108613640840152506131a08201516131c08301518291900961366083015261328082015181816132a085015108613680840152506133008201516131c0830151829190096136a08301526132c082015181816132e0850151086136c0840152506135c082015161360083015182908290099050806136e084015281816136408501510990508061370084015281816136808501510990508061372084015281816136c08501510990508061374084015250602061378083015260206137a083015260206137c08301526137408201516137e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6138008301526000805160206154138339815191526138208301528260016020613760850160c0613780870160055afa1416925061376082015160006136c084015190508282613720860151096136c08501528282820991506136808401519050828261370086015109613680850152828282099150613640840151905082826136e086015109613640850152828282099150613600840151905082826135c086015109613600850152828282096135c085015250506136008201516135e08301518291900961384083015280613640830151613620840151096138608301528061368083015161366084015109613880830152806136c08301516136a0840151096138a0830152610a40820151819080096138c08301819052610a408301518291096138e08301819052610a408301518291096139008301819052610a408301518291096139208301819052610a408301518291096139408301819052610a408301518291096139608301819052610a408301518291096139808301819052610a408301518291096139a08301819052610a408301518291096139c08301819052610a408301518291096139e08301819052610a40830151829109613a008301819052610a40830151829109613a208301819052610a40830151829109613a408301819052610a40830151829109613a608301819052610a40830151829109613a808301819052610a40830151829109613aa08301819052610a40830151829109613ac08301819052610a40830151829109613ae08301819052610a40830151829109613b008301819052610a40830151829109613b20830152610aa082015181908009613b408301819052610aa0830151829109613b608301819052610aa0830151829109613b808301819052610aa0830151829109613ba0830152806131208301516105c084015109818183613140860151610600870151090890508181836131608601516106808701510908613bc084018190526135c08401518392509009613be0830152806001613be0840151830309613c00830152806131208301516105e084015109818183613140860151610620870151090890508181836131608601516106608701510908613c2084018190526135c08401518392509009613c408301819052610a408301518291820309613c6083015280610a40830151600109613c8083015280613c60830151613c0084015108613ca0830152806001613ca084015109613cc0830152806001613c8084015109613ce0830152806135e0830151600109613d00830152806131e083015161064084015109613d208301819052613840830151829109613d40830152806001613d40840151830309613d60830152806001613d0084015109613d80830152806131e0830151610a0084015109613da08301819052613840830151829109613dc08301819052610a408301518291820309613de083015280610a40830151613d0084015109613e0083015280613de0830151613d6084015108613e20830152806131e08301516106a084015109613e408301819052613840830151829109613e6083018190526138c08301518291820309613e80830152806138c0830151613d0084015109613ea083015280613e80830151613e2084015108613ec0830152806131e08301516106c084015109613ee08301819052613840830151829109613f0083018190526138e08301518291820309613f20830152806138e0830151613d0084015109613f4083015280613f20830151613ec084015108613f60830152806131e08301516106e084015109613f808301819052613840830151829109613fa083018190526139008301518291820309613fc083015280613900830151613d0084015109613fe083015280613fc0830151613f6084015108614000830152806131e08301516107008401510961402083018190526138408301518291096140408301819052613920830151829182030961406083015280613920830151613d008401510961408083015280614060830151614000840151086140a0830152806131e0830151610720840151096140c083018190526138408301518291096140e08301819052613940830151829182030961410083015280613940830151613d0084015109614120830152806141008301516140a084015108614140830152806131e0830151610740840151096141608301819052613840830151829109614180830181905261396083015182918203096141a083015280613960830151613d00840151096141c0830152806141a0830151614140840151086141e0830152806131e08301516107608401510961420083018190526138408301518291096142208301819052613980830151829182030961424083015280613980830151613d0084015109614260830152806142408301516141e084015108614280830152806131e0830151610780840151096142a083018190526138408301518291096142c083018190526139a083015182918203096142e0830152806139a0830151613d0084015109614300830152806142e083015161428084015108614320830152806131e08301516107a084015109614340830181905261384083015182910961436083018190526139c08301518291820309614380830152806139c0830151613d00840151096143a083015280614380830151614320840151086143c0830152806131e08301516107c0840151096143e0830181905261384083015182910961440083018190526139e08301518291820309614420830152806139e0830151613d0084015109614440830152806144208301516143c084015108614460830152806131e08301516107e08401510961448083018190526138408301518291096144a08301819052613a0083015182918203096144c083015280613a00830151613d00840151096144e0830152806144c083015161446084015108614500830152806131e08301516108208401510961452083018190526138408301518291096145408301819052613a20830151829182030961456083015280613a20830151613d008401510961458083015280614560830151614500840151086145a0830152806131e0830151610840840151096145c083018190526138408301518291096145e08301819052613a40830151829182030961460083015280613a40830151613d0084015109614620830152806146008301516145a084015108614640830152806131e08301516108608401510961466083018190526138408301518291096146808301819052613a6083015182918203096146a083015280613a60830151613d00840151096146c0830152806146a0830151614640840151086146e0830152806131e08301516108808401510961470083018190526138408301518291096147208301819052613a80830151829182030961474083015280613a80830151613d0084015109614760830152806147408301516146e084015108614780830152806131e08301516108a0840151096147a083018190526138408301518291096147c08301819052613aa083015182918203096147e083015280613aa0830151613d0084015109614800830152806147e083015161478084015108614820830152806131e08301516108c08401510961484083018190526138408301518291096148608301819052613ac0830151829182030961488083015280613ac0830151613d00840151096148a083015280614880830151614820840151086148c0830152806135e0830151612f60840151096148e0830152806135e0830151612f8084015109614900830152806135e0830151612fa084015109614920830152806135e0830151612fc084015109614940830152806131e0830151612fe08401510961496083018190526138408301518291096149808301819052613ae083015182918203096149a083015280613ae0830151613d00840151096149c083015280613ae08301516148e0840151096149e083015280613ae083015161490084015109614a0083015280613ae083015161492084015109614a2083015280613ae083015161494084015109614a40830152806149a08301516148c084015108614a60830152806131e083015161080084015109614a808301819052613840830151829109614aa08301819052613b008301518291820309614ac083015280613b00830151613d0084015109614ae083015280614ac0830151614a6084015108614b008301819052610aa0830151829109614b2083015280610aa0830151613d8084015109614b4083015280610aa0830151613e0084015109614b6083015280610aa0830151613ea084015109614b8083015280610aa0830151613f4084015109614ba083015280610aa0830151613fe084015109614bc083015280610aa083015161408084015109614be083015280610aa083015161412084015109614c0083015280610aa08301516141c084015109614c2083015280610aa083015161426084015109614c4083015280610aa083015161430084015109614c6083015280610aa08301516143a084015109614c8083015280610aa083015161444084015109614ca083015280610aa08301516144e084015109614cc083015280610aa083015161458084015109614ce083015280610aa083015161462084015109614d0083015280610aa08301516146c084015109614d2083015280610aa083015161476084015109614d4083015280610aa083015161480084015109614d6083015280610aa08301516148a084015109614d8083015280610aa08301516149c084015109614da083015280610aa08301516149e084015109614dc083015280610aa0830151614a0084015109614de083015280610aa0830151614a2084015109614e0083015280610aa0830151614a4084015109614e2083015280610aa0830151614ae084015109614e4083015280614b20830151613cc084015108614e6083015280613620830151600109614e80830152806132008301516108e084015109818183613220860151610900870151090890508181836132408601516109208701510908614ea084018190526138608401518392509009614ec0830152806001614ec0840151830309614ee0830152806001614e8084015109614f0083015280613b40830151614ee084015109614f2083015280613b40830151614f0084015109614f4083015280614f20830151614e6084015108614f6083015280613660830151600109614f8083015280613280830151610940840151098181836132a08601516109608701510908614fa084018190526138808401518392509009614fc0830152806001614fc0840151830309614fe0830152806001614f808401510961500083015280613280830151610980840151098181836132a08601516109a08701510908615020840181905261388084015183925090096150408301819052610a40830151829182030961506083015280610a40830151614f808401510961508083015280615060830151614fe0840151086150a08301819052613b608301518291096150c083015280613b60830151615000840151096150e083015280613b6083015161508084015109615100830152806150c0830151614f6084015108615120830152806136a0830151600109615140830152806132c08301516109c0840151098181836132e08601516109e0870151090861516084018190526138a084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c083015280613b808301516151a0840151096151e083015280613b808301516151c084015109615200830152806151e083015161512084015108615220830152806131c083015160010961524083015280610b408301516001096152608301526001615280830181815260026152a08501526152208401516152c085015284919060409060608160075afa141692506152808201516152e08301526152a08201516153008301526060820151615320830152608082015161534083015282600160406152e0850160806152e0870160065afa1416925060a082015161536083015260c0820151615380830152613ce08201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa1416925060e0820151615440830152610100820151615460830152614b40820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692506101c08201516155208301526101e0820151615540830152614b60820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f23a3b90b52101f0a6b5743b3e901cc1ca3fedcf56639e3f5d092c1fe8918dd496156008301527f2d1ac29c598a842f7865a78359fe925ab012907df3ef22ecee8c3e38775c47fd615620830152614b80820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f03889f612bd17e011b13902673a70688bbacdf22704cc8295740a0b855955fc06156e08301527f077a491ddd81dbd1802d89735ae881c56da97f908e0bb6a3a8ad6fd9f72db123615700830152614ba082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f293f3eeabeb387e78c97a4de420d2336ff8ed1aaadf797c7dc3e622c9f1440526157c08301527f04f8141148a083ed78d264b622ccd39fdc2e5a4d4309def83c65f641fa1f73ae6157e0830152614bc082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f153842f7c3d4213d1a0bdf0272dc0ac05b87949495a94680ea07f5528cd4cb656158a08301527f197481eee392189181d33d51883b612dc4b9b7b40ac3c516d04ef58b4458f8416158c0830152614be08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f2eb2df9649175ed689ae9b18bd9c2da55e06f28b8bade40ece584fe646987af26159808301527f060bd862d267d622becf447c96e00a075a556a12d57a89cdfcccd59180d6e1836159a0830152614c008201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f261ab047cacbf6fda910b594e5a47fce17d7bf5912a803a159724638ac9a9293615a608301527f1c19cf99cd99c0a2995e7b540f0e131d5a76ada19f52dbf97bf3f7e048e24d57615a80830152614c20820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f09852cc4d7e43585f80a71bb658d117c8bad4afd38c56250f79e2fe5ea36cbea615b408301527f0eafdf1dc0ebc50c66a28ef4e4ce11d67dc26835ee8fca885308c4e800e503db615b60830152614c40820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f060d05d9347318b8c482f43d589babe34c4feac67e633b7c7d205124e5942031615c208301527f126bce5e065317f42c4ea09165d00008202438e1c490d572c6b76613f21a1ebf615c40830152614c60820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f1d0f94f3535e58b5d06c339b6364b77cafc3894f0189d777a08f20ce239a1a34615d008301527f0b53ad507c469a238239f93e42e07194761f396948a8d4af1b2ef3eda0ba369f615d20830152614c80820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f05ffd6f47fadc13d413ff73d3dcd2b5413970d2328ace551b3b1d5f20a687375615de08301527f267595ab27c68ff69d06c8c28585973ef0fbad8e0982871a193b026541e27893615e00830152614ca0820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f072dca4b7136fbd39742610eeae201e76bc2295ddc20cc18dd6b19aa7b724b13615ec08301527f23048e9bb2debeafcf95628ab81b03275cdee33bca18d579dde2661f64645ec5615ee0830152614cc0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f05469c240f7b5fedc125ba1ee66cae1377ec75579599278f630f2d7640994fec615fa08301527f08b814cfa26074aade7bab13b494f598aa5bfdbc49d0df4c4390dd69285d03d0615fc0830152614ce0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f07faf619bc79f6e8ecd37ee152e6befc7b7789c1b594544bf208493392a8ee286160808301527f2a91842e18f3ac761e5f65edc640dd42ef6d9115b649ad3acdff6cced7a274aa6160a0830152614d008201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f0fd4442f53e6b5a5f860c2c811cf4e498642314abc354e0a174be6b8bc0e27e56161608301527f091f3fcbe89a23c4458c2e38c7b6444e28d8244c08549e9525ceedf4a320cbc0616180830152614d208201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f050cba2ca48cc882687a9e66867e984e2ce5494778a8bcaffdd2296ba9abdb566162408301527f0e44d0ab2133714afce93a354d6271470c293f18ef29ecc874416f81ffb92818616260830152614d40820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507f2f69a41fff5cbe55da07d30e789a0d7660d3e841c70ebb326f5825610a4a5c086163208301527f1fe7e7411a599e8addf546471194a4851d36c711a88e926632f571f0d91fc9f6616340830152614d60820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f26a5a8097f66050a9a3d815d3915eb122d75020777f9e87b160e67cc7fa17e5e6164008301527f12c0173fdec4f54e72a0ab39fd9a5ffa14364bbb1ef304610af17195b993b316616420830152614d80820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506104208201516164e0830152610440820151616500830152614da082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506104608201516165c08301526104808201516165e0830152614dc082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104a08201516166a08301526104c08201516166c0830152614de08201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104e08201516167808301526105008201516167a0830152614e008201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa14169250610520820151616860830152610540820151616880830152614e208201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa141692506103808201516169408301526103a0820151616960830152614e40820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa141692506102c0820151616a208301526102e0820151616a40830152614f40820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa14169250610300820151616b00830152610320820151616b208301526150e0820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610340820151616be0830152610360820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610180820151616cc08301526101a0820151616ce0830152615200820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610ae0820151616da0830152610b00820151616dc08301526152408201518103616de0830152508160016040616da084016060616da0860160075afa14169150616d20810151616e00820152616d40810151616e20820152616da0810151616e40820152616dc0810151616e608201528160016040616e0084016080616e00860160065afa14169150610b80810151616e80820152610ba0810151616ea0820152615260810151616ec08201528160016040616e8084016060616e80860160075afa14169150616e00810151616ee0820152616e20810151616f00820152616e80810151616f20820152616ea0810151616f408201528160016040616ee084016080616ee0860160065afa14169150616ee0810151616f60820152616f00810151616f808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2616fa08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed616fc08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b616fe08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617000820152610b80810151617020820152610ba08101516170408201527f1d34ba6e3b52afa8a8df056bfc5157fa16e2c5bb045aab7186aab58f70927fbc6170608201527f0b4a022eb8fc503d9d91660c783fc6e37ae61570ebe4883f3663d5b4a435665e6170808201527f2495e03d5e5c9d6acf62cdf715118eebbda912e3092dfe3e9813ed642cdf04126170a08201527f0b9a8ccf1bc9f1b36b74792ad10007ce579e8ba5574a9880d6dff4da84768efe6170c08201528160016020616f608401610180616f60860160085afa616f6093909301516001149214161691505092915050565b604051806170c00160405280610386906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156152b2576152b2615273565b604052919050565b600082601f8301126152cb57600080fd5b813567ffffffffffffffff8111156152e5576152e5615273565b6152f8601f8201601f1916602001615289565b81815284602083860101111561530d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561533d57600080fd5b823567ffffffffffffffff8082111561535557600080fd5b818501915085601f83011261536957600080fd5b813560208282111561537d5761537d615273565b8160051b61538c828201615289565b928352848101820192828101908a8511156153a657600080fd5b958301955b848710156153c4578635825295830195908301906153ab565b97505050860135925050808211156153db57600080fd5b506153e8858286016152ba565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220acce6e0c3fd5aa5773e58c5af181185c75eedbaee08cdea5f8643c6575b25b4a64736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e36600461532a565b610057565b604051901515815260200160405180910390f35b60006001610063615253565b6000805160206154138339815191526100d9565b6000805160206153f383398151915280831081831016908380096000805160206153f38339815191528384096000805160206153f383398151915284820990506000805160206153f38339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301527f28c894f41fc22dc4314404d520858054b873e3fa824b0b79c28069864128959c600083015260208501518060608401526040860151806080850152846101388284610077565b169450505060608501518060a084015260808601518060c08501528461015e8284610077565b169450505060a08501518060e084015260c086015180610100850152846101858284610077565b16945050506101206000830120610120830152610120820151818106610140840152806101608401525060e085015180610180840152610100860151806101a0850152846101d38284610077565b1694505050610120850151806101c0840152610140860151806101e0850152846101fd8284610077565b60a061016087012061020087018190528581066102208801526102408701521694506001915050610260830153602161024083012061026083018190528181066102808401526102a08301526101608501516102c083018190526101808601516102e08401819052846102708284610077565b16945050506101a0850151806103008401526101c0860151806103208501528461029a8284610077565b16945050506101e08501518061034084015261020086015180610360850152846102c48284610077565b169450505061022085015180610380840152610240860151806103a0850152846102ee8284610077565b16945050506101206102a08301206103c08301526103c08201518181066103e0840152806104008401525061026085015180610420840152610280860151806104408501528461033e8284610077565b16945050506102a0850151806104608401526102c086015180610480850152846103688284610077565b16945050506102e0850151806104a0840152610300860151806104c0850152846103928284610077565b1694505050610320850151806104e084015261034086015180610500850152846103bc8284610077565b16945050506103608501518061052084015261038086015180610540850152846103e68284610077565b1694505050610160610400830120610560830152610560820151818106610580840152806105a084015250806103a0860151066105c0830152806103c0860151066105e0830152806103e086015106610600830152806104008601510661062083015280610420860151066106408301528061044086015106610660830152806104608601510661068083015280610480860151066106a0830152806104a0860151066106c0830152806104c0860151066106e0830152806104e086015106610700830152806105008601510661072083015280610520860151066107408301528061054086015106610760830152806105608601510661078083015280610580860151066107a0830152806105a0860151066107c0830152806105c0860151066107e0830152806105e086015106610800830152806106008601510661082083015280610620860151066108408301528061064086015106610860830152806106608601510661088083015280610680860151066108a0830152806106a0860151066108c0830152806106c0860151066108e0830152806106e086015106610900830152806107008601510661092083015280610720860151066109408301528061074086015106610960830152806107608601510661098083015280610780860151066109a0830152806107a0860151066109c0830152806107c0860151066109e0830152806107e086015106610a008301526104806105a0830120610a20830152610a20820151818106610a4084015280610a60840152506001610a808301536021610a60830120610a808301819052818106610aa0840152610ac0830152610800850151610ae08301819052610820860151610b0084018190528461066f8284610077565b16945050506060610ac0830120610b20830152610b20820151818106610b4084015280610b608401525061084085015180610b8084015261086086015180610ba0850152846106be8284610077565b16945050508061058083015161058084015109610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d0084015108610d20830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d2084015109610d40830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d4084015109610d60830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff61058084015108610d80830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d4084015109610da0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb061058084015108610dc0830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d4084015109610de0830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc61058084015108610e00830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d4084015109610e20830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc61058084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d4084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e61058084015108610e80830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d4084015109610ea0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e761058084015108610ec0830152806001610d4084015109610ee0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058084015108610f00830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d4084015109610f20830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa261058084015108610f40830152610d808201518181610dc085015109905080610f608401528181610e0085015109905080610f808401528181610e4085015109905080610fa08401528181610e8085015109905080610fc08401528181610ec085015109905080610fe08401528181610f00850151099050806110008401528181610f40850151099050806110208401528181610d208501510990508061104084015250602061108083015260206110a083015260206110c08301526110408201516110e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6111008301526000805160206154138339815191526111208301528260016020611060850160c0611080870160055afa141692506110608201516000610d208401519050828261102086015109610d20850152828282099150610f408401519050828261100086015109610f40850152828282099150610f0084015190508282610fe086015109610f00850152828282099150610ec084015190508282610fc086015109610ec0850152828282099150610e8084015190508282610fa086015109610e80850152828282099150610e4084015190508282610f8086015109610e40850152828282099150610e0084015190508282610f6086015109610e00850152828282099150610dc084015190508282610d8086015109610dc085015282828209610d808501819052610d608501518493509091500961114083015280610dc0830151610da08401510961116083015280610e00830151610de08401510961118083015280610e40830151610e20840151096111a083015280610e80830151610e60840151096111c083015280610ec0830151610ea0840151096111e083015280610f00830151610ee08401510961120083015280610f40830151610f20840151096112208301528060208301516112008401510981818360408601516112208701510908611240840152506106e08201516105c0830151829190086112608301819052819080096112808301819052819080096112a0830152806112a0830151611260840151096112c0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad56112c0840151096112e0830152806107008301516105e0840151086113008301819052819080096113208301819052819080096113408301528061134083015161130084015109611360830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e861136084015109611380830152806113808301516112e0840151086113a08301528061060083015182036113a0840151086113c083018190526107808301518291096113e0830152806113e08301516103e084015109611400830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff96112c084015109611420830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113608401510961144083015280611440830151611420840151086114608301528061062083015182036114608401510861148083018190526107808301518291096114a0830152806114a0830151611400840151086114c0830152806114c08301516103e0840151096114e08301528061064083015182036112c08401510861150083018190526107a0830151829109611520830152806115208301516114e084015108611540830152806115408301516103e084015109611560830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561064084015109611580830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611300840151096115a0830152806115a0830151611580840151086115c083018190526106a08301518291086115e0830181905281908009611600830181905281908009611620830152806116208301516115e084015109611640830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e6661060084015109611660830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe6106208401510961168083015280611680830151611660840151086116a0830152806116a08301518203611640840151086116c083018190526107a08301518291096116e0830152806116e083015161156084015108611700830152806117008301516103e084015109611720830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961064084015109611740830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c861130084015109611760830152806117608301516117408401510861178083018190526106c08301518291086117a0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb02610600840151096117c0830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be610620840151096117e0830152806117e08301516117c0840151086118008301528061180083015182036117a08401510861182083018190526107a08301518291096118408301528061184083015161172084015108611860830152806118608301516103e0840151096118808301528061076083015182036001086118a083018190526107608301518291096118c08301528061076083015182036002086118e083018190526118c08301518291096119008301528061076083015182036004086119208301819052611900830151829109611940830152806105c0830151610680840151086119608301528061060083015182036119608401510861198083018190526119408301518291096119a0830152806119a0830151611880840151086119c0830152806119c08301516103e0840151096119e083015280610620830151820361066084015108611a008301819052611940830151829109611a2083015280611a208301516119e084015108611a4083015280611a408301516103e084015109611a60830152806107c08301516113c084015109611a8083015280611a80830151611a6084015108611aa083015280611aa08301516103e084015109611ac0830152806107c083015161148084015109611ae083015280611ae0830151611ac084015108611b0083015280611b008301516103e084015109611b20830152806107e083015161150084015109611b4083015280611b40830151611b2084015108611b6083015280611b608301516103e084015109611b80830152806107e08301516116c084015109611ba083015280611ba0830151611b8084015108611bc083015280611bc08301516103e084015109611be0830152806107e083015161182084015109611c0083015280611c00830151611be084015108611c2083015280611c208301516103e084015109611c40830152806107608301518203600308611c608301819052611900830151829109611c8083015280611c8083015161198084015109611ca083015280611ca0830151611c4084015108611cc083015280611cc08301516103e084015109611ce083015280611c80830151611a0084015109611d0083015280611d00830151611ce084015108611d2083015280611d208301516103e084015109611d40830152806107608301516118e084015109611d6083015280611d60830151611c6084015109611d8083015280611d8083015161192084015109611da083015280611da083015161064084015109611dc0830152806106408301518203600108611de08301819052611dc0830151829109611e0083015280611e00830151611d4084015108611e2083015280611e208301516103e084015109611e4083015280610640830151600209611e60830152806105c083015182036105e084015108611e808301819052611e60830151829109611ea0830152806105c0830151820361060084015108611ec083015280611ec08301518203611ea084015108611ee08301528061062083015182036105e084015108611f0083015280611f008301518203611ee084015108611f208301819052611da0830151829109611f4083015280611f40830151611e4084015108611f6083015280611f608301516103e084015109611f80830152806118c0830151611c6084015109611fa083015280611fa083015161192084015109611fc0830152806105e08301516105c084015108611fe0830152806106408301518203611fe0840151086120008301819052611fc083015182910961202083015280612020830151611f8084015108612040830152806120408301516103e0840151096120608301819052612020830151829108612080830152806120808301516103e0840151096120a0830152806108e083015182036001086120c083018190526112008301518291096120e0830152806120e08301516120a084015108612100830152806121008301516103e0840151096121208301526109408201518190800961214083015280610940830151820361214084015108612160830181905261114083015182910961218083015280612180830151612120840151086121a0830152806121a08301516103e0840151096121c0830152806109208301518203610940840151086121e08301819052611200830151829109612200830152806122008301516121c084015108612220830152806122208301516103e084015109612240830152806111408301518203600108612260830152806111808301516111608401510861228083018190526111a08301518291086122a083018190526111c08301518291086122c083018190526111e08301518291086122e0830152806122e08301518203612260840151086123008301528061022083015161082084015109612320830152806123208301516106a08401510861234083018190526102808301518291086123608301528061022083015161084084015109612380830152806123808301516105c0840151086123a083018190526102808301518291086123c083018190526123608301518291096123e08301528061022083015161086084015109612400830152806124008301516105e084015108612420830181905261028083015182910861244083018190526123e08301518291096124608301528061022083015161088084015109612480830152806124808301516106c0840151086124a083018190526102808301518291086124c083018190526124608301518291096124e08301819052610900830151829109612500830152806102208301516001096125208301528061252083015161058084015109612540830152806125408301516106a0840151086125608301819052610280830151829108612580830152806102208301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096125a0830152806125a0830151610580840151096125c0830152806125c08301516105c0840151086125e083018190526102808301518291086126008301819052612580830151829109612620830152806102208301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096126408301528061264083015161058084015109612660830152806126608301516105e08401510861268083018190526102808301518291086126a083018190526126208301518291096126c0830152806102208301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096126e0830152806126e083015161058084015109612700830152806127008301516106c084015108612720830181905261028083015182910861274083018190526126c083015182910961276083018190526108e0830151829109612780830152806127808301518203612500840151086127a083018190526123008301518291096127c0830152806127c0830151612240840151086127e0830152806127e08301516103e084015109612800830152806102208301516108a08401510961282083015280612820830151610640840151086128408301819052610280830151829108612860830152806102208301516108c08401510961288083015280612880830151611240840151086128a083018190526102808301518291086128c083018190526128608301518291096128e08301819052610960830151829109612900830152806102208301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612920830152806129208301516105808401510961294083015280612940830151610640840151086129608301819052610280830151829108612980830152806102208301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d096129a0830152806129a0830151610580840151096129c0830152806129c0830151611240840151086129e08301819052610280830151829108612a008301819052612980830151829109612a208301819052610940830151829109612a4083015280612a40830151820361290084015108612a608301819052612300830151829109612a8083015280612a8083015161280084015108612aa083015280612aa08301516103e084015109612ac0830152806109808301518203600108612ae08301819052611200830151829109612b0083015280612b00830151612ac084015108612b2083015280612b208301516103e084015109612b4083015261098082015181908009612b60830152806109808301518203612b6084015108612b808301819052611140830151829109612ba083015280612ba0830151612b4084015108612bc083015280612bc08301516103e084015109612be0830152806102208301516109c084015108612c0083018190526109a0830151829109612c2083015280610280830151610a0084015108612c408301819052612c20830151829109612c608301528061060083015161010009612c8083015280612c8083015182036105c084015108612ca08301819052610740830151829109612cc08301819052610220830151829108612ce08301819052610980830151829109612d008301528061028083015161072084015108612d208301819052612d00830151829109612d4083015280612d408301518203612c6084015108612d608301819052612300830151829109612d8083015280612d80830151612be084015108612da083015280612da08301516103e084015109612dc083015280610a0083015182036109c084015108612de08301819052611200830151829109612e0083015280612e00830151612dc084015108612e2083015280612e208301516103e084015109612e4083015280612300830151612de084015109612e60830152806109e083015182036109c084015108612e808301819052612e60830151829109612ea083015280612ea0830151612e4084015108612ec0830152610d0082015181908009612ee08301819052610d00830151829109612f008301819052610d00830151829109612f208301819052610d00830151829109612f4083015280610d00830151600109612f6083015280612ee0830151600109612f8083015280612f00830151600109612fa083015280612f20830151600109612fc083015280610d20830151612ec084015109612fe083015280610580830151610bc08401510961300083015280600161058084015109613020830152806130208301518203610b4084015108613040830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f61058084015109613060830152806130608301518203610b4084015108613080830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610580840151096130a0830152806130a08301518203610b40840151086130c0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610580840151096130e0830152806130e08301518203610b408401510861310083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610bc085015109610b4084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610bc08801510961058087015109089050806131208401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610bc085015109610b4084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610bc08801510961058087015109089050806131408401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610bc085015109610b4084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610bc088015109610580870151090861316084015250613040820151819060010961318083018190526130808301518291096131a083018190526131008301518291096131c0830152806001610b40840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058087015109089050806131e08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610bc085015109610b4084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610bc08801510961058087015109089050806132008401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610bc085015109610b4084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610bc08801510961058087015109089050806132208401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610bc085015109610b4084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610bc0880151096105808701510908613240840152506130c08201516131a08301518291900961326083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa361058085015109610b4084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105808801510961058087015109089050806132808401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e61058085015109610b4084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105808801510961058087015109089050806132a08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e861058085015109610b4084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105808801510961058087015109089050806132c08401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161961058085015109610b4084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105808801510961058087015109086132e0840152506131008201516131808301518291900961330083015261312082015181816131408501510990508061332084015281816131608501510990508061334084015281816131e0850151099050806133608401528181613180850151099050806133808401528181613200850151099050806133a08401528181613220850151099050806133c08401528181613240850151099050806133e084015281816132608501510990508061340084015281816132808501510990508061342084015281816132a08501510990508061344084015281816131a08501510990508061346084015281816132c08501510990508061348084015281816132e0850151099050806134a08401528181613300850151099050806134c0840152506020613500830152602061352083015260206135408301526134c08201516135608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6135808301526000805160206154138339815191526135a083015282600160206134e0850160c0613500870160055afa141692506134e08201516000613300840151905082826134a0860151096133008501528282820991506132e084015190508282613480860151096132e08501528282820991506132c084015190508282613460860151096132c08501528282820991506131a084015190508282613440860151096131a08501528282820991506132a084015190508282613420860151096132a08501528282820991506132808401519050828261340086015109613280850152828282099150613260840151905082826133e086015109613260850152828282099150613240840151905082826133c086015109613240850152828282099150613220840151905082826133a086015109613220850152828282099150613200840151905082826133808601510961320085015282828209915061318084015190508282613360860151096131808501528282820991506131e084015190508282613340860151096131e08501528282820991506131608401519050828261332086015109613160850152828282099150613140840151905082826131208601510961314085015282828209613120850181905261314085015190925083915082900890508181613160850151086135c0840152506131808201516131c0830151829190096135e08301526131e08201518061360084015250806132608301516131c0840151096136208301526132008201518181613220850151089050818161324085015108613640840152506131a08201516131c08301518291900961366083015261328082015181816132a085015108613680840152506133008201516131c0830151829190096136a08301526132c082015181816132e0850151086136c0840152506135c082015161360083015182908290099050806136e084015281816136408501510990508061370084015281816136808501510990508061372084015281816136c08501510990508061374084015250602061378083015260206137a083015260206137c08301526137408201516137e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6138008301526000805160206154138339815191526138208301528260016020613760850160c0613780870160055afa1416925061376082015160006136c084015190508282613720860151096136c08501528282820991506136808401519050828261370086015109613680850152828282099150613640840151905082826136e086015109613640850152828282099150613600840151905082826135c086015109613600850152828282096135c085015250506136008201516135e08301518291900961384083015280613640830151613620840151096138608301528061368083015161366084015109613880830152806136c08301516136a0840151096138a0830152610a40820151819080096138c08301819052610a408301518291096138e08301819052610a408301518291096139008301819052610a408301518291096139208301819052610a408301518291096139408301819052610a408301518291096139608301819052610a408301518291096139808301819052610a408301518291096139a08301819052610a408301518291096139c08301819052610a408301518291096139e08301819052610a40830151829109613a008301819052610a40830151829109613a208301819052610a40830151829109613a408301819052610a40830151829109613a608301819052610a40830151829109613a808301819052610a40830151829109613aa08301819052610a40830151829109613ac08301819052610a40830151829109613ae08301819052610a40830151829109613b008301819052610a40830151829109613b20830152610aa082015181908009613b408301819052610aa0830151829109613b608301819052610aa0830151829109613b808301819052610aa0830151829109613ba0830152806131208301516105c084015109818183613140860151610600870151090890508181836131608601516106808701510908613bc084018190526135c08401518392509009613be0830152806001613be0840151830309613c00830152806131208301516105e084015109818183613140860151610620870151090890508181836131608601516106608701510908613c2084018190526135c08401518392509009613c408301819052610a408301518291820309613c6083015280610a40830151600109613c8083015280613c60830151613c0084015108613ca0830152806001613ca084015109613cc0830152806001613c8084015109613ce0830152806135e0830151600109613d00830152806131e083015161064084015109613d208301819052613840830151829109613d40830152806001613d40840151830309613d60830152806001613d0084015109613d80830152806131e0830151610a0084015109613da08301819052613840830151829109613dc08301819052610a408301518291820309613de083015280610a40830151613d0084015109613e0083015280613de0830151613d6084015108613e20830152806131e08301516106a084015109613e408301819052613840830151829109613e6083018190526138c08301518291820309613e80830152806138c0830151613d0084015109613ea083015280613e80830151613e2084015108613ec0830152806131e08301516106c084015109613ee08301819052613840830151829109613f0083018190526138e08301518291820309613f20830152806138e0830151613d0084015109613f4083015280613f20830151613ec084015108613f60830152806131e08301516106e084015109613f808301819052613840830151829109613fa083018190526139008301518291820309613fc083015280613900830151613d0084015109613fe083015280613fc0830151613f6084015108614000830152806131e08301516107008401510961402083018190526138408301518291096140408301819052613920830151829182030961406083015280613920830151613d008401510961408083015280614060830151614000840151086140a0830152806131e0830151610720840151096140c083018190526138408301518291096140e08301819052613940830151829182030961410083015280613940830151613d0084015109614120830152806141008301516140a084015108614140830152806131e0830151610740840151096141608301819052613840830151829109614180830181905261396083015182918203096141a083015280613960830151613d00840151096141c0830152806141a0830151614140840151086141e0830152806131e08301516107608401510961420083018190526138408301518291096142208301819052613980830151829182030961424083015280613980830151613d0084015109614260830152806142408301516141e084015108614280830152806131e0830151610780840151096142a083018190526138408301518291096142c083018190526139a083015182918203096142e0830152806139a0830151613d0084015109614300830152806142e083015161428084015108614320830152806131e08301516107a084015109614340830181905261384083015182910961436083018190526139c08301518291820309614380830152806139c0830151613d00840151096143a083015280614380830151614320840151086143c0830152806131e08301516107c0840151096143e0830181905261384083015182910961440083018190526139e08301518291820309614420830152806139e0830151613d0084015109614440830152806144208301516143c084015108614460830152806131e08301516107e08401510961448083018190526138408301518291096144a08301819052613a0083015182918203096144c083015280613a00830151613d00840151096144e0830152806144c083015161446084015108614500830152806131e08301516108208401510961452083018190526138408301518291096145408301819052613a20830151829182030961456083015280613a20830151613d008401510961458083015280614560830151614500840151086145a0830152806131e0830151610840840151096145c083018190526138408301518291096145e08301819052613a40830151829182030961460083015280613a40830151613d0084015109614620830152806146008301516145a084015108614640830152806131e08301516108608401510961466083018190526138408301518291096146808301819052613a6083015182918203096146a083015280613a60830151613d00840151096146c0830152806146a0830151614640840151086146e0830152806131e08301516108808401510961470083018190526138408301518291096147208301819052613a80830151829182030961474083015280613a80830151613d0084015109614760830152806147408301516146e084015108614780830152806131e08301516108a0840151096147a083018190526138408301518291096147c08301819052613aa083015182918203096147e083015280613aa0830151613d0084015109614800830152806147e083015161478084015108614820830152806131e08301516108c08401510961484083018190526138408301518291096148608301819052613ac0830151829182030961488083015280613ac0830151613d00840151096148a083015280614880830151614820840151086148c0830152806135e0830151612f60840151096148e0830152806135e0830151612f8084015109614900830152806135e0830151612fa084015109614920830152806135e0830151612fc084015109614940830152806131e0830151612fe08401510961496083018190526138408301518291096149808301819052613ae083015182918203096149a083015280613ae0830151613d00840151096149c083015280613ae08301516148e0840151096149e083015280613ae083015161490084015109614a0083015280613ae083015161492084015109614a2083015280613ae083015161494084015109614a40830152806149a08301516148c084015108614a60830152806131e083015161080084015109614a808301819052613840830151829109614aa08301819052613b008301518291820309614ac083015280613b00830151613d0084015109614ae083015280614ac0830151614a6084015108614b008301819052610aa0830151829109614b2083015280610aa0830151613d8084015109614b4083015280610aa0830151613e0084015109614b6083015280610aa0830151613ea084015109614b8083015280610aa0830151613f4084015109614ba083015280610aa0830151613fe084015109614bc083015280610aa083015161408084015109614be083015280610aa083015161412084015109614c0083015280610aa08301516141c084015109614c2083015280610aa083015161426084015109614c4083015280610aa083015161430084015109614c6083015280610aa08301516143a084015109614c8083015280610aa083015161444084015109614ca083015280610aa08301516144e084015109614cc083015280610aa083015161458084015109614ce083015280610aa083015161462084015109614d0083015280610aa08301516146c084015109614d2083015280610aa083015161476084015109614d4083015280610aa083015161480084015109614d6083015280610aa08301516148a084015109614d8083015280610aa08301516149c084015109614da083015280610aa08301516149e084015109614dc083015280610aa0830151614a0084015109614de083015280610aa0830151614a2084015109614e0083015280610aa0830151614a4084015109614e2083015280610aa0830151614ae084015109614e4083015280614b20830151613cc084015108614e6083015280613620830151600109614e80830152806132008301516108e084015109818183613220860151610900870151090890508181836132408601516109208701510908614ea084018190526138608401518392509009614ec0830152806001614ec0840151830309614ee0830152806001614e8084015109614f0083015280613b40830151614ee084015109614f2083015280613b40830151614f0084015109614f4083015280614f20830151614e6084015108614f6083015280613660830151600109614f8083015280613280830151610940840151098181836132a08601516109608701510908614fa084018190526138808401518392509009614fc0830152806001614fc0840151830309614fe0830152806001614f808401510961500083015280613280830151610980840151098181836132a08601516109a08701510908615020840181905261388084015183925090096150408301819052610a40830151829182030961506083015280610a40830151614f808401510961508083015280615060830151614fe0840151086150a08301819052613b608301518291096150c083015280613b60830151615000840151096150e083015280613b6083015161508084015109615100830152806150c0830151614f6084015108615120830152806136a0830151600109615140830152806132c08301516109c0840151098181836132e08601516109e0870151090861516084018190526138a084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c083015280613b808301516151a0840151096151e083015280613b808301516151c084015109615200830152806151e083015161512084015108615220830152806131c083015160010961524083015280610b408301516001096152608301526001615280830181815260026152a08501526152208401516152c085015284919060409060608160075afa141692506152808201516152e08301526152a08201516153008301526060820151615320830152608082015161534083015282600160406152e0850160806152e0870160065afa1416925060a082015161536083015260c0820151615380830152613ce08201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa1416925060e0820151615440830152610100820151615460830152614b40820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692506101c08201516155208301526101e0820151615540830152614b60820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f23a3b90b52101f0a6b5743b3e901cc1ca3fedcf56639e3f5d092c1fe8918dd496156008301527f2d1ac29c598a842f7865a78359fe925ab012907df3ef22ecee8c3e38775c47fd615620830152614b80820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f03889f612bd17e011b13902673a70688bbacdf22704cc8295740a0b855955fc06156e08301527f077a491ddd81dbd1802d89735ae881c56da97f908e0bb6a3a8ad6fd9f72db123615700830152614ba082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f293f3eeabeb387e78c97a4de420d2336ff8ed1aaadf797c7dc3e622c9f1440526157c08301527f04f8141148a083ed78d264b622ccd39fdc2e5a4d4309def83c65f641fa1f73ae6157e0830152614bc082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f153842f7c3d4213d1a0bdf0272dc0ac05b87949495a94680ea07f5528cd4cb656158a08301527f197481eee392189181d33d51883b612dc4b9b7b40ac3c516d04ef58b4458f8416158c0830152614be08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f2eb2df9649175ed689ae9b18bd9c2da55e06f28b8bade40ece584fe646987af26159808301527f060bd862d267d622becf447c96e00a075a556a12d57a89cdfcccd59180d6e1836159a0830152614c008201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f261ab047cacbf6fda910b594e5a47fce17d7bf5912a803a159724638ac9a9293615a608301527f1c19cf99cd99c0a2995e7b540f0e131d5a76ada19f52dbf97bf3f7e048e24d57615a80830152614c20820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f09852cc4d7e43585f80a71bb658d117c8bad4afd38c56250f79e2fe5ea36cbea615b408301527f0eafdf1dc0ebc50c66a28ef4e4ce11d67dc26835ee8fca885308c4e800e503db615b60830152614c40820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f060d05d9347318b8c482f43d589babe34c4feac67e633b7c7d205124e5942031615c208301527f126bce5e065317f42c4ea09165d00008202438e1c490d572c6b76613f21a1ebf615c40830152614c60820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f1d0f94f3535e58b5d06c339b6364b77cafc3894f0189d777a08f20ce239a1a34615d008301527f0b53ad507c469a238239f93e42e07194761f396948a8d4af1b2ef3eda0ba369f615d20830152614c80820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f05ffd6f47fadc13d413ff73d3dcd2b5413970d2328ace551b3b1d5f20a687375615de08301527f267595ab27c68ff69d06c8c28585973ef0fbad8e0982871a193b026541e27893615e00830152614ca0820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f072dca4b7136fbd39742610eeae201e76bc2295ddc20cc18dd6b19aa7b724b13615ec08301527f23048e9bb2debeafcf95628ab81b03275cdee33bca18d579dde2661f64645ec5615ee0830152614cc0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f05469c240f7b5fedc125ba1ee66cae1377ec75579599278f630f2d7640994fec615fa08301527f08b814cfa26074aade7bab13b494f598aa5bfdbc49d0df4c4390dd69285d03d0615fc0830152614ce0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f07faf619bc79f6e8ecd37ee152e6befc7b7789c1b594544bf208493392a8ee286160808301527f2a91842e18f3ac761e5f65edc640dd42ef6d9115b649ad3acdff6cced7a274aa6160a0830152614d008201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f0fd4442f53e6b5a5f860c2c811cf4e498642314abc354e0a174be6b8bc0e27e56161608301527f091f3fcbe89a23c4458c2e38c7b6444e28d8244c08549e9525ceedf4a320cbc0616180830152614d208201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f050cba2ca48cc882687a9e66867e984e2ce5494778a8bcaffdd2296ba9abdb566162408301527f0e44d0ab2133714afce93a354d6271470c293f18ef29ecc874416f81ffb92818616260830152614d40820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507f2f69a41fff5cbe55da07d30e789a0d7660d3e841c70ebb326f5825610a4a5c086163208301527f1fe7e7411a599e8addf546471194a4851d36c711a88e926632f571f0d91fc9f6616340830152614d60820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f26a5a8097f66050a9a3d815d3915eb122d75020777f9e87b160e67cc7fa17e5e6164008301527f12c0173fdec4f54e72a0ab39fd9a5ffa14364bbb1ef304610af17195b993b316616420830152614d80820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506104208201516164e0830152610440820151616500830152614da082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506104608201516165c08301526104808201516165e0830152614dc082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104a08201516166a08301526104c08201516166c0830152614de08201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104e08201516167808301526105008201516167a0830152614e008201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa14169250610520820151616860830152610540820151616880830152614e208201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa141692506103808201516169408301526103a0820151616960830152614e40820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa141692506102c0820151616a208301526102e0820151616a40830152614f40820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa14169250610300820151616b00830152610320820151616b208301526150e0820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610340820151616be0830152610360820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610180820151616cc08301526101a0820151616ce0830152615200820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610ae0820151616da0830152610b00820151616dc08301526152408201518103616de0830152508160016040616da084016060616da0860160075afa14169150616d20810151616e00820152616d40810151616e20820152616da0810151616e40820152616dc0810151616e608201528160016040616e0084016080616e00860160065afa14169150610b80810151616e80820152610ba0810151616ea0820152615260810151616ec08201528160016040616e8084016060616e80860160075afa14169150616e00810151616ee0820152616e20810151616f00820152616e80810151616f20820152616ea0810151616f408201528160016040616ee084016080616ee0860160065afa14169150616ee0810151616f60820152616f00810151616f808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2616fa08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed616fc08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b616fe08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617000820152610b80810151617020820152610ba08101516170408201527f1d34ba6e3b52afa8a8df056bfc5157fa16e2c5bb045aab7186aab58f70927fbc6170608201527f0b4a022eb8fc503d9d91660c783fc6e37ae61570ebe4883f3663d5b4a435665e6170808201527f2495e03d5e5c9d6acf62cdf715118eebbda912e3092dfe3e9813ed642cdf04126170a08201527f0b9a8ccf1bc9f1b36b74792ad10007ce579e8ba5574a9880d6dff4da84768efe6170c08201528160016020616f608401610180616f60860160085afa616f6093909301516001149214161691505092915050565b604051806170c00160405280610386906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156152b2576152b2615273565b604052919050565b600082601f8301126152cb57600080fd5b813567ffffffffffffffff8111156152e5576152e5615273565b6152f8601f8201601f1916602001615289565b81815284602083860101111561530d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561533d57600080fd5b823567ffffffffffffffff8082111561535557600080fd5b818501915085601f83011261536957600080fd5b813560208282111561537d5761537d615273565b8160051b61538c828201615289565b928352848101820192828101908a8511156153a657600080fd5b958301955b848710156153c4578635825295830195908301906153ab565b97505050860135925050808211156153db57600080fd5b506153e8858286016152ba565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220acce6e0c3fd5aa5773e58c5af181185c75eedbaee08cdea5f8643c6575b25b4a64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/InclusionVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50615467806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004615329565b610057565b604051901515815260200160405180910390f35b60006001610063615252565b6000805160206154128339815191526100d9565b6000805160206153f283398151915280831081831016908380096000805160206153f28339815191528384096000805160206153f283398151915284820990506000805160206153f28339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301527f2df16218a82d39831071e46956c233ee9aa79bb065b265871080d8643f2f52ab600083015260208501518060608401526040860151806080850152846101388284610077565b169450505060608501518060a084015260808601518060c08501528461015e8284610077565b169450505060a08501518060e084015260c086015180610100850152846101858284610077565b16945050506101206000830120610120830152610120820151818106610140840152806101608401525060e085015180610180840152610100860151806101a0850152846101d38284610077565b1694505050610120850151806101c0840152610140860151806101e0850152846101fd8284610077565b60a061016087012061020087018190528581066102208801526102408701521694506001915050610260830153602161024083012061026083018190528181066102808401526102a08301526101608501516102c083018190526101808601516102e08401819052846102708284610077565b16945050506101a0850151806103008401526101c0860151806103208501528461029a8284610077565b16945050506101e08501518061034084015261020086015180610360850152846102c48284610077565b169450505061022085015180610380840152610240860151806103a0850152846102ee8284610077565b16945050506101206102a08301206103c08301526103c08201518181066103e0840152806104008401525061026085015180610420840152610280860151806104408501528461033e8284610077565b16945050506102a0850151806104608401526102c086015180610480850152846103688284610077565b16945050506102e0850151806104a0840152610300860151806104c0850152846103928284610077565b1694505050610320850151806104e084015261034086015180610500850152846103bc8284610077565b16945050506103608501518061052084015261038086015180610540850152846103e68284610077565b1694505050610160610400830120610560830152610560820151818106610580840152806105a084015250806103a0860151066105c0830152806103c0860151066105e0830152806103e086015106610600830152806104008601510661062083015280610420860151066106408301528061044086015106610660830152806104608601510661068083015280610480860151066106a0830152806104a0860151066106c0830152806104c0860151066106e0830152806104e086015106610700830152806105008601510661072083015280610520860151066107408301528061054086015106610760830152806105608601510661078083015280610580860151066107a0830152806105a0860151066107c0830152806105c0860151066107e0830152806105e086015106610800830152806106008601510661082083015280610620860151066108408301528061064086015106610860830152806106608601510661088083015280610680860151066108a0830152806106a0860151066108c0830152806106c0860151066108e0830152806106e086015106610900830152806107008601510661092083015280610720860151066109408301528061074086015106610960830152806107608601510661098083015280610780860151066109a0830152806107a0860151066109c0830152806107c0860151066109e0830152806107e086015106610a008301526104806105a0830120610a20830152610a20820151818106610a4084015280610a60840152506001610a808301536021610a60830120610a808301819052818106610aa0840152610ac0830152610800850151610ae08301819052610820860151610b0084018190528461066f8284610077565b16945050506060610ac0830120610b20830152610b20820151818106610b4084015280610b608401525061084085015180610b8084015261086086015180610ba0850152846106be8284610077565b16945050508061058083015161058084015109610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d0084015108610d20830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d2084015109610d40830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d4084015109610d60830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff61058084015108610d80830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d4084015109610da0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb061058084015108610dc0830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d4084015109610de0830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc61058084015108610e00830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d4084015109610e20830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc61058084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d4084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e61058084015108610e80830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d4084015109610ea0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e761058084015108610ec0830152806001610d4084015109610ee0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058084015108610f00830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d4084015109610f20830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa261058084015108610f40830152610d808201518181610dc085015109905080610f608401528181610e0085015109905080610f808401528181610e4085015109905080610fa08401528181610e8085015109905080610fc08401528181610ec085015109905080610fe08401528181610f00850151099050806110008401528181610f40850151099050806110208401528181610d208501510990508061104084015250602061108083015260206110a083015260206110c08301526110408201516110e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6111008301526000805160206154128339815191526111208301528260016020611060850160c0611080870160055afa141692506110608201516000610d208401519050828261102086015109610d20850152828282099150610f408401519050828261100086015109610f40850152828282099150610f0084015190508282610fe086015109610f00850152828282099150610ec084015190508282610fc086015109610ec0850152828282099150610e8084015190508282610fa086015109610e80850152828282099150610e4084015190508282610f8086015109610e40850152828282099150610e0084015190508282610f6086015109610e00850152828282099150610dc084015190508282610d8086015109610dc085015282828209610d808501819052610d608501518493509091500961114083015280610dc0830151610da08401510961116083015280610e00830151610de08401510961118083015280610e40830151610e20840151096111a083015280610e80830151610e60840151096111c083015280610ec0830151610ea0840151096111e083015280610f00830151610ee08401510961120083015280610f40830151610f20840151096112208301528060208301516112008401510981818360408601516112208701510908611240840152506106e08201516105c0830151829190086112608301819052819080096112808301819052819080096112a0830152806112a0830151611260840151096112c0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad56112c0840151096112e0830152806107008301516105e0840151086113008301819052819080096113208301819052819080096113408301528061134083015161130084015109611360830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e861136084015109611380830152806113808301516112e0840151086113a08301528061060083015182036113a0840151086113c083018190526107808301518291096113e0830152806113e08301516103e084015109611400830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff96112c084015109611420830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113608401510961144083015280611440830151611420840151086114608301528061062083015182036114608401510861148083018190526107808301518291096114a0830152806114a0830151611400840151086114c0830152806114c08301516103e0840151096114e08301528061064083015182036112c08401510861150083018190526107a0830151829109611520830152806115208301516114e084015108611540830152806115408301516103e084015109611560830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561064084015109611580830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611300840151096115a0830152806115a0830151611580840151086115c083018190526106a08301518291086115e0830181905281908009611600830181905281908009611620830152806116208301516115e084015109611640830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e6661060084015109611660830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe6106208401510961168083015280611680830151611660840151086116a0830152806116a08301518203611640840151086116c083018190526107a08301518291096116e0830152806116e083015161156084015108611700830152806117008301516103e084015109611720830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961064084015109611740830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c861130084015109611760830152806117608301516117408401510861178083018190526106c08301518291086117a0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb02610600840151096117c0830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be610620840151096117e0830152806117e08301516117c0840151086118008301528061180083015182036117a08401510861182083018190526107a08301518291096118408301528061184083015161172084015108611860830152806118608301516103e0840151096118808301528061076083015182036001086118a083018190526107608301518291096118c08301528061076083015182036002086118e083018190526118c08301518291096119008301528061076083015182036004086119208301819052611900830151829109611940830152806105c0830151610680840151086119608301528061060083015182036119608401510861198083018190526119408301518291096119a0830152806119a0830151611880840151086119c0830152806119c08301516103e0840151096119e083015280610620830151820361066084015108611a008301819052611940830151829109611a2083015280611a208301516119e084015108611a4083015280611a408301516103e084015109611a60830152806107c08301516113c084015109611a8083015280611a80830151611a6084015108611aa083015280611aa08301516103e084015109611ac0830152806107c083015161148084015109611ae083015280611ae0830151611ac084015108611b0083015280611b008301516103e084015109611b20830152806107e083015161150084015109611b4083015280611b40830151611b2084015108611b6083015280611b608301516103e084015109611b80830152806107e08301516116c084015109611ba083015280611ba0830151611b8084015108611bc083015280611bc08301516103e084015109611be0830152806107e083015161182084015109611c0083015280611c00830151611be084015108611c2083015280611c208301516103e084015109611c40830152806107608301518203600308611c608301819052611900830151829109611c8083015280611c8083015161198084015109611ca083015280611ca0830151611c4084015108611cc083015280611cc08301516103e084015109611ce083015280611c80830151611a0084015109611d0083015280611d00830151611ce084015108611d2083015280611d208301516103e084015109611d40830152806107608301516118e084015109611d6083015280611d60830151611c6084015109611d8083015280611d8083015161192084015109611da083015280611da083015161064084015109611dc0830152806106408301518203600108611de08301819052611dc0830151829109611e0083015280611e00830151611d4084015108611e2083015280611e208301516103e084015109611e4083015280610640830151600209611e60830152806105c083015182036105e084015108611e808301819052611e60830151829109611ea0830152806105c0830151820361060084015108611ec083015280611ec08301518203611ea084015108611ee08301528061062083015182036105e084015108611f0083015280611f008301518203611ee084015108611f208301819052611da0830151829109611f4083015280611f40830151611e4084015108611f6083015280611f608301516103e084015109611f80830152806118c0830151611c6084015109611fa083015280611fa083015161192084015109611fc0830152806105e08301516105c084015108611fe0830152806106408301518203611fe0840151086120008301819052611fc083015182910961202083015280612020830151611f8084015108612040830152806120408301516103e0840151096120608301819052612020830151829108612080830152806120808301516103e0840151096120a0830152806108e083015182036001086120c083018190526112008301518291096120e0830152806120e08301516120a084015108612100830152806121008301516103e0840151096121208301526109408201518190800961214083015280610940830151820361214084015108612160830181905261114083015182910961218083015280612180830151612120840151086121a0830152806121a08301516103e0840151096121c0830152806109208301518203610940840151086121e08301819052611200830151829109612200830152806122008301516121c084015108612220830152806122208301516103e084015109612240830152806111408301518203600108612260830152806111808301516111608401510861228083018190526111a08301518291086122a083018190526111c08301518291086122c083018190526111e08301518291086122e0830152806122e08301518203612260840151086123008301528061022083015161082084015109612320830152806123208301516106a08401510861234083018190526102808301518291086123608301528061022083015161084084015109612380830152806123808301516105c0840151086123a083018190526102808301518291086123c083018190526123608301518291096123e08301528061022083015161086084015109612400830152806124008301516105e084015108612420830181905261028083015182910861244083018190526123e08301518291096124608301528061022083015161088084015109612480830152806124808301516106c0840151086124a083018190526102808301518291086124c083018190526124608301518291096124e08301819052610900830151829109612500830152806102208301516001096125208301528061252083015161058084015109612540830152806125408301516106a0840151086125608301819052610280830151829108612580830152806102208301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096125a0830152806125a0830151610580840151096125c0830152806125c08301516105c0840151086125e083018190526102808301518291086126008301819052612580830151829109612620830152806102208301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096126408301528061264083015161058084015109612660830152806126608301516105e08401510861268083018190526102808301518291086126a083018190526126208301518291096126c0830152806102208301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096126e0830152806126e083015161058084015109612700830152806127008301516106c084015108612720830181905261028083015182910861274083018190526126c083015182910961276083018190526108e0830151829109612780830152806127808301518203612500840151086127a083018190526123008301518291096127c0830152806127c0830151612240840151086127e0830152806127e08301516103e084015109612800830152806102208301516108a08401510961282083015280612820830151610640840151086128408301819052610280830151829108612860830152806102208301516108c08401510961288083015280612880830151611240840151086128a083018190526102808301518291086128c083018190526128608301518291096128e08301819052610960830151829109612900830152806102208301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612920830152806129208301516105808401510961294083015280612940830151610640840151086129608301819052610280830151829108612980830152806102208301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d096129a0830152806129a0830151610580840151096129c0830152806129c0830151611240840151086129e08301819052610280830151829108612a008301819052612980830151829109612a208301819052610940830151829109612a4083015280612a40830151820361290084015108612a608301819052612300830151829109612a8083015280612a8083015161280084015108612aa083015280612aa08301516103e084015109612ac0830152806109808301518203600108612ae08301819052611200830151829109612b0083015280612b00830151612ac084015108612b2083015280612b208301516103e084015109612b4083015261098082015181908009612b60830152806109808301518203612b6084015108612b808301819052611140830151829109612ba083015280612ba0830151612b4084015108612bc083015280612bc08301516103e084015109612be0830152806102208301516109c084015108612c0083018190526109a0830151829109612c2083015280610280830151610a0084015108612c408301819052612c20830151829109612c608301528061060083015161010009612c8083015280612c8083015182036105c084015108612ca08301819052610740830151829109612cc08301819052610220830151829108612ce08301819052610980830151829109612d008301528061028083015161072084015108612d208301819052612d00830151829109612d4083015280612d408301518203612c6084015108612d608301819052612300830151829109612d8083015280612d80830151612be084015108612da083015280612da08301516103e084015109612dc083015280610a0083015182036109c084015108612de08301819052611200830151829109612e0083015280612e00830151612dc084015108612e2083015280612e208301516103e084015109612e4083015280612300830151612de084015109612e60830152806109e083015182036109c084015108612e808301819052612e60830151829109612ea083015280612ea0830151612e4084015108612ec0830152610d0082015181908009612ee08301819052610d00830151829109612f008301819052610d00830151829109612f208301819052610d00830151829109612f4083015280610d00830151600109612f6083015280612ee0830151600109612f8083015280612f00830151600109612fa083015280612f20830151600109612fc083015280610d20830151612ec084015109612fe083015280610580830151610bc08401510961300083015280600161058084015109613020830152806130208301518203610b4084015108613040830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f61058084015109613060830152806130608301518203610b4084015108613080830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610580840151096130a0830152806130a08301518203610b40840151086130c0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610580840151096130e0830152806130e08301518203610b408401510861310083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610bc085015109610b4084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610bc08801510961058087015109089050806131208401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610bc085015109610b4084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610bc08801510961058087015109089050806131408401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610bc085015109610b4084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610bc088015109610580870151090861316084015250613040820151819060010961318083018190526130808301518291096131a083018190526131008301518291096131c0830152806001610b40840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058087015109089050806131e08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610bc085015109610b4084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610bc08801510961058087015109089050806132008401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610bc085015109610b4084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610bc08801510961058087015109089050806132208401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610bc085015109610b4084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610bc0880151096105808701510908613240840152506130c08201516131a08301518291900961326083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa361058085015109610b4084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105808801510961058087015109089050806132808401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e61058085015109610b4084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105808801510961058087015109089050806132a08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e861058085015109610b4084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105808801510961058087015109089050806132c08401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161961058085015109610b4084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105808801510961058087015109086132e0840152506131008201516131808301518291900961330083015261312082015181816131408501510990508061332084015281816131608501510990508061334084015281816131e0850151099050806133608401528181613180850151099050806133808401528181613200850151099050806133a08401528181613220850151099050806133c08401528181613240850151099050806133e084015281816132608501510990508061340084015281816132808501510990508061342084015281816132a08501510990508061344084015281816131a08501510990508061346084015281816132c08501510990508061348084015281816132e0850151099050806134a08401528181613300850151099050806134c0840152506020613500830152602061352083015260206135408301526134c08201516135608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6135808301526000805160206154128339815191526135a083015282600160206134e0850160c0613500870160055afa141692506134e08201516000613300840151905082826134a0860151096133008501528282820991506132e084015190508282613480860151096132e08501528282820991506132c084015190508282613460860151096132c08501528282820991506131a084015190508282613440860151096131a08501528282820991506132a084015190508282613420860151096132a08501528282820991506132808401519050828261340086015109613280850152828282099150613260840151905082826133e086015109613260850152828282099150613240840151905082826133c086015109613240850152828282099150613220840151905082826133a086015109613220850152828282099150613200840151905082826133808601510961320085015282828209915061318084015190508282613360860151096131808501528282820991506131e084015190508282613340860151096131e08501528282820991506131608401519050828261332086015109613160850152828282099150613140840151905082826131208601510961314085015282828209613120850181905261314085015190925083915082900890508181613160850151086135c0840152506131808201516131c0830151829190096135e08301526131e08201518061360084015250806132608301516131c0840151096136208301526132008201518181613220850151089050818161324085015108613640840152506131a08201516131c08301518291900961366083015261328082015181816132a085015108613680840152506133008201516131c0830151829190096136a08301526132c082015181816132e0850151086136c0840152506135c082015161360083015182908290099050806136e084015281816136408501510990508061370084015281816136808501510990508061372084015281816136c08501510990508061374084015250602061378083015260206137a083015260206137c08301526137408201516137e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6138008301526000805160206154128339815191526138208301528260016020613760850160c0613780870160055afa1416925061376082015160006136c084015190508282613720860151096136c08501528282820991506136808401519050828261370086015109613680850152828282099150613640840151905082826136e086015109613640850152828282099150613600840151905082826135c086015109613600850152828282096135c085015250506136008201516135e08301518291900961384083015280613640830151613620840151096138608301528061368083015161366084015109613880830152806136c08301516136a0840151096138a0830152610a40820151819080096138c08301819052610a408301518291096138e08301819052610a408301518291096139008301819052610a408301518291096139208301819052610a408301518291096139408301819052610a408301518291096139608301819052610a408301518291096139808301819052610a408301518291096139a08301819052610a408301518291096139c08301819052610a408301518291096139e08301819052610a40830151829109613a008301819052610a40830151829109613a208301819052610a40830151829109613a408301819052610a40830151829109613a608301819052610a40830151829109613a808301819052610a40830151829109613aa08301819052610a40830151829109613ac08301819052610a40830151829109613ae08301819052610a40830151829109613b008301819052610a40830151829109613b20830152610aa082015181908009613b408301819052610aa0830151829109613b608301819052610aa0830151829109613b808301819052610aa0830151829109613ba0830152806131208301516105c084015109818183613140860151610600870151090890508181836131608601516106808701510908613bc084018190526135c08401518392509009613be0830152806001613be0840151830309613c00830152806131208301516105e084015109818183613140860151610620870151090890508181836131608601516106608701510908613c2084018190526135c08401518392509009613c408301819052610a408301518291820309613c6083015280610a40830151600109613c8083015280613c60830151613c0084015108613ca0830152806001613ca084015109613cc0830152806001613c8084015109613ce0830152806135e0830151600109613d00830152806131e083015161064084015109613d208301819052613840830151829109613d40830152806001613d40840151830309613d60830152806001613d0084015109613d80830152806131e0830151610a0084015109613da08301819052613840830151829109613dc08301819052610a408301518291820309613de083015280610a40830151613d0084015109613e0083015280613de0830151613d6084015108613e20830152806131e08301516106a084015109613e408301819052613840830151829109613e6083018190526138c08301518291820309613e80830152806138c0830151613d0084015109613ea083015280613e80830151613e2084015108613ec0830152806131e08301516106c084015109613ee08301819052613840830151829109613f0083018190526138e08301518291820309613f20830152806138e0830151613d0084015109613f4083015280613f20830151613ec084015108613f60830152806131e08301516106e084015109613f808301819052613840830151829109613fa083018190526139008301518291820309613fc083015280613900830151613d0084015109613fe083015280613fc0830151613f6084015108614000830152806131e08301516107008401510961402083018190526138408301518291096140408301819052613920830151829182030961406083015280613920830151613d008401510961408083015280614060830151614000840151086140a0830152806131e0830151610720840151096140c083018190526138408301518291096140e08301819052613940830151829182030961410083015280613940830151613d0084015109614120830152806141008301516140a084015108614140830152806131e0830151610740840151096141608301819052613840830151829109614180830181905261396083015182918203096141a083015280613960830151613d00840151096141c0830152806141a0830151614140840151086141e0830152806131e08301516107608401510961420083018190526138408301518291096142208301819052613980830151829182030961424083015280613980830151613d0084015109614260830152806142408301516141e084015108614280830152806131e0830151610780840151096142a083018190526138408301518291096142c083018190526139a083015182918203096142e0830152806139a0830151613d0084015109614300830152806142e083015161428084015108614320830152806131e08301516107a084015109614340830181905261384083015182910961436083018190526139c08301518291820309614380830152806139c0830151613d00840151096143a083015280614380830151614320840151086143c0830152806131e08301516107c0840151096143e0830181905261384083015182910961440083018190526139e08301518291820309614420830152806139e0830151613d0084015109614440830152806144208301516143c084015108614460830152806131e08301516107e08401510961448083018190526138408301518291096144a08301819052613a0083015182918203096144c083015280613a00830151613d00840151096144e0830152806144c083015161446084015108614500830152806131e08301516108208401510961452083018190526138408301518291096145408301819052613a20830151829182030961456083015280613a20830151613d008401510961458083015280614560830151614500840151086145a0830152806131e0830151610840840151096145c083018190526138408301518291096145e08301819052613a40830151829182030961460083015280613a40830151613d0084015109614620830152806146008301516145a084015108614640830152806131e08301516108608401510961466083018190526138408301518291096146808301819052613a6083015182918203096146a083015280613a60830151613d00840151096146c0830152806146a0830151614640840151086146e0830152806131e08301516108808401510961470083018190526138408301518291096147208301819052613a80830151829182030961474083015280613a80830151613d0084015109614760830152806147408301516146e084015108614780830152806131e08301516108a0840151096147a083018190526138408301518291096147c08301819052613aa083015182918203096147e083015280613aa0830151613d0084015109614800830152806147e083015161478084015108614820830152806131e08301516108c08401510961484083018190526138408301518291096148608301819052613ac0830151829182030961488083015280613ac0830151613d00840151096148a083015280614880830151614820840151086148c0830152806135e0830151612f60840151096148e0830152806135e0830151612f8084015109614900830152806135e0830151612fa084015109614920830152806135e0830151612fc084015109614940830152806131e0830151612fe08401510961496083018190526138408301518291096149808301819052613ae083015182918203096149a083015280613ae0830151613d00840151096149c083015280613ae08301516148e0840151096149e083015280613ae083015161490084015109614a0083015280613ae083015161492084015109614a2083015280613ae083015161494084015109614a40830152806149a08301516148c084015108614a60830152806131e083015161080084015109614a808301819052613840830151829109614aa08301819052613b008301518291820309614ac083015280613b00830151613d0084015109614ae083015280614ac0830151614a6084015108614b008301819052610aa0830151829109614b2083015280610aa0830151613d8084015109614b4083015280610aa0830151613e0084015109614b6083015280610aa0830151613ea084015109614b8083015280610aa0830151613f4084015109614ba083015280610aa0830151613fe084015109614bc083015280610aa083015161408084015109614be083015280610aa083015161412084015109614c0083015280610aa08301516141c084015109614c2083015280610aa083015161426084015109614c4083015280610aa083015161430084015109614c6083015280610aa08301516143a084015109614c8083015280610aa083015161444084015109614ca083015280610aa08301516144e084015109614cc083015280610aa083015161458084015109614ce083015280610aa083015161462084015109614d0083015280610aa08301516146c084015109614d2083015280610aa083015161476084015109614d4083015280610aa083015161480084015109614d6083015280610aa08301516148a084015109614d8083015280610aa08301516149c084015109614da083015280610aa08301516149e084015109614dc083015280610aa0830151614a0084015109614de083015280610aa0830151614a2084015109614e0083015280610aa0830151614a4084015109614e2083015280610aa0830151614ae084015109614e4083015280614b20830151613cc084015108614e6083015280613620830151600109614e80830152806132008301516108e084015109818183613220860151610900870151090890508181836132408601516109208701510908614ea084018190526138608401518392509009614ec0830152806001614ec0840151830309614ee0830152806001614e8084015109614f0083015280613b40830151614ee084015109614f2083015280613b40830151614f0084015109614f4083015280614f20830151614e6084015108614f6083015280613660830151600109614f8083015280613280830151610940840151098181836132a08601516109608701510908614fa084018190526138808401518392509009614fc0830152806001614fc0840151830309614fe0830152806001614f808401510961500083015280613280830151610980840151098181836132a08601516109a08701510908615020840181905261388084015183925090096150408301819052610a40830151829182030961506083015280610a40830151614f808401510961508083015280615060830151614fe0840151086150a08301819052613b608301518291096150c083015280613b60830151615000840151096150e083015280613b6083015161508084015109615100830152806150c0830151614f6084015108615120830152806136a0830151600109615140830152806132c08301516109c0840151098181836132e08601516109e0870151090861516084018190526138a084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c083015280613b808301516151a0840151096151e083015280613b808301516151c084015109615200830152806151e083015161512084015108615220830152806131c083015160010961524083015280610b408301516001096152608301526001615280830181815260026152a08501526152208401516152c085015284919060409060608160075afa141692506152808201516152e08301526152a08201516153008301526060820151615320830152608082015161534083015282600160406152e0850160806152e0870160065afa1416925060a082015161536083015260c0820151615380830152613ce08201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa1416925060e0820151615440830152610100820151615460830152614b40820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692506101c08201516155208301526101e0820151615540830152614b60820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db4252906156008301527f154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc615620830152614b80820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d6156e08301527f1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51615700830152614ba082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e202507596157c08301527f0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea836157e0830152614bc082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af6158a08301527f24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c436158c0830152614be08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa46159808301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c06159a0830152614c008201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed615a608301527f286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf615a80830152614c20820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5615b408301527f0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2615b60830152614c40820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36615c208301527f2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890615c40830152614c60820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f615d008301527f1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d615d20830152614c80820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c615de08301527f1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68615e00830152614ca0820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701615ec08301527f07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a615ee0830152614cc0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d615fa08301527f154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6615fc0830152614ce0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2402db4b1c7746dcd9fe7eab82ab3fa7ebb1bd352a9af94ef6811b2af9ab6f8e6160808301527f2a0047ec08a254753c466648f0dc6e077e88e5495829c3a845873b9058bf44076160a0830152614d008201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a6161608301527f27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28616180830152614d208201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746162408301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3616260830152614d40820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507f1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a6163208301527eb004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56616340830152614d60820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f2903a763c1c6b78667f906b6fe2b4ad197b55587c90e14e8502446da8c45ef7d6164008301527f13ea57986f9295e92def3303aef53f2b4f625ba985531201ab53dc7307f46b69616420830152614d80820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506104208201516164e0830152610440820151616500830152614da082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506104608201516165c08301526104808201516165e0830152614dc082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104a08201516166a08301526104c08201516166c0830152614de08201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104e08201516167808301526105008201516167a0830152614e008201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa14169250610520820151616860830152610540820151616880830152614e208201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa141692506103808201516169408301526103a0820151616960830152614e40820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa141692506102c0820151616a208301526102e0820151616a40830152614f40820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa14169250610300820151616b00830152610320820151616b208301526150e0820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610340820151616be0830152610360820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610180820151616cc08301526101a0820151616ce0830152615200820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610ae0820151616da0830152610b00820151616dc08301526152408201518103616de0830152508160016040616da084016060616da0860160075afa14169150616d20810151616e00820152616d40810151616e20820152616da0810151616e40820152616dc0810151616e608201528160016040616e0084016080616e00860160065afa14169150610b80810151616e80820152610ba0810151616ea0820152615260810151616ec08201528160016040616e8084016060616e80860160075afa14169150616e00810151616ee0820152616e20810151616f00820152616e80810151616f20820152616ea0810151616f408201528160016040616ee084016080616ee0860160065afa14169150616ee0810151616f60820152616f00810151616f808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2616fa08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed616fc08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b616fe08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617000820152610b80810151617020820152610ba08101516170408201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6170608201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6170808201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456170a08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff6170c08201528160016020616f608401610180616f60860160085afa616f6093909301516001149214161691505092915050565b604051806170c00160405280610386906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156152b1576152b1615272565b604052919050565b600082601f8301126152ca57600080fd5b813567ffffffffffffffff8111156152e4576152e4615272565b6152f7601f8201601f1916602001615288565b81815284602083860101111561530c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561533c57600080fd5b823567ffffffffffffffff8082111561535457600080fd5b818501915085601f83011261536857600080fd5b813560208282111561537c5761537c615272565b8160051b61538b828201615288565b928352848101820192828101908a8511156153a557600080fd5b958301955b848710156153c3578635825295830195908301906153aa565b97505050860135925050808211156153da57600080fd5b506153e7858286016152b9565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212208f0f08c113d71e9affd04a930a0ccffff41cc79e358932cfa7ac1395c242440564736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004615329565b610057565b604051901515815260200160405180910390f35b60006001610063615252565b6000805160206154128339815191526100d9565b6000805160206153f283398151915280831081831016908380096000805160206153f28339815191528384096000805160206153f283398151915284820990506000805160206153f28339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301527f2df16218a82d39831071e46956c233ee9aa79bb065b265871080d8643f2f52ab600083015260208501518060608401526040860151806080850152846101388284610077565b169450505060608501518060a084015260808601518060c08501528461015e8284610077565b169450505060a08501518060e084015260c086015180610100850152846101858284610077565b16945050506101206000830120610120830152610120820151818106610140840152806101608401525060e085015180610180840152610100860151806101a0850152846101d38284610077565b1694505050610120850151806101c0840152610140860151806101e0850152846101fd8284610077565b60a061016087012061020087018190528581066102208801526102408701521694506001915050610260830153602161024083012061026083018190528181066102808401526102a08301526101608501516102c083018190526101808601516102e08401819052846102708284610077565b16945050506101a0850151806103008401526101c0860151806103208501528461029a8284610077565b16945050506101e08501518061034084015261020086015180610360850152846102c48284610077565b169450505061022085015180610380840152610240860151806103a0850152846102ee8284610077565b16945050506101206102a08301206103c08301526103c08201518181066103e0840152806104008401525061026085015180610420840152610280860151806104408501528461033e8284610077565b16945050506102a0850151806104608401526102c086015180610480850152846103688284610077565b16945050506102e0850151806104a0840152610300860151806104c0850152846103928284610077565b1694505050610320850151806104e084015261034086015180610500850152846103bc8284610077565b16945050506103608501518061052084015261038086015180610540850152846103e68284610077565b1694505050610160610400830120610560830152610560820151818106610580840152806105a084015250806103a0860151066105c0830152806103c0860151066105e0830152806103e086015106610600830152806104008601510661062083015280610420860151066106408301528061044086015106610660830152806104608601510661068083015280610480860151066106a0830152806104a0860151066106c0830152806104c0860151066106e0830152806104e086015106610700830152806105008601510661072083015280610520860151066107408301528061054086015106610760830152806105608601510661078083015280610580860151066107a0830152806105a0860151066107c0830152806105c0860151066107e0830152806105e086015106610800830152806106008601510661082083015280610620860151066108408301528061064086015106610860830152806106608601510661088083015280610680860151066108a0830152806106a0860151066108c0830152806106c0860151066108e0830152806106e086015106610900830152806107008601510661092083015280610720860151066109408301528061074086015106610960830152806107608601510661098083015280610780860151066109a0830152806107a0860151066109c0830152806107c0860151066109e0830152806107e086015106610a008301526104806105a0830120610a20830152610a20820151818106610a4084015280610a60840152506001610a808301536021610a60830120610a808301819052818106610aa0840152610ac0830152610800850151610ae08301819052610820860151610b0084018190528461066f8284610077565b16945050506060610ac0830120610b20830152610b20820151818106610b4084015280610b608401525061084085015180610b8084015261086086015180610ba0850152846106be8284610077565b16945050508061058083015161058084015109610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d0084015108610d20830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d2084015109610d40830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d4084015109610d60830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff61058084015108610d80830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d4084015109610da0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb061058084015108610dc0830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d4084015109610de0830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc61058084015108610e00830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d4084015109610e20830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc61058084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d4084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e61058084015108610e80830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d4084015109610ea0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e761058084015108610ec0830152806001610d4084015109610ee0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058084015108610f00830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d4084015109610f20830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa261058084015108610f40830152610d808201518181610dc085015109905080610f608401528181610e0085015109905080610f808401528181610e4085015109905080610fa08401528181610e8085015109905080610fc08401528181610ec085015109905080610fe08401528181610f00850151099050806110008401528181610f40850151099050806110208401528181610d208501510990508061104084015250602061108083015260206110a083015260206110c08301526110408201516110e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6111008301526000805160206154128339815191526111208301528260016020611060850160c0611080870160055afa141692506110608201516000610d208401519050828261102086015109610d20850152828282099150610f408401519050828261100086015109610f40850152828282099150610f0084015190508282610fe086015109610f00850152828282099150610ec084015190508282610fc086015109610ec0850152828282099150610e8084015190508282610fa086015109610e80850152828282099150610e4084015190508282610f8086015109610e40850152828282099150610e0084015190508282610f6086015109610e00850152828282099150610dc084015190508282610d8086015109610dc085015282828209610d808501819052610d608501518493509091500961114083015280610dc0830151610da08401510961116083015280610e00830151610de08401510961118083015280610e40830151610e20840151096111a083015280610e80830151610e60840151096111c083015280610ec0830151610ea0840151096111e083015280610f00830151610ee08401510961120083015280610f40830151610f20840151096112208301528060208301516112008401510981818360408601516112208701510908611240840152506106e08201516105c0830151829190086112608301819052819080096112808301819052819080096112a0830152806112a0830151611260840151096112c0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad56112c0840151096112e0830152806107008301516105e0840151086113008301819052819080096113208301819052819080096113408301528061134083015161130084015109611360830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e861136084015109611380830152806113808301516112e0840151086113a08301528061060083015182036113a0840151086113c083018190526107808301518291096113e0830152806113e08301516103e084015109611400830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff96112c084015109611420830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113608401510961144083015280611440830151611420840151086114608301528061062083015182036114608401510861148083018190526107808301518291096114a0830152806114a0830151611400840151086114c0830152806114c08301516103e0840151096114e08301528061064083015182036112c08401510861150083018190526107a0830151829109611520830152806115208301516114e084015108611540830152806115408301516103e084015109611560830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561064084015109611580830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611300840151096115a0830152806115a0830151611580840151086115c083018190526106a08301518291086115e0830181905281908009611600830181905281908009611620830152806116208301516115e084015109611640830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e6661060084015109611660830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe6106208401510961168083015280611680830151611660840151086116a0830152806116a08301518203611640840151086116c083018190526107a08301518291096116e0830152806116e083015161156084015108611700830152806117008301516103e084015109611720830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961064084015109611740830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c861130084015109611760830152806117608301516117408401510861178083018190526106c08301518291086117a0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb02610600840151096117c0830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be610620840151096117e0830152806117e08301516117c0840151086118008301528061180083015182036117a08401510861182083018190526107a08301518291096118408301528061184083015161172084015108611860830152806118608301516103e0840151096118808301528061076083015182036001086118a083018190526107608301518291096118c08301528061076083015182036002086118e083018190526118c08301518291096119008301528061076083015182036004086119208301819052611900830151829109611940830152806105c0830151610680840151086119608301528061060083015182036119608401510861198083018190526119408301518291096119a0830152806119a0830151611880840151086119c0830152806119c08301516103e0840151096119e083015280610620830151820361066084015108611a008301819052611940830151829109611a2083015280611a208301516119e084015108611a4083015280611a408301516103e084015109611a60830152806107c08301516113c084015109611a8083015280611a80830151611a6084015108611aa083015280611aa08301516103e084015109611ac0830152806107c083015161148084015109611ae083015280611ae0830151611ac084015108611b0083015280611b008301516103e084015109611b20830152806107e083015161150084015109611b4083015280611b40830151611b2084015108611b6083015280611b608301516103e084015109611b80830152806107e08301516116c084015109611ba083015280611ba0830151611b8084015108611bc083015280611bc08301516103e084015109611be0830152806107e083015161182084015109611c0083015280611c00830151611be084015108611c2083015280611c208301516103e084015109611c40830152806107608301518203600308611c608301819052611900830151829109611c8083015280611c8083015161198084015109611ca083015280611ca0830151611c4084015108611cc083015280611cc08301516103e084015109611ce083015280611c80830151611a0084015109611d0083015280611d00830151611ce084015108611d2083015280611d208301516103e084015109611d40830152806107608301516118e084015109611d6083015280611d60830151611c6084015109611d8083015280611d8083015161192084015109611da083015280611da083015161064084015109611dc0830152806106408301518203600108611de08301819052611dc0830151829109611e0083015280611e00830151611d4084015108611e2083015280611e208301516103e084015109611e4083015280610640830151600209611e60830152806105c083015182036105e084015108611e808301819052611e60830151829109611ea0830152806105c0830151820361060084015108611ec083015280611ec08301518203611ea084015108611ee08301528061062083015182036105e084015108611f0083015280611f008301518203611ee084015108611f208301819052611da0830151829109611f4083015280611f40830151611e4084015108611f6083015280611f608301516103e084015109611f80830152806118c0830151611c6084015109611fa083015280611fa083015161192084015109611fc0830152806105e08301516105c084015108611fe0830152806106408301518203611fe0840151086120008301819052611fc083015182910961202083015280612020830151611f8084015108612040830152806120408301516103e0840151096120608301819052612020830151829108612080830152806120808301516103e0840151096120a0830152806108e083015182036001086120c083018190526112008301518291096120e0830152806120e08301516120a084015108612100830152806121008301516103e0840151096121208301526109408201518190800961214083015280610940830151820361214084015108612160830181905261114083015182910961218083015280612180830151612120840151086121a0830152806121a08301516103e0840151096121c0830152806109208301518203610940840151086121e08301819052611200830151829109612200830152806122008301516121c084015108612220830152806122208301516103e084015109612240830152806111408301518203600108612260830152806111808301516111608401510861228083018190526111a08301518291086122a083018190526111c08301518291086122c083018190526111e08301518291086122e0830152806122e08301518203612260840151086123008301528061022083015161082084015109612320830152806123208301516106a08401510861234083018190526102808301518291086123608301528061022083015161084084015109612380830152806123808301516105c0840151086123a083018190526102808301518291086123c083018190526123608301518291096123e08301528061022083015161086084015109612400830152806124008301516105e084015108612420830181905261028083015182910861244083018190526123e08301518291096124608301528061022083015161088084015109612480830152806124808301516106c0840151086124a083018190526102808301518291086124c083018190526124608301518291096124e08301819052610900830151829109612500830152806102208301516001096125208301528061252083015161058084015109612540830152806125408301516106a0840151086125608301819052610280830151829108612580830152806102208301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096125a0830152806125a0830151610580840151096125c0830152806125c08301516105c0840151086125e083018190526102808301518291086126008301819052612580830151829109612620830152806102208301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096126408301528061264083015161058084015109612660830152806126608301516105e08401510861268083018190526102808301518291086126a083018190526126208301518291096126c0830152806102208301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096126e0830152806126e083015161058084015109612700830152806127008301516106c084015108612720830181905261028083015182910861274083018190526126c083015182910961276083018190526108e0830151829109612780830152806127808301518203612500840151086127a083018190526123008301518291096127c0830152806127c0830151612240840151086127e0830152806127e08301516103e084015109612800830152806102208301516108a08401510961282083015280612820830151610640840151086128408301819052610280830151829108612860830152806102208301516108c08401510961288083015280612880830151611240840151086128a083018190526102808301518291086128c083018190526128608301518291096128e08301819052610960830151829109612900830152806102208301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612920830152806129208301516105808401510961294083015280612940830151610640840151086129608301819052610280830151829108612980830152806102208301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d096129a0830152806129a0830151610580840151096129c0830152806129c0830151611240840151086129e08301819052610280830151829108612a008301819052612980830151829109612a208301819052610940830151829109612a4083015280612a40830151820361290084015108612a608301819052612300830151829109612a8083015280612a8083015161280084015108612aa083015280612aa08301516103e084015109612ac0830152806109808301518203600108612ae08301819052611200830151829109612b0083015280612b00830151612ac084015108612b2083015280612b208301516103e084015109612b4083015261098082015181908009612b60830152806109808301518203612b6084015108612b808301819052611140830151829109612ba083015280612ba0830151612b4084015108612bc083015280612bc08301516103e084015109612be0830152806102208301516109c084015108612c0083018190526109a0830151829109612c2083015280610280830151610a0084015108612c408301819052612c20830151829109612c608301528061060083015161010009612c8083015280612c8083015182036105c084015108612ca08301819052610740830151829109612cc08301819052610220830151829108612ce08301819052610980830151829109612d008301528061028083015161072084015108612d208301819052612d00830151829109612d4083015280612d408301518203612c6084015108612d608301819052612300830151829109612d8083015280612d80830151612be084015108612da083015280612da08301516103e084015109612dc083015280610a0083015182036109c084015108612de08301819052611200830151829109612e0083015280612e00830151612dc084015108612e2083015280612e208301516103e084015109612e4083015280612300830151612de084015109612e60830152806109e083015182036109c084015108612e808301819052612e60830151829109612ea083015280612ea0830151612e4084015108612ec0830152610d0082015181908009612ee08301819052610d00830151829109612f008301819052610d00830151829109612f208301819052610d00830151829109612f4083015280610d00830151600109612f6083015280612ee0830151600109612f8083015280612f00830151600109612fa083015280612f20830151600109612fc083015280610d20830151612ec084015109612fe083015280610580830151610bc08401510961300083015280600161058084015109613020830152806130208301518203610b4084015108613040830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f61058084015109613060830152806130608301518203610b4084015108613080830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610580840151096130a0830152806130a08301518203610b40840151086130c0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610580840151096130e0830152806130e08301518203610b408401510861310083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610bc085015109610b4084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610bc08801510961058087015109089050806131208401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610bc085015109610b4084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610bc08801510961058087015109089050806131408401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610bc085015109610b4084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610bc088015109610580870151090861316084015250613040820151819060010961318083018190526130808301518291096131a083018190526131008301518291096131c0830152806001610b40840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058087015109089050806131e08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610bc085015109610b4084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610bc08801510961058087015109089050806132008401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610bc085015109610b4084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610bc08801510961058087015109089050806132208401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610bc085015109610b4084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610bc0880151096105808701510908613240840152506130c08201516131a08301518291900961326083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa361058085015109610b4084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105808801510961058087015109089050806132808401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e61058085015109610b4084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105808801510961058087015109089050806132a08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e861058085015109610b4084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105808801510961058087015109089050806132c08401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161961058085015109610b4084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105808801510961058087015109086132e0840152506131008201516131808301518291900961330083015261312082015181816131408501510990508061332084015281816131608501510990508061334084015281816131e0850151099050806133608401528181613180850151099050806133808401528181613200850151099050806133a08401528181613220850151099050806133c08401528181613240850151099050806133e084015281816132608501510990508061340084015281816132808501510990508061342084015281816132a08501510990508061344084015281816131a08501510990508061346084015281816132c08501510990508061348084015281816132e0850151099050806134a08401528181613300850151099050806134c0840152506020613500830152602061352083015260206135408301526134c08201516135608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6135808301526000805160206154128339815191526135a083015282600160206134e0850160c0613500870160055afa141692506134e08201516000613300840151905082826134a0860151096133008501528282820991506132e084015190508282613480860151096132e08501528282820991506132c084015190508282613460860151096132c08501528282820991506131a084015190508282613440860151096131a08501528282820991506132a084015190508282613420860151096132a08501528282820991506132808401519050828261340086015109613280850152828282099150613260840151905082826133e086015109613260850152828282099150613240840151905082826133c086015109613240850152828282099150613220840151905082826133a086015109613220850152828282099150613200840151905082826133808601510961320085015282828209915061318084015190508282613360860151096131808501528282820991506131e084015190508282613340860151096131e08501528282820991506131608401519050828261332086015109613160850152828282099150613140840151905082826131208601510961314085015282828209613120850181905261314085015190925083915082900890508181613160850151086135c0840152506131808201516131c0830151829190096135e08301526131e08201518061360084015250806132608301516131c0840151096136208301526132008201518181613220850151089050818161324085015108613640840152506131a08201516131c08301518291900961366083015261328082015181816132a085015108613680840152506133008201516131c0830151829190096136a08301526132c082015181816132e0850151086136c0840152506135c082015161360083015182908290099050806136e084015281816136408501510990508061370084015281816136808501510990508061372084015281816136c08501510990508061374084015250602061378083015260206137a083015260206137c08301526137408201516137e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6138008301526000805160206154128339815191526138208301528260016020613760850160c0613780870160055afa1416925061376082015160006136c084015190508282613720860151096136c08501528282820991506136808401519050828261370086015109613680850152828282099150613640840151905082826136e086015109613640850152828282099150613600840151905082826135c086015109613600850152828282096135c085015250506136008201516135e08301518291900961384083015280613640830151613620840151096138608301528061368083015161366084015109613880830152806136c08301516136a0840151096138a0830152610a40820151819080096138c08301819052610a408301518291096138e08301819052610a408301518291096139008301819052610a408301518291096139208301819052610a408301518291096139408301819052610a408301518291096139608301819052610a408301518291096139808301819052610a408301518291096139a08301819052610a408301518291096139c08301819052610a408301518291096139e08301819052610a40830151829109613a008301819052610a40830151829109613a208301819052610a40830151829109613a408301819052610a40830151829109613a608301819052610a40830151829109613a808301819052610a40830151829109613aa08301819052610a40830151829109613ac08301819052610a40830151829109613ae08301819052610a40830151829109613b008301819052610a40830151829109613b20830152610aa082015181908009613b408301819052610aa0830151829109613b608301819052610aa0830151829109613b808301819052610aa0830151829109613ba0830152806131208301516105c084015109818183613140860151610600870151090890508181836131608601516106808701510908613bc084018190526135c08401518392509009613be0830152806001613be0840151830309613c00830152806131208301516105e084015109818183613140860151610620870151090890508181836131608601516106608701510908613c2084018190526135c08401518392509009613c408301819052610a408301518291820309613c6083015280610a40830151600109613c8083015280613c60830151613c0084015108613ca0830152806001613ca084015109613cc0830152806001613c8084015109613ce0830152806135e0830151600109613d00830152806131e083015161064084015109613d208301819052613840830151829109613d40830152806001613d40840151830309613d60830152806001613d0084015109613d80830152806131e0830151610a0084015109613da08301819052613840830151829109613dc08301819052610a408301518291820309613de083015280610a40830151613d0084015109613e0083015280613de0830151613d6084015108613e20830152806131e08301516106a084015109613e408301819052613840830151829109613e6083018190526138c08301518291820309613e80830152806138c0830151613d0084015109613ea083015280613e80830151613e2084015108613ec0830152806131e08301516106c084015109613ee08301819052613840830151829109613f0083018190526138e08301518291820309613f20830152806138e0830151613d0084015109613f4083015280613f20830151613ec084015108613f60830152806131e08301516106e084015109613f808301819052613840830151829109613fa083018190526139008301518291820309613fc083015280613900830151613d0084015109613fe083015280613fc0830151613f6084015108614000830152806131e08301516107008401510961402083018190526138408301518291096140408301819052613920830151829182030961406083015280613920830151613d008401510961408083015280614060830151614000840151086140a0830152806131e0830151610720840151096140c083018190526138408301518291096140e08301819052613940830151829182030961410083015280613940830151613d0084015109614120830152806141008301516140a084015108614140830152806131e0830151610740840151096141608301819052613840830151829109614180830181905261396083015182918203096141a083015280613960830151613d00840151096141c0830152806141a0830151614140840151086141e0830152806131e08301516107608401510961420083018190526138408301518291096142208301819052613980830151829182030961424083015280613980830151613d0084015109614260830152806142408301516141e084015108614280830152806131e0830151610780840151096142a083018190526138408301518291096142c083018190526139a083015182918203096142e0830152806139a0830151613d0084015109614300830152806142e083015161428084015108614320830152806131e08301516107a084015109614340830181905261384083015182910961436083018190526139c08301518291820309614380830152806139c0830151613d00840151096143a083015280614380830151614320840151086143c0830152806131e08301516107c0840151096143e0830181905261384083015182910961440083018190526139e08301518291820309614420830152806139e0830151613d0084015109614440830152806144208301516143c084015108614460830152806131e08301516107e08401510961448083018190526138408301518291096144a08301819052613a0083015182918203096144c083015280613a00830151613d00840151096144e0830152806144c083015161446084015108614500830152806131e08301516108208401510961452083018190526138408301518291096145408301819052613a20830151829182030961456083015280613a20830151613d008401510961458083015280614560830151614500840151086145a0830152806131e0830151610840840151096145c083018190526138408301518291096145e08301819052613a40830151829182030961460083015280613a40830151613d0084015109614620830152806146008301516145a084015108614640830152806131e08301516108608401510961466083018190526138408301518291096146808301819052613a6083015182918203096146a083015280613a60830151613d00840151096146c0830152806146a0830151614640840151086146e0830152806131e08301516108808401510961470083018190526138408301518291096147208301819052613a80830151829182030961474083015280613a80830151613d0084015109614760830152806147408301516146e084015108614780830152806131e08301516108a0840151096147a083018190526138408301518291096147c08301819052613aa083015182918203096147e083015280613aa0830151613d0084015109614800830152806147e083015161478084015108614820830152806131e08301516108c08401510961484083018190526138408301518291096148608301819052613ac0830151829182030961488083015280613ac0830151613d00840151096148a083015280614880830151614820840151086148c0830152806135e0830151612f60840151096148e0830152806135e0830151612f8084015109614900830152806135e0830151612fa084015109614920830152806135e0830151612fc084015109614940830152806131e0830151612fe08401510961496083018190526138408301518291096149808301819052613ae083015182918203096149a083015280613ae0830151613d00840151096149c083015280613ae08301516148e0840151096149e083015280613ae083015161490084015109614a0083015280613ae083015161492084015109614a2083015280613ae083015161494084015109614a40830152806149a08301516148c084015108614a60830152806131e083015161080084015109614a808301819052613840830151829109614aa08301819052613b008301518291820309614ac083015280613b00830151613d0084015109614ae083015280614ac0830151614a6084015108614b008301819052610aa0830151829109614b2083015280610aa0830151613d8084015109614b4083015280610aa0830151613e0084015109614b6083015280610aa0830151613ea084015109614b8083015280610aa0830151613f4084015109614ba083015280610aa0830151613fe084015109614bc083015280610aa083015161408084015109614be083015280610aa083015161412084015109614c0083015280610aa08301516141c084015109614c2083015280610aa083015161426084015109614c4083015280610aa083015161430084015109614c6083015280610aa08301516143a084015109614c8083015280610aa083015161444084015109614ca083015280610aa08301516144e084015109614cc083015280610aa083015161458084015109614ce083015280610aa083015161462084015109614d0083015280610aa08301516146c084015109614d2083015280610aa083015161476084015109614d4083015280610aa083015161480084015109614d6083015280610aa08301516148a084015109614d8083015280610aa08301516149c084015109614da083015280610aa08301516149e084015109614dc083015280610aa0830151614a0084015109614de083015280610aa0830151614a2084015109614e0083015280610aa0830151614a4084015109614e2083015280610aa0830151614ae084015109614e4083015280614b20830151613cc084015108614e6083015280613620830151600109614e80830152806132008301516108e084015109818183613220860151610900870151090890508181836132408601516109208701510908614ea084018190526138608401518392509009614ec0830152806001614ec0840151830309614ee0830152806001614e8084015109614f0083015280613b40830151614ee084015109614f2083015280613b40830151614f0084015109614f4083015280614f20830151614e6084015108614f6083015280613660830151600109614f8083015280613280830151610940840151098181836132a08601516109608701510908614fa084018190526138808401518392509009614fc0830152806001614fc0840151830309614fe0830152806001614f808401510961500083015280613280830151610980840151098181836132a08601516109a08701510908615020840181905261388084015183925090096150408301819052610a40830151829182030961506083015280610a40830151614f808401510961508083015280615060830151614fe0840151086150a08301819052613b608301518291096150c083015280613b60830151615000840151096150e083015280613b6083015161508084015109615100830152806150c0830151614f6084015108615120830152806136a0830151600109615140830152806132c08301516109c0840151098181836132e08601516109e0870151090861516084018190526138a084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c083015280613b808301516151a0840151096151e083015280613b808301516151c084015109615200830152806151e083015161512084015108615220830152806131c083015160010961524083015280610b408301516001096152608301526001615280830181815260026152a08501526152208401516152c085015284919060409060608160075afa141692506152808201516152e08301526152a08201516153008301526060820151615320830152608082015161534083015282600160406152e0850160806152e0870160065afa1416925060a082015161536083015260c0820151615380830152613ce08201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa1416925060e0820151615440830152610100820151615460830152614b40820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692506101c08201516155208301526101e0820151615540830152614b60820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db4252906156008301527f154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc615620830152614b80820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d6156e08301527f1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51615700830152614ba082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e202507596157c08301527f0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea836157e0830152614bc082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af6158a08301527f24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c436158c0830152614be08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa46159808301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c06159a0830152614c008201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed615a608301527f286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf615a80830152614c20820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5615b408301527f0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2615b60830152614c40820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36615c208301527f2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890615c40830152614c60820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f615d008301527f1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d615d20830152614c80820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c615de08301527f1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68615e00830152614ca0820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701615ec08301527f07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a615ee0830152614cc0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d615fa08301527f154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6615fc0830152614ce0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2402db4b1c7746dcd9fe7eab82ab3fa7ebb1bd352a9af94ef6811b2af9ab6f8e6160808301527f2a0047ec08a254753c466648f0dc6e077e88e5495829c3a845873b9058bf44076160a0830152614d008201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a6161608301527f27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28616180830152614d208201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746162408301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3616260830152614d40820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507f1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a6163208301527eb004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56616340830152614d60820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f2903a763c1c6b78667f906b6fe2b4ad197b55587c90e14e8502446da8c45ef7d6164008301527f13ea57986f9295e92def3303aef53f2b4f625ba985531201ab53dc7307f46b69616420830152614d80820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506104208201516164e0830152610440820151616500830152614da082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506104608201516165c08301526104808201516165e0830152614dc082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104a08201516166a08301526104c08201516166c0830152614de08201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104e08201516167808301526105008201516167a0830152614e008201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa14169250610520820151616860830152610540820151616880830152614e208201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa141692506103808201516169408301526103a0820151616960830152614e40820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa141692506102c0820151616a208301526102e0820151616a40830152614f40820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa14169250610300820151616b00830152610320820151616b208301526150e0820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610340820151616be0830152610360820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610180820151616cc08301526101a0820151616ce0830152615200820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610ae0820151616da0830152610b00820151616dc08301526152408201518103616de0830152508160016040616da084016060616da0860160075afa14169150616d20810151616e00820152616d40810151616e20820152616da0810151616e40820152616dc0810151616e608201528160016040616e0084016080616e00860160065afa14169150610b80810151616e80820152610ba0810151616ea0820152615260810151616ec08201528160016040616e8084016060616e80860160075afa14169150616e00810151616ee0820152616e20810151616f00820152616e80810151616f20820152616ea0810151616f408201528160016040616ee084016080616ee0860160065afa14169150616ee0810151616f60820152616f00810151616f808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2616fa08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed616fc08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b616fe08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617000820152610b80810151617020820152610ba08101516170408201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6170608201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6170808201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456170a08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff6170c08201528160016020616f608401610180616f60860160085afa616f6093909301516001149214161691505092915050565b604051806170c00160405280610386906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156152b1576152b1615272565b604052919050565b600082601f8301126152ca57600080fd5b813567ffffffffffffffff8111156152e4576152e4615272565b6152f7601f8201601f1916602001615288565b81815284602083860101111561530c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561533c57600080fd5b823567ffffffffffffffff8082111561535457600080fd5b818501915085601f83011261536857600080fd5b813560208282111561537c5761537c615272565b8160051b61538b828201615288565b928352848101820192828101908a8511156153a557600080fd5b958301955b848710156153c3578635825295830195908301906153aa565b97505050860135925050808211156153da57600080fd5b506153e7858286016152b9565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212208f0f08c113d71e9affd04a930a0ccffff41cc79e358932cfa7ac1395c242440564736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} diff --git a/backend/src/contracts/abi/SolvencyVerifier.json b/backend/src/contracts/abi/SolvencyVerifier.json index 15519102..8d5d66bf 100644 --- a/backend/src/contracts/abi/SolvencyVerifier.json +++ b/backend/src/contracts/abi/SolvencyVerifier.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/SolvencyVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50615013806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004614ed5565b610057565b604051901515815260200160405180910390f35b60006001610063614dfe565b600080516020614fbe8339815191526100d9565b600080516020614f9e8339815191528083108183101690838009600080516020614f9e833981519152838409600080516020614f9e8339815191528482099050600080516020614f9e8339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301527f2711433a26ab4da2ec8740666db1f70d31818824e0a122a89a12a43a63a9b70d6000830152602085015180608084015260408601518060a0850152846101448284610077565b169450505060608501518060c084015260808601518060e08501528461016a8284610077565b169450505060a08501518061010084015260c086015180610120850152846101928284610077565b16945050506101406000830120610140830152610140820151818106610160840152806101808401525060e0850151806101a0840152610100860151806101c0850152846101e08284610077565b1694505050610120850151806101e0840152610140860151806102008501528461020a8284610077565b60a061018087012061022087018190528581066102408801526102608701521694506001915050610280830153602161026083012061028083018190528181066102a08401526102c08301526101608501516102e0830181905261018086015161030084018190528461027d8284610077565b16945050506101a0850151806103208401526101c086015180610340850152846102a78284610077565b16945050506101e08501518061036084015261020086015180610380850152846102d18284610077565b1694505050610220850151806103a0840152610240860151806103c0850152846102fb8284610077565b16945050506101206102c08301206103e08301526103e0820151818106610400840152806104208401525061026085015180610440840152610280860151806104608501528461034b8284610077565b16945050506102a0850151806104808401526102c0860151806104a0850152846103758284610077565b16945050506102e0850151806104c0840152610300860151806104e08501528461039f8284610077565b16945050506103208501518061050084015261034086015180610520850152846103c98284610077565b16945050506103608501518061054084015261038086015180610560850152846103f38284610077565b16945050506101606104208301206105808301526105808201518181066105a0840152806105c084015250806103a0860151066105e0830152806103c086015106610600830152806103e08601510661062083015280610400860151066106408301528061042086015106610660830152806104408601510661068083015280610460860151066106a083015280610480860151066106c0830152806104a0860151066106e0830152806104c086015106610700830152806104e08601510661072083015280610500860151066107408301528061052086015106610760830152806105408601510661078083015280610560860151066107a083015280610580860151066107c0830152806105a0860151066107e0830152806105c086015106610800830152806105e08601510661082083015280610600860151066108408301528061062086015106610860830152806106408601510661088083015280610660860151066108a083015280610680860151066108c0830152806106a0860151066108e0830152806106c086015106610900830152806106e08601510661092083015280610700860151066109408301528061072086015106610960830152806107408601510661098083015280610760860151066109a083015280610780860151066109c0830152806107a0860151066109e08301526104406105c0830120610a00830152610a00820151818106610a2084015280610a40840152506001610a608301536021610a40830120610a608301819052818106610a80840152610aa08301526107c0850151610ac083018190526107e0860151610ae08401819052846106608284610077565b16945050506060610aa0830120610b00830152610b00820151818106610b2084015280610b408401525061080085015180610b6084015261082086015180610b80850152846106af8284610077565b1694505050806105a08301516105a084015109610ba0830181905281908009610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610cc084015108610ce0830152807f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001610ce084015109610d00830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb26610d0084015109610d20830152807f1a6cb0b91da01e6d7a1e7d76eeef7de63954cd24b5a8c2b95ad8712f455b04db6105a084015108610d40830152807f03b743d74fd9ddb41f920179ac30e04b0ebd93e580b9c0b50061087904110bd4610d0084015109610d60830152807f2cad0a9b9157c27598be443cd550781219765462f8ffafdc4380ed1aebeef42d6105a084015108610d80830152807f1f4d7180df5014849825f3c9b0e89d79432c51f48eb5846ae63b433f28aba10b610d0084015109610da0830152807f1116dcf201e18ba5202a51ecd098bae3e5079653eb03ec265da6b254c7545ef66105a084015108610dc0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d0084015109610de0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105a084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d0084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105a084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d0084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105a084015108610e80830152806001610d0084015109610ea0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a084015108610ec0830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d0084015109610ee0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105a084015108610f00830152807f0dd30b9ad8c173555d2a33029bc807ac165b61281e9054a173af7ff4e4fc88fc610d0084015109610f20830152807f229142d808702cd45b2612b3e5b950b111d887205b291befd032759f0b0377056105a084015108610f40830152610d408201518181610d8085015109905080610f608401528181610dc085015109905080610f808401528181610e0085015109905080610fa08401528181610e4085015109905080610fc08401528181610e8085015109905080610fe08401528181610ec0850151099050806110008401528181610f00850151099050806110208401528181610f40850151099050806110408401528181610ce0850151099050806110608401525060206110a083015260206110c083015260206110e08301526110608201516111008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff611120830152600080516020614fbe8339815191526111408301528260016020611080850160c06110a0870160055afa141692506110808201516000610ce08401519050828261104086015109610ce0850152828282099150610f408401519050828261102086015109610f40850152828282099150610f008401519050828261100086015109610f00850152828282099150610ec084015190508282610fe086015109610ec0850152828282099150610e8084015190508282610fc086015109610e80850152828282099150610e4084015190508282610fa086015109610e40850152828282099150610e0084015190508282610f8086015109610e00850152828282099150610dc084015190508282610f6086015109610dc0850152828282099150610d8084015190508282610d4086015109610d8085015282828209610d408501819052610d208501518493509091500961116083015280610d80830151610d608401510961118083015280610dc0830151610da0840151096111a083015280610e00830151610de0840151096111c083015280610e40830151610e20840151096111e083015280610e80830151610e608401510961120083015280610ec0830151610ea08401510961122083015280610f00830151610ee08401510961124083015280610f40830151610f20840151096112608301528060208301516112208401510981818360408601516112408701510908905081818360608601516112608701510908611280840152506107208201516105e0830151829190086112a08301819052819080096112c08301819052819080096112e0830152806112e08301516112a084015109611300830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561130084015109611320830152806107408301516106008401510861134083018190528190800961136083018190528190800961138083015280611380830151611340840151096113a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86113a0840151096113c0830152806113c0830151611320840151086113e08301528061062083015182036113e08401510861140083018190526107a08301518291096114208301528061142083015161040084015109611440830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961130084015109611460830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113a08401510961148083015280611480830151611460840151086114a08301528061064083015182036114a0840151086114c083018190526107a08301518291096114e0830152806114e08301516114408401510861150083015280611500830151610400840151096115208301528061066083015182036113008401510861154083018190526107c0830151829109611560830152806115608301516115208401510861158083015280611580830151610400840151096115a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610660840151096115c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611340840151096115e0830152806115e08301516115c08401510861160083018190526106e08301518291086116208301819052819080096116408301819052819080096116608301528061166083015161162084015109611680830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610620840151096116a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610640840151096116c0830152806116c08301516116a0840151086116e0830152806116e083015182036116808401510861170083018190526107c0830151829109611720830152806117208301516115a0840151086117408301528061174083015161040084015109611760830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961066084015109611780830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611340840151096117a0830152806117a0830151611780840151086117c083018190526107008301518291086117e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261062084015109611800830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106408401510961182083015280611820830151611800840151086118408301528061184083015182036117e08401510861186083018190526107c083015182910961188083015280611880830151611760840151086118a0830152806118a0830151610400840151096118c08301528061078083015182036001086118e0830181905261078083015182910961190083015280610780830151820360020861192083018190526119008301518291096119408301528061078083015182036003086119608301819052611940830151829109611980830152806105e08301516106a0840151086119a08301528061062083015182036119a0840151086119c083018190526119808301518291096119e0830152806119e08301516118c084015108611a0083015280611a0083015161040084015109611a2083015280610640830151820361068084015108611a408301819052611980830151829109611a6083015280611a60830151611a2084015108611a8083015280611a8083015161040084015109611aa08301528061078083015161192084015109611ac083015280611ac083015161196084015109611ae0830152806107808301518203600408611b008301819052611ae0830151829109611b2083015280611b2083015161066084015109611b40830152806106608301518203600108611b608301819052611b40830151829109611b8083015280611b80830151611aa084015108611ba083015280611ba083015161040084015109611bc083015280610660830151600209611be0830152806105e0830151820361060084015108611c008301819052611be0830151829109611c20830152806105e0830151820361062084015108611c4083015280611c408301518203611c2084015108611c6083015280610640830151820361060084015108611c8083015280611c808301518203611c6084015108611ca08301819052611b20830151829109611cc083015280611cc0830151611bc084015108611ce083015280611ce083015161040084015109611d008301528061190083015161196084015109611d2083015280611d20830151611b0084015109611d40830152806106008301516105e084015108611d60830152806106608301518203611d6084015108611d808301819052611d40830151829109611da083015280611da0830151611d0084015108611dc083015280611dc083015161040084015109611de08301819052611da0830151829108611e0083015280611e0083015161040084015109611e2083015280611940830151611b0084015109611e408301528061060083015182036105e084015108611e6083015280600160701b611e6084015108611e80830152806106608301518203611e8084015108611ea08301819052611e40830151829109611ec083015280611ec0830151611e2084015108611ee083015280611ee083015161040084015109611f00830152806108c08301518203600108611f208301819052611220830151829109611f4083015280611f40830151611f0084015108611f6083015280611f6083015161040084015109611f8083015261092082015181908009611fa0830152806109208301518203611fa084015108611fc08301819052611160830151829109611fe083015280611fe0830151611f80840151086120008301528061200083015161040084015109612020830152806109008301518203610920840151086120408301819052611220830151829109612060830152806120608301516120208401510861208083015280612080830151610400840151096120a08301528061116083015182036001086120c0830152806111a0830151611180840151086120e083018190526111c083015182910861210083018190526111e083015182910861212083018190526112008301518291086121408301528061214083015182036120c0840151086121608301528061024083015161080084015109612180830152806121808301516106e0840151086121a083018190526102a08301518291086121c083015280610240830151610820840151096121e0830152806121e08301516105e08401510861220083018190526102a083015182910861222083018190526121c08301518291096122408301528061024083015161084084015109612260830152806122608301516106008401510861228083018190526102a08301518291086122a083018190526122408301518291096122c083015280610240830151610860840151096122e0830152806122e08301516107008401510861230083018190526102a083015182910861232083018190526122c083015182910961234083018190526108e083015182910961236083015280610240830151600109612380830152806123808301516105a0840151096123a0830152806123a08301516106e0840151086123c083018190526102a08301518291086123e0830152806102408301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a209612400830152806124008301516105a084015109612420830152806124208301516105e08401510861244083018190526102a083015182910861246083018190526123e0830151829109612480830152806102408301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096124a0830152806124a08301516105a0840151096124c0830152806124c0830151610600840151086124e083018190526102a08301518291086125008301819052612480830151829109612520830152806102408301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612540830152806125408301516105a084015109612560830152806125608301516107008401510861258083018190526102a08301518291086125a083018190526125208301518291096125c083018190526108c08301518291096125e0830152806125e08301518203612360840151086126008301819052612160830151829109612620830152806126208301516120a0840151086126408301528061264083015161040084015109612660830152806102408301516108808401510961268083015280612680830151610660840151086126a083018190526102a08301518291086126c0830152806102408301516108a0840151096126e0830152806126e08301516112808401510861270083018190526102a083015182910861272083018190526126c08301518291096127408301819052610940830151829109612760830152806102408301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612780830152806127808301516105a0840151096127a0830152806127a0830151610660840151086127c083018190526102a08301518291086127e0830152806102408301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612800830152806128008301516105a084015109612820830152806128208301516112808401510861284083018190526102a083015182910861286083018190526127e083015182910961288083018190526109208301518291096128a0830152806128a08301518203612760840151086128c083018190526121608301518291096128e0830152806128e08301516126608401510861290083015280612900830151610400840151096129208301528061096083015182036001086129408301819052611220830151829109612960830152806129608301516129208401510861298083015280612980830151610400840151096129a0830152610960820151819080096129c08301528061096083015182036129c0840151086129e08301819052611160830151829109612a0083015280612a008301516129a084015108612a2083015280612a2083015161040084015109612a40830152806102408301516109a084015108612a608301819052610980830151829109612a80830152806102a08301516109e084015108612aa08301819052612a80830151829109612ac0830152806106c083015161010009612ae083015280612ae0830151820361066084015108612b008301819052610760830151829109612b208301819052610240830151829108612b408301819052610960830151829109612b60830152806102a083015161072084015108612b808301819052612b60830151829109612ba083015280612ba08301518203612ac084015108612bc08301819052612160830151829109612be083015280612be0830151612a4084015108612c0083015280612c0083015161040084015109612c20830152806109e083015182036109a084015108612c408301819052611220830151829109612c6083015280612c60830151612c2084015108612c8083015280612c8083015161040084015109612ca083015280612160830151612c4084015109612cc0830152806109c083015182036109a084015108612ce08301819052612cc0830151829109612d0083015280612d00830151612ca084015108612d20830152610cc082015181908009612d408301819052610cc0830151829109612d608301819052610cc0830151829109612d808301819052610cc0830151829109612da083015280610cc0830151600109612dc083015280612d40830151600109612de083015280612d60830151600109612e0083015280612d80830151600109612e2083015280610ce0830151612d2084015109612e40830152806105a0830151610ba084015109612e608301528060016105a084015109612e8083015280612e808301518203610b2084015108612ea0830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e36105a084015109612ec083015280612ec08301518203610b2084015108612ee0830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb266105a084015109612f0083015280612f008301518203610b2084015108612f20830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d6105a084015109612f4083015280612f408301518203610b2084015108612f6083015280817f2b0bd16731aaf34928c0661ba43310fbbf44baa457b980ce19affba7315792a4610ba085015109610b2084015109818183847f05587d0baf86ace08f8fdf9add4e476168ef2da421ffefc32a31f9ecbea86d5d610ba0880151096105a08701510908905080612f808401525080817f1e42214ea9b2db33296ba55096815a0a6d468af715ccfa9fab93b1e3701b7f62610ba085015109610b2084015109818183847f1648cc055b11af4e0f62923d9627e377b1d413c0864af4963a826fcc6a0231fa610ba0880151096105a08701510908905080612fa08401525080817f2960d84a95d8f00f740a3d1478feb6d4b196e34bf86b62b75041b14b389d49ce610ba085015109610b2084015109818183847f21fe615ace99028841c84393e39435ea26675e494fd4886263e6fedd3cba1f16610ba0880151096105a08701510908612fc084015250612ea08201518190600109612fe08301819052612f608301518291096130008301819052612ee083015182910961302083015280817f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44856105a085015109610b2084015109818183847f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a0880151096105a087015109089050806130408401525080817f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a085015109610b2084015109818183847f1d05f683f7bacf55bccd495a5703cb329ada890af08ac0d24959599e24c832816105a0880151096105a087015109089050806130608401525080817f23af40e47e2f59a03809484a29d5e3afbf105f1fa100de8be21295a92fa75534610ba085015109610b2084015109818183847f0cb50d8e630246898046fd6c57ab74ad69238928d8b8920561cf5feac058aacd610ba0880151096105a087015109089050806130808401525080817f259eb1d15d2e74dc1a22c32210de87566d7ae67bcc859ce1e33117e171cbbcd2610ba085015109610b2084015109818183847f0705f7901a0ba3736dff0830a813cdc7350ce79c852ba2d86353d0ff84d80bb5610ba0880151096105a087015109089050806130a08401525080817f2a6bbeb56332f220c30fcaac737fd885c3596480f0ca2ff07d2733561911b7bd610ba085015109610b2084015109818183847f26a0f84d76444b5e0a60f8966cc6c88c09cf0713bd044ba9fe6c9b2e8b6263b7610ba0880151096105a087015109086130c084015250612f20820151613000830151829190096130e083015280817f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1f6105a085015109610b2084015109818183847f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a0880151096105a087015109089050806131008401525080817f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a085015109610b2084015109818183847f017829d43aa3529ba5ed3f4879cd1c09ff9f06e716afb2bc6cc72847d12771ae6105a0880151096105a0870151090861312084015250612ee0820151612fe083015182919009613140830152806001610b20840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a0870151090861316084015250612f80820151612fa083015182908290099050806131808401528181612fc0850151099050806131a08401528181613040850151099050806131c08401528181613060850151099050806131e084015281816130008501510990508061320084015281816130808501510990508061322084015281816130a08501510990508061324084015281816130c08501510990508061326084015281816130e0850151099050806132808401528181613100850151099050806132a08401528181613120850151099050806132c08401528181613140850151099050806132e08401528181613160850151099050806133008401528181612fe085015109905080613320840152506020613360830152602061338083015260206133a08301526133208201516133c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6133e0830152600080516020614fbe8339815191526134008301528260016020613340850160c0613360870160055afa141692506133408201516000612fe08401519050828261330086015109612fe0850152828282099150613160840151905082826132e086015109613160850152828282099150613140840151905082826132c086015109613140850152828282099150613120840151905082826132a08601510961312085015282828209915061310084015190508282613280860151096131008501528282820991506130e084015190508282613260860151096130e08501528282820991506130c084015190508282613240860151096130c08501528282820991506130a084015190508282613220860151096130a08501528282820991506130808401519050828261320086015109613080850152828282099150613000840151905082826131e086015109613000850152828282099150613060840151905082826131c086015109613060850152828282099150613040840151905082826131a086015109613040850152828282099150612fc08401519050828261318086015109612fc0850152828282099150612fa084015190508282612f8086015109612fa085015282828209612f808501819052612fa085015190925083915082900890508181612fc0850151086134208401525061300082015161302083015182919009613440830152613040820151818161306085015108613460840152506130e08201516130208301518291900961348083015261308082015181816130a085015108905081816130c0850151086134a084015250613140820151613020830151829190096134c08301526131008201518181613120850151086134e084015250612fe082015161302083015182919009613500830152613160820151806135208401525061342082015181816134608501510990508061354084015281816134a08501510990508061356084015281816134e0850151099050806135808401528181613520850151099050806135a08401525060206135e0830152602061360083015260206136208301526135a08201516136408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff613660830152600080516020614fbe83398151915261368083015282600160206135c0850160c06135e0870160055afa141692506135c0820151600061352084015190508282613580860151096135208501528282820991506134e084015190508282613560860151096134e08501528282820991506134a084015190508282613540860151096134a08501528282820991506134608401519050828261342086015109613460850152828282096134208501525050613460820151613440830151829190096136a0830152806134a0830151613480840151096136c0830152806134e08301516134c0840151096136e08301528061352083015161350084015109613700830152610a20820151819080096137208301819052610a208301518291096137408301819052610a208301518291096137608301819052610a208301518291096137808301819052610a208301518291096137a08301819052610a208301518291096137c08301819052610a208301518291096137e08301819052610a208301518291096138008301819052610a208301518291096138208301819052610a208301518291096138408301819052610a208301518291096138608301819052610a208301518291096138808301819052610a208301518291096138a08301819052610a208301518291096138c08301819052610a208301518291096138e08301819052610a20830151829109613900830152610a80820151819080096139208301819052610a808301518291096139408301819052610a808301518291096139608301819052610a8083015182910961398083015280612f808301516105e084015109818183612fa086015161062087015109089050818183612fc08601516106a087015109086139a0840181905261342084015183925090096139c08301528060016139c08401518303096139e083015280612f8083015161060084015109818183612fa086015161064087015109089050818183612fc08601516106808701510908613a0084018190526134208401518392509009613a208301819052610a208301518291820309613a4083015280610a20830151600109613a6083015280613a408301516139e084015108613a80830152806001613a8084015109613aa0830152806001613a6084015109613ac083015280613440830151600109613ae083015280613040830151610660840151098181836130608601516106c08701510908613b0084018190526136a08401518392509009613b20830152806001613b20840151830309613b40830152806001613ae084015109613b6083015280613040830151610920840151098181836130608601516109408701510908613b8084018190526136a08401518392509009613ba08301819052610a208301518291820309613bc083015280610a20830151613ae084015109613be083015280613bc0830151613b4084015108613c0083015280613040830151610960840151098181836130608601516109808701510908613c2084018190526136a08401518392509009613c4083018190526137208301518291820309613c6083015280613720830151613ae084015109613c8083015280613c60830151613c0084015108613ca08301819052610a80830151829109613cc083015280610a80830151613b6084015109613ce083015280610a80830151613be084015109613d0083015280610a80830151613c8084015109613d2083015280613cc0830151613aa084015108613d4083015280613480830151600109613d60830152806130808301516108c0840151098181836130a08601516108e0870151090890508181836130c08601516109008701510908613d8084018190526136c08401518392509009613da0830152806001613da0840151830309613dc0830152806001613d6084015109613de083015280613920830151613dc084015109613e0083015280613920830151613de084015109613e2083015280613e00830151613d4084015108613e40830152806134c0830151600109613e60830152806131008301516109a0840151098181836131208601516109c08701510908613e8084018190526136e08401518392509009613ea0830152806001613ea0840151830309613ec0830152806001613e6084015109613ee083015280613940830151613ec084015109613f0083015280613940830151613ee084015109613f2083015280613f00830151613e4084015108613f4083015280613500830151600109613f60830152806131608301516109e084015109613f808301819052613700830151829109613fa0830152806001613fa0840151830309613fc0830152806001613f6084015109613fe0830152806131608301516106e08401510961400083018190526137008301518291096140208301819052610a20830151829182030961404083015280610a20830151613f608401510961406083015280614040830151613fc08401510861408083015280613160830151610700840151096140a083018190526137008301518291096140c0830181905261372083015182918203096140e083015280613720830151613f6084015109614100830152806140e083015161408084015108614120830152806131608301516107208401510961414083018190526137008301518291096141608301819052613740830151829182030961418083015280613740830151613f60840151096141a083015280614180830151614120840151086141c083015280613160830151610740840151096141e083018190526137008301518291096142008301819052613760830151829182030961422083015280613760830151613f6084015109614240830152806142208301516141c084015108614260830152806131608301516107608401510961428083018190526137008301518291096142a0830181905261378083015182918203096142c083015280613780830151613f60840151096142e0830152806142c0830151614260840151086143008301528061316083015161078084015109614320830181905261370083015182910961434083018190526137a08301518291820309614360830152806137a0830151613f608401510961438083015280614360830151614300840151086143a0830152806131608301516107a0840151096143c083018190526137008301518291096143e083018190526137c08301518291820309614400830152806137c0830151613f6084015109614420830152806144008301516143a084015108614440830152806131608301516107c084015109614460830181905261370083015182910961448083018190526137e083015182918203096144a0830152806137e0830151613f60840151096144c0830152806144a0830151614440840151086144e0830152806131608301516108008401510961450083018190526137008301518291096145208301819052613800830151829182030961454083015280613800830151613f6084015109614560830152806145408301516144e08401510861458083015280613160830151610820840151096145a083018190526137008301518291096145c0830181905261382083015182918203096145e083015280613820830151613f6084015109614600830152806145e083015161458084015108614620830152806131608301516108408401510961464083018190526137008301518291096146608301819052613840830151829182030961468083015280613840830151613f60840151096146a083015280614680830151614620840151086146c083015280613160830151610860840151096146e083018190526137008301518291096147008301819052613860830151829182030961472083015280613860830151613f6084015109614740830152806147208301516146c084015108614760830152806131608301516108808401510961478083018190526137008301518291096147a0830181905261388083015182918203096147c083015280613880830151613f60840151096147e0830152806147c083015161476084015108614800830152806131608301516108a084015109614820830181905261370083015182910961484083018190526138a08301518291820309614860830152806138a0830151613f608401510961488083015280614860830151614800840151086148a083015280613500830151612dc0840151096148c083015280613500830151612de0840151096148e083015280613500830151612e008401510961490083015280613500830151612e208401510961492083015280613160830151612e4084015109614940830181905261370083015182910961496083018190526138c08301518291820309614980830152806138c0830151613f60840151096149a0830152806138c08301516148c0840151096149c0830152806138c08301516148e0840151096149e0830152806138c083015161490084015109614a00830152806138c083015161492084015109614a20830152806149808301516148a084015108614a40830152806131608301516107e084015109614a608301819052613700830151829109614a8083018190526138e08301518291820309614aa0830152806138e0830151613f6084015109614ac083015280614aa0830151614a4084015108614ae08301819052613960830151829109614b0083015280613960830151613fe084015109614b208301528061396083015161406084015109614b408301528061396083015161410084015109614b60830152806139608301516141a084015109614b808301528061396083015161424084015109614ba0830152806139608301516142e084015109614bc08301528061396083015161438084015109614be08301528061396083015161442084015109614c00830152806139608301516144c084015109614c208301528061396083015161456084015109614c408301528061396083015161460084015109614c60830152806139608301516146a084015109614c808301528061396083015161474084015109614ca0830152806139608301516147e084015109614cc08301528061396083015161488084015109614ce0830152806139608301516149a084015109614d00830152806139608301516149c084015109614d20830152806139608301516149e084015109614d4083015280613960830151614a0084015109614d6083015280613960830151614a2084015109614d8083015280613960830151614ac084015109614da083015280614b00830151613f4084015108614dc083015280613020830151600109614de083015280610b20830151600109614e008301526001614e2083018181526002614e40850152614dc0840151614e6085015284919060409060608160075afa14169250614e20820151614e80830152614e40820151614ea08301526080820151614ec083015260a0820151614ee08301528260016040614e8085016080614e80870160065afa1416925060c0820151614f0083015260e0820151614f20830152613ac0820151614f408301528260016040614f0085016060614f00870160075afa14169250614e80820151614f60830152614ea0820151614f80830152614f00820151614fa0830152614f20820151614fc08301528260016040614f6085016080614f60870160065afa14169250610100820151614fe0830152610120820151615000830152613ce08201516150208301528260016040614fe085016060614fe0870160075afa14169250614f60820151615040830152614f80820151615060830152614fe08201516150808301526150008201516150a0830152826001604061504085016080615040870160065afa141692506103208201516150c08301526103408201516150e0830152613d0082015161510083015282600160406150c0850160606150c0870160075afa141692506150408201516151208301526150608201516151408301526150c08201516151608301526150e0820151615180830152826001604061512085016080615120870160065afa141692506103608201516151a08301526103808201516151c0830152613d208201516151e083015282600160406151a0850160606151a0870160075afa141692506151208201516152008301526151408201516152208301526151a08201516152408301526151c0820151615260830152826001604061520085016080615200870160065afa141692506102e08201516152808301526103008201516152a0830152613e208201516152c0830152826001604061528085016060615280870160075afa141692506152008201516152e08301526152208201516153008301526152808201516153208301526152a082015161534083015282600160406152e0850160806152e0870160065afa141692506101a08201516153608301526101c0820151615380830152613f208201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa141692506101e0820151615440830152610200820151615460830152614b20820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692507f2f76bb5b87a6969c4ebb851bb10df173a462316bec33392c426c2f2b3a23f18b6155208301527f1128e4c8af582c69c209db87ec18fa85466ea71b7198f6d8c79083103261fec3615540830152614b40820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f133492493eb62499c1ba03a8715f8d07e78490f157ef603bdfbafb396a1bdcbf6156008301527f079b0b5d58e739eea6bdfe4092e232bacee0d027bd0f5186c22977bfd24620d7615620830152614b60820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f187bddea7dbe1c5acd2e01afadc1c0df38180c00ab7439352151b7e801502a0b6156e08301527f0fc2689a279dba9a368a34988064e5dc4f1cd3f2598bd2a6949e1b1a02d10b76615700830152614b8082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f16fbd0af4b59dc890346304d35c999dd8dfad3a06ad8a10f474527fad9ea9c326157c08301527f2ab015bc2b8a19b48338928187638174065562d0a5a83b008546a9e6612ec6c46157e0830152614ba082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f1dcfb31490b59327642f4b9392465bd8824f732a9e94e46b0bad32b5706087af6158a08301527f16b484290b48dce843c6bab1e64e7f45eb424bb17ce605fbcea4650fb021f6006158c0830152614bc08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f1eeb3f7b26d5c9871bc2c16a4ed5056dbe613a4bad07a1865e94b5a3f1f468426159808301527f2226ac7577fc6b41920682f07383ed12ef175ee617888551e764434eda30a02e6159a0830152614be08201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f26e3fbd5c5a66607cd8371419cac48be464539f883f1edfaca3c6bf8507a7410615a608301527f08f6e991d52b47307f2f83f267b41f3f3310fa21831988da7ab39054fe2ac53b615a80830152614c00820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f1654ed6ee24ad6ebd5c4c2dc0febbb2e92d556bb946f336c7cc1566170f64cdd615b408301527f2e60765d74d1d5c043e2299c4e457312b1358f4e51cdea038ec00ef453f20a09615b60830152614c20820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f23a0c541643962fd3751f386670057a24c2a2966d6f975b8474b1df1df58aec5615c208301527f12adacf7628483c9dd1d014cb00243aa716100680f195d25d59bc85ee7fdf202615c40830152614c40820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f19780ae2901b7f5ddedf94c1b53b504977a5181f39a0502c6e86b8378203f22e615d008301527f1f5f311a3d179380fe7cd9e6d14150dc860629541bb2c8f88110e31de91c7bfa615d20830152614c60820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f021fa11f2c822b49466f473bc750e172be66ff9df35bc5a393cee59294f42b98615de08301527f2281445678651a0a05ccdbea47bde6e7a6c82e43de0a52a5414fe82995229130615e00830152614c80820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0e67f06b3cd6ad600c3a3b705d3d178c2ea4afa419a60ff56b42774a44f2c151615ec08301527f1cc0dd45b27e99dcba7e4c721c4255ebde7a5b3aea6279859073398d6bf3ba1d615ee0830152614ca0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f279c16cd7feb17ed6cfe4ce27f00473872b340ebcae3dfe2c6d8aa97d9602273615fa08301527f0aaffc872c798473df012c13c5185eb7cca39ba51cbf0358a7f5b7903fbde64d615fc0830152614cc0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f1b711abfd5ca379b0c7a059a3c0a23f8aa6d033158b9bcb922f191cd11a374db6160808301527f2293e4350f716a42b09abf2696b53647b98656e217dfc39071b2207cb348c4946160a0830152614ce08201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa14169250610440820151616160830152610460820151616180830152614d008201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692506104808201516162408301526104a0820151616260830152614d20820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692506104c08201516163208301526104e0820151616340830152614d40820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa14169250610500820151616400830152610520820151616420830152614d60820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506105408201516164e0830152610560820151616500830152614d8082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506103a08201516165c08301526103c08201516165e0830152614da082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa14169250610ac08201516166a0830152610ae08201516166c0830152614de082015181036166e08301525081600160406166a0840160606166a0860160075afa141691506166208101516167008201526166408101516167208201526166a08101516167408201526166c0810151616760820152816001604061670084016080616700860160065afa14169150610b60810151616780820152610b808101516167a0820152614e008101516167c0820152816001604061678084016060616780860160075afa141691506167008101516167e08201526167208101516168008201526167808101516168208201526167a081015161684082015281600160406167e0840160806167e0860160065afa141691506167e08101516168608201526168008101516168808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26168a08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6168c08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6168e08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa616900820152610b60810151616920820152610b808101516169408201527f2bda3e3f6913dbd628d5cb2e235040d9902e3f5cd9b5f5669ed765984db32b556169608201527f14f987df3f0b40848192c76a191314d67fb1f2618fba33e163e28ce9e895ab806169808201527f2b11a57fe3e865318a9cba27a410871987a176b7746acccc7aa6c59c47c9c07b6169a08201527f071173db1791499cdfe9b9ca8a89c405cdf9a28e622dc3417b7d3c70882d034f6169c082015281600160206168608401610180616860860160085afa61686093909301516001149214161691505092915050565b604051806169c0016040528061034e906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5d57614e5d614e1e565b604052919050565b600082601f830112614e7657600080fd5b813567ffffffffffffffff811115614e9057614e90614e1e565b614ea3601f8201601f1916602001614e34565b818152846020838601011115614eb857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614ee857600080fd5b823567ffffffffffffffff80821115614f0057600080fd5b818501915085601f830112614f1457600080fd5b8135602082821115614f2857614f28614e1e565b8160051b614f37828201614e34565b928352848101820192828101908a851115614f5157600080fd5b958301955b84871015614f6f57863582529583019590830190614f56565b9750505086013592505080821115614f8657600080fd5b50614f9385828601614e65565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220fad36e747e649649da58b272be689e94c0e196a8172956777013195f5895998764736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004614ed5565b610057565b604051901515815260200160405180910390f35b60006001610063614dfe565b600080516020614fbe8339815191526100d9565b600080516020614f9e8339815191528083108183101690838009600080516020614f9e833981519152838409600080516020614f9e8339815191528482099050600080516020614f9e8339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301527f2711433a26ab4da2ec8740666db1f70d31818824e0a122a89a12a43a63a9b70d6000830152602085015180608084015260408601518060a0850152846101448284610077565b169450505060608501518060c084015260808601518060e08501528461016a8284610077565b169450505060a08501518061010084015260c086015180610120850152846101928284610077565b16945050506101406000830120610140830152610140820151818106610160840152806101808401525060e0850151806101a0840152610100860151806101c0850152846101e08284610077565b1694505050610120850151806101e0840152610140860151806102008501528461020a8284610077565b60a061018087012061022087018190528581066102408801526102608701521694506001915050610280830153602161026083012061028083018190528181066102a08401526102c08301526101608501516102e0830181905261018086015161030084018190528461027d8284610077565b16945050506101a0850151806103208401526101c086015180610340850152846102a78284610077565b16945050506101e08501518061036084015261020086015180610380850152846102d18284610077565b1694505050610220850151806103a0840152610240860151806103c0850152846102fb8284610077565b16945050506101206102c08301206103e08301526103e0820151818106610400840152806104208401525061026085015180610440840152610280860151806104608501528461034b8284610077565b16945050506102a0850151806104808401526102c0860151806104a0850152846103758284610077565b16945050506102e0850151806104c0840152610300860151806104e08501528461039f8284610077565b16945050506103208501518061050084015261034086015180610520850152846103c98284610077565b16945050506103608501518061054084015261038086015180610560850152846103f38284610077565b16945050506101606104208301206105808301526105808201518181066105a0840152806105c084015250806103a0860151066105e0830152806103c086015106610600830152806103e08601510661062083015280610400860151066106408301528061042086015106610660830152806104408601510661068083015280610460860151066106a083015280610480860151066106c0830152806104a0860151066106e0830152806104c086015106610700830152806104e08601510661072083015280610500860151066107408301528061052086015106610760830152806105408601510661078083015280610560860151066107a083015280610580860151066107c0830152806105a0860151066107e0830152806105c086015106610800830152806105e08601510661082083015280610600860151066108408301528061062086015106610860830152806106408601510661088083015280610660860151066108a083015280610680860151066108c0830152806106a0860151066108e0830152806106c086015106610900830152806106e08601510661092083015280610700860151066109408301528061072086015106610960830152806107408601510661098083015280610760860151066109a083015280610780860151066109c0830152806107a0860151066109e08301526104406105c0830120610a00830152610a00820151818106610a2084015280610a40840152506001610a608301536021610a40830120610a608301819052818106610a80840152610aa08301526107c0850151610ac083018190526107e0860151610ae08401819052846106608284610077565b16945050506060610aa0830120610b00830152610b00820151818106610b2084015280610b408401525061080085015180610b6084015261082086015180610b80850152846106af8284610077565b1694505050806105a08301516105a084015109610ba0830181905281908009610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610cc084015108610ce0830152807f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001610ce084015109610d00830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb26610d0084015109610d20830152807f1a6cb0b91da01e6d7a1e7d76eeef7de63954cd24b5a8c2b95ad8712f455b04db6105a084015108610d40830152807f03b743d74fd9ddb41f920179ac30e04b0ebd93e580b9c0b50061087904110bd4610d0084015109610d60830152807f2cad0a9b9157c27598be443cd550781219765462f8ffafdc4380ed1aebeef42d6105a084015108610d80830152807f1f4d7180df5014849825f3c9b0e89d79432c51f48eb5846ae63b433f28aba10b610d0084015109610da0830152807f1116dcf201e18ba5202a51ecd098bae3e5079653eb03ec265da6b254c7545ef66105a084015108610dc0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d0084015109610de0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105a084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d0084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105a084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d0084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105a084015108610e80830152806001610d0084015109610ea0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a084015108610ec0830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d0084015109610ee0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105a084015108610f00830152807f0dd30b9ad8c173555d2a33029bc807ac165b61281e9054a173af7ff4e4fc88fc610d0084015109610f20830152807f229142d808702cd45b2612b3e5b950b111d887205b291befd032759f0b0377056105a084015108610f40830152610d408201518181610d8085015109905080610f608401528181610dc085015109905080610f808401528181610e0085015109905080610fa08401528181610e4085015109905080610fc08401528181610e8085015109905080610fe08401528181610ec0850151099050806110008401528181610f00850151099050806110208401528181610f40850151099050806110408401528181610ce0850151099050806110608401525060206110a083015260206110c083015260206110e08301526110608201516111008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff611120830152600080516020614fbe8339815191526111408301528260016020611080850160c06110a0870160055afa141692506110808201516000610ce08401519050828261104086015109610ce0850152828282099150610f408401519050828261102086015109610f40850152828282099150610f008401519050828261100086015109610f00850152828282099150610ec084015190508282610fe086015109610ec0850152828282099150610e8084015190508282610fc086015109610e80850152828282099150610e4084015190508282610fa086015109610e40850152828282099150610e0084015190508282610f8086015109610e00850152828282099150610dc084015190508282610f6086015109610dc0850152828282099150610d8084015190508282610d4086015109610d8085015282828209610d408501819052610d208501518493509091500961116083015280610d80830151610d608401510961118083015280610dc0830151610da0840151096111a083015280610e00830151610de0840151096111c083015280610e40830151610e20840151096111e083015280610e80830151610e608401510961120083015280610ec0830151610ea08401510961122083015280610f00830151610ee08401510961124083015280610f40830151610f20840151096112608301528060208301516112208401510981818360408601516112408701510908905081818360608601516112608701510908611280840152506107208201516105e0830151829190086112a08301819052819080096112c08301819052819080096112e0830152806112e08301516112a084015109611300830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561130084015109611320830152806107408301516106008401510861134083018190528190800961136083018190528190800961138083015280611380830151611340840151096113a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86113a0840151096113c0830152806113c0830151611320840151086113e08301528061062083015182036113e08401510861140083018190526107a08301518291096114208301528061142083015161040084015109611440830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961130084015109611460830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113a08401510961148083015280611480830151611460840151086114a08301528061064083015182036114a0840151086114c083018190526107a08301518291096114e0830152806114e08301516114408401510861150083015280611500830151610400840151096115208301528061066083015182036113008401510861154083018190526107c0830151829109611560830152806115608301516115208401510861158083015280611580830151610400840151096115a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610660840151096115c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611340840151096115e0830152806115e08301516115c08401510861160083018190526106e08301518291086116208301819052819080096116408301819052819080096116608301528061166083015161162084015109611680830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610620840151096116a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610640840151096116c0830152806116c08301516116a0840151086116e0830152806116e083015182036116808401510861170083018190526107c0830151829109611720830152806117208301516115a0840151086117408301528061174083015161040084015109611760830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961066084015109611780830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611340840151096117a0830152806117a0830151611780840151086117c083018190526107008301518291086117e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261062084015109611800830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106408401510961182083015280611820830151611800840151086118408301528061184083015182036117e08401510861186083018190526107c083015182910961188083015280611880830151611760840151086118a0830152806118a0830151610400840151096118c08301528061078083015182036001086118e0830181905261078083015182910961190083015280610780830151820360020861192083018190526119008301518291096119408301528061078083015182036003086119608301819052611940830151829109611980830152806105e08301516106a0840151086119a08301528061062083015182036119a0840151086119c083018190526119808301518291096119e0830152806119e08301516118c084015108611a0083015280611a0083015161040084015109611a2083015280610640830151820361068084015108611a408301819052611980830151829109611a6083015280611a60830151611a2084015108611a8083015280611a8083015161040084015109611aa08301528061078083015161192084015109611ac083015280611ac083015161196084015109611ae0830152806107808301518203600408611b008301819052611ae0830151829109611b2083015280611b2083015161066084015109611b40830152806106608301518203600108611b608301819052611b40830151829109611b8083015280611b80830151611aa084015108611ba083015280611ba083015161040084015109611bc083015280610660830151600209611be0830152806105e0830151820361060084015108611c008301819052611be0830151829109611c20830152806105e0830151820361062084015108611c4083015280611c408301518203611c2084015108611c6083015280610640830151820361060084015108611c8083015280611c808301518203611c6084015108611ca08301819052611b20830151829109611cc083015280611cc0830151611bc084015108611ce083015280611ce083015161040084015109611d008301528061190083015161196084015109611d2083015280611d20830151611b0084015109611d40830152806106008301516105e084015108611d60830152806106608301518203611d6084015108611d808301819052611d40830151829109611da083015280611da0830151611d0084015108611dc083015280611dc083015161040084015109611de08301819052611da0830151829108611e0083015280611e0083015161040084015109611e2083015280611940830151611b0084015109611e408301528061060083015182036105e084015108611e6083015280600160701b611e6084015108611e80830152806106608301518203611e8084015108611ea08301819052611e40830151829109611ec083015280611ec0830151611e2084015108611ee083015280611ee083015161040084015109611f00830152806108c08301518203600108611f208301819052611220830151829109611f4083015280611f40830151611f0084015108611f6083015280611f6083015161040084015109611f8083015261092082015181908009611fa0830152806109208301518203611fa084015108611fc08301819052611160830151829109611fe083015280611fe0830151611f80840151086120008301528061200083015161040084015109612020830152806109008301518203610920840151086120408301819052611220830151829109612060830152806120608301516120208401510861208083015280612080830151610400840151096120a08301528061116083015182036001086120c0830152806111a0830151611180840151086120e083018190526111c083015182910861210083018190526111e083015182910861212083018190526112008301518291086121408301528061214083015182036120c0840151086121608301528061024083015161080084015109612180830152806121808301516106e0840151086121a083018190526102a08301518291086121c083015280610240830151610820840151096121e0830152806121e08301516105e08401510861220083018190526102a083015182910861222083018190526121c08301518291096122408301528061024083015161084084015109612260830152806122608301516106008401510861228083018190526102a08301518291086122a083018190526122408301518291096122c083015280610240830151610860840151096122e0830152806122e08301516107008401510861230083018190526102a083015182910861232083018190526122c083015182910961234083018190526108e083015182910961236083015280610240830151600109612380830152806123808301516105a0840151096123a0830152806123a08301516106e0840151086123c083018190526102a08301518291086123e0830152806102408301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a209612400830152806124008301516105a084015109612420830152806124208301516105e08401510861244083018190526102a083015182910861246083018190526123e0830151829109612480830152806102408301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096124a0830152806124a08301516105a0840151096124c0830152806124c0830151610600840151086124e083018190526102a08301518291086125008301819052612480830151829109612520830152806102408301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612540830152806125408301516105a084015109612560830152806125608301516107008401510861258083018190526102a08301518291086125a083018190526125208301518291096125c083018190526108c08301518291096125e0830152806125e08301518203612360840151086126008301819052612160830151829109612620830152806126208301516120a0840151086126408301528061264083015161040084015109612660830152806102408301516108808401510961268083015280612680830151610660840151086126a083018190526102a08301518291086126c0830152806102408301516108a0840151096126e0830152806126e08301516112808401510861270083018190526102a083015182910861272083018190526126c08301518291096127408301819052610940830151829109612760830152806102408301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612780830152806127808301516105a0840151096127a0830152806127a0830151610660840151086127c083018190526102a08301518291086127e0830152806102408301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612800830152806128008301516105a084015109612820830152806128208301516112808401510861284083018190526102a083015182910861286083018190526127e083015182910961288083018190526109208301518291096128a0830152806128a08301518203612760840151086128c083018190526121608301518291096128e0830152806128e08301516126608401510861290083015280612900830151610400840151096129208301528061096083015182036001086129408301819052611220830151829109612960830152806129608301516129208401510861298083015280612980830151610400840151096129a0830152610960820151819080096129c08301528061096083015182036129c0840151086129e08301819052611160830151829109612a0083015280612a008301516129a084015108612a2083015280612a2083015161040084015109612a40830152806102408301516109a084015108612a608301819052610980830151829109612a80830152806102a08301516109e084015108612aa08301819052612a80830151829109612ac0830152806106c083015161010009612ae083015280612ae0830151820361066084015108612b008301819052610760830151829109612b208301819052610240830151829108612b408301819052610960830151829109612b60830152806102a083015161072084015108612b808301819052612b60830151829109612ba083015280612ba08301518203612ac084015108612bc08301819052612160830151829109612be083015280612be0830151612a4084015108612c0083015280612c0083015161040084015109612c20830152806109e083015182036109a084015108612c408301819052611220830151829109612c6083015280612c60830151612c2084015108612c8083015280612c8083015161040084015109612ca083015280612160830151612c4084015109612cc0830152806109c083015182036109a084015108612ce08301819052612cc0830151829109612d0083015280612d00830151612ca084015108612d20830152610cc082015181908009612d408301819052610cc0830151829109612d608301819052610cc0830151829109612d808301819052610cc0830151829109612da083015280610cc0830151600109612dc083015280612d40830151600109612de083015280612d60830151600109612e0083015280612d80830151600109612e2083015280610ce0830151612d2084015109612e40830152806105a0830151610ba084015109612e608301528060016105a084015109612e8083015280612e808301518203610b2084015108612ea0830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e36105a084015109612ec083015280612ec08301518203610b2084015108612ee0830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb266105a084015109612f0083015280612f008301518203610b2084015108612f20830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d6105a084015109612f4083015280612f408301518203610b2084015108612f6083015280817f2b0bd16731aaf34928c0661ba43310fbbf44baa457b980ce19affba7315792a4610ba085015109610b2084015109818183847f05587d0baf86ace08f8fdf9add4e476168ef2da421ffefc32a31f9ecbea86d5d610ba0880151096105a08701510908905080612f808401525080817f1e42214ea9b2db33296ba55096815a0a6d468af715ccfa9fab93b1e3701b7f62610ba085015109610b2084015109818183847f1648cc055b11af4e0f62923d9627e377b1d413c0864af4963a826fcc6a0231fa610ba0880151096105a08701510908905080612fa08401525080817f2960d84a95d8f00f740a3d1478feb6d4b196e34bf86b62b75041b14b389d49ce610ba085015109610b2084015109818183847f21fe615ace99028841c84393e39435ea26675e494fd4886263e6fedd3cba1f16610ba0880151096105a08701510908612fc084015250612ea08201518190600109612fe08301819052612f608301518291096130008301819052612ee083015182910961302083015280817f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44856105a085015109610b2084015109818183847f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a0880151096105a087015109089050806130408401525080817f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a085015109610b2084015109818183847f1d05f683f7bacf55bccd495a5703cb329ada890af08ac0d24959599e24c832816105a0880151096105a087015109089050806130608401525080817f23af40e47e2f59a03809484a29d5e3afbf105f1fa100de8be21295a92fa75534610ba085015109610b2084015109818183847f0cb50d8e630246898046fd6c57ab74ad69238928d8b8920561cf5feac058aacd610ba0880151096105a087015109089050806130808401525080817f259eb1d15d2e74dc1a22c32210de87566d7ae67bcc859ce1e33117e171cbbcd2610ba085015109610b2084015109818183847f0705f7901a0ba3736dff0830a813cdc7350ce79c852ba2d86353d0ff84d80bb5610ba0880151096105a087015109089050806130a08401525080817f2a6bbeb56332f220c30fcaac737fd885c3596480f0ca2ff07d2733561911b7bd610ba085015109610b2084015109818183847f26a0f84d76444b5e0a60f8966cc6c88c09cf0713bd044ba9fe6c9b2e8b6263b7610ba0880151096105a087015109086130c084015250612f20820151613000830151829190096130e083015280817f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1f6105a085015109610b2084015109818183847f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a0880151096105a087015109089050806131008401525080817f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a085015109610b2084015109818183847f017829d43aa3529ba5ed3f4879cd1c09ff9f06e716afb2bc6cc72847d12771ae6105a0880151096105a0870151090861312084015250612ee0820151612fe083015182919009613140830152806001610b20840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a0870151090861316084015250612f80820151612fa083015182908290099050806131808401528181612fc0850151099050806131a08401528181613040850151099050806131c08401528181613060850151099050806131e084015281816130008501510990508061320084015281816130808501510990508061322084015281816130a08501510990508061324084015281816130c08501510990508061326084015281816130e0850151099050806132808401528181613100850151099050806132a08401528181613120850151099050806132c08401528181613140850151099050806132e08401528181613160850151099050806133008401528181612fe085015109905080613320840152506020613360830152602061338083015260206133a08301526133208201516133c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6133e0830152600080516020614fbe8339815191526134008301528260016020613340850160c0613360870160055afa141692506133408201516000612fe08401519050828261330086015109612fe0850152828282099150613160840151905082826132e086015109613160850152828282099150613140840151905082826132c086015109613140850152828282099150613120840151905082826132a08601510961312085015282828209915061310084015190508282613280860151096131008501528282820991506130e084015190508282613260860151096130e08501528282820991506130c084015190508282613240860151096130c08501528282820991506130a084015190508282613220860151096130a08501528282820991506130808401519050828261320086015109613080850152828282099150613000840151905082826131e086015109613000850152828282099150613060840151905082826131c086015109613060850152828282099150613040840151905082826131a086015109613040850152828282099150612fc08401519050828261318086015109612fc0850152828282099150612fa084015190508282612f8086015109612fa085015282828209612f808501819052612fa085015190925083915082900890508181612fc0850151086134208401525061300082015161302083015182919009613440830152613040820151818161306085015108613460840152506130e08201516130208301518291900961348083015261308082015181816130a085015108905081816130c0850151086134a084015250613140820151613020830151829190096134c08301526131008201518181613120850151086134e084015250612fe082015161302083015182919009613500830152613160820151806135208401525061342082015181816134608501510990508061354084015281816134a08501510990508061356084015281816134e0850151099050806135808401528181613520850151099050806135a08401525060206135e0830152602061360083015260206136208301526135a08201516136408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff613660830152600080516020614fbe83398151915261368083015282600160206135c0850160c06135e0870160055afa141692506135c0820151600061352084015190508282613580860151096135208501528282820991506134e084015190508282613560860151096134e08501528282820991506134a084015190508282613540860151096134a08501528282820991506134608401519050828261342086015109613460850152828282096134208501525050613460820151613440830151829190096136a0830152806134a0830151613480840151096136c0830152806134e08301516134c0840151096136e08301528061352083015161350084015109613700830152610a20820151819080096137208301819052610a208301518291096137408301819052610a208301518291096137608301819052610a208301518291096137808301819052610a208301518291096137a08301819052610a208301518291096137c08301819052610a208301518291096137e08301819052610a208301518291096138008301819052610a208301518291096138208301819052610a208301518291096138408301819052610a208301518291096138608301819052610a208301518291096138808301819052610a208301518291096138a08301819052610a208301518291096138c08301819052610a208301518291096138e08301819052610a20830151829109613900830152610a80820151819080096139208301819052610a808301518291096139408301819052610a808301518291096139608301819052610a8083015182910961398083015280612f808301516105e084015109818183612fa086015161062087015109089050818183612fc08601516106a087015109086139a0840181905261342084015183925090096139c08301528060016139c08401518303096139e083015280612f8083015161060084015109818183612fa086015161064087015109089050818183612fc08601516106808701510908613a0084018190526134208401518392509009613a208301819052610a208301518291820309613a4083015280610a20830151600109613a6083015280613a408301516139e084015108613a80830152806001613a8084015109613aa0830152806001613a6084015109613ac083015280613440830151600109613ae083015280613040830151610660840151098181836130608601516106c08701510908613b0084018190526136a08401518392509009613b20830152806001613b20840151830309613b40830152806001613ae084015109613b6083015280613040830151610920840151098181836130608601516109408701510908613b8084018190526136a08401518392509009613ba08301819052610a208301518291820309613bc083015280610a20830151613ae084015109613be083015280613bc0830151613b4084015108613c0083015280613040830151610960840151098181836130608601516109808701510908613c2084018190526136a08401518392509009613c4083018190526137208301518291820309613c6083015280613720830151613ae084015109613c8083015280613c60830151613c0084015108613ca08301819052610a80830151829109613cc083015280610a80830151613b6084015109613ce083015280610a80830151613be084015109613d0083015280610a80830151613c8084015109613d2083015280613cc0830151613aa084015108613d4083015280613480830151600109613d60830152806130808301516108c0840151098181836130a08601516108e0870151090890508181836130c08601516109008701510908613d8084018190526136c08401518392509009613da0830152806001613da0840151830309613dc0830152806001613d6084015109613de083015280613920830151613dc084015109613e0083015280613920830151613de084015109613e2083015280613e00830151613d4084015108613e40830152806134c0830151600109613e60830152806131008301516109a0840151098181836131208601516109c08701510908613e8084018190526136e08401518392509009613ea0830152806001613ea0840151830309613ec0830152806001613e6084015109613ee083015280613940830151613ec084015109613f0083015280613940830151613ee084015109613f2083015280613f00830151613e4084015108613f4083015280613500830151600109613f60830152806131608301516109e084015109613f808301819052613700830151829109613fa0830152806001613fa0840151830309613fc0830152806001613f6084015109613fe0830152806131608301516106e08401510961400083018190526137008301518291096140208301819052610a20830151829182030961404083015280610a20830151613f608401510961406083015280614040830151613fc08401510861408083015280613160830151610700840151096140a083018190526137008301518291096140c0830181905261372083015182918203096140e083015280613720830151613f6084015109614100830152806140e083015161408084015108614120830152806131608301516107208401510961414083018190526137008301518291096141608301819052613740830151829182030961418083015280613740830151613f60840151096141a083015280614180830151614120840151086141c083015280613160830151610740840151096141e083018190526137008301518291096142008301819052613760830151829182030961422083015280613760830151613f6084015109614240830152806142208301516141c084015108614260830152806131608301516107608401510961428083018190526137008301518291096142a0830181905261378083015182918203096142c083015280613780830151613f60840151096142e0830152806142c0830151614260840151086143008301528061316083015161078084015109614320830181905261370083015182910961434083018190526137a08301518291820309614360830152806137a0830151613f608401510961438083015280614360830151614300840151086143a0830152806131608301516107a0840151096143c083018190526137008301518291096143e083018190526137c08301518291820309614400830152806137c0830151613f6084015109614420830152806144008301516143a084015108614440830152806131608301516107c084015109614460830181905261370083015182910961448083018190526137e083015182918203096144a0830152806137e0830151613f60840151096144c0830152806144a0830151614440840151086144e0830152806131608301516108008401510961450083018190526137008301518291096145208301819052613800830151829182030961454083015280613800830151613f6084015109614560830152806145408301516144e08401510861458083015280613160830151610820840151096145a083018190526137008301518291096145c0830181905261382083015182918203096145e083015280613820830151613f6084015109614600830152806145e083015161458084015108614620830152806131608301516108408401510961464083018190526137008301518291096146608301819052613840830151829182030961468083015280613840830151613f60840151096146a083015280614680830151614620840151086146c083015280613160830151610860840151096146e083018190526137008301518291096147008301819052613860830151829182030961472083015280613860830151613f6084015109614740830152806147208301516146c084015108614760830152806131608301516108808401510961478083018190526137008301518291096147a0830181905261388083015182918203096147c083015280613880830151613f60840151096147e0830152806147c083015161476084015108614800830152806131608301516108a084015109614820830181905261370083015182910961484083018190526138a08301518291820309614860830152806138a0830151613f608401510961488083015280614860830151614800840151086148a083015280613500830151612dc0840151096148c083015280613500830151612de0840151096148e083015280613500830151612e008401510961490083015280613500830151612e208401510961492083015280613160830151612e4084015109614940830181905261370083015182910961496083018190526138c08301518291820309614980830152806138c0830151613f60840151096149a0830152806138c08301516148c0840151096149c0830152806138c08301516148e0840151096149e0830152806138c083015161490084015109614a00830152806138c083015161492084015109614a20830152806149808301516148a084015108614a40830152806131608301516107e084015109614a608301819052613700830151829109614a8083018190526138e08301518291820309614aa0830152806138e0830151613f6084015109614ac083015280614aa0830151614a4084015108614ae08301819052613960830151829109614b0083015280613960830151613fe084015109614b208301528061396083015161406084015109614b408301528061396083015161410084015109614b60830152806139608301516141a084015109614b808301528061396083015161424084015109614ba0830152806139608301516142e084015109614bc08301528061396083015161438084015109614be08301528061396083015161442084015109614c00830152806139608301516144c084015109614c208301528061396083015161456084015109614c408301528061396083015161460084015109614c60830152806139608301516146a084015109614c808301528061396083015161474084015109614ca0830152806139608301516147e084015109614cc08301528061396083015161488084015109614ce0830152806139608301516149a084015109614d00830152806139608301516149c084015109614d20830152806139608301516149e084015109614d4083015280613960830151614a0084015109614d6083015280613960830151614a2084015109614d8083015280613960830151614ac084015109614da083015280614b00830151613f4084015108614dc083015280613020830151600109614de083015280610b20830151600109614e008301526001614e2083018181526002614e40850152614dc0840151614e6085015284919060409060608160075afa14169250614e20820151614e80830152614e40820151614ea08301526080820151614ec083015260a0820151614ee08301528260016040614e8085016080614e80870160065afa1416925060c0820151614f0083015260e0820151614f20830152613ac0820151614f408301528260016040614f0085016060614f00870160075afa14169250614e80820151614f60830152614ea0820151614f80830152614f00820151614fa0830152614f20820151614fc08301528260016040614f6085016080614f60870160065afa14169250610100820151614fe0830152610120820151615000830152613ce08201516150208301528260016040614fe085016060614fe0870160075afa14169250614f60820151615040830152614f80820151615060830152614fe08201516150808301526150008201516150a0830152826001604061504085016080615040870160065afa141692506103208201516150c08301526103408201516150e0830152613d0082015161510083015282600160406150c0850160606150c0870160075afa141692506150408201516151208301526150608201516151408301526150c08201516151608301526150e0820151615180830152826001604061512085016080615120870160065afa141692506103608201516151a08301526103808201516151c0830152613d208201516151e083015282600160406151a0850160606151a0870160075afa141692506151208201516152008301526151408201516152208301526151a08201516152408301526151c0820151615260830152826001604061520085016080615200870160065afa141692506102e08201516152808301526103008201516152a0830152613e208201516152c0830152826001604061528085016060615280870160075afa141692506152008201516152e08301526152208201516153008301526152808201516153208301526152a082015161534083015282600160406152e0850160806152e0870160065afa141692506101a08201516153608301526101c0820151615380830152613f208201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa141692506101e0820151615440830152610200820151615460830152614b20820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692507f2f76bb5b87a6969c4ebb851bb10df173a462316bec33392c426c2f2b3a23f18b6155208301527f1128e4c8af582c69c209db87ec18fa85466ea71b7198f6d8c79083103261fec3615540830152614b40820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f133492493eb62499c1ba03a8715f8d07e78490f157ef603bdfbafb396a1bdcbf6156008301527f079b0b5d58e739eea6bdfe4092e232bacee0d027bd0f5186c22977bfd24620d7615620830152614b60820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f187bddea7dbe1c5acd2e01afadc1c0df38180c00ab7439352151b7e801502a0b6156e08301527f0fc2689a279dba9a368a34988064e5dc4f1cd3f2598bd2a6949e1b1a02d10b76615700830152614b8082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f16fbd0af4b59dc890346304d35c999dd8dfad3a06ad8a10f474527fad9ea9c326157c08301527f2ab015bc2b8a19b48338928187638174065562d0a5a83b008546a9e6612ec6c46157e0830152614ba082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f1dcfb31490b59327642f4b9392465bd8824f732a9e94e46b0bad32b5706087af6158a08301527f16b484290b48dce843c6bab1e64e7f45eb424bb17ce605fbcea4650fb021f6006158c0830152614bc08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f1eeb3f7b26d5c9871bc2c16a4ed5056dbe613a4bad07a1865e94b5a3f1f468426159808301527f2226ac7577fc6b41920682f07383ed12ef175ee617888551e764434eda30a02e6159a0830152614be08201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f26e3fbd5c5a66607cd8371419cac48be464539f883f1edfaca3c6bf8507a7410615a608301527f08f6e991d52b47307f2f83f267b41f3f3310fa21831988da7ab39054fe2ac53b615a80830152614c00820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f1654ed6ee24ad6ebd5c4c2dc0febbb2e92d556bb946f336c7cc1566170f64cdd615b408301527f2e60765d74d1d5c043e2299c4e457312b1358f4e51cdea038ec00ef453f20a09615b60830152614c20820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f23a0c541643962fd3751f386670057a24c2a2966d6f975b8474b1df1df58aec5615c208301527f12adacf7628483c9dd1d014cb00243aa716100680f195d25d59bc85ee7fdf202615c40830152614c40820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f19780ae2901b7f5ddedf94c1b53b504977a5181f39a0502c6e86b8378203f22e615d008301527f1f5f311a3d179380fe7cd9e6d14150dc860629541bb2c8f88110e31de91c7bfa615d20830152614c60820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f021fa11f2c822b49466f473bc750e172be66ff9df35bc5a393cee59294f42b98615de08301527f2281445678651a0a05ccdbea47bde6e7a6c82e43de0a52a5414fe82995229130615e00830152614c80820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0e67f06b3cd6ad600c3a3b705d3d178c2ea4afa419a60ff56b42774a44f2c151615ec08301527f1cc0dd45b27e99dcba7e4c721c4255ebde7a5b3aea6279859073398d6bf3ba1d615ee0830152614ca0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f279c16cd7feb17ed6cfe4ce27f00473872b340ebcae3dfe2c6d8aa97d9602273615fa08301527f0aaffc872c798473df012c13c5185eb7cca39ba51cbf0358a7f5b7903fbde64d615fc0830152614cc0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f1b711abfd5ca379b0c7a059a3c0a23f8aa6d033158b9bcb922f191cd11a374db6160808301527f2293e4350f716a42b09abf2696b53647b98656e217dfc39071b2207cb348c4946160a0830152614ce08201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa14169250610440820151616160830152610460820151616180830152614d008201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692506104808201516162408301526104a0820151616260830152614d20820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692506104c08201516163208301526104e0820151616340830152614d40820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa14169250610500820151616400830152610520820151616420830152614d60820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506105408201516164e0830152610560820151616500830152614d8082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506103a08201516165c08301526103c08201516165e0830152614da082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa14169250610ac08201516166a0830152610ae08201516166c0830152614de082015181036166e08301525081600160406166a0840160606166a0860160075afa141691506166208101516167008201526166408101516167208201526166a08101516167408201526166c0810151616760820152816001604061670084016080616700860160065afa14169150610b60810151616780820152610b808101516167a0820152614e008101516167c0820152816001604061678084016060616780860160075afa141691506167008101516167e08201526167208101516168008201526167808101516168208201526167a081015161684082015281600160406167e0840160806167e0860160065afa141691506167e08101516168608201526168008101516168808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26168a08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6168c08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6168e08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa616900820152610b60810151616920820152610b808101516169408201527f2bda3e3f6913dbd628d5cb2e235040d9902e3f5cd9b5f5669ed765984db32b556169608201527f14f987df3f0b40848192c76a191314d67fb1f2618fba33e163e28ce9e895ab806169808201527f2b11a57fe3e865318a9cba27a410871987a176b7746acccc7aa6c59c47c9c07b6169a08201527f071173db1791499cdfe9b9ca8a89c405cdf9a28e622dc3417b7d3c70882d034f6169c082015281600160206168608401610180616860860160085afa61686093909301516001149214161691505092915050565b604051806169c0016040528061034e906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5d57614e5d614e1e565b604052919050565b600082601f830112614e7657600080fd5b813567ffffffffffffffff811115614e9057614e90614e1e565b614ea3601f8201601f1916602001614e34565b818152846020838601011115614eb857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614ee857600080fd5b823567ffffffffffffffff80821115614f0057600080fd5b818501915085601f830112614f1457600080fd5b8135602082821115614f2857614f28614e1e565b8160051b614f37828201614e34565b928352848101820192828101908a851115614f5157600080fd5b958301955b84871015614f6f57863582529583019590830190614f56565b9750505086013592505080821115614f8657600080fd5b50614f9385828601614e65565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220fad36e747e649649da58b272be689e94c0e196a8172956777013195f5895998764736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/SolvencyVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50615012806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004614ed4565b610057565b604051901515815260200160405180910390f35b60006001610063614dfd565b600080516020614fbd8339815191526100d9565b600080516020614f9d8339815191528083108183101690838009600080516020614f9d833981519152838409600080516020614f9d8339815191528482099050600080516020614f9d8339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301527eae99b137916ff4220b0da7179a4601301c82346fc665cd3369a54e1f02d4ea6000830152602085015180608084015260408601518060a0850152846101438284610077565b169450505060608501518060c084015260808601518060e0850152846101698284610077565b169450505060a08501518061010084015260c086015180610120850152846101918284610077565b16945050506101406000830120610140830152610140820151818106610160840152806101808401525060e0850151806101a0840152610100860151806101c0850152846101df8284610077565b1694505050610120850151806101e084015261014086015180610200850152846102098284610077565b60a061018087012061022087018190528581066102408801526102608701521694506001915050610280830153602161026083012061028083018190528181066102a08401526102c08301526101608501516102e0830181905261018086015161030084018190528461027c8284610077565b16945050506101a0850151806103208401526101c086015180610340850152846102a68284610077565b16945050506101e08501518061036084015261020086015180610380850152846102d08284610077565b1694505050610220850151806103a0840152610240860151806103c0850152846102fa8284610077565b16945050506101206102c08301206103e08301526103e0820151818106610400840152806104208401525061026085015180610440840152610280860151806104608501528461034a8284610077565b16945050506102a0850151806104808401526102c0860151806104a0850152846103748284610077565b16945050506102e0850151806104c0840152610300860151806104e08501528461039e8284610077565b16945050506103208501518061050084015261034086015180610520850152846103c88284610077565b16945050506103608501518061054084015261038086015180610560850152846103f28284610077565b16945050506101606104208301206105808301526105808201518181066105a0840152806105c084015250806103a0860151066105e0830152806103c086015106610600830152806103e08601510661062083015280610400860151066106408301528061042086015106610660830152806104408601510661068083015280610460860151066106a083015280610480860151066106c0830152806104a0860151066106e0830152806104c086015106610700830152806104e08601510661072083015280610500860151066107408301528061052086015106610760830152806105408601510661078083015280610560860151066107a083015280610580860151066107c0830152806105a0860151066107e0830152806105c086015106610800830152806105e08601510661082083015280610600860151066108408301528061062086015106610860830152806106408601510661088083015280610660860151066108a083015280610680860151066108c0830152806106a0860151066108e0830152806106c086015106610900830152806106e08601510661092083015280610700860151066109408301528061072086015106610960830152806107408601510661098083015280610760860151066109a083015280610780860151066109c0830152806107a0860151066109e08301526104406105c0830120610a00830152610a00820151818106610a2084015280610a40840152506001610a608301536021610a40830120610a608301819052818106610a80840152610aa08301526107c0850151610ac083018190526107e0860151610ae084018190528461065f8284610077565b16945050506060610aa0830120610b00830152610b00820151818106610b2084015280610b408401525061080085015180610b6084015261082086015180610b80850152846106ae8284610077565b1694505050806105a08301516105a084015109610ba0830181905281908009610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610cc084015108610ce0830152807f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001610ce084015109610d00830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb26610d0084015109610d20830152807f1a6cb0b91da01e6d7a1e7d76eeef7de63954cd24b5a8c2b95ad8712f455b04db6105a084015108610d40830152807f03b743d74fd9ddb41f920179ac30e04b0ebd93e580b9c0b50061087904110bd4610d0084015109610d60830152807f2cad0a9b9157c27598be443cd550781219765462f8ffafdc4380ed1aebeef42d6105a084015108610d80830152807f1f4d7180df5014849825f3c9b0e89d79432c51f48eb5846ae63b433f28aba10b610d0084015109610da0830152807f1116dcf201e18ba5202a51ecd098bae3e5079653eb03ec265da6b254c7545ef66105a084015108610dc0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d0084015109610de0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105a084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d0084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105a084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d0084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105a084015108610e80830152806001610d0084015109610ea0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a084015108610ec0830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d0084015109610ee0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105a084015108610f00830152807f0dd30b9ad8c173555d2a33029bc807ac165b61281e9054a173af7ff4e4fc88fc610d0084015109610f20830152807f229142d808702cd45b2612b3e5b950b111d887205b291befd032759f0b0377056105a084015108610f40830152610d408201518181610d8085015109905080610f608401528181610dc085015109905080610f808401528181610e0085015109905080610fa08401528181610e4085015109905080610fc08401528181610e8085015109905080610fe08401528181610ec0850151099050806110008401528181610f00850151099050806110208401528181610f40850151099050806110408401528181610ce0850151099050806110608401525060206110a083015260206110c083015260206110e08301526110608201516111008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff611120830152600080516020614fbd8339815191526111408301528260016020611080850160c06110a0870160055afa141692506110808201516000610ce08401519050828261104086015109610ce0850152828282099150610f408401519050828261102086015109610f40850152828282099150610f008401519050828261100086015109610f00850152828282099150610ec084015190508282610fe086015109610ec0850152828282099150610e8084015190508282610fc086015109610e80850152828282099150610e4084015190508282610fa086015109610e40850152828282099150610e0084015190508282610f8086015109610e00850152828282099150610dc084015190508282610f6086015109610dc0850152828282099150610d8084015190508282610d4086015109610d8085015282828209610d408501819052610d208501518493509091500961116083015280610d80830151610d608401510961118083015280610dc0830151610da0840151096111a083015280610e00830151610de0840151096111c083015280610e40830151610e20840151096111e083015280610e80830151610e608401510961120083015280610ec0830151610ea08401510961122083015280610f00830151610ee08401510961124083015280610f40830151610f20840151096112608301528060208301516112208401510981818360408601516112408701510908905081818360608601516112608701510908611280840152506107208201516105e0830151829190086112a08301819052819080096112c08301819052819080096112e0830152806112e08301516112a084015109611300830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561130084015109611320830152806107408301516106008401510861134083018190528190800961136083018190528190800961138083015280611380830151611340840151096113a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86113a0840151096113c0830152806113c0830151611320840151086113e08301528061062083015182036113e08401510861140083018190526107a08301518291096114208301528061142083015161040084015109611440830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961130084015109611460830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113a08401510961148083015280611480830151611460840151086114a08301528061064083015182036114a0840151086114c083018190526107a08301518291096114e0830152806114e08301516114408401510861150083015280611500830151610400840151096115208301528061066083015182036113008401510861154083018190526107c0830151829109611560830152806115608301516115208401510861158083015280611580830151610400840151096115a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610660840151096115c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611340840151096115e0830152806115e08301516115c08401510861160083018190526106e08301518291086116208301819052819080096116408301819052819080096116608301528061166083015161162084015109611680830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610620840151096116a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610640840151096116c0830152806116c08301516116a0840151086116e0830152806116e083015182036116808401510861170083018190526107c0830151829109611720830152806117208301516115a0840151086117408301528061174083015161040084015109611760830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961066084015109611780830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611340840151096117a0830152806117a0830151611780840151086117c083018190526107008301518291086117e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261062084015109611800830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106408401510961182083015280611820830151611800840151086118408301528061184083015182036117e08401510861186083018190526107c083015182910961188083015280611880830151611760840151086118a0830152806118a0830151610400840151096118c08301528061078083015182036001086118e0830181905261078083015182910961190083015280610780830151820360020861192083018190526119008301518291096119408301528061078083015182036003086119608301819052611940830151829109611980830152806105e08301516106a0840151086119a08301528061062083015182036119a0840151086119c083018190526119808301518291096119e0830152806119e08301516118c084015108611a0083015280611a0083015161040084015109611a2083015280610640830151820361068084015108611a408301819052611980830151829109611a6083015280611a60830151611a2084015108611a8083015280611a8083015161040084015109611aa08301528061078083015161192084015109611ac083015280611ac083015161196084015109611ae0830152806107808301518203600408611b008301819052611ae0830151829109611b2083015280611b2083015161066084015109611b40830152806106608301518203600108611b608301819052611b40830151829109611b8083015280611b80830151611aa084015108611ba083015280611ba083015161040084015109611bc083015280610660830151600209611be0830152806105e0830151820361060084015108611c008301819052611be0830151829109611c20830152806105e0830151820361062084015108611c4083015280611c408301518203611c2084015108611c6083015280610640830151820361060084015108611c8083015280611c808301518203611c6084015108611ca08301819052611b20830151829109611cc083015280611cc0830151611bc084015108611ce083015280611ce083015161040084015109611d008301528061190083015161196084015109611d2083015280611d20830151611b0084015109611d40830152806106008301516105e084015108611d60830152806106608301518203611d6084015108611d808301819052611d40830151829109611da083015280611da0830151611d0084015108611dc083015280611dc083015161040084015109611de08301819052611da0830151829108611e0083015280611e0083015161040084015109611e2083015280611940830151611b0084015109611e408301528061060083015182036105e084015108611e6083015280600160701b611e6084015108611e80830152806106608301518203611e8084015108611ea08301819052611e40830151829109611ec083015280611ec0830151611e2084015108611ee083015280611ee083015161040084015109611f00830152806108c08301518203600108611f208301819052611220830151829109611f4083015280611f40830151611f0084015108611f6083015280611f6083015161040084015109611f8083015261092082015181908009611fa0830152806109208301518203611fa084015108611fc08301819052611160830151829109611fe083015280611fe0830151611f80840151086120008301528061200083015161040084015109612020830152806109008301518203610920840151086120408301819052611220830151829109612060830152806120608301516120208401510861208083015280612080830151610400840151096120a08301528061116083015182036001086120c0830152806111a0830151611180840151086120e083018190526111c083015182910861210083018190526111e083015182910861212083018190526112008301518291086121408301528061214083015182036120c0840151086121608301528061024083015161080084015109612180830152806121808301516106e0840151086121a083018190526102a08301518291086121c083015280610240830151610820840151096121e0830152806121e08301516105e08401510861220083018190526102a083015182910861222083018190526121c08301518291096122408301528061024083015161084084015109612260830152806122608301516106008401510861228083018190526102a08301518291086122a083018190526122408301518291096122c083015280610240830151610860840151096122e0830152806122e08301516107008401510861230083018190526102a083015182910861232083018190526122c083015182910961234083018190526108e083015182910961236083015280610240830151600109612380830152806123808301516105a0840151096123a0830152806123a08301516106e0840151086123c083018190526102a08301518291086123e0830152806102408301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a209612400830152806124008301516105a084015109612420830152806124208301516105e08401510861244083018190526102a083015182910861246083018190526123e0830151829109612480830152806102408301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096124a0830152806124a08301516105a0840151096124c0830152806124c0830151610600840151086124e083018190526102a08301518291086125008301819052612480830151829109612520830152806102408301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612540830152806125408301516105a084015109612560830152806125608301516107008401510861258083018190526102a08301518291086125a083018190526125208301518291096125c083018190526108c08301518291096125e0830152806125e08301518203612360840151086126008301819052612160830151829109612620830152806126208301516120a0840151086126408301528061264083015161040084015109612660830152806102408301516108808401510961268083015280612680830151610660840151086126a083018190526102a08301518291086126c0830152806102408301516108a0840151096126e0830152806126e08301516112808401510861270083018190526102a083015182910861272083018190526126c08301518291096127408301819052610940830151829109612760830152806102408301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612780830152806127808301516105a0840151096127a0830152806127a0830151610660840151086127c083018190526102a08301518291086127e0830152806102408301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612800830152806128008301516105a084015109612820830152806128208301516112808401510861284083018190526102a083015182910861286083018190526127e083015182910961288083018190526109208301518291096128a0830152806128a08301518203612760840151086128c083018190526121608301518291096128e0830152806128e08301516126608401510861290083015280612900830151610400840151096129208301528061096083015182036001086129408301819052611220830151829109612960830152806129608301516129208401510861298083015280612980830151610400840151096129a0830152610960820151819080096129c08301528061096083015182036129c0840151086129e08301819052611160830151829109612a0083015280612a008301516129a084015108612a2083015280612a2083015161040084015109612a40830152806102408301516109a084015108612a608301819052610980830151829109612a80830152806102a08301516109e084015108612aa08301819052612a80830151829109612ac0830152806106c083015161010009612ae083015280612ae0830151820361066084015108612b008301819052610760830151829109612b208301819052610240830151829108612b408301819052610960830151829109612b60830152806102a083015161072084015108612b808301819052612b60830151829109612ba083015280612ba08301518203612ac084015108612bc08301819052612160830151829109612be083015280612be0830151612a4084015108612c0083015280612c0083015161040084015109612c20830152806109e083015182036109a084015108612c408301819052611220830151829109612c6083015280612c60830151612c2084015108612c8083015280612c8083015161040084015109612ca083015280612160830151612c4084015109612cc0830152806109c083015182036109a084015108612ce08301819052612cc0830151829109612d0083015280612d00830151612ca084015108612d20830152610cc082015181908009612d408301819052610cc0830151829109612d608301819052610cc0830151829109612d808301819052610cc0830151829109612da083015280610cc0830151600109612dc083015280612d40830151600109612de083015280612d60830151600109612e0083015280612d80830151600109612e2083015280610ce0830151612d2084015109612e40830152806105a0830151610ba084015109612e608301528060016105a084015109612e8083015280612e808301518203610b2084015108612ea0830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e36105a084015109612ec083015280612ec08301518203610b2084015108612ee0830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb266105a084015109612f0083015280612f008301518203610b2084015108612f20830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d6105a084015109612f4083015280612f408301518203610b2084015108612f6083015280817f2b0bd16731aaf34928c0661ba43310fbbf44baa457b980ce19affba7315792a4610ba085015109610b2084015109818183847f05587d0baf86ace08f8fdf9add4e476168ef2da421ffefc32a31f9ecbea86d5d610ba0880151096105a08701510908905080612f808401525080817f1e42214ea9b2db33296ba55096815a0a6d468af715ccfa9fab93b1e3701b7f62610ba085015109610b2084015109818183847f1648cc055b11af4e0f62923d9627e377b1d413c0864af4963a826fcc6a0231fa610ba0880151096105a08701510908905080612fa08401525080817f2960d84a95d8f00f740a3d1478feb6d4b196e34bf86b62b75041b14b389d49ce610ba085015109610b2084015109818183847f21fe615ace99028841c84393e39435ea26675e494fd4886263e6fedd3cba1f16610ba0880151096105a08701510908612fc084015250612ea08201518190600109612fe08301819052612f608301518291096130008301819052612ee083015182910961302083015280817f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44856105a085015109610b2084015109818183847f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a0880151096105a087015109089050806130408401525080817f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a085015109610b2084015109818183847f1d05f683f7bacf55bccd495a5703cb329ada890af08ac0d24959599e24c832816105a0880151096105a087015109089050806130608401525080817f23af40e47e2f59a03809484a29d5e3afbf105f1fa100de8be21295a92fa75534610ba085015109610b2084015109818183847f0cb50d8e630246898046fd6c57ab74ad69238928d8b8920561cf5feac058aacd610ba0880151096105a087015109089050806130808401525080817f259eb1d15d2e74dc1a22c32210de87566d7ae67bcc859ce1e33117e171cbbcd2610ba085015109610b2084015109818183847f0705f7901a0ba3736dff0830a813cdc7350ce79c852ba2d86353d0ff84d80bb5610ba0880151096105a087015109089050806130a08401525080817f2a6bbeb56332f220c30fcaac737fd885c3596480f0ca2ff07d2733561911b7bd610ba085015109610b2084015109818183847f26a0f84d76444b5e0a60f8966cc6c88c09cf0713bd044ba9fe6c9b2e8b6263b7610ba0880151096105a087015109086130c084015250612f20820151613000830151829190096130e083015280817f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1f6105a085015109610b2084015109818183847f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a0880151096105a087015109089050806131008401525080817f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a085015109610b2084015109818183847f017829d43aa3529ba5ed3f4879cd1c09ff9f06e716afb2bc6cc72847d12771ae6105a0880151096105a0870151090861312084015250612ee0820151612fe083015182919009613140830152806001610b20840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a0870151090861316084015250612f80820151612fa083015182908290099050806131808401528181612fc0850151099050806131a08401528181613040850151099050806131c08401528181613060850151099050806131e084015281816130008501510990508061320084015281816130808501510990508061322084015281816130a08501510990508061324084015281816130c08501510990508061326084015281816130e0850151099050806132808401528181613100850151099050806132a08401528181613120850151099050806132c08401528181613140850151099050806132e08401528181613160850151099050806133008401528181612fe085015109905080613320840152506020613360830152602061338083015260206133a08301526133208201516133c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6133e0830152600080516020614fbd8339815191526134008301528260016020613340850160c0613360870160055afa141692506133408201516000612fe08401519050828261330086015109612fe0850152828282099150613160840151905082826132e086015109613160850152828282099150613140840151905082826132c086015109613140850152828282099150613120840151905082826132a08601510961312085015282828209915061310084015190508282613280860151096131008501528282820991506130e084015190508282613260860151096130e08501528282820991506130c084015190508282613240860151096130c08501528282820991506130a084015190508282613220860151096130a08501528282820991506130808401519050828261320086015109613080850152828282099150613000840151905082826131e086015109613000850152828282099150613060840151905082826131c086015109613060850152828282099150613040840151905082826131a086015109613040850152828282099150612fc08401519050828261318086015109612fc0850152828282099150612fa084015190508282612f8086015109612fa085015282828209612f808501819052612fa085015190925083915082900890508181612fc0850151086134208401525061300082015161302083015182919009613440830152613040820151818161306085015108613460840152506130e08201516130208301518291900961348083015261308082015181816130a085015108905081816130c0850151086134a084015250613140820151613020830151829190096134c08301526131008201518181613120850151086134e084015250612fe082015161302083015182919009613500830152613160820151806135208401525061342082015181816134608501510990508061354084015281816134a08501510990508061356084015281816134e0850151099050806135808401528181613520850151099050806135a08401525060206135e0830152602061360083015260206136208301526135a08201516136408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff613660830152600080516020614fbd83398151915261368083015282600160206135c0850160c06135e0870160055afa141692506135c0820151600061352084015190508282613580860151096135208501528282820991506134e084015190508282613560860151096134e08501528282820991506134a084015190508282613540860151096134a08501528282820991506134608401519050828261342086015109613460850152828282096134208501525050613460820151613440830151829190096136a0830152806134a0830151613480840151096136c0830152806134e08301516134c0840151096136e08301528061352083015161350084015109613700830152610a20820151819080096137208301819052610a208301518291096137408301819052610a208301518291096137608301819052610a208301518291096137808301819052610a208301518291096137a08301819052610a208301518291096137c08301819052610a208301518291096137e08301819052610a208301518291096138008301819052610a208301518291096138208301819052610a208301518291096138408301819052610a208301518291096138608301819052610a208301518291096138808301819052610a208301518291096138a08301819052610a208301518291096138c08301819052610a208301518291096138e08301819052610a20830151829109613900830152610a80820151819080096139208301819052610a808301518291096139408301819052610a808301518291096139608301819052610a8083015182910961398083015280612f808301516105e084015109818183612fa086015161062087015109089050818183612fc08601516106a087015109086139a0840181905261342084015183925090096139c08301528060016139c08401518303096139e083015280612f8083015161060084015109818183612fa086015161064087015109089050818183612fc08601516106808701510908613a0084018190526134208401518392509009613a208301819052610a208301518291820309613a4083015280610a20830151600109613a6083015280613a408301516139e084015108613a80830152806001613a8084015109613aa0830152806001613a6084015109613ac083015280613440830151600109613ae083015280613040830151610660840151098181836130608601516106c08701510908613b0084018190526136a08401518392509009613b20830152806001613b20840151830309613b40830152806001613ae084015109613b6083015280613040830151610920840151098181836130608601516109408701510908613b8084018190526136a08401518392509009613ba08301819052610a208301518291820309613bc083015280610a20830151613ae084015109613be083015280613bc0830151613b4084015108613c0083015280613040830151610960840151098181836130608601516109808701510908613c2084018190526136a08401518392509009613c4083018190526137208301518291820309613c6083015280613720830151613ae084015109613c8083015280613c60830151613c0084015108613ca08301819052610a80830151829109613cc083015280610a80830151613b6084015109613ce083015280610a80830151613be084015109613d0083015280610a80830151613c8084015109613d2083015280613cc0830151613aa084015108613d4083015280613480830151600109613d60830152806130808301516108c0840151098181836130a08601516108e0870151090890508181836130c08601516109008701510908613d8084018190526136c08401518392509009613da0830152806001613da0840151830309613dc0830152806001613d6084015109613de083015280613920830151613dc084015109613e0083015280613920830151613de084015109613e2083015280613e00830151613d4084015108613e40830152806134c0830151600109613e60830152806131008301516109a0840151098181836131208601516109c08701510908613e8084018190526136e08401518392509009613ea0830152806001613ea0840151830309613ec0830152806001613e6084015109613ee083015280613940830151613ec084015109613f0083015280613940830151613ee084015109613f2083015280613f00830151613e4084015108613f4083015280613500830151600109613f60830152806131608301516109e084015109613f808301819052613700830151829109613fa0830152806001613fa0840151830309613fc0830152806001613f6084015109613fe0830152806131608301516106e08401510961400083018190526137008301518291096140208301819052610a20830151829182030961404083015280610a20830151613f608401510961406083015280614040830151613fc08401510861408083015280613160830151610700840151096140a083018190526137008301518291096140c0830181905261372083015182918203096140e083015280613720830151613f6084015109614100830152806140e083015161408084015108614120830152806131608301516107208401510961414083018190526137008301518291096141608301819052613740830151829182030961418083015280613740830151613f60840151096141a083015280614180830151614120840151086141c083015280613160830151610740840151096141e083018190526137008301518291096142008301819052613760830151829182030961422083015280613760830151613f6084015109614240830152806142208301516141c084015108614260830152806131608301516107608401510961428083018190526137008301518291096142a0830181905261378083015182918203096142c083015280613780830151613f60840151096142e0830152806142c0830151614260840151086143008301528061316083015161078084015109614320830181905261370083015182910961434083018190526137a08301518291820309614360830152806137a0830151613f608401510961438083015280614360830151614300840151086143a0830152806131608301516107a0840151096143c083018190526137008301518291096143e083018190526137c08301518291820309614400830152806137c0830151613f6084015109614420830152806144008301516143a084015108614440830152806131608301516107c084015109614460830181905261370083015182910961448083018190526137e083015182918203096144a0830152806137e0830151613f60840151096144c0830152806144a0830151614440840151086144e0830152806131608301516108008401510961450083018190526137008301518291096145208301819052613800830151829182030961454083015280613800830151613f6084015109614560830152806145408301516144e08401510861458083015280613160830151610820840151096145a083018190526137008301518291096145c0830181905261382083015182918203096145e083015280613820830151613f6084015109614600830152806145e083015161458084015108614620830152806131608301516108408401510961464083018190526137008301518291096146608301819052613840830151829182030961468083015280613840830151613f60840151096146a083015280614680830151614620840151086146c083015280613160830151610860840151096146e083018190526137008301518291096147008301819052613860830151829182030961472083015280613860830151613f6084015109614740830152806147208301516146c084015108614760830152806131608301516108808401510961478083018190526137008301518291096147a0830181905261388083015182918203096147c083015280613880830151613f60840151096147e0830152806147c083015161476084015108614800830152806131608301516108a084015109614820830181905261370083015182910961484083018190526138a08301518291820309614860830152806138a0830151613f608401510961488083015280614860830151614800840151086148a083015280613500830151612dc0840151096148c083015280613500830151612de0840151096148e083015280613500830151612e008401510961490083015280613500830151612e208401510961492083015280613160830151612e4084015109614940830181905261370083015182910961496083018190526138c08301518291820309614980830152806138c0830151613f60840151096149a0830152806138c08301516148c0840151096149c0830152806138c08301516148e0840151096149e0830152806138c083015161490084015109614a00830152806138c083015161492084015109614a20830152806149808301516148a084015108614a40830152806131608301516107e084015109614a608301819052613700830151829109614a8083018190526138e08301518291820309614aa0830152806138e0830151613f6084015109614ac083015280614aa0830151614a4084015108614ae08301819052613960830151829109614b0083015280613960830151613fe084015109614b208301528061396083015161406084015109614b408301528061396083015161410084015109614b60830152806139608301516141a084015109614b808301528061396083015161424084015109614ba0830152806139608301516142e084015109614bc08301528061396083015161438084015109614be08301528061396083015161442084015109614c00830152806139608301516144c084015109614c208301528061396083015161456084015109614c408301528061396083015161460084015109614c60830152806139608301516146a084015109614c808301528061396083015161474084015109614ca0830152806139608301516147e084015109614cc08301528061396083015161488084015109614ce0830152806139608301516149a084015109614d00830152806139608301516149c084015109614d20830152806139608301516149e084015109614d4083015280613960830151614a0084015109614d6083015280613960830151614a2084015109614d8083015280613960830151614ac084015109614da083015280614b00830151613f4084015108614dc083015280613020830151600109614de083015280610b20830151600109614e008301526001614e2083018181526002614e40850152614dc0840151614e6085015284919060409060608160075afa14169250614e20820151614e80830152614e40820151614ea08301526080820151614ec083015260a0820151614ee08301528260016040614e8085016080614e80870160065afa1416925060c0820151614f0083015260e0820151614f20830152613ac0820151614f408301528260016040614f0085016060614f00870160075afa14169250614e80820151614f60830152614ea0820151614f80830152614f00820151614fa0830152614f20820151614fc08301528260016040614f6085016080614f60870160065afa14169250610100820151614fe0830152610120820151615000830152613ce08201516150208301528260016040614fe085016060614fe0870160075afa14169250614f60820151615040830152614f80820151615060830152614fe08201516150808301526150008201516150a0830152826001604061504085016080615040870160065afa141692506103208201516150c08301526103408201516150e0830152613d0082015161510083015282600160406150c0850160606150c0870160075afa141692506150408201516151208301526150608201516151408301526150c08201516151608301526150e0820151615180830152826001604061512085016080615120870160065afa141692506103608201516151a08301526103808201516151c0830152613d208201516151e083015282600160406151a0850160606151a0870160075afa141692506151208201516152008301526151408201516152208301526151a08201516152408301526151c0820151615260830152826001604061520085016080615200870160065afa141692506102e08201516152808301526103008201516152a0830152613e208201516152c0830152826001604061528085016060615280870160075afa141692506152008201516152e08301526152208201516153008301526152808201516153208301526152a082015161534083015282600160406152e0850160806152e0870160065afa141692506101a08201516153608301526101c0820151615380830152613f208201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa141692506101e0820151615440830152610200820151615460830152614b20820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692507f0655d62979dc062dc1e8c15334bf17cf5c7e6352219c0bd0b0cc039598d9a6696155208301527f019589d3002f6a0ded46a69053f0c05e7a7ca45339b3d2bae85d00f26ac0f33e615540830152614b40820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f1eab999592385208b42a12dcc047763ee5cf12052eb4b0d9a7a286e043f3df9f6156008301527f18887eb3c646ffd4961226c91bac9661004798b1fc6a39c43f9a6d1d03767194615620830152614b60820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f076806058b02e1b5e99b2f2e8eee613194f8df73481659f5938baacd64e4d7b86156e08301527f05ae81644b244dceea5350a84a79cbf0a199bbd6c1fad9887423f8c8048e6039615700830152614b8082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f0438873fc00231ae527efcf74d9092f5059dfa05275cbe7381e948fe3b7b61d86157c08301527f03c0f314c93403792ba86ec3841b3080f2f7cd092c6bcb632cdbc2122a13cdef6157e0830152614ba082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f2b12b132a6261ad60249147599cae0d5b3547e510deabba65526d130f04f24026158a08301527f13e3c02ce00f6b7e00d5b099eda5f1155956ae83899a2d59cefcb00dad66a7f66158c0830152614bc08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f0ed83370277e0fd35e8258dd5630ce0ce3491fdf7e166d293745635b0cc4eba56159808301527f03994e7e77ad58072b78757700ab0b79247f2e462b0cf6a5a18b607414c095db6159a0830152614be08201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f23ba4bc49baab563e9d5bf07da231a4496d35b6bc782dbbd76135fe44c31cbcf615a608301527f28b88097e7edf1b2904f6c25c1e30ca0e38c74a52125b2995c4cf0a750683854615a80830152614c00820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f17dcbba0bbe2d24566de620998f62ff54ea5302ada6aeb18028b61b4dc19bbd3615b408301527f0e1f908007a5c2cc934426c26de7206c53fa10c79d63ef52ee91bfb568c72fbd615b60830152614c20820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f2c7823f99cb2adb716becb960914ffa1d6e2f257875fdd03c2bee52ef571d41e615c208301527f09ab83ebc6803e65b2e6831c8706d9a134f6b1cf6f6ec5c2697afee095320ee1615c40830152614c40820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f2dc12c205152bfacc354c838225571172c215e01a64de6a2ca6665c70937ac58615d008301527f0449eb529f0038a2bd2f6c0b6213a70488b69b479d90a953579e4c9d45621b85615d20830152614c60820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f09a2ab3913a4770fd50f6ba9ec4ce0b3178b54d7bfca5b42fe7e8e1ce5cf60a9615de08301527f13ec31f94026569c4bb76e2c4ceaa3e6525438ffb4a7a69cde61f6d77b93bad7615e00830152614c80820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974615ec08301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3615ee0830152614ca0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f02a9a77d8e6f6fd89f33ba56fe45f6f5c907e50ba28cdd4198acfb562eb21103615fa08301527f23abee68d83c2d6632576e5e95ca01a61e5e3e6d9438c2ac6428c8b6edfe2aba615fc0830152614cc0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2cf36d36bfacbe1a8d8c626aefa75ac0feb46b725989a8e6fabed074bf9f6af76160808301527f060fded3ed5ec56d9e0064d73c472245a4c4b6ec371e9808692bf7f259d3b7306160a0830152614ce08201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa14169250610440820151616160830152610460820151616180830152614d008201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692506104808201516162408301526104a0820151616260830152614d20820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692506104c08201516163208301526104e0820151616340830152614d40820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa14169250610500820151616400830152610520820151616420830152614d60820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506105408201516164e0830152610560820151616500830152614d8082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506103a08201516165c08301526103c08201516165e0830152614da082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa14169250610ac08201516166a0830152610ae08201516166c0830152614de082015181036166e08301525081600160406166a0840160606166a0860160075afa141691506166208101516167008201526166408101516167208201526166a08101516167408201526166c0810151616760820152816001604061670084016080616700860160065afa14169150610b60810151616780820152610b808101516167a0820152614e008101516167c0820152816001604061678084016060616780860160075afa141691506167008101516167e08201526167208101516168008201526167808101516168208201526167a081015161684082015281600160406167e0840160806167e0860160065afa141691506167e08101516168608201526168008101516168808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26168a08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6168c08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6168e08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa616900820152610b60810151616920820152610b808101516169408201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6169608201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6169808201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456169a08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff6169c082015281600160206168608401610180616860860160085afa61686093909301516001149214161691505092915050565b604051806169c0016040528061034e906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5c57614e5c614e1d565b604052919050565b600082601f830112614e7557600080fd5b813567ffffffffffffffff811115614e8f57614e8f614e1d565b614ea2601f8201601f1916602001614e33565b818152846020838601011115614eb757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614ee757600080fd5b823567ffffffffffffffff80821115614eff57600080fd5b818501915085601f830112614f1357600080fd5b8135602082821115614f2757614f27614e1d565b8160051b614f36828201614e33565b928352848101820192828101908a851115614f5057600080fd5b958301955b84871015614f6e57863582529583019590830190614f55565b9750505086013592505080821115614f8557600080fd5b50614f9285828601614e64565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220d4b2dc8798bab17b65a2e72c3cd13b07b4a58aae366a77784852333c75aa78b964736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004614ed4565b610057565b604051901515815260200160405180910390f35b60006001610063614dfd565b600080516020614fbd8339815191526100d9565b600080516020614f9d8339815191528083108183101690838009600080516020614f9d833981519152838409600080516020614f9d8339815191528482099050600080516020614f9d8339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301527eae99b137916ff4220b0da7179a4601301c82346fc665cd3369a54e1f02d4ea6000830152602085015180608084015260408601518060a0850152846101438284610077565b169450505060608501518060c084015260808601518060e0850152846101698284610077565b169450505060a08501518061010084015260c086015180610120850152846101918284610077565b16945050506101406000830120610140830152610140820151818106610160840152806101808401525060e0850151806101a0840152610100860151806101c0850152846101df8284610077565b1694505050610120850151806101e084015261014086015180610200850152846102098284610077565b60a061018087012061022087018190528581066102408801526102608701521694506001915050610280830153602161026083012061028083018190528181066102a08401526102c08301526101608501516102e0830181905261018086015161030084018190528461027c8284610077565b16945050506101a0850151806103208401526101c086015180610340850152846102a68284610077565b16945050506101e08501518061036084015261020086015180610380850152846102d08284610077565b1694505050610220850151806103a0840152610240860151806103c0850152846102fa8284610077565b16945050506101206102c08301206103e08301526103e0820151818106610400840152806104208401525061026085015180610440840152610280860151806104608501528461034a8284610077565b16945050506102a0850151806104808401526102c0860151806104a0850152846103748284610077565b16945050506102e0850151806104c0840152610300860151806104e08501528461039e8284610077565b16945050506103208501518061050084015261034086015180610520850152846103c88284610077565b16945050506103608501518061054084015261038086015180610560850152846103f28284610077565b16945050506101606104208301206105808301526105808201518181066105a0840152806105c084015250806103a0860151066105e0830152806103c086015106610600830152806103e08601510661062083015280610400860151066106408301528061042086015106610660830152806104408601510661068083015280610460860151066106a083015280610480860151066106c0830152806104a0860151066106e0830152806104c086015106610700830152806104e08601510661072083015280610500860151066107408301528061052086015106610760830152806105408601510661078083015280610560860151066107a083015280610580860151066107c0830152806105a0860151066107e0830152806105c086015106610800830152806105e08601510661082083015280610600860151066108408301528061062086015106610860830152806106408601510661088083015280610660860151066108a083015280610680860151066108c0830152806106a0860151066108e0830152806106c086015106610900830152806106e08601510661092083015280610700860151066109408301528061072086015106610960830152806107408601510661098083015280610760860151066109a083015280610780860151066109c0830152806107a0860151066109e08301526104406105c0830120610a00830152610a00820151818106610a2084015280610a40840152506001610a608301536021610a40830120610a608301819052818106610a80840152610aa08301526107c0850151610ac083018190526107e0860151610ae084018190528461065f8284610077565b16945050506060610aa0830120610b00830152610b00820151818106610b2084015280610b408401525061080085015180610b6084015261082086015180610b80850152846106ae8284610077565b1694505050806105a08301516105a084015109610ba0830181905281908009610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610cc084015108610ce0830152807f3058355f447953c1ade231a513e0f80710e9db4e679b02351f90fd168b040001610ce084015109610d00830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb26610d0084015109610d20830152807f1a6cb0b91da01e6d7a1e7d76eeef7de63954cd24b5a8c2b95ad8712f455b04db6105a084015108610d40830152807f03b743d74fd9ddb41f920179ac30e04b0ebd93e580b9c0b50061087904110bd4610d0084015109610d60830152807f2cad0a9b9157c27598be443cd550781219765462f8ffafdc4380ed1aebeef42d6105a084015108610d80830152807f1f4d7180df5014849825f3c9b0e89d79432c51f48eb5846ae63b433f28aba10b610d0084015109610da0830152807f1116dcf201e18ba5202a51ecd098bae3e5079653eb03ec265da6b254c7545ef66105a084015108610dc0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d0084015109610de0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105a084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d0084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105a084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d0084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105a084015108610e80830152806001610d0084015109610ea0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a084015108610ec0830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d0084015109610ee0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105a084015108610f00830152807f0dd30b9ad8c173555d2a33029bc807ac165b61281e9054a173af7ff4e4fc88fc610d0084015109610f20830152807f229142d808702cd45b2612b3e5b950b111d887205b291befd032759f0b0377056105a084015108610f40830152610d408201518181610d8085015109905080610f608401528181610dc085015109905080610f808401528181610e0085015109905080610fa08401528181610e4085015109905080610fc08401528181610e8085015109905080610fe08401528181610ec0850151099050806110008401528181610f00850151099050806110208401528181610f40850151099050806110408401528181610ce0850151099050806110608401525060206110a083015260206110c083015260206110e08301526110608201516111008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff611120830152600080516020614fbd8339815191526111408301528260016020611080850160c06110a0870160055afa141692506110808201516000610ce08401519050828261104086015109610ce0850152828282099150610f408401519050828261102086015109610f40850152828282099150610f008401519050828261100086015109610f00850152828282099150610ec084015190508282610fe086015109610ec0850152828282099150610e8084015190508282610fc086015109610e80850152828282099150610e4084015190508282610fa086015109610e40850152828282099150610e0084015190508282610f8086015109610e00850152828282099150610dc084015190508282610f6086015109610dc0850152828282099150610d8084015190508282610d4086015109610d8085015282828209610d408501819052610d208501518493509091500961116083015280610d80830151610d608401510961118083015280610dc0830151610da0840151096111a083015280610e00830151610de0840151096111c083015280610e40830151610e20840151096111e083015280610e80830151610e608401510961120083015280610ec0830151610ea08401510961122083015280610f00830151610ee08401510961124083015280610f40830151610f20840151096112608301528060208301516112208401510981818360408601516112408701510908905081818360608601516112608701510908611280840152506107208201516105e0830151829190086112a08301819052819080096112c08301819052819080096112e0830152806112e08301516112a084015109611300830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561130084015109611320830152806107408301516106008401510861134083018190528190800961136083018190528190800961138083015280611380830151611340840151096113a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86113a0840151096113c0830152806113c0830151611320840151086113e08301528061062083015182036113e08401510861140083018190526107a08301518291096114208301528061142083015161040084015109611440830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961130084015109611460830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113a08401510961148083015280611480830151611460840151086114a08301528061064083015182036114a0840151086114c083018190526107a08301518291096114e0830152806114e08301516114408401510861150083015280611500830151610400840151096115208301528061066083015182036113008401510861154083018190526107c0830151829109611560830152806115608301516115208401510861158083015280611580830151610400840151096115a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610660840151096115c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611340840151096115e0830152806115e08301516115c08401510861160083018190526106e08301518291086116208301819052819080096116408301819052819080096116608301528061166083015161162084015109611680830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610620840151096116a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610640840151096116c0830152806116c08301516116a0840151086116e0830152806116e083015182036116808401510861170083018190526107c0830151829109611720830152806117208301516115a0840151086117408301528061174083015161040084015109611760830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961066084015109611780830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611340840151096117a0830152806117a0830151611780840151086117c083018190526107008301518291086117e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261062084015109611800830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106408401510961182083015280611820830151611800840151086118408301528061184083015182036117e08401510861186083018190526107c083015182910961188083015280611880830151611760840151086118a0830152806118a0830151610400840151096118c08301528061078083015182036001086118e0830181905261078083015182910961190083015280610780830151820360020861192083018190526119008301518291096119408301528061078083015182036003086119608301819052611940830151829109611980830152806105e08301516106a0840151086119a08301528061062083015182036119a0840151086119c083018190526119808301518291096119e0830152806119e08301516118c084015108611a0083015280611a0083015161040084015109611a2083015280610640830151820361068084015108611a408301819052611980830151829109611a6083015280611a60830151611a2084015108611a8083015280611a8083015161040084015109611aa08301528061078083015161192084015109611ac083015280611ac083015161196084015109611ae0830152806107808301518203600408611b008301819052611ae0830151829109611b2083015280611b2083015161066084015109611b40830152806106608301518203600108611b608301819052611b40830151829109611b8083015280611b80830151611aa084015108611ba083015280611ba083015161040084015109611bc083015280610660830151600209611be0830152806105e0830151820361060084015108611c008301819052611be0830151829109611c20830152806105e0830151820361062084015108611c4083015280611c408301518203611c2084015108611c6083015280610640830151820361060084015108611c8083015280611c808301518203611c6084015108611ca08301819052611b20830151829109611cc083015280611cc0830151611bc084015108611ce083015280611ce083015161040084015109611d008301528061190083015161196084015109611d2083015280611d20830151611b0084015109611d40830152806106008301516105e084015108611d60830152806106608301518203611d6084015108611d808301819052611d40830151829109611da083015280611da0830151611d0084015108611dc083015280611dc083015161040084015109611de08301819052611da0830151829108611e0083015280611e0083015161040084015109611e2083015280611940830151611b0084015109611e408301528061060083015182036105e084015108611e6083015280600160701b611e6084015108611e80830152806106608301518203611e8084015108611ea08301819052611e40830151829109611ec083015280611ec0830151611e2084015108611ee083015280611ee083015161040084015109611f00830152806108c08301518203600108611f208301819052611220830151829109611f4083015280611f40830151611f0084015108611f6083015280611f6083015161040084015109611f8083015261092082015181908009611fa0830152806109208301518203611fa084015108611fc08301819052611160830151829109611fe083015280611fe0830151611f80840151086120008301528061200083015161040084015109612020830152806109008301518203610920840151086120408301819052611220830151829109612060830152806120608301516120208401510861208083015280612080830151610400840151096120a08301528061116083015182036001086120c0830152806111a0830151611180840151086120e083018190526111c083015182910861210083018190526111e083015182910861212083018190526112008301518291086121408301528061214083015182036120c0840151086121608301528061024083015161080084015109612180830152806121808301516106e0840151086121a083018190526102a08301518291086121c083015280610240830151610820840151096121e0830152806121e08301516105e08401510861220083018190526102a083015182910861222083018190526121c08301518291096122408301528061024083015161084084015109612260830152806122608301516106008401510861228083018190526102a08301518291086122a083018190526122408301518291096122c083015280610240830151610860840151096122e0830152806122e08301516107008401510861230083018190526102a083015182910861232083018190526122c083015182910961234083018190526108e083015182910961236083015280610240830151600109612380830152806123808301516105a0840151096123a0830152806123a08301516106e0840151086123c083018190526102a08301518291086123e0830152806102408301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a209612400830152806124008301516105a084015109612420830152806124208301516105e08401510861244083018190526102a083015182910861246083018190526123e0830151829109612480830152806102408301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096124a0830152806124a08301516105a0840151096124c0830152806124c0830151610600840151086124e083018190526102a08301518291086125008301819052612480830151829109612520830152806102408301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612540830152806125408301516105a084015109612560830152806125608301516107008401510861258083018190526102a08301518291086125a083018190526125208301518291096125c083018190526108c08301518291096125e0830152806125e08301518203612360840151086126008301819052612160830151829109612620830152806126208301516120a0840151086126408301528061264083015161040084015109612660830152806102408301516108808401510961268083015280612680830151610660840151086126a083018190526102a08301518291086126c0830152806102408301516108a0840151096126e0830152806126e08301516112808401510861270083018190526102a083015182910861272083018190526126c08301518291096127408301819052610940830151829109612760830152806102408301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612780830152806127808301516105a0840151096127a0830152806127a0830151610660840151086127c083018190526102a08301518291086127e0830152806102408301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612800830152806128008301516105a084015109612820830152806128208301516112808401510861284083018190526102a083015182910861286083018190526127e083015182910961288083018190526109208301518291096128a0830152806128a08301518203612760840151086128c083018190526121608301518291096128e0830152806128e08301516126608401510861290083015280612900830151610400840151096129208301528061096083015182036001086129408301819052611220830151829109612960830152806129608301516129208401510861298083015280612980830151610400840151096129a0830152610960820151819080096129c08301528061096083015182036129c0840151086129e08301819052611160830151829109612a0083015280612a008301516129a084015108612a2083015280612a2083015161040084015109612a40830152806102408301516109a084015108612a608301819052610980830151829109612a80830152806102a08301516109e084015108612aa08301819052612a80830151829109612ac0830152806106c083015161010009612ae083015280612ae0830151820361066084015108612b008301819052610760830151829109612b208301819052610240830151829108612b408301819052610960830151829109612b60830152806102a083015161072084015108612b808301819052612b60830151829109612ba083015280612ba08301518203612ac084015108612bc08301819052612160830151829109612be083015280612be0830151612a4084015108612c0083015280612c0083015161040084015109612c20830152806109e083015182036109a084015108612c408301819052611220830151829109612c6083015280612c60830151612c2084015108612c8083015280612c8083015161040084015109612ca083015280612160830151612c4084015109612cc0830152806109c083015182036109a084015108612ce08301819052612cc0830151829109612d0083015280612d00830151612ca084015108612d20830152610cc082015181908009612d408301819052610cc0830151829109612d608301819052610cc0830151829109612d808301819052610cc0830151829109612da083015280610cc0830151600109612dc083015280612d40830151600109612de083015280612d60830151600109612e0083015280612d80830151600109612e2083015280610ce0830151612d2084015109612e40830152806105a0830151610ba084015109612e608301528060016105a084015109612e8083015280612e808301518203610b2084015108612ea0830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e36105a084015109612ec083015280612ec08301518203610b2084015108612ee0830152807f15f79db9c39181bc3e31c83f9291da76eedf1b23c410add7e9098464aaa4fb266105a084015109612f0083015280612f008301518203610b2084015108612f20830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d6105a084015109612f4083015280612f408301518203610b2084015108612f6083015280817f2b0bd16731aaf34928c0661ba43310fbbf44baa457b980ce19affba7315792a4610ba085015109610b2084015109818183847f05587d0baf86ace08f8fdf9add4e476168ef2da421ffefc32a31f9ecbea86d5d610ba0880151096105a08701510908905080612f808401525080817f1e42214ea9b2db33296ba55096815a0a6d468af715ccfa9fab93b1e3701b7f62610ba085015109610b2084015109818183847f1648cc055b11af4e0f62923d9627e377b1d413c0864af4963a826fcc6a0231fa610ba0880151096105a08701510908905080612fa08401525080817f2960d84a95d8f00f740a3d1478feb6d4b196e34bf86b62b75041b14b389d49ce610ba085015109610b2084015109818183847f21fe615ace99028841c84393e39435ea26675e494fd4886263e6fedd3cba1f16610ba0880151096105a08701510908612fc084015250612ea08201518190600109612fe08301819052612f608301518291096130008301819052612ee083015182910961302083015280817f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44856105a085015109610b2084015109818183847f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a0880151096105a087015109089050806130408401525080817f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7c6105a085015109610b2084015109818183847f1d05f683f7bacf55bccd495a5703cb329ada890af08ac0d24959599e24c832816105a0880151096105a087015109089050806130608401525080817f23af40e47e2f59a03809484a29d5e3afbf105f1fa100de8be21295a92fa75534610ba085015109610b2084015109818183847f0cb50d8e630246898046fd6c57ab74ad69238928d8b8920561cf5feac058aacd610ba0880151096105a087015109089050806130808401525080817f259eb1d15d2e74dc1a22c32210de87566d7ae67bcc859ce1e33117e171cbbcd2610ba085015109610b2084015109818183847f0705f7901a0ba3736dff0830a813cdc7350ce79c852ba2d86353d0ff84d80bb5610ba0880151096105a087015109089050806130a08401525080817f2a6bbeb56332f220c30fcaac737fd885c3596480f0ca2ff07d2733561911b7bd610ba085015109610b2084015109818183847f26a0f84d76444b5e0a60f8966cc6c88c09cf0713bd044ba9fe6c9b2e8b6263b7610ba0880151096105a087015109086130c084015250612f20820151613000830151829190096130e083015280817f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1f6105a085015109610b2084015109818183847f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a0880151096105a087015109089050806131008401525080817f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e26105a085015109610b2084015109818183847f017829d43aa3529ba5ed3f4879cd1c09ff9f06e716afb2bc6cc72847d12771ae6105a0880151096105a0870151090861312084015250612ee0820151612fe083015182919009613140830152806001610b20840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105a0870151090861316084015250612f80820151612fa083015182908290099050806131808401528181612fc0850151099050806131a08401528181613040850151099050806131c08401528181613060850151099050806131e084015281816130008501510990508061320084015281816130808501510990508061322084015281816130a08501510990508061324084015281816130c08501510990508061326084015281816130e0850151099050806132808401528181613100850151099050806132a08401528181613120850151099050806132c08401528181613140850151099050806132e08401528181613160850151099050806133008401528181612fe085015109905080613320840152506020613360830152602061338083015260206133a08301526133208201516133c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6133e0830152600080516020614fbd8339815191526134008301528260016020613340850160c0613360870160055afa141692506133408201516000612fe08401519050828261330086015109612fe0850152828282099150613160840151905082826132e086015109613160850152828282099150613140840151905082826132c086015109613140850152828282099150613120840151905082826132a08601510961312085015282828209915061310084015190508282613280860151096131008501528282820991506130e084015190508282613260860151096130e08501528282820991506130c084015190508282613240860151096130c08501528282820991506130a084015190508282613220860151096130a08501528282820991506130808401519050828261320086015109613080850152828282099150613000840151905082826131e086015109613000850152828282099150613060840151905082826131c086015109613060850152828282099150613040840151905082826131a086015109613040850152828282099150612fc08401519050828261318086015109612fc0850152828282099150612fa084015190508282612f8086015109612fa085015282828209612f808501819052612fa085015190925083915082900890508181612fc0850151086134208401525061300082015161302083015182919009613440830152613040820151818161306085015108613460840152506130e08201516130208301518291900961348083015261308082015181816130a085015108905081816130c0850151086134a084015250613140820151613020830151829190096134c08301526131008201518181613120850151086134e084015250612fe082015161302083015182919009613500830152613160820151806135208401525061342082015181816134608501510990508061354084015281816134a08501510990508061356084015281816134e0850151099050806135808401528181613520850151099050806135a08401525060206135e0830152602061360083015260206136208301526135a08201516136408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff613660830152600080516020614fbd83398151915261368083015282600160206135c0850160c06135e0870160055afa141692506135c0820151600061352084015190508282613580860151096135208501528282820991506134e084015190508282613560860151096134e08501528282820991506134a084015190508282613540860151096134a08501528282820991506134608401519050828261342086015109613460850152828282096134208501525050613460820151613440830151829190096136a0830152806134a0830151613480840151096136c0830152806134e08301516134c0840151096136e08301528061352083015161350084015109613700830152610a20820151819080096137208301819052610a208301518291096137408301819052610a208301518291096137608301819052610a208301518291096137808301819052610a208301518291096137a08301819052610a208301518291096137c08301819052610a208301518291096137e08301819052610a208301518291096138008301819052610a208301518291096138208301819052610a208301518291096138408301819052610a208301518291096138608301819052610a208301518291096138808301819052610a208301518291096138a08301819052610a208301518291096138c08301819052610a208301518291096138e08301819052610a20830151829109613900830152610a80820151819080096139208301819052610a808301518291096139408301819052610a808301518291096139608301819052610a8083015182910961398083015280612f808301516105e084015109818183612fa086015161062087015109089050818183612fc08601516106a087015109086139a0840181905261342084015183925090096139c08301528060016139c08401518303096139e083015280612f8083015161060084015109818183612fa086015161064087015109089050818183612fc08601516106808701510908613a0084018190526134208401518392509009613a208301819052610a208301518291820309613a4083015280610a20830151600109613a6083015280613a408301516139e084015108613a80830152806001613a8084015109613aa0830152806001613a6084015109613ac083015280613440830151600109613ae083015280613040830151610660840151098181836130608601516106c08701510908613b0084018190526136a08401518392509009613b20830152806001613b20840151830309613b40830152806001613ae084015109613b6083015280613040830151610920840151098181836130608601516109408701510908613b8084018190526136a08401518392509009613ba08301819052610a208301518291820309613bc083015280610a20830151613ae084015109613be083015280613bc0830151613b4084015108613c0083015280613040830151610960840151098181836130608601516109808701510908613c2084018190526136a08401518392509009613c4083018190526137208301518291820309613c6083015280613720830151613ae084015109613c8083015280613c60830151613c0084015108613ca08301819052610a80830151829109613cc083015280610a80830151613b6084015109613ce083015280610a80830151613be084015109613d0083015280610a80830151613c8084015109613d2083015280613cc0830151613aa084015108613d4083015280613480830151600109613d60830152806130808301516108c0840151098181836130a08601516108e0870151090890508181836130c08601516109008701510908613d8084018190526136c08401518392509009613da0830152806001613da0840151830309613dc0830152806001613d6084015109613de083015280613920830151613dc084015109613e0083015280613920830151613de084015109613e2083015280613e00830151613d4084015108613e40830152806134c0830151600109613e60830152806131008301516109a0840151098181836131208601516109c08701510908613e8084018190526136e08401518392509009613ea0830152806001613ea0840151830309613ec0830152806001613e6084015109613ee083015280613940830151613ec084015109613f0083015280613940830151613ee084015109613f2083015280613f00830151613e4084015108613f4083015280613500830151600109613f60830152806131608301516109e084015109613f808301819052613700830151829109613fa0830152806001613fa0840151830309613fc0830152806001613f6084015109613fe0830152806131608301516106e08401510961400083018190526137008301518291096140208301819052610a20830151829182030961404083015280610a20830151613f608401510961406083015280614040830151613fc08401510861408083015280613160830151610700840151096140a083018190526137008301518291096140c0830181905261372083015182918203096140e083015280613720830151613f6084015109614100830152806140e083015161408084015108614120830152806131608301516107208401510961414083018190526137008301518291096141608301819052613740830151829182030961418083015280613740830151613f60840151096141a083015280614180830151614120840151086141c083015280613160830151610740840151096141e083018190526137008301518291096142008301819052613760830151829182030961422083015280613760830151613f6084015109614240830152806142208301516141c084015108614260830152806131608301516107608401510961428083018190526137008301518291096142a0830181905261378083015182918203096142c083015280613780830151613f60840151096142e0830152806142c0830151614260840151086143008301528061316083015161078084015109614320830181905261370083015182910961434083018190526137a08301518291820309614360830152806137a0830151613f608401510961438083015280614360830151614300840151086143a0830152806131608301516107a0840151096143c083018190526137008301518291096143e083018190526137c08301518291820309614400830152806137c0830151613f6084015109614420830152806144008301516143a084015108614440830152806131608301516107c084015109614460830181905261370083015182910961448083018190526137e083015182918203096144a0830152806137e0830151613f60840151096144c0830152806144a0830151614440840151086144e0830152806131608301516108008401510961450083018190526137008301518291096145208301819052613800830151829182030961454083015280613800830151613f6084015109614560830152806145408301516144e08401510861458083015280613160830151610820840151096145a083018190526137008301518291096145c0830181905261382083015182918203096145e083015280613820830151613f6084015109614600830152806145e083015161458084015108614620830152806131608301516108408401510961464083018190526137008301518291096146608301819052613840830151829182030961468083015280613840830151613f60840151096146a083015280614680830151614620840151086146c083015280613160830151610860840151096146e083018190526137008301518291096147008301819052613860830151829182030961472083015280613860830151613f6084015109614740830152806147208301516146c084015108614760830152806131608301516108808401510961478083018190526137008301518291096147a0830181905261388083015182918203096147c083015280613880830151613f60840151096147e0830152806147c083015161476084015108614800830152806131608301516108a084015109614820830181905261370083015182910961484083018190526138a08301518291820309614860830152806138a0830151613f608401510961488083015280614860830151614800840151086148a083015280613500830151612dc0840151096148c083015280613500830151612de0840151096148e083015280613500830151612e008401510961490083015280613500830151612e208401510961492083015280613160830151612e4084015109614940830181905261370083015182910961496083018190526138c08301518291820309614980830152806138c0830151613f60840151096149a0830152806138c08301516148c0840151096149c0830152806138c08301516148e0840151096149e0830152806138c083015161490084015109614a00830152806138c083015161492084015109614a20830152806149808301516148a084015108614a40830152806131608301516107e084015109614a608301819052613700830151829109614a8083018190526138e08301518291820309614aa0830152806138e0830151613f6084015109614ac083015280614aa0830151614a4084015108614ae08301819052613960830151829109614b0083015280613960830151613fe084015109614b208301528061396083015161406084015109614b408301528061396083015161410084015109614b60830152806139608301516141a084015109614b808301528061396083015161424084015109614ba0830152806139608301516142e084015109614bc08301528061396083015161438084015109614be08301528061396083015161442084015109614c00830152806139608301516144c084015109614c208301528061396083015161456084015109614c408301528061396083015161460084015109614c60830152806139608301516146a084015109614c808301528061396083015161474084015109614ca0830152806139608301516147e084015109614cc08301528061396083015161488084015109614ce0830152806139608301516149a084015109614d00830152806139608301516149c084015109614d20830152806139608301516149e084015109614d4083015280613960830151614a0084015109614d6083015280613960830151614a2084015109614d8083015280613960830151614ac084015109614da083015280614b00830151613f4084015108614dc083015280613020830151600109614de083015280610b20830151600109614e008301526001614e2083018181526002614e40850152614dc0840151614e6085015284919060409060608160075afa14169250614e20820151614e80830152614e40820151614ea08301526080820151614ec083015260a0820151614ee08301528260016040614e8085016080614e80870160065afa1416925060c0820151614f0083015260e0820151614f20830152613ac0820151614f408301528260016040614f0085016060614f00870160075afa14169250614e80820151614f60830152614ea0820151614f80830152614f00820151614fa0830152614f20820151614fc08301528260016040614f6085016080614f60870160065afa14169250610100820151614fe0830152610120820151615000830152613ce08201516150208301528260016040614fe085016060614fe0870160075afa14169250614f60820151615040830152614f80820151615060830152614fe08201516150808301526150008201516150a0830152826001604061504085016080615040870160065afa141692506103208201516150c08301526103408201516150e0830152613d0082015161510083015282600160406150c0850160606150c0870160075afa141692506150408201516151208301526150608201516151408301526150c08201516151608301526150e0820151615180830152826001604061512085016080615120870160065afa141692506103608201516151a08301526103808201516151c0830152613d208201516151e083015282600160406151a0850160606151a0870160075afa141692506151208201516152008301526151408201516152208301526151a08201516152408301526151c0820151615260830152826001604061520085016080615200870160065afa141692506102e08201516152808301526103008201516152a0830152613e208201516152c0830152826001604061528085016060615280870160075afa141692506152008201516152e08301526152208201516153008301526152808201516153208301526152a082015161534083015282600160406152e0850160806152e0870160065afa141692506101a08201516153608301526101c0820151615380830152613f208201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa141692506101e0820151615440830152610200820151615460830152614b20820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692507f0655d62979dc062dc1e8c15334bf17cf5c7e6352219c0bd0b0cc039598d9a6696155208301527f019589d3002f6a0ded46a69053f0c05e7a7ca45339b3d2bae85d00f26ac0f33e615540830152614b40820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f1eab999592385208b42a12dcc047763ee5cf12052eb4b0d9a7a286e043f3df9f6156008301527f18887eb3c646ffd4961226c91bac9661004798b1fc6a39c43f9a6d1d03767194615620830152614b60820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f076806058b02e1b5e99b2f2e8eee613194f8df73481659f5938baacd64e4d7b86156e08301527f05ae81644b244dceea5350a84a79cbf0a199bbd6c1fad9887423f8c8048e6039615700830152614b8082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f0438873fc00231ae527efcf74d9092f5059dfa05275cbe7381e948fe3b7b61d86157c08301527f03c0f314c93403792ba86ec3841b3080f2f7cd092c6bcb632cdbc2122a13cdef6157e0830152614ba082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f2b12b132a6261ad60249147599cae0d5b3547e510deabba65526d130f04f24026158a08301527f13e3c02ce00f6b7e00d5b099eda5f1155956ae83899a2d59cefcb00dad66a7f66158c0830152614bc08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f0ed83370277e0fd35e8258dd5630ce0ce3491fdf7e166d293745635b0cc4eba56159808301527f03994e7e77ad58072b78757700ab0b79247f2e462b0cf6a5a18b607414c095db6159a0830152614be08201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f23ba4bc49baab563e9d5bf07da231a4496d35b6bc782dbbd76135fe44c31cbcf615a608301527f28b88097e7edf1b2904f6c25c1e30ca0e38c74a52125b2995c4cf0a750683854615a80830152614c00820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f17dcbba0bbe2d24566de620998f62ff54ea5302ada6aeb18028b61b4dc19bbd3615b408301527f0e1f908007a5c2cc934426c26de7206c53fa10c79d63ef52ee91bfb568c72fbd615b60830152614c20820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f2c7823f99cb2adb716becb960914ffa1d6e2f257875fdd03c2bee52ef571d41e615c208301527f09ab83ebc6803e65b2e6831c8706d9a134f6b1cf6f6ec5c2697afee095320ee1615c40830152614c40820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f2dc12c205152bfacc354c838225571172c215e01a64de6a2ca6665c70937ac58615d008301527f0449eb529f0038a2bd2f6c0b6213a70488b69b479d90a953579e4c9d45621b85615d20830152614c60820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f09a2ab3913a4770fd50f6ba9ec4ce0b3178b54d7bfca5b42fe7e8e1ce5cf60a9615de08301527f13ec31f94026569c4bb76e2c4ceaa3e6525438ffb4a7a69cde61f6d77b93bad7615e00830152614c80820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974615ec08301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3615ee0830152614ca0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f02a9a77d8e6f6fd89f33ba56fe45f6f5c907e50ba28cdd4198acfb562eb21103615fa08301527f23abee68d83c2d6632576e5e95ca01a61e5e3e6d9438c2ac6428c8b6edfe2aba615fc0830152614cc0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2cf36d36bfacbe1a8d8c626aefa75ac0feb46b725989a8e6fabed074bf9f6af76160808301527f060fded3ed5ec56d9e0064d73c472245a4c4b6ec371e9808692bf7f259d3b7306160a0830152614ce08201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa14169250610440820151616160830152610460820151616180830152614d008201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692506104808201516162408301526104a0820151616260830152614d20820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692506104c08201516163208301526104e0820151616340830152614d40820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa14169250610500820151616400830152610520820151616420830152614d60820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506105408201516164e0830152610560820151616500830152614d8082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506103a08201516165c08301526103c08201516165e0830152614da082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa14169250610ac08201516166a0830152610ae08201516166c0830152614de082015181036166e08301525081600160406166a0840160606166a0860160075afa141691506166208101516167008201526166408101516167208201526166a08101516167408201526166c0810151616760820152816001604061670084016080616700860160065afa14169150610b60810151616780820152610b808101516167a0820152614e008101516167c0820152816001604061678084016060616780860160075afa141691506167008101516167e08201526167208101516168008201526167808101516168208201526167a081015161684082015281600160406167e0840160806167e0860160065afa141691506167e08101516168608201526168008101516168808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26168a08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6168c08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6168e08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa616900820152610b60810151616920820152610b808101516169408201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6169608201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6169808201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456169a08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff6169c082015281600160206168608401610180616860860160085afa61686093909301516001149214161691505092915050565b604051806169c0016040528061034e906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5c57614e5c614e1d565b604052919050565b600082601f830112614e7557600080fd5b813567ffffffffffffffff811115614e8f57614e8f614e1d565b614ea2601f8201601f1916602001614e33565b818152846020838601011115614eb757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614ee757600080fd5b823567ffffffffffffffff80821115614eff57600080fd5b818501915085601f830112614f1357600080fd5b8135602082821115614f2757614f27614e1d565b8160051b614f36828201614e33565b928352848101820192828101908a851115614f5057600080fd5b958301955b84871015614f6e57863582529583019590830190614f55565b9750505086013592505080821115614f8557600080fd5b50614f9285828601614e64565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220d4b2dc8798bab17b65a2e72c3cd13b07b4a58aae366a77784852333c75aa78b964736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} diff --git a/backend/src/contracts/generated/inclusion_verifier.rs b/backend/src/contracts/generated/inclusion_verifier.rs index b7798a28..71ddc9f7 100644 --- a/backend/src/contracts/generated/inclusion_verifier.rs +++ b/backend/src/contracts/generated/inclusion_verifier.rs @@ -41,7 +41,7 @@ pub mod inclusion_verifier { 80, 97, 84, - 104, + 103, 128, 97, 0, @@ -113,7 +113,7 @@ pub mod inclusion_verifier { 4, 97, 83, - 42, + 41, 86, 91, 97, @@ -150,7 +150,7 @@ pub mod inclusion_verifier { 99, 97, 82, - 83, + 82, 86, 91, 96, @@ -161,7 +161,7 @@ pub mod inclusion_verifier { 32, 97, 84, - 19, + 18, 131, 57, 129, @@ -181,7 +181,7 @@ pub mod inclusion_verifier { 32, 97, 83, - 243, + 242, 131, 57, 129, @@ -207,7 +207,7 @@ pub mod inclusion_verifier { 32, 97, 83, - 243, + 242, 131, 57, 129, @@ -225,7 +225,7 @@ pub mod inclusion_verifier { 32, 97, 83, - 243, + 242, 131, 57, 129, @@ -245,7 +245,7 @@ pub mod inclusion_verifier { 32, 97, 83, - 243, + 242, 131, 57, 129, @@ -296,38 +296,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 40, - 200, - 148, - 244, - 31, - 194, 45, - 196, - 49, - 68, - 4, - 213, - 32, - 133, - 128, - 84, - 184, - 115, - 227, - 250, - 130, - 75, - 11, - 121, + 241, + 98, + 24, + 168, + 45, + 57, + 131, + 16, + 113, + 228, + 105, + 86, 194, + 51, + 238, + 154, + 167, + 155, + 176, + 101, + 178, + 101, + 135, + 16, 128, - 105, - 134, - 65, - 40, - 149, - 156, + 216, + 100, + 63, + 47, + 82, + 171, 96, 0, 131, @@ -2974,7 +2974,7 @@ pub mod inclusion_verifier { 32, 97, 84, - 19, + 18, 131, 57, 129, @@ -10271,7 +10271,7 @@ pub mod inclusion_verifier { 32, 97, 84, - 19, + 18, 131, 57, 129, @@ -11103,7 +11103,7 @@ pub mod inclusion_verifier { 32, 97, 84, - 19, + 18, 131, 57, 129, @@ -15917,38 +15917,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 35, - 163, + 41, + 30, + 77, + 180, + 60, + 38, + 7, + 38, 185, - 11, - 82, - 16, - 31, - 10, + 28, + 83, + 89, + 23, + 168, + 1, + 189, + 224, 107, - 87, - 67, - 179, - 233, + 231, + 247, + 207, + 69, 1, - 204, - 28, - 163, - 254, - 220, - 245, - 102, - 57, - 227, - 245, - 208, - 146, - 193, - 254, - 137, - 24, - 221, - 73, + 9, + 9, + 118, + 35, + 19, + 219, + 66, + 82, + 144, 97, 86, 0, @@ -15956,38 +15956,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 45, - 26, - 194, - 156, - 89, - 138, - 132, - 47, - 120, - 101, - 167, - 131, - 89, - 254, - 146, - 90, - 176, - 18, - 144, - 125, - 243, - 239, - 34, - 236, - 238, - 140, - 62, - 56, - 119, - 92, + 21, + 78, + 127, + 225, + 88, 71, - 253, + 172, + 77, + 28, + 217, + 63, + 166, + 200, + 32, + 150, + 114, + 207, + 204, + 244, + 90, + 216, + 225, + 58, + 184, + 47, + 198, + 177, + 103, + 186, + 25, + 148, + 252, 97, 86, 32, @@ -16105,38 +16105,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 3, - 136, - 159, - 97, - 43, - 209, - 126, - 1, - 27, - 19, - 144, - 38, - 115, - 167, - 6, - 136, - 187, - 172, - 223, - 34, - 112, - 76, - 200, - 41, - 87, - 64, - 160, - 184, - 85, - 149, - 95, + 23, + 107, + 16, + 212, + 2, + 250, 192, + 91, + 252, + 152, + 34, + 52, + 245, + 11, + 48, + 90, + 208, + 103, + 225, + 34, + 241, + 104, + 42, + 75, + 156, + 75, + 217, + 139, + 218, + 145, + 145, + 157, 97, 86, 224, @@ -16144,38 +16144,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 7, - 122, - 73, 29, + 98, + 231, + 141, + 101, + 94, + 63, + 199, + 65, + 136, + 102, + 103, + 56, + 252, + 166, + 82, + 74, + 113, + 47, + 26, + 60, + 76, + 207, 221, - 129, - 219, - 209, - 128, - 45, - 137, - 115, - 90, - 232, - 129, - 197, - 109, - 169, - 127, - 144, - 142, - 11, - 182, - 163, - 168, - 173, - 111, - 217, - 247, - 45, - 177, - 35, + 15, + 164, + 79, + 62, + 44, + 132, + 156, + 81, 97, 87, 0, @@ -16293,38 +16293,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 41, - 63, - 62, - 234, - 190, - 179, - 135, - 231, - 140, - 151, - 164, - 222, - 66, - 13, - 35, - 54, - 255, - 142, - 209, + 1, + 157, + 215, + 238, + 83, + 25, + 144, + 211, + 53, 170, - 173, - 247, - 151, - 199, - 220, - 62, - 98, - 44, - 159, - 20, - 64, - 82, + 216, + 246, + 76, + 38, + 161, + 188, + 7, + 43, + 71, + 167, + 239, + 212, + 80, + 68, + 4, + 210, + 233, + 94, + 32, + 37, + 7, + 89, 97, 87, 192, @@ -16332,38 +16332,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 4, - 248, - 20, - 17, - 72, + 12, + 65, + 61, + 216, + 229, + 1, + 137, 160, - 131, - 237, - 120, - 210, - 100, - 182, - 34, - 204, - 211, - 159, - 220, - 46, 90, - 77, - 67, - 9, - 222, - 248, - 60, - 101, - 246, - 65, - 250, - 31, - 115, - 174, + 55, + 70, + 121, + 186, + 231, + 47, + 114, + 79, + 123, + 113, + 233, + 86, + 195, + 44, + 8, + 129, + 234, + 55, + 105, + 66, + 118, + 234, + 131, 97, 87, 224, @@ -16481,38 +16481,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 21, - 56, - 66, - 247, - 195, - 212, - 33, - 61, - 26, - 11, - 223, - 2, - 114, - 220, - 10, - 192, + 7, + 48, + 121, + 157, 91, - 135, - 148, + 254, + 193, + 206, + 252, + 90, + 175, + 252, + 255, + 227, + 243, + 221, + 73, + 27, + 43, + 252, + 175, + 159, + 85, + 63, 148, - 149, - 169, - 70, - 128, - 234, - 7, - 245, - 82, - 140, - 212, - 203, - 101, + 222, + 97, + 69, + 237, + 71, + 66, + 175, 97, 88, 160, @@ -16520,38 +16520,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 25, - 116, - 129, - 238, - 227, - 146, - 24, - 145, - 129, - 211, - 61, - 81, - 136, - 59, - 97, - 45, - 196, + 36, + 173, + 74, + 240, + 130, + 233, + 107, + 20, 185, - 183, - 180, - 10, - 195, - 197, - 22, - 208, - 78, - 245, - 139, - 68, + 166, + 218, + 128, + 244, + 250, + 19, + 52, + 242, + 83, + 196, 88, + 173, + 213, + 49, + 200, + 217, 248, - 65, + 178, + 60, + 94, + 203, + 156, + 67, 97, 88, 192, @@ -16669,38 +16669,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 46, - 178, - 223, - 150, - 73, - 23, - 94, - 214, - 137, - 174, - 155, + 34, + 225, + 205, + 191, + 255, + 207, + 207, + 79, 24, - 189, - 156, - 45, - 165, - 94, - 6, - 242, - 139, - 139, - 173, - 228, - 14, + 207, + 67, + 66, + 237, + 241, + 251, + 38, + 195, + 182, + 229, + 42, 206, - 88, - 79, - 230, - 70, - 152, - 122, - 242, + 61, + 95, + 173, + 207, + 92, + 194, + 97, + 67, + 51, + 186, + 164, 97, 89, 128, @@ -16708,38 +16708,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 6, - 11, - 216, - 98, - 210, - 103, - 214, - 34, - 190, - 207, + 14, + 40, + 223, + 114, + 220, + 198, + 156, + 198, 68, - 124, - 150, - 224, + 45, + 114, + 246, + 147, + 102, + 25, + 151, + 72, 10, - 7, - 90, - 85, - 106, - 18, - 213, - 122, - 137, - 205, - 252, - 204, - 213, 145, - 128, - 214, - 225, - 131, + 58, + 195, + 83, + 137, + 14, + 253, + 99, + 168, + 115, + 149, + 151, + 39, + 192, 97, 89, 160, @@ -16857,38 +16857,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 38, - 26, - 176, - 71, - 202, - 203, - 246, - 253, - 169, - 16, - 181, - 148, - 229, - 164, - 127, - 206, - 23, - 215, - 191, - 89, - 18, - 168, - 3, - 161, - 89, - 114, + 11, + 48, + 254, + 149, + 129, + 166, + 199, + 0, + 100, + 227, + 179, + 84, 70, + 178, + 67, 56, - 172, - 154, - 146, - 147, + 66, + 219, + 118, + 232, + 250, + 213, + 71, + 251, + 177, + 238, + 105, + 145, + 100, + 115, + 247, + 237, 97, 90, 96, @@ -16896,38 +16896,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 28, - 25, - 207, - 153, - 205, - 153, - 192, - 162, - 153, - 94, - 123, - 84, + 40, + 110, 15, - 14, - 19, - 29, - 90, - 118, - 173, - 161, - 159, - 82, - 219, - 249, - 123, + 135, + 214, + 25, + 227, + 254, + 218, + 200, + 163, + 215, + 68, + 46, 243, - 247, - 224, - 72, - 226, - 77, + 79, + 182, + 86, + 108, + 233, + 175, + 90, + 49, 87, + 88, + 192, + 194, + 184, + 0, + 12, + 54, + 207, 97, 90, 128, @@ -17045,38 +17045,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 9, - 133, + 20, + 230, + 106, + 119, + 30, + 240, + 140, + 202, + 5, + 81, + 194, + 107, + 52, + 57, + 212, + 157, + 57, + 27, + 162, + 29, + 145, + 183, + 6, + 223, 44, - 196, - 215, - 228, - 53, - 133, - 248, - 10, - 113, - 187, - 101, - 141, - 17, - 124, - 139, - 173, - 74, - 253, - 56, - 197, - 98, - 80, - 247, - 158, - 47, + 75, + 31, + 23, + 125, + 119, + 89, 229, - 234, - 54, - 203, - 234, 97, 91, 64, @@ -17084,38 +17084,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 14, - 175, - 223, - 29, - 192, - 235, - 197, - 12, - 102, - 162, - 142, - 244, - 228, - 206, - 17, - 214, - 125, - 194, - 104, - 53, - 238, + 5, + 50, + 114, + 58, + 38, + 220, + 146, 143, - 202, - 136, - 83, - 8, - 196, - 232, - 0, - 229, + 67, 3, - 219, + 62, + 250, + 239, + 142, + 74, + 162, + 115, + 39, + 114, + 186, + 65, + 75, + 29, + 173, + 206, + 31, + 231, + 208, + 179, + 13, + 153, + 210, 97, 91, 96, @@ -17233,38 +17233,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 6, - 13, - 5, - 217, - 52, + 4, + 116, + 174, + 28, + 66, + 48, + 189, + 205, + 210, + 92, + 228, + 96, + 239, 115, - 24, - 184, - 196, - 130, - 244, - 61, - 88, - 155, - 171, - 227, - 76, - 79, - 234, 198, + 137, + 228, + 34, 126, - 99, - 59, - 124, - 125, - 32, - 81, - 36, - 229, - 148, - 32, - 49, + 223, + 14, + 199, + 194, + 190, + 133, + 239, + 141, + 117, + 89, + 46, + 27, + 54, 97, 92, 32, @@ -17272,38 +17272,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 18, - 107, - 206, - 94, - 6, - 83, - 23, - 244, - 44, - 78, - 160, - 145, - 101, + 47, + 216, + 62, + 110, + 7, + 204, + 53, + 117, + 90, + 4, + 51, + 127, + 215, + 10, + 248, + 170, + 49, + 252, + 116, + 222, + 7, + 165, + 57, + 184, + 168, + 117, + 108, + 170, + 96, 208, - 0, - 8, - 32, - 36, - 56, - 225, - 196, + 72, 144, - 213, - 114, - 198, - 183, - 102, - 19, - 242, - 26, - 30, - 191, 97, 92, 64, @@ -17421,38 +17421,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 29, - 15, - 148, - 243, - 83, - 94, - 88, + 28, + 111, + 147, + 174, + 247, + 149, + 245, + 37, + 200, 181, - 208, - 108, - 51, - 155, - 99, - 100, - 183, - 124, - 175, - 195, - 137, - 79, - 1, - 137, - 215, - 119, - 160, - 143, - 32, - 206, - 35, - 154, - 26, + 27, + 203, + 2, 52, + 187, + 52, + 89, + 66, + 204, + 49, + 120, + 43, + 247, + 80, + 150, + 255, + 242, + 112, + 127, + 62, + 75, + 159, 97, 93, 0, @@ -17460,38 +17460,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 11, - 83, - 173, - 80, - 124, - 70, - 154, - 35, - 130, - 57, - 249, - 62, - 66, - 224, - 113, - 148, + 27, + 248, + 75, 118, - 31, - 57, - 105, - 72, - 168, - 212, - 175, + 24, + 113, + 163, + 49, 27, - 46, - 243, - 237, - 160, - 186, - 54, - 159, + 9, + 109, + 135, + 5, + 52, + 176, + 164, + 176, + 149, + 51, + 12, + 212, + 95, + 190, + 123, + 187, + 245, + 179, + 83, + 169, + 128, + 195, + 157, 97, 93, 32, @@ -17609,38 +17609,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 5, - 255, - 214, - 244, - 127, - 173, - 193, - 61, - 65, - 63, - 247, - 61, - 61, - 205, - 43, - 84, - 19, - 151, - 13, - 35, - 40, - 172, - 229, - 81, - 179, - 177, - 213, - 242, - 10, - 104, - 115, + 7, + 96, + 155, + 167, + 145, + 240, + 237, + 93, + 86, + 144, + 145, + 4, + 28, + 128, + 9, + 116, + 184, + 68, + 11, + 197, + 192, + 249, + 125, + 155, + 98, + 149, + 161, + 99, + 33, 117, + 17, + 108, 97, 93, 224, @@ -17648,38 +17648,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 38, - 117, - 149, - 171, - 39, - 198, - 143, - 246, - 157, - 6, - 200, - 194, - 133, - 133, - 151, - 62, - 240, - 251, - 173, + 28, + 219, + 4, + 18, + 243, 142, - 9, - 130, - 135, 26, 25, - 59, - 2, + 83, + 26, + 251, + 209, + 201, + 96, + 49, + 70, + 231, + 189, + 28, + 52, + 169, + 61, + 246, + 190, + 76, 101, - 65, - 226, - 120, - 147, + 177, + 38, + 227, + 83, + 123, + 104, 97, 94, 0, @@ -17797,38 +17797,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 45, - 202, - 75, - 113, - 54, - 251, - 211, - 151, - 66, - 97, 14, - 234, - 226, - 1, - 231, - 107, + 149, + 91, + 137, + 236, + 165, + 252, + 52, + 210, + 23, + 32, + 34, + 248, + 157, + 196, + 103, + 172, + 46, + 132, + 201, + 146, + 158, + 28, + 224, 194, - 41, + 168, + 206, + 131, + 28, 93, - 220, - 32, - 204, - 24, - 221, - 107, - 25, - 170, - 123, - 114, - 75, - 19, + 215, + 1, 97, 94, 192, @@ -17836,38 +17836,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 35, - 4, - 142, - 155, - 178, - 222, - 190, - 175, + 7, 207, - 149, - 98, - 138, - 184, - 27, - 3, - 39, - 92, + 146, + 154, + 220, + 230, + 20, + 176, + 136, + 200, + 44, + 179, + 147, + 79, + 30, + 183, + 84, + 109, + 210, + 228, + 131, + 150, + 233, + 20, + 180, + 255, + 6, + 236, + 69, 222, - 227, - 59, - 202, - 24, - 213, - 121, - 221, - 226, - 102, - 31, - 100, - 100, - 94, - 197, + 158, + 138, 97, 94, 224, @@ -17985,38 +17985,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 5, - 70, - 156, - 36, - 15, - 123, - 95, - 237, - 193, - 37, - 186, - 30, - 230, - 108, - 174, - 19, - 119, - 236, + 45, + 69, + 49, + 164, 117, - 87, + 40, + 230, + 66, + 248, + 246, 149, - 153, - 39, - 143, - 99, - 15, - 45, - 118, - 64, - 153, - 79, - 236, + 74, + 63, + 63, + 249, + 246, + 7, + 46, + 56, + 211, + 14, + 46, + 13, + 16, + 141, + 28, + 172, + 32, + 29, + 75, + 104, + 77, 97, 95, 160, @@ -18024,38 +18024,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 8, - 184, - 20, - 207, - 162, + 21, + 76, + 64, + 155, + 189, + 23, 96, - 116, - 170, + 236, + 85, + 99, + 157, + 50, + 213, + 129, + 124, + 147, + 153, + 229, + 115, + 178, + 42, + 143, + 221, + 165, + 247, + 7, + 201, + 185, 222, - 123, - 171, - 19, - 180, - 148, - 245, - 152, - 170, - 91, - 253, - 188, - 73, - 208, - 223, + 29, 76, - 67, - 144, - 221, - 105, - 40, - 93, - 3, - 208, + 166, 97, 95, 192, @@ -18173,77 +18173,77 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 250, - 246, - 25, - 188, - 121, - 246, - 232, - 236, - 211, - 126, - 225, - 82, - 230, - 190, - 252, - 123, - 119, - 137, - 193, - 181, - 148, - 84, + 36, + 2, + 219, 75, - 242, - 8, - 73, - 51, - 146, - 168, - 238, - 40, + 28, + 119, + 70, + 220, + 217, + 254, + 126, + 171, + 130, + 171, + 63, + 167, + 235, + 177, + 189, + 53, + 42, + 154, + 249, + 78, + 246, + 129, + 27, + 42, + 249, + 171, + 111, + 142, 97, 96, 128, - 131, - 1, - 82, - 127, - 42, - 145, - 132, - 46, - 24, - 243, - 172, - 118, - 30, - 95, - 101, - 237, - 198, - 64, - 221, - 66, - 239, - 109, - 145, - 21, - 182, - 73, - 173, - 58, - 205, - 255, - 108, - 206, - 215, + 131, + 1, + 82, + 127, + 42, + 0, + 71, + 236, + 8, 162, - 116, - 170, + 84, + 117, + 60, + 70, + 102, + 72, + 240, + 220, + 110, + 7, + 126, + 136, + 229, + 73, + 88, + 41, + 195, + 168, + 69, + 135, + 59, + 144, + 88, + 191, + 68, + 7, 97, 96, 160, @@ -18361,38 +18361,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 15, - 212, - 68, - 47, - 83, - 230, - 181, - 165, - 248, - 96, - 194, - 200, - 17, - 207, - 78, - 73, - 134, - 66, - 49, - 74, - 188, - 53, + 4, + 118, + 199, + 241, + 84, + 247, + 3, + 103, + 42, + 221, + 116, + 255, + 235, + 198, + 255, + 166, + 21, + 155, 78, + 82, + 127, 10, - 23, - 75, - 230, - 184, - 188, - 14, - 39, - 229, + 67, + 84, + 182, + 1, + 250, + 205, + 87, + 255, + 26, + 26, 97, 97, 96, @@ -18400,38 +18400,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 9, - 31, - 63, + 39, + 193, + 2, + 144, + 247, + 48, + 237, + 173, + 155, 203, - 232, - 154, - 35, - 196, - 69, - 140, - 46, + 37, 56, - 199, - 182, - 68, - 78, - 40, - 216, + 5, + 111, + 117, + 94, + 254, + 169, 36, - 76, - 8, - 84, - 158, - 149, - 37, - 206, - 237, - 244, - 163, - 32, - 203, - 192, + 176, + 166, + 157, + 134, + 213, + 201, + 200, + 51, + 113, + 126, + 115, + 14, + 40, 97, 97, 128, @@ -18549,38 +18549,38 @@ pub mod inclusion_verifier { 146, 80, 127, + 7, + 67, + 234, + 64, + 241, + 64, + 132, + 219, + 38, + 115, + 33, + 114, + 131, + 170, 5, - 12, - 186, - 44, - 164, - 140, - 200, - 130, - 104, - 122, - 158, - 102, - 134, - 126, + 63, 152, - 78, - 44, - 229, - 73, - 71, - 120, - 168, - 188, - 175, - 253, - 210, + 104, + 150, + 238, + 124, + 24, + 31, + 82, + 17, + 132, + 66, + 233, + 156, + 69, 41, - 107, - 169, - 171, - 219, - 86, + 116, 97, 98, 64, @@ -18588,38 +18588,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 14, - 68, - 208, - 171, - 33, - 51, - 113, - 74, - 252, - 233, + 2, + 3, + 227, + 73, 58, - 53, - 77, - 98, + 37, + 148, + 236, + 229, + 125, + 34, + 204, + 117, + 221, + 8, + 26, + 198, + 130, 113, - 71, - 12, - 41, - 63, - 24, - 239, - 41, 236, - 200, - 116, - 65, - 111, + 124, + 117, 129, - 255, - 185, - 40, - 24, + 83, + 207, + 210, + 21, + 43, + 251, + 92, + 25, + 227, 97, 98, 96, @@ -18737,77 +18737,76 @@ pub mod inclusion_verifier { 146, 80, 127, - 47, - 105, - 164, - 31, - 255, - 92, - 190, - 85, - 218, - 7, - 211, - 14, - 120, - 154, - 13, - 118, - 96, - 211, + 30, + 135, + 235, + 136, + 87, + 119, + 149, + 201, + 242, + 140, + 66, + 59, + 77, + 44, + 62, + 193, 232, - 65, - 199, - 14, - 187, - 50, - 111, - 88, - 37, - 97, + 144, + 22, + 68, + 102, + 234, + 151, + 66, + 217, + 153, + 106, + 229, + 195, + 184, 10, - 74, - 92, - 8, + 42, 97, 99, 32, 131, 1, 82, - 127, - 31, - 231, - 231, - 65, - 26, - 89, - 158, - 138, - 221, - 245, - 70, - 71, - 17, - 148, - 164, - 133, - 29, - 54, + 126, + 176, + 4, + 129, + 75, + 36, 199, - 17, - 168, - 142, - 146, - 102, - 50, - 245, - 113, - 240, - 217, - 31, - 201, - 246, + 199, + 169, + 220, + 86, + 255, + 160, + 61, + 79, + 43, + 126, + 15, + 86, + 5, + 243, + 187, + 24, + 222, + 221, + 249, + 230, + 57, + 120, + 171, + 188, + 86, 97, 99, 64, @@ -18925,38 +18924,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 38, - 165, - 168, - 9, - 127, - 102, - 5, - 10, - 154, - 61, - 129, - 93, - 57, - 21, - 235, - 18, - 45, - 117, - 2, - 7, - 119, + 41, + 3, + 167, + 99, + 193, + 198, + 183, + 134, + 103, 249, - 232, - 123, - 22, + 6, + 182, + 254, + 43, + 74, + 209, + 151, + 181, + 85, + 135, + 201, 14, - 103, - 204, - 127, - 161, - 126, - 94, + 20, + 232, + 80, + 36, + 70, + 218, + 140, + 69, + 239, + 125, 97, 100, 0, @@ -18964,38 +18963,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 18, - 192, - 23, - 63, - 222, - 196, + 19, + 234, + 87, + 152, + 111, + 146, + 149, + 233, + 45, + 239, + 51, + 3, + 174, 245, - 78, - 114, - 160, + 63, + 43, + 79, + 98, + 91, + 169, + 133, + 83, + 18, + 1, 171, - 57, - 253, - 154, - 95, - 250, - 20, - 54, - 75, - 187, - 30, - 243, - 4, - 97, - 10, - 241, - 113, - 149, - 185, - 147, - 179, - 22, + 83, + 220, + 115, + 7, + 244, + 107, + 105, 97, 100, 32, @@ -20928,38 +20927,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 29, - 52, - 186, - 110, - 59, - 82, - 175, - 168, - 168, - 223, - 5, - 107, - 252, - 81, - 87, - 250, - 22, + 38, + 24, + 106, + 45, + 101, + 238, + 77, + 47, + 156, + 154, + 91, + 145, + 248, + 101, + 151, + 211, + 95, + 25, + 44, + 209, + 32, + 202, + 247, + 233, + 53, + 216, + 68, + 61, + 25, + 56, 226, - 197, - 187, - 4, - 90, - 171, - 113, - 134, - 170, - 181, - 143, - 112, - 146, - 127, - 188, + 61, 97, 112, 96, @@ -20967,38 +20966,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 11, - 74, - 2, - 46, - 184, - 252, - 80, - 61, - 157, - 145, - 102, - 12, - 120, - 63, - 198, - 227, - 122, - 230, - 21, - 112, - 235, - 228, - 136, - 63, - 54, - 99, - 213, - 180, - 164, + 48, + 68, + 31, + 209, + 181, + 211, + 55, + 4, + 130, + 196, + 33, + 82, + 168, + 137, + 144, + 39, + 113, + 105, + 137, + 166, + 153, + 108, + 37, 53, - 102, - 94, + 188, + 159, + 127, + 238, + 138, + 174, + 247, + 158, 97, 112, 128, @@ -21006,38 +21005,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 36, - 149, - 224, - 61, - 94, + 22, + 243, + 99, + 241, + 3, + 200, + 13, + 123, + 188, + 138, + 211, + 198, + 134, + 126, + 8, + 34, + 187, + 198, + 0, + 11, + 233, + 26, + 70, + 137, + 117, 92, - 157, - 106, - 207, - 98, - 205, - 247, - 21, - 17, - 142, - 235, - 189, - 169, - 18, - 227, - 9, - 45, - 254, - 62, - 152, - 19, - 237, - 100, - 44, - 223, - 4, - 18, + 125, + 244, + 2, + 33, + 193, + 69, 97, 112, 160, @@ -21045,38 +21044,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 11, - 154, - 140, - 207, - 27, - 201, - 241, - 179, - 107, - 116, - 121, - 42, - 209, - 0, - 7, - 206, - 87, - 158, - 139, - 165, - 87, - 74, - 152, - 128, - 214, + 43, + 28, + 187, + 62, + 82, + 30, 223, - 244, - 218, - 132, + 90, + 98, + 45, + 130, 118, - 142, - 254, + 42, + 68, + 165, + 230, + 63, + 30, + 80, + 179, + 50, + 215, + 17, + 84, + 164, + 167, + 149, + 141, + 96, + 17, + 222, + 255, 97, 112, 192, @@ -21214,14 +21213,14 @@ pub mod inclusion_verifier { 21, 97, 82, - 178, + 177, 87, 97, 82, - 178, + 177, 97, 82, - 115, + 114, 86, 91, 96, @@ -21242,7 +21241,7 @@ pub mod inclusion_verifier { 18, 97, 82, - 203, + 202, 87, 96, 0, @@ -21265,19 +21264,19 @@ pub mod inclusion_verifier { 21, 97, 82, - 229, + 228, 87, 97, 82, - 229, + 228, 97, 82, - 115, + 114, 86, 91, 97, 82, - 248, + 247, 96, 31, 130, @@ -21291,7 +21290,7 @@ pub mod inclusion_verifier { 1, 97, 82, - 137, + 136, 86, 91, 129, @@ -21308,7 +21307,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 13, + 12, 87, 96, 0, @@ -21356,7 +21355,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 61, + 60, 87, 96, 0, @@ -21380,7 +21379,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 85, + 84, 87, 96, 0, @@ -21400,7 +21399,7 @@ pub mod inclusion_verifier { 18, 97, 83, - 105, + 104, 87, 96, 0, @@ -21417,14 +21416,14 @@ pub mod inclusion_verifier { 21, 97, 83, - 125, + 124, 87, 97, 83, - 125, + 124, 97, 82, - 115, + 114, 86, 91, 129, @@ -21433,13 +21432,13 @@ pub mod inclusion_verifier { 27, 97, 83, - 140, + 139, 130, 130, 1, 97, 82, - 137, + 136, 86, 91, 146, @@ -21461,7 +21460,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 166, + 165, 87, 96, 0, @@ -21479,7 +21478,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 196, + 195, 87, 134, 53, @@ -21495,7 +21494,7 @@ pub mod inclusion_verifier { 144, 97, 83, - 171, + 170, 86, 91, 151, @@ -21514,7 +21513,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 219, + 218, 87, 96, 0, @@ -21524,14 +21523,14 @@ pub mod inclusion_verifier { 80, 97, 83, - 232, + 231, 133, 130, 134, 1, 97, 82, - 186, + 185, 86, 91, 145, @@ -21618,38 +21617,38 @@ pub mod inclusion_verifier { 34, 18, 32, - 172, - 206, - 110, - 12, - 63, - 213, - 170, - 87, - 115, - 229, - 140, - 90, - 241, - 129, - 24, - 92, - 117, - 238, - 219, - 174, - 224, - 140, - 222, - 165, - 248, - 100, - 60, - 101, - 117, - 178, - 91, + 143, + 15, + 8, + 193, + 19, + 215, + 30, + 154, + 255, + 208, 74, + 147, + 10, + 12, + 207, + 255, + 244, + 28, + 199, + 158, + 53, + 137, + 50, + 207, + 167, + 172, + 19, + 149, + 194, + 66, + 68, + 5, 100, 115, 111, @@ -21728,7 +21727,7 @@ pub mod inclusion_verifier { 4, 97, 83, - 42, + 41, 86, 91, 97, @@ -21765,7 +21764,7 @@ pub mod inclusion_verifier { 99, 97, 82, - 83, + 82, 86, 91, 96, @@ -21776,7 +21775,7 @@ pub mod inclusion_verifier { 32, 97, 84, - 19, + 18, 131, 57, 129, @@ -21796,7 +21795,7 @@ pub mod inclusion_verifier { 32, 97, 83, - 243, + 242, 131, 57, 129, @@ -21822,7 +21821,7 @@ pub mod inclusion_verifier { 32, 97, 83, - 243, + 242, 131, 57, 129, @@ -21840,7 +21839,7 @@ pub mod inclusion_verifier { 32, 97, 83, - 243, + 242, 131, 57, 129, @@ -21860,7 +21859,7 @@ pub mod inclusion_verifier { 32, 97, 83, - 243, + 242, 131, 57, 129, @@ -21911,38 +21910,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 40, - 200, - 148, - 244, - 31, - 194, 45, - 196, - 49, - 68, - 4, - 213, - 32, - 133, - 128, - 84, - 184, - 115, - 227, - 250, - 130, - 75, - 11, - 121, + 241, + 98, + 24, + 168, + 45, + 57, + 131, + 16, + 113, + 228, + 105, + 86, 194, + 51, + 238, + 154, + 167, + 155, + 176, + 101, + 178, + 101, + 135, + 16, 128, - 105, - 134, - 65, - 40, - 149, - 156, + 216, + 100, + 63, + 47, + 82, + 171, 96, 0, 131, @@ -24589,7 +24588,7 @@ pub mod inclusion_verifier { 32, 97, 84, - 19, + 18, 131, 57, 129, @@ -31886,7 +31885,7 @@ pub mod inclusion_verifier { 32, 97, 84, - 19, + 18, 131, 57, 129, @@ -32718,7 +32717,7 @@ pub mod inclusion_verifier { 32, 97, 84, - 19, + 18, 131, 57, 129, @@ -37532,38 +37531,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 35, - 163, + 41, + 30, + 77, + 180, + 60, + 38, + 7, + 38, 185, - 11, - 82, - 16, - 31, - 10, + 28, + 83, + 89, + 23, + 168, + 1, + 189, + 224, 107, - 87, - 67, - 179, - 233, + 231, + 247, + 207, + 69, 1, - 204, - 28, - 163, - 254, - 220, - 245, - 102, - 57, - 227, - 245, - 208, - 146, - 193, - 254, - 137, - 24, - 221, - 73, + 9, + 9, + 118, + 35, + 19, + 219, + 66, + 82, + 144, 97, 86, 0, @@ -37571,38 +37570,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 45, - 26, - 194, - 156, - 89, - 138, - 132, - 47, - 120, - 101, - 167, - 131, - 89, - 254, - 146, - 90, - 176, - 18, - 144, - 125, - 243, - 239, - 34, - 236, - 238, - 140, - 62, - 56, - 119, - 92, + 21, + 78, + 127, + 225, + 88, 71, - 253, + 172, + 77, + 28, + 217, + 63, + 166, + 200, + 32, + 150, + 114, + 207, + 204, + 244, + 90, + 216, + 225, + 58, + 184, + 47, + 198, + 177, + 103, + 186, + 25, + 148, + 252, 97, 86, 32, @@ -37720,38 +37719,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 3, - 136, - 159, - 97, - 43, - 209, - 126, - 1, - 27, - 19, - 144, - 38, - 115, - 167, - 6, - 136, - 187, - 172, - 223, - 34, - 112, - 76, - 200, - 41, - 87, - 64, - 160, - 184, - 85, - 149, - 95, + 23, + 107, + 16, + 212, + 2, + 250, 192, + 91, + 252, + 152, + 34, + 52, + 245, + 11, + 48, + 90, + 208, + 103, + 225, + 34, + 241, + 104, + 42, + 75, + 156, + 75, + 217, + 139, + 218, + 145, + 145, + 157, 97, 86, 224, @@ -37759,38 +37758,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 7, - 122, - 73, 29, + 98, + 231, + 141, + 101, + 94, + 63, + 199, + 65, + 136, + 102, + 103, + 56, + 252, + 166, + 82, + 74, + 113, + 47, + 26, + 60, + 76, + 207, 221, - 129, - 219, - 209, - 128, - 45, - 137, - 115, - 90, - 232, - 129, - 197, - 109, - 169, - 127, - 144, - 142, - 11, - 182, - 163, - 168, - 173, - 111, - 217, - 247, - 45, - 177, - 35, + 15, + 164, + 79, + 62, + 44, + 132, + 156, + 81, 97, 87, 0, @@ -37908,38 +37907,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 41, - 63, - 62, - 234, - 190, - 179, - 135, - 231, - 140, - 151, - 164, - 222, - 66, - 13, - 35, - 54, - 255, - 142, - 209, + 1, + 157, + 215, + 238, + 83, + 25, + 144, + 211, + 53, 170, - 173, - 247, - 151, - 199, - 220, - 62, - 98, - 44, - 159, - 20, - 64, - 82, + 216, + 246, + 76, + 38, + 161, + 188, + 7, + 43, + 71, + 167, + 239, + 212, + 80, + 68, + 4, + 210, + 233, + 94, + 32, + 37, + 7, + 89, 97, 87, 192, @@ -37947,38 +37946,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 4, - 248, - 20, - 17, - 72, + 12, + 65, + 61, + 216, + 229, + 1, + 137, 160, - 131, - 237, - 120, - 210, - 100, - 182, - 34, - 204, - 211, - 159, - 220, - 46, 90, - 77, - 67, - 9, - 222, - 248, - 60, - 101, - 246, - 65, - 250, - 31, - 115, - 174, + 55, + 70, + 121, + 186, + 231, + 47, + 114, + 79, + 123, + 113, + 233, + 86, + 195, + 44, + 8, + 129, + 234, + 55, + 105, + 66, + 118, + 234, + 131, 97, 87, 224, @@ -38096,38 +38095,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 21, - 56, - 66, - 247, - 195, - 212, - 33, - 61, - 26, - 11, - 223, - 2, - 114, - 220, - 10, - 192, + 7, + 48, + 121, + 157, 91, - 135, - 148, + 254, + 193, + 206, + 252, + 90, + 175, + 252, + 255, + 227, + 243, + 221, + 73, + 27, + 43, + 252, + 175, + 159, + 85, + 63, 148, - 149, - 169, - 70, - 128, - 234, - 7, - 245, - 82, - 140, - 212, - 203, - 101, + 222, + 97, + 69, + 237, + 71, + 66, + 175, 97, 88, 160, @@ -38135,38 +38134,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 25, - 116, - 129, - 238, - 227, - 146, - 24, - 145, - 129, - 211, - 61, - 81, - 136, - 59, - 97, - 45, - 196, + 36, + 173, + 74, + 240, + 130, + 233, + 107, + 20, 185, - 183, - 180, - 10, - 195, - 197, - 22, - 208, - 78, - 245, - 139, - 68, + 166, + 218, + 128, + 244, + 250, + 19, + 52, + 242, + 83, + 196, 88, + 173, + 213, + 49, + 200, + 217, 248, - 65, + 178, + 60, + 94, + 203, + 156, + 67, 97, 88, 192, @@ -38284,38 +38283,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 46, - 178, - 223, - 150, - 73, - 23, - 94, - 214, - 137, - 174, - 155, + 34, + 225, + 205, + 191, + 255, + 207, + 207, + 79, 24, - 189, - 156, - 45, - 165, - 94, - 6, - 242, - 139, - 139, - 173, - 228, - 14, + 207, + 67, + 66, + 237, + 241, + 251, + 38, + 195, + 182, + 229, + 42, 206, - 88, - 79, - 230, - 70, - 152, - 122, - 242, + 61, + 95, + 173, + 207, + 92, + 194, + 97, + 67, + 51, + 186, + 164, 97, 89, 128, @@ -38323,38 +38322,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 6, - 11, - 216, - 98, - 210, - 103, - 214, - 34, - 190, - 207, + 14, + 40, + 223, + 114, + 220, + 198, + 156, + 198, 68, - 124, - 150, - 224, + 45, + 114, + 246, + 147, + 102, + 25, + 151, + 72, 10, - 7, - 90, - 85, - 106, - 18, - 213, - 122, - 137, - 205, - 252, - 204, - 213, 145, - 128, - 214, - 225, - 131, + 58, + 195, + 83, + 137, + 14, + 253, + 99, + 168, + 115, + 149, + 151, + 39, + 192, 97, 89, 160, @@ -38472,38 +38471,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 38, - 26, - 176, - 71, - 202, - 203, - 246, - 253, - 169, - 16, - 181, - 148, - 229, - 164, - 127, - 206, - 23, - 215, - 191, - 89, - 18, - 168, - 3, - 161, - 89, - 114, + 11, + 48, + 254, + 149, + 129, + 166, + 199, + 0, + 100, + 227, + 179, + 84, 70, + 178, + 67, 56, - 172, - 154, - 146, - 147, + 66, + 219, + 118, + 232, + 250, + 213, + 71, + 251, + 177, + 238, + 105, + 145, + 100, + 115, + 247, + 237, 97, 90, 96, @@ -38511,38 +38510,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 28, - 25, - 207, - 153, - 205, - 153, - 192, - 162, - 153, - 94, - 123, - 84, + 40, + 110, 15, - 14, - 19, - 29, - 90, - 118, - 173, - 161, - 159, - 82, - 219, - 249, - 123, + 135, + 214, + 25, + 227, + 254, + 218, + 200, + 163, + 215, + 68, + 46, 243, - 247, - 224, - 72, - 226, - 77, + 79, + 182, + 86, + 108, + 233, + 175, + 90, + 49, 87, + 88, + 192, + 194, + 184, + 0, + 12, + 54, + 207, 97, 90, 128, @@ -38660,38 +38659,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 9, - 133, + 20, + 230, + 106, + 119, + 30, + 240, + 140, + 202, + 5, + 81, + 194, + 107, + 52, + 57, + 212, + 157, + 57, + 27, + 162, + 29, + 145, + 183, + 6, + 223, 44, - 196, - 215, - 228, - 53, - 133, - 248, - 10, - 113, - 187, - 101, - 141, - 17, - 124, - 139, - 173, - 74, - 253, - 56, - 197, - 98, - 80, - 247, - 158, - 47, + 75, + 31, + 23, + 125, + 119, + 89, 229, - 234, - 54, - 203, - 234, 97, 91, 64, @@ -38699,38 +38698,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 14, - 175, - 223, - 29, - 192, - 235, - 197, - 12, - 102, - 162, - 142, - 244, - 228, - 206, - 17, - 214, - 125, - 194, - 104, - 53, - 238, + 5, + 50, + 114, + 58, + 38, + 220, + 146, 143, - 202, - 136, - 83, - 8, - 196, - 232, - 0, - 229, + 67, 3, - 219, + 62, + 250, + 239, + 142, + 74, + 162, + 115, + 39, + 114, + 186, + 65, + 75, + 29, + 173, + 206, + 31, + 231, + 208, + 179, + 13, + 153, + 210, 97, 91, 96, @@ -38848,38 +38847,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 6, - 13, - 5, - 217, - 52, + 4, + 116, + 174, + 28, + 66, + 48, + 189, + 205, + 210, + 92, + 228, + 96, + 239, 115, - 24, - 184, - 196, - 130, - 244, - 61, - 88, - 155, - 171, - 227, - 76, - 79, - 234, 198, + 137, + 228, + 34, 126, - 99, - 59, - 124, - 125, - 32, - 81, - 36, - 229, - 148, - 32, - 49, + 223, + 14, + 199, + 194, + 190, + 133, + 239, + 141, + 117, + 89, + 46, + 27, + 54, 97, 92, 32, @@ -38887,38 +38886,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 18, - 107, - 206, - 94, - 6, - 83, - 23, - 244, - 44, - 78, - 160, - 145, - 101, + 47, + 216, + 62, + 110, + 7, + 204, + 53, + 117, + 90, + 4, + 51, + 127, + 215, + 10, + 248, + 170, + 49, + 252, + 116, + 222, + 7, + 165, + 57, + 184, + 168, + 117, + 108, + 170, + 96, 208, - 0, - 8, - 32, - 36, - 56, - 225, - 196, + 72, 144, - 213, - 114, - 198, - 183, - 102, - 19, - 242, - 26, - 30, - 191, 97, 92, 64, @@ -39036,38 +39035,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 29, - 15, - 148, - 243, - 83, - 94, - 88, + 28, + 111, + 147, + 174, + 247, + 149, + 245, + 37, + 200, 181, - 208, - 108, - 51, - 155, - 99, - 100, - 183, - 124, - 175, - 195, - 137, - 79, - 1, - 137, - 215, - 119, - 160, - 143, - 32, - 206, - 35, - 154, - 26, + 27, + 203, + 2, + 52, + 187, 52, + 89, + 66, + 204, + 49, + 120, + 43, + 247, + 80, + 150, + 255, + 242, + 112, + 127, + 62, + 75, + 159, 97, 93, 0, @@ -39075,38 +39074,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 11, - 83, - 173, - 80, - 124, - 70, - 154, - 35, - 130, - 57, - 249, - 62, - 66, - 224, - 113, - 148, + 27, + 248, + 75, 118, - 31, - 57, - 105, - 72, - 168, - 212, - 175, + 24, + 113, + 163, + 49, 27, - 46, - 243, - 237, - 160, - 186, - 54, - 159, + 9, + 109, + 135, + 5, + 52, + 176, + 164, + 176, + 149, + 51, + 12, + 212, + 95, + 190, + 123, + 187, + 245, + 179, + 83, + 169, + 128, + 195, + 157, 97, 93, 32, @@ -39224,38 +39223,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 5, - 255, - 214, - 244, - 127, - 173, - 193, - 61, - 65, - 63, - 247, - 61, - 61, - 205, - 43, - 84, - 19, - 151, - 13, - 35, - 40, - 172, - 229, - 81, - 179, - 177, - 213, - 242, - 10, - 104, - 115, + 7, + 96, + 155, + 167, + 145, + 240, + 237, + 93, + 86, + 144, + 145, + 4, + 28, + 128, + 9, + 116, + 184, + 68, + 11, + 197, + 192, + 249, + 125, + 155, + 98, + 149, + 161, + 99, + 33, 117, + 17, + 108, 97, 93, 224, @@ -39263,38 +39262,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 38, - 117, - 149, - 171, - 39, - 198, - 143, - 246, - 157, - 6, - 200, - 194, - 133, - 133, - 151, - 62, - 240, - 251, - 173, + 28, + 219, + 4, + 18, + 243, 142, - 9, - 130, - 135, 26, 25, - 59, - 2, + 83, + 26, + 251, + 209, + 201, + 96, + 49, + 70, + 231, + 189, + 28, + 52, + 169, + 61, + 246, + 190, + 76, 101, - 65, - 226, - 120, - 147, + 177, + 38, + 227, + 83, + 123, + 104, 97, 94, 0, @@ -39412,38 +39411,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 45, - 202, - 75, - 113, - 54, - 251, - 211, - 151, - 66, - 97, 14, - 234, - 226, - 1, - 231, - 107, + 149, + 91, + 137, + 236, + 165, + 252, + 52, + 210, + 23, + 32, + 34, + 248, + 157, + 196, + 103, + 172, + 46, + 132, + 201, + 146, + 158, + 28, + 224, 194, - 41, + 168, + 206, + 131, + 28, 93, - 220, - 32, - 204, - 24, - 221, - 107, - 25, - 170, - 123, - 114, - 75, - 19, + 215, + 1, 97, 94, 192, @@ -39451,38 +39450,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 35, - 4, - 142, - 155, - 178, - 222, - 190, - 175, + 7, 207, - 149, - 98, - 138, - 184, - 27, - 3, - 39, - 92, + 146, + 154, + 220, + 230, + 20, + 176, + 136, + 200, + 44, + 179, + 147, + 79, + 30, + 183, + 84, + 109, + 210, + 228, + 131, + 150, + 233, + 20, + 180, + 255, + 6, + 236, + 69, 222, - 227, - 59, - 202, - 24, - 213, - 121, - 221, - 226, - 102, - 31, - 100, - 100, - 94, - 197, + 158, + 138, 97, 94, 224, @@ -39600,38 +39599,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 5, - 70, - 156, - 36, - 15, - 123, - 95, - 237, - 193, - 37, - 186, - 30, - 230, - 108, - 174, - 19, - 119, - 236, + 45, + 69, + 49, + 164, 117, - 87, + 40, + 230, + 66, + 248, + 246, 149, - 153, - 39, - 143, - 99, - 15, - 45, - 118, - 64, - 153, - 79, - 236, + 74, + 63, + 63, + 249, + 246, + 7, + 46, + 56, + 211, + 14, + 46, + 13, + 16, + 141, + 28, + 172, + 32, + 29, + 75, + 104, + 77, 97, 95, 160, @@ -39639,38 +39638,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 8, - 184, - 20, - 207, - 162, + 21, + 76, + 64, + 155, + 189, + 23, 96, - 116, - 170, + 236, + 85, + 99, + 157, + 50, + 213, + 129, + 124, + 147, + 153, + 229, + 115, + 178, + 42, + 143, + 221, + 165, + 247, + 7, + 201, + 185, 222, - 123, - 171, - 19, - 180, - 148, - 245, - 152, - 170, - 91, - 253, - 188, - 73, - 208, - 223, + 29, 76, - 67, - 144, - 221, - 105, - 40, - 93, - 3, - 208, + 166, 97, 95, 192, @@ -39788,77 +39787,77 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 250, - 246, - 25, - 188, - 121, - 246, - 232, - 236, - 211, - 126, - 225, - 82, - 230, - 190, - 252, - 123, - 119, - 137, - 193, - 181, - 148, - 84, + 36, + 2, + 219, 75, - 242, - 8, - 73, - 51, - 146, - 168, - 238, - 40, + 28, + 119, + 70, + 220, + 217, + 254, + 126, + 171, + 130, + 171, + 63, + 167, + 235, + 177, + 189, + 53, + 42, + 154, + 249, + 78, + 246, + 129, + 27, + 42, + 249, + 171, + 111, + 142, 97, 96, 128, - 131, - 1, - 82, - 127, - 42, - 145, - 132, - 46, - 24, - 243, - 172, - 118, - 30, - 95, - 101, - 237, - 198, - 64, - 221, - 66, - 239, - 109, - 145, - 21, - 182, - 73, - 173, - 58, - 205, - 255, - 108, - 206, - 215, + 131, + 1, + 82, + 127, + 42, + 0, + 71, + 236, + 8, 162, - 116, - 170, + 84, + 117, + 60, + 70, + 102, + 72, + 240, + 220, + 110, + 7, + 126, + 136, + 229, + 73, + 88, + 41, + 195, + 168, + 69, + 135, + 59, + 144, + 88, + 191, + 68, + 7, 97, 96, 160, @@ -39976,38 +39975,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 15, - 212, - 68, - 47, - 83, - 230, - 181, - 165, - 248, - 96, - 194, - 200, - 17, - 207, - 78, - 73, - 134, - 66, - 49, - 74, - 188, - 53, + 4, + 118, + 199, + 241, + 84, + 247, + 3, + 103, + 42, + 221, + 116, + 255, + 235, + 198, + 255, + 166, + 21, + 155, 78, + 82, + 127, 10, - 23, - 75, - 230, - 184, - 188, - 14, - 39, - 229, + 67, + 84, + 182, + 1, + 250, + 205, + 87, + 255, + 26, + 26, 97, 97, 96, @@ -40015,38 +40014,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 9, - 31, - 63, + 39, + 193, + 2, + 144, + 247, + 48, + 237, + 173, + 155, 203, - 232, - 154, - 35, - 196, - 69, - 140, - 46, + 37, 56, - 199, - 182, - 68, - 78, - 40, - 216, + 5, + 111, + 117, + 94, + 254, + 169, 36, - 76, - 8, - 84, - 158, - 149, - 37, - 206, - 237, - 244, - 163, - 32, - 203, - 192, + 176, + 166, + 157, + 134, + 213, + 201, + 200, + 51, + 113, + 126, + 115, + 14, + 40, 97, 97, 128, @@ -40164,38 +40163,38 @@ pub mod inclusion_verifier { 146, 80, 127, + 7, + 67, + 234, + 64, + 241, + 64, + 132, + 219, + 38, + 115, + 33, + 114, + 131, + 170, 5, - 12, - 186, - 44, - 164, - 140, - 200, - 130, - 104, - 122, - 158, - 102, - 134, - 126, + 63, 152, - 78, - 44, - 229, - 73, - 71, - 120, - 168, - 188, - 175, - 253, - 210, + 104, + 150, + 238, + 124, + 24, + 31, + 82, + 17, + 132, + 66, + 233, + 156, + 69, 41, - 107, - 169, - 171, - 219, - 86, + 116, 97, 98, 64, @@ -40203,38 +40202,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 14, - 68, - 208, - 171, - 33, - 51, - 113, - 74, - 252, - 233, + 2, + 3, + 227, + 73, 58, - 53, - 77, - 98, + 37, + 148, + 236, + 229, + 125, + 34, + 204, + 117, + 221, + 8, + 26, + 198, + 130, 113, - 71, - 12, - 41, - 63, - 24, - 239, - 41, 236, - 200, - 116, - 65, - 111, + 124, + 117, 129, - 255, - 185, - 40, - 24, + 83, + 207, + 210, + 21, + 43, + 251, + 92, + 25, + 227, 97, 98, 96, @@ -40352,77 +40351,76 @@ pub mod inclusion_verifier { 146, 80, 127, - 47, - 105, - 164, - 31, - 255, - 92, - 190, - 85, - 218, - 7, - 211, - 14, - 120, - 154, - 13, - 118, - 96, - 211, + 30, + 135, + 235, + 136, + 87, + 119, + 149, + 201, + 242, + 140, + 66, + 59, + 77, + 44, + 62, + 193, 232, - 65, - 199, - 14, - 187, - 50, - 111, - 88, - 37, - 97, + 144, + 22, + 68, + 102, + 234, + 151, + 66, + 217, + 153, + 106, + 229, + 195, + 184, 10, - 74, - 92, - 8, + 42, 97, 99, 32, 131, 1, 82, - 127, - 31, - 231, - 231, - 65, - 26, - 89, - 158, - 138, - 221, - 245, - 70, - 71, - 17, - 148, - 164, - 133, - 29, - 54, + 126, + 176, + 4, + 129, + 75, + 36, 199, - 17, - 168, - 142, - 146, - 102, - 50, - 245, - 113, - 240, - 217, - 31, - 201, - 246, + 199, + 169, + 220, + 86, + 255, + 160, + 61, + 79, + 43, + 126, + 15, + 86, + 5, + 243, + 187, + 24, + 222, + 221, + 249, + 230, + 57, + 120, + 171, + 188, + 86, 97, 99, 64, @@ -40540,38 +40538,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 38, - 165, - 168, - 9, - 127, - 102, - 5, - 10, - 154, - 61, - 129, - 93, - 57, - 21, - 235, - 18, - 45, - 117, - 2, - 7, - 119, + 41, + 3, + 167, + 99, + 193, + 198, + 183, + 134, + 103, 249, - 232, - 123, - 22, + 6, + 182, + 254, + 43, + 74, + 209, + 151, + 181, + 85, + 135, + 201, 14, - 103, - 204, - 127, - 161, - 126, - 94, + 20, + 232, + 80, + 36, + 70, + 218, + 140, + 69, + 239, + 125, 97, 100, 0, @@ -40579,38 +40577,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 18, - 192, - 23, - 63, - 222, - 196, + 19, + 234, + 87, + 152, + 111, + 146, + 149, + 233, + 45, + 239, + 51, + 3, + 174, 245, - 78, - 114, - 160, + 63, + 43, + 79, + 98, + 91, + 169, + 133, + 83, + 18, + 1, 171, - 57, - 253, - 154, - 95, - 250, - 20, - 54, - 75, - 187, - 30, - 243, - 4, - 97, - 10, - 241, - 113, - 149, - 185, - 147, - 179, - 22, + 83, + 220, + 115, + 7, + 244, + 107, + 105, 97, 100, 32, @@ -42543,38 +42541,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 29, - 52, - 186, - 110, - 59, - 82, - 175, - 168, - 168, - 223, - 5, - 107, - 252, - 81, - 87, - 250, - 22, + 38, + 24, + 106, + 45, + 101, + 238, + 77, + 47, + 156, + 154, + 91, + 145, + 248, + 101, + 151, + 211, + 95, + 25, + 44, + 209, + 32, + 202, + 247, + 233, + 53, + 216, + 68, + 61, + 25, + 56, 226, - 197, - 187, - 4, - 90, - 171, - 113, - 134, - 170, - 181, - 143, - 112, - 146, - 127, - 188, + 61, 97, 112, 96, @@ -42582,38 +42580,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 11, - 74, - 2, - 46, - 184, - 252, - 80, - 61, - 157, - 145, - 102, - 12, - 120, - 63, - 198, - 227, - 122, - 230, - 21, - 112, - 235, - 228, - 136, - 63, - 54, - 99, - 213, - 180, - 164, + 48, + 68, + 31, + 209, + 181, + 211, + 55, + 4, + 130, + 196, + 33, + 82, + 168, + 137, + 144, + 39, + 113, + 105, + 137, + 166, + 153, + 108, + 37, 53, - 102, - 94, + 188, + 159, + 127, + 238, + 138, + 174, + 247, + 158, 97, 112, 128, @@ -42621,38 +42619,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 36, - 149, - 224, - 61, - 94, + 22, + 243, + 99, + 241, + 3, + 200, + 13, + 123, + 188, + 138, + 211, + 198, + 134, + 126, + 8, + 34, + 187, + 198, + 0, + 11, + 233, + 26, + 70, + 137, + 117, 92, - 157, - 106, - 207, - 98, - 205, - 247, - 21, - 17, - 142, - 235, - 189, - 169, - 18, - 227, - 9, - 45, - 254, - 62, - 152, - 19, - 237, - 100, - 44, - 223, - 4, - 18, + 125, + 244, + 2, + 33, + 193, + 69, 97, 112, 160, @@ -42660,38 +42658,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 11, - 154, - 140, - 207, - 27, - 201, - 241, - 179, - 107, - 116, - 121, - 42, - 209, - 0, - 7, - 206, - 87, - 158, - 139, - 165, - 87, - 74, - 152, - 128, - 214, + 43, + 28, + 187, + 62, + 82, + 30, 223, - 244, - 218, - 132, + 90, + 98, + 45, + 130, 118, - 142, - 254, + 42, + 68, + 165, + 230, + 63, + 30, + 80, + 179, + 50, + 215, + 17, + 84, + 164, + 167, + 149, + 141, + 96, + 17, + 222, + 255, 97, 112, 192, @@ -42829,14 +42827,14 @@ pub mod inclusion_verifier { 21, 97, 82, - 178, + 177, 87, 97, 82, - 178, + 177, 97, 82, - 115, + 114, 86, 91, 96, @@ -42857,7 +42855,7 @@ pub mod inclusion_verifier { 18, 97, 82, - 203, + 202, 87, 96, 0, @@ -42880,19 +42878,19 @@ pub mod inclusion_verifier { 21, 97, 82, - 229, + 228, 87, 97, 82, - 229, + 228, 97, 82, - 115, + 114, 86, 91, 97, 82, - 248, + 247, 96, 31, 130, @@ -42906,7 +42904,7 @@ pub mod inclusion_verifier { 1, 97, 82, - 137, + 136, 86, 91, 129, @@ -42923,7 +42921,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 13, + 12, 87, 96, 0, @@ -42971,7 +42969,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 61, + 60, 87, 96, 0, @@ -42995,7 +42993,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 85, + 84, 87, 96, 0, @@ -43015,7 +43013,7 @@ pub mod inclusion_verifier { 18, 97, 83, - 105, + 104, 87, 96, 0, @@ -43032,14 +43030,14 @@ pub mod inclusion_verifier { 21, 97, 83, - 125, + 124, 87, 97, 83, - 125, + 124, 97, 82, - 115, + 114, 86, 91, 129, @@ -43048,13 +43046,13 @@ pub mod inclusion_verifier { 27, 97, 83, - 140, + 139, 130, 130, 1, 97, 82, - 137, + 136, 86, 91, 146, @@ -43076,7 +43074,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 166, + 165, 87, 96, 0, @@ -43094,7 +43092,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 196, + 195, 87, 134, 53, @@ -43110,7 +43108,7 @@ pub mod inclusion_verifier { 144, 97, 83, - 171, + 170, 86, 91, 151, @@ -43129,7 +43127,7 @@ pub mod inclusion_verifier { 21, 97, 83, - 219, + 218, 87, 96, 0, @@ -43139,14 +43137,14 @@ pub mod inclusion_verifier { 80, 97, 83, - 232, + 231, 133, 130, 134, 1, 97, 82, - 186, + 185, 86, 91, 145, @@ -43233,38 +43231,38 @@ pub mod inclusion_verifier { 34, 18, 32, - 172, - 206, - 110, - 12, - 63, - 213, - 170, - 87, - 115, - 229, - 140, - 90, - 241, - 129, - 24, - 92, - 117, - 238, - 219, - 174, - 224, - 140, - 222, - 165, - 248, - 100, - 60, - 101, - 117, - 178, - 91, + 143, + 15, + 8, + 193, + 19, + 215, + 30, + 154, + 255, + 208, 74, + 147, + 10, + 12, + 207, + 255, + 244, + 28, + 199, + 158, + 53, + 137, + 50, + 207, + 167, + 172, + 19, + 149, + 194, + 66, + 68, + 5, 100, 115, 111, diff --git a/backend/src/contracts/generated/mod.rs b/backend/src/contracts/generated/mod.rs index a944f3aa..a4524590 100644 --- a/backend/src/contracts/generated/mod.rs +++ b/backend/src/contracts/generated/mod.rs @@ -1,3 +1,3 @@ -pub mod summa_contract; +pub mod inclusion_verifier; pub mod solvency_verifier; -pub mod inclusion_verifier; \ No newline at end of file +pub mod summa_contract; diff --git a/backend/src/contracts/generated/solvency_verifier.rs b/backend/src/contracts/generated/solvency_verifier.rs index 87a20a95..c4614e1f 100644 --- a/backend/src/contracts/generated/solvency_verifier.rs +++ b/backend/src/contracts/generated/solvency_verifier.rs @@ -41,7 +41,7 @@ pub mod solvency_verifier { 80, 97, 80, - 19, + 18, 128, 97, 0, @@ -113,7 +113,7 @@ pub mod solvency_verifier { 4, 97, 78, - 213, + 212, 86, 91, 97, @@ -150,7 +150,7 @@ pub mod solvency_verifier { 99, 97, 77, - 254, + 253, 86, 91, 96, @@ -161,7 +161,7 @@ pub mod solvency_verifier { 32, 97, 79, - 190, + 189, 131, 57, 129, @@ -181,7 +181,7 @@ pub mod solvency_verifier { 32, 97, 79, - 158, + 157, 131, 57, 129, @@ -207,7 +207,7 @@ pub mod solvency_verifier { 32, 97, 79, - 158, + 157, 131, 57, 129, @@ -225,7 +225,7 @@ pub mod solvency_verifier { 32, 97, 79, - 158, + 157, 131, 57, 129, @@ -245,7 +245,7 @@ pub mod solvency_verifier { 32, 97, 79, - 158, + 157, 131, 57, 129, @@ -307,39 +307,38 @@ pub mod solvency_verifier { 131, 1, 82, - 127, - 39, - 17, - 67, - 58, - 38, - 171, - 77, - 162, - 236, - 135, - 64, - 102, - 109, + 126, + 174, + 153, 177, - 247, - 13, - 49, - 129, - 136, - 36, - 224, - 161, + 55, + 145, + 111, + 244, 34, - 168, - 154, - 18, - 164, - 58, - 99, - 169, - 183, + 11, 13, + 167, + 23, + 154, + 70, + 1, + 48, + 28, + 130, + 52, + 111, + 198, + 101, + 205, + 51, + 105, + 165, + 78, + 31, + 2, + 212, + 234, 96, 0, 131, @@ -370,7 +369,7 @@ pub mod solvency_verifier { 132, 97, 1, - 68, + 67, 130, 132, 97, @@ -408,7 +407,7 @@ pub mod solvency_verifier { 132, 97, 1, - 106, + 105, 130, 132, 97, @@ -448,7 +447,7 @@ pub mod solvency_verifier { 132, 97, 1, - 146, + 145, 130, 132, 97, @@ -526,7 +525,7 @@ pub mod solvency_verifier { 132, 97, 1, - 224, + 223, 130, 132, 97, @@ -568,7 +567,7 @@ pub mod solvency_verifier { 132, 97, 2, - 10, + 9, 130, 132, 97, @@ -683,7 +682,7 @@ pub mod solvency_verifier { 132, 97, 2, - 125, + 124, 130, 132, 97, @@ -725,7 +724,7 @@ pub mod solvency_verifier { 132, 97, 2, - 167, + 166, 130, 132, 97, @@ -767,7 +766,7 @@ pub mod solvency_verifier { 132, 97, 2, - 209, + 208, 130, 132, 97, @@ -809,7 +808,7 @@ pub mod solvency_verifier { 132, 97, 2, - 251, + 250, 130, 132, 97, @@ -889,7 +888,7 @@ pub mod solvency_verifier { 132, 97, 3, - 75, + 74, 130, 132, 97, @@ -931,7 +930,7 @@ pub mod solvency_verifier { 132, 97, 3, - 117, + 116, 130, 132, 97, @@ -973,7 +972,7 @@ pub mod solvency_verifier { 132, 97, 3, - 159, + 158, 130, 132, 97, @@ -1015,7 +1014,7 @@ pub mod solvency_verifier { 132, 97, 3, - 201, + 200, 130, 132, 97, @@ -1057,7 +1056,7 @@ pub mod solvency_verifier { 132, 97, 3, - 243, + 242, 130, 132, 97, @@ -1678,7 +1677,7 @@ pub mod solvency_verifier { 132, 97, 6, - 96, + 95, 130, 132, 97, @@ -1757,7 +1756,7 @@ pub mod solvency_verifier { 132, 97, 6, - 175, + 174, 130, 132, 97, @@ -3059,7 +3058,7 @@ pub mod solvency_verifier { 32, 97, 79, - 190, + 189, 131, 57, 129, @@ -10122,7 +10121,7 @@ pub mod solvency_verifier { 32, 97, 79, - 190, + 189, 131, 57, 129, @@ -10954,7 +10953,7 @@ pub mod solvency_verifier { 32, 97, 79, - 190, + 189, 131, 57, 129, @@ -15908,38 +15907,38 @@ pub mod solvency_verifier { 146, 80, 127, - 47, - 118, - 187, - 91, - 135, - 166, - 150, + 6, + 85, + 214, + 41, + 121, + 220, + 6, + 45, + 193, + 232, + 193, + 83, + 52, + 191, + 23, + 207, + 92, + 126, + 99, + 82, + 33, 156, - 78, - 187, - 133, - 27, - 177, - 13, - 241, - 115, - 164, - 98, - 49, - 107, - 236, - 51, - 57, - 44, - 66, - 108, - 47, - 43, - 58, - 35, - 241, - 139, + 11, + 208, + 176, + 204, + 3, + 149, + 152, + 217, + 166, + 105, 97, 85, 32, @@ -15947,38 +15946,38 @@ pub mod solvency_verifier { 1, 82, 127, - 17, - 40, - 228, - 200, - 175, - 88, - 44, - 105, - 194, - 9, - 219, - 135, - 236, - 24, - 250, - 133, + 1, + 149, + 137, + 211, + 0, + 47, + 106, + 13, + 237, 70, - 110, - 167, - 27, - 113, - 152, - 246, - 216, - 199, + 166, 144, - 131, - 16, - 50, - 97, - 254, - 195, + 83, + 240, + 192, + 94, + 122, + 124, + 164, + 83, + 57, + 179, + 210, + 186, + 232, + 93, + 0, + 242, + 106, + 192, + 243, + 62, 97, 85, 64, @@ -16096,38 +16095,38 @@ pub mod solvency_verifier { 146, 80, 127, - 19, - 52, + 30, + 171, + 153, + 149, 146, - 73, + 56, + 82, + 8, + 180, + 42, + 18, + 220, + 192, + 71, + 118, 62, - 182, - 36, - 153, - 193, - 186, - 3, - 168, - 113, - 95, - 141, - 7, - 231, - 132, - 144, - 241, - 87, - 239, - 96, - 59, + 229, + 207, + 18, + 5, + 46, + 180, + 176, + 217, + 167, + 162, + 134, + 224, + 67, + 243, 223, - 186, - 251, - 57, - 106, - 27, - 220, - 191, + 159, 97, 86, 0, @@ -16135,38 +16134,38 @@ pub mod solvency_verifier { 1, 82, 127, - 7, - 155, - 11, - 93, - 88, - 231, - 57, - 238, - 166, - 189, - 254, - 64, - 146, - 226, - 50, - 186, - 206, - 224, - 208, - 39, - 189, - 15, - 81, - 134, - 194, - 41, - 119, - 191, - 210, + 24, + 136, + 126, + 179, + 198, 70, - 32, - 215, + 255, + 212, + 150, + 18, + 38, + 201, + 27, + 172, + 150, + 97, + 0, + 71, + 152, + 177, + 252, + 106, + 57, + 196, + 63, + 154, + 109, + 29, + 3, + 118, + 113, + 148, 97, 86, 32, @@ -16284,38 +16283,38 @@ pub mod solvency_verifier { 146, 80, 127, - 24, - 123, - 221, - 234, - 125, - 190, - 28, - 90, - 205, + 7, + 104, + 6, + 5, + 139, + 2, + 225, + 181, + 233, + 155, + 47, 46, - 1, - 175, - 173, - 193, - 192, + 142, + 238, + 97, + 49, + 148, + 248, 223, - 56, - 24, - 12, - 0, - 171, - 116, - 57, - 53, - 33, - 81, - 183, - 232, - 1, - 80, - 42, - 11, + 115, + 72, + 22, + 89, + 245, + 147, + 139, + 170, + 205, + 100, + 228, + 215, + 184, 97, 86, 224, @@ -16323,38 +16322,38 @@ pub mod solvency_verifier { 1, 82, 127, - 15, - 194, - 104, - 154, - 39, - 157, - 186, - 154, - 54, - 138, - 52, - 152, - 128, + 5, + 174, + 129, 100, - 229, - 220, - 79, - 28, - 211, - 242, - 89, - 139, - 210, - 166, - 148, - 158, - 27, - 26, - 2, - 209, - 11, - 118, + 75, + 36, + 77, + 206, + 234, + 83, + 80, + 168, + 74, + 121, + 203, + 240, + 161, + 153, + 187, + 214, + 193, + 250, + 217, + 136, + 116, + 35, + 248, + 200, + 4, + 142, + 96, + 57, 97, 87, 0, @@ -16472,38 +16471,38 @@ pub mod solvency_verifier { 146, 80, 127, - 22, - 251, - 208, - 175, - 75, - 89, - 220, - 137, - 3, - 70, - 48, + 4, + 56, + 135, + 63, + 192, + 2, + 49, + 174, + 82, + 126, + 252, + 247, 77, - 53, - 201, - 153, - 221, - 141, + 144, + 146, + 245, + 5, + 157, 250, - 211, - 160, - 106, - 216, - 161, - 15, - 71, - 69, + 5, 39, - 250, - 217, - 234, - 156, - 50, + 92, + 190, + 115, + 129, + 233, + 72, + 254, + 59, + 123, + 97, + 216, 97, 87, 192, @@ -16511,38 +16510,38 @@ pub mod solvency_verifier { 1, 82, 127, - 42, - 176, - 21, - 188, + 3, + 192, + 243, + 20, + 201, + 52, + 3, + 121, 43, - 138, - 25, - 180, - 131, - 56, - 146, - 129, - 135, - 99, - 129, - 116, - 6, - 85, - 98, - 208, - 165, 168, - 59, - 0, - 133, - 70, - 169, - 230, - 97, - 46, - 198, - 196, + 110, + 195, + 132, + 27, + 48, + 128, + 242, + 247, + 205, + 9, + 44, + 107, + 203, + 99, + 44, + 219, + 194, + 18, + 42, + 19, + 205, + 239, 97, 87, 224, @@ -16660,38 +16659,38 @@ pub mod solvency_verifier { 146, 80, 127, - 29, - 207, - 179, + 43, + 18, + 177, + 50, + 166, + 38, + 26, + 214, + 2, + 73, 20, - 144, - 181, - 147, - 39, - 100, - 47, - 75, - 147, - 146, - 70, - 91, - 216, - 130, + 117, + 153, + 202, + 224, + 213, + 179, + 84, + 126, + 81, + 13, + 234, + 187, + 166, + 85, + 38, + 209, + 48, + 240, 79, - 115, - 42, - 158, - 148, - 228, - 107, - 11, - 173, - 50, - 181, - 112, - 96, - 135, - 175, + 36, + 2, 97, 88, 160, @@ -16699,38 +16698,38 @@ pub mod solvency_verifier { 1, 82, 127, - 22, - 180, - 132, - 41, - 11, - 72, - 220, - 232, - 67, - 198, - 186, - 177, - 230, - 78, - 127, - 69, - 235, - 66, - 75, - 177, - 124, - 230, - 5, - 251, - 206, - 164, - 101, + 19, + 227, + 192, + 44, + 224, 15, + 107, + 126, + 0, + 213, 176, - 33, + 153, + 237, + 165, + 241, + 21, + 89, + 86, + 174, + 131, + 137, + 154, + 45, + 89, + 206, + 252, + 176, + 13, + 173, + 102, + 167, 246, - 0, 97, 88, 192, @@ -16848,38 +16847,38 @@ pub mod solvency_verifier { 146, 80, 127, - 30, - 235, - 63, - 123, - 38, - 213, - 201, - 135, - 27, - 194, - 193, - 106, - 78, - 213, - 5, - 109, - 190, - 97, - 58, - 75, - 173, - 7, - 161, - 134, + 14, + 216, + 51, + 112, + 39, + 126, + 15, + 211, 94, - 148, - 181, - 163, - 241, - 244, - 104, - 66, + 130, + 88, + 221, + 86, + 48, + 206, + 12, + 227, + 73, + 31, + 223, + 126, + 22, + 109, + 41, + 55, + 69, + 99, + 91, + 12, + 196, + 235, + 165, 97, 89, 128, @@ -16887,38 +16886,38 @@ pub mod solvency_verifier { 1, 82, 127, - 34, - 38, - 172, + 3, + 153, + 78, + 126, + 119, + 173, + 88, + 7, + 43, + 120, 117, 119, - 252, - 107, - 65, - 146, - 6, - 130, - 240, - 115, - 131, - 237, - 18, - 239, - 23, - 94, - 230, - 23, - 136, - 133, - 81, - 231, - 100, - 67, - 78, - 218, - 48, - 160, + 0, + 171, + 11, + 121, + 36, + 127, 46, + 70, + 43, + 12, + 246, + 165, + 161, + 139, + 96, + 116, + 20, + 192, + 149, + 219, 97, 89, 160, @@ -17036,38 +17035,38 @@ pub mod solvency_verifier { 146, 80, 127, - 38, - 227, - 251, + 35, + 186, + 75, + 196, + 155, + 170, + 181, + 99, + 233, 213, - 197, - 166, - 102, + 191, 7, - 205, - 131, - 113, - 65, - 156, - 172, - 72, - 190, - 70, - 69, - 57, - 248, - 131, - 241, - 237, - 250, - 202, - 60, + 218, + 35, + 26, + 68, + 150, + 211, + 91, 107, - 248, - 80, - 122, - 116, - 16, + 199, + 130, + 219, + 189, + 118, + 19, + 95, + 228, + 76, + 49, + 203, + 207, 97, 90, 96, @@ -17075,38 +17074,38 @@ pub mod solvency_verifier { 1, 82, 127, - 8, - 246, - 233, - 145, - 213, - 43, - 71, - 48, - 127, - 47, - 131, - 242, - 103, - 180, - 31, - 63, - 51, - 16, - 250, - 33, - 131, - 25, - 136, - 218, - 122, - 179, + 40, + 184, + 128, + 151, + 231, + 237, + 241, + 178, 144, + 79, + 108, + 37, + 193, + 227, + 12, + 160, + 227, + 140, + 116, + 165, + 33, + 37, + 178, + 153, + 92, + 76, + 240, + 167, + 80, + 104, + 56, 84, - 254, - 42, - 197, - 59, 97, 90, 128, @@ -17224,38 +17223,38 @@ pub mod solvency_verifier { 146, 80, 127, - 22, - 84, - 237, - 110, - 226, - 74, - 214, - 235, - 213, - 196, - 194, + 23, 220, - 15, - 235, 187, - 46, - 146, - 213, - 86, + 160, 187, - 148, - 111, - 51, - 108, - 124, - 193, - 86, - 97, - 112, + 226, + 210, + 69, + 102, + 222, + 98, + 9, + 152, 246, - 76, - 221, + 47, + 245, + 78, + 165, + 48, + 42, + 218, + 106, + 235, + 24, + 2, + 139, + 97, + 180, + 220, + 25, + 187, + 211, 97, 91, 64, @@ -17263,38 +17262,38 @@ pub mod solvency_verifier { 1, 82, 127, - 46, - 96, - 118, - 93, - 116, - 209, - 213, - 192, - 67, - 226, - 41, - 156, - 78, - 69, - 115, - 18, - 177, - 53, - 143, - 78, - 81, - 205, - 234, - 3, - 142, - 192, 14, - 244, + 31, + 144, + 128, + 7, + 165, + 194, + 204, + 147, + 68, + 38, + 194, + 109, + 231, + 32, + 108, 83, - 242, - 10, - 9, + 250, + 16, + 199, + 157, + 99, + 239, + 82, + 238, + 145, + 191, + 181, + 104, + 199, + 47, + 189, 97, 91, 96, @@ -17412,38 +17411,38 @@ pub mod solvency_verifier { 146, 80, 127, + 44, + 120, 35, - 160, - 197, - 65, - 100, - 57, - 98, - 253, - 55, - 81, - 243, - 134, - 103, - 0, - 87, - 162, - 76, - 42, - 41, - 102, - 214, 249, - 117, - 184, - 71, - 75, - 29, - 241, - 223, - 88, - 174, - 197, + 156, + 178, + 173, + 183, + 22, + 190, + 203, + 150, + 9, + 20, + 255, + 161, + 214, + 226, + 242, + 87, + 135, + 95, + 221, + 3, + 194, + 190, + 229, + 46, + 245, + 113, + 212, + 30, 97, 92, 32, @@ -17451,38 +17450,38 @@ pub mod solvency_verifier { 1, 82, 127, - 18, - 173, - 172, - 247, - 98, - 132, + 9, + 171, 131, - 201, - 221, - 29, - 1, - 76, - 176, - 2, - 67, - 170, - 113, - 97, - 0, - 104, - 15, - 25, - 93, - 37, - 213, - 155, - 200, - 94, - 231, - 253, - 242, - 2, + 235, + 198, + 128, + 62, + 101, + 178, + 230, + 131, + 28, + 135, + 6, + 217, + 161, + 52, + 246, + 177, + 207, + 111, + 110, + 197, + 194, + 105, + 122, + 254, + 224, + 149, + 50, + 14, + 225, 97, 92, 64, @@ -17600,38 +17599,38 @@ pub mod solvency_verifier { 146, 80, 127, - 25, - 120, - 10, - 226, - 144, - 27, - 127, - 93, - 222, - 223, - 148, + 45, 193, - 181, - 59, - 80, - 73, - 119, - 165, - 24, - 31, - 57, - 160, - 80, 44, - 110, - 134, - 184, + 32, + 81, + 82, + 191, + 172, + 195, + 84, + 200, + 56, + 34, + 85, + 113, + 23, + 44, + 33, + 94, + 1, + 166, + 77, + 230, + 162, + 202, + 102, + 101, + 199, + 9, 55, - 130, - 3, - 242, - 46, + 172, + 88, 97, 93, 0, @@ -17639,38 +17638,38 @@ pub mod solvency_verifier { 1, 82, 127, - 31, - 95, - 49, - 26, - 61, - 23, - 147, - 128, - 254, - 124, - 217, - 230, - 209, - 65, - 80, - 220, - 134, - 6, - 41, - 84, + 4, + 73, + 235, + 82, + 159, + 0, + 56, + 162, + 189, + 47, + 108, + 11, + 98, + 19, + 167, + 4, + 136, + 182, + 155, + 71, + 157, + 144, + 169, + 83, + 87, + 158, + 76, + 157, + 69, + 98, 27, - 178, - 200, - 248, - 129, - 16, - 227, - 29, - 233, - 28, - 123, - 250, + 133, 97, 93, 32, @@ -17788,38 +17787,38 @@ pub mod solvency_verifier { 146, 80, 127, - 2, - 31, - 161, - 31, - 44, - 130, - 43, - 73, - 70, - 111, - 71, - 59, - 199, - 80, - 225, - 114, - 190, - 102, - 255, - 157, - 243, + 9, + 162, + 171, + 57, + 19, + 164, + 119, + 15, + 213, + 15, + 107, + 169, + 236, + 76, + 224, + 179, + 23, + 139, + 84, + 215, + 191, + 202, 91, - 197, - 163, - 147, - 206, + 66, + 254, + 126, + 142, + 28, 229, - 146, - 148, - 244, - 43, - 152, + 207, + 96, + 169, 97, 93, 224, @@ -17827,38 +17826,38 @@ pub mod solvency_verifier { 1, 82, 127, - 34, - 129, - 68, + 19, + 236, + 49, + 249, + 64, + 38, 86, - 120, - 101, - 26, - 10, - 5, - 204, - 219, + 156, + 75, + 183, + 110, + 44, + 76, 234, - 71, - 189, + 163, 230, - 231, + 82, + 84, + 56, + 255, + 180, + 167, 166, - 200, - 46, - 67, + 156, 222, - 10, - 82, - 165, - 65, - 79, - 232, - 41, - 149, - 34, - 145, - 48, + 97, + 246, + 215, + 123, + 147, + 186, + 215, 97, 94, 0, @@ -17976,38 +17975,38 @@ pub mod solvency_verifier { 146, 80, 127, - 14, - 103, - 240, - 107, - 60, - 214, - 173, - 96, - 12, - 58, - 59, - 112, - 93, - 61, - 23, - 140, - 46, - 164, - 175, - 164, - 25, - 166, - 15, - 245, - 107, + 7, + 67, + 234, + 64, + 241, + 64, + 132, + 219, + 38, + 115, + 33, + 114, + 131, + 170, + 5, + 63, + 152, + 104, + 150, + 238, + 124, + 24, + 31, + 82, + 17, + 132, 66, - 119, - 74, - 68, - 242, - 193, - 81, + 233, + 156, + 69, + 41, + 116, 97, 94, 192, @@ -18015,38 +18014,38 @@ pub mod solvency_verifier { 1, 82, 127, - 28, - 192, - 221, - 69, - 178, - 126, - 153, - 220, - 186, - 126, - 76, - 114, - 28, - 66, - 85, - 235, - 222, - 122, - 91, + 2, + 3, + 227, + 73, 58, - 234, - 98, - 121, - 133, - 144, - 115, - 57, - 141, - 107, - 243, - 186, - 29, + 37, + 148, + 236, + 229, + 125, + 34, + 204, + 117, + 221, + 8, + 26, + 198, + 130, + 113, + 236, + 124, + 117, + 129, + 83, + 207, + 210, + 21, + 43, + 251, + 92, + 25, + 227, 97, 94, 224, @@ -18164,38 +18163,38 @@ pub mod solvency_verifier { 146, 80, 127, - 39, - 156, - 22, - 205, - 127, - 235, - 23, - 237, - 108, - 254, - 76, - 226, - 127, - 0, - 71, - 56, - 114, - 179, - 64, - 235, - 202, - 227, - 223, - 226, - 198, + 2, + 169, + 167, + 125, + 142, + 111, + 111, 216, - 170, - 151, - 217, - 96, - 34, - 115, + 159, + 51, + 186, + 86, + 254, + 69, + 246, + 245, + 201, + 7, + 229, + 11, + 162, + 140, + 221, + 65, + 152, + 172, + 251, + 86, + 46, + 178, + 17, + 3, 97, 95, 160, @@ -18203,38 +18202,38 @@ pub mod solvency_verifier { 1, 82, 127, - 10, - 175, - 252, - 135, - 44, - 121, - 132, - 115, - 223, + 35, + 171, + 238, + 104, + 216, + 60, + 45, + 102, + 50, + 87, + 110, + 94, + 149, + 202, 1, - 44, - 19, - 197, - 24, + 166, + 30, 94, - 183, - 204, - 163, - 155, - 165, - 28, - 191, - 3, - 88, - 167, - 245, - 183, - 144, - 63, - 189, - 230, - 77, + 62, + 109, + 148, + 56, + 194, + 172, + 100, + 40, + 200, + 182, + 237, + 254, + 42, + 186, 97, 95, 192, @@ -18352,38 +18351,38 @@ pub mod solvency_verifier { 146, 80, 127, - 27, - 113, - 26, - 191, - 213, - 202, - 55, - 155, - 12, - 122, - 5, - 154, - 60, - 10, - 35, - 248, - 170, + 44, + 243, 109, - 3, - 49, - 88, - 185, - 188, - 185, - 34, - 241, - 145, - 205, - 17, - 163, + 54, + 191, + 172, + 190, + 26, + 141, + 140, + 98, + 106, + 239, + 167, + 90, + 192, + 254, + 180, + 107, + 114, + 89, + 137, + 168, + 230, + 250, + 190, + 208, 116, - 219, + 191, + 159, + 106, + 247, 97, 96, 128, @@ -18391,38 +18390,38 @@ pub mod solvency_verifier { 1, 82, 127, - 34, - 147, - 228, - 53, + 6, 15, - 113, - 106, - 66, - 176, - 154, - 191, - 38, - 150, - 181, - 54, + 222, + 211, + 237, + 94, + 197, + 109, + 158, + 0, + 100, + 215, + 60, 71, - 185, - 134, - 86, - 226, - 23, - 223, - 195, - 144, - 113, - 178, - 32, - 124, - 179, - 72, + 34, + 69, + 164, 196, - 148, + 182, + 236, + 55, + 30, + 152, + 8, + 105, + 43, + 247, + 242, + 89, + 211, + 183, + 48, 97, 96, 160, @@ -19819,38 +19818,38 @@ pub mod solvency_verifier { 1, 82, 127, - 43, - 218, - 62, - 63, - 105, - 19, - 219, - 214, - 40, - 213, - 203, - 46, - 35, - 80, - 64, - 217, - 144, - 46, - 63, - 92, - 217, - 181, - 245, - 102, - 158, - 215, + 38, + 24, + 106, + 45, 101, - 152, + 238, 77, - 179, - 43, - 85, + 47, + 156, + 154, + 91, + 145, + 248, + 101, + 151, + 211, + 95, + 25, + 44, + 209, + 32, + 202, + 247, + 233, + 53, + 216, + 68, + 61, + 25, + 56, + 226, + 61, 97, 105, 96, @@ -19858,38 +19857,38 @@ pub mod solvency_verifier { 1, 82, 127, - 20, - 249, - 135, - 223, - 63, - 11, - 64, - 132, - 129, - 146, - 199, - 106, - 25, - 19, - 20, - 214, + 48, + 68, + 31, + 209, + 181, + 211, + 55, + 4, + 130, + 196, + 33, + 82, + 168, + 137, + 144, + 39, + 113, + 105, + 137, + 166, + 153, + 108, + 37, + 53, + 188, + 159, 127, - 177, - 242, - 97, - 143, - 186, - 51, - 225, - 99, - 226, - 140, - 233, - 232, - 149, - 171, - 128, + 238, + 138, + 174, + 247, + 158, 97, 105, 128, @@ -19897,38 +19896,38 @@ pub mod solvency_verifier { 1, 82, 127, - 43, - 17, - 165, - 127, - 227, - 232, - 101, - 49, - 138, - 156, - 186, - 39, - 164, - 16, - 135, - 25, - 135, - 161, - 118, - 183, - 116, - 106, - 204, - 204, - 122, - 166, - 197, - 156, - 71, - 201, - 192, + 22, + 243, + 99, + 241, + 3, + 200, + 13, 123, + 188, + 138, + 211, + 198, + 134, + 126, + 8, + 34, + 187, + 198, + 0, + 11, + 233, + 26, + 70, + 137, + 117, + 92, + 125, + 244, + 2, + 33, + 193, + 69, 97, 105, 160, @@ -19936,38 +19935,38 @@ pub mod solvency_verifier { 1, 82, 127, - 7, - 17, - 115, - 219, - 23, - 145, - 73, - 156, + 43, + 28, + 187, + 62, + 82, + 30, 223, - 233, - 185, - 202, - 138, - 137, - 196, - 5, - 205, - 249, - 162, - 142, + 90, 98, 45, - 195, - 65, - 123, - 125, - 60, - 112, - 136, - 45, - 3, - 79, + 130, + 118, + 42, + 68, + 165, + 230, + 63, + 30, + 80, + 179, + 50, + 215, + 17, + 84, + 164, + 167, + 149, + 141, + 96, + 17, + 222, + 255, 97, 105, 192, @@ -20105,14 +20104,14 @@ pub mod solvency_verifier { 21, 97, 78, - 93, + 92, 87, 97, 78, - 93, + 92, 97, 78, - 30, + 29, 86, 91, 96, @@ -20133,7 +20132,7 @@ pub mod solvency_verifier { 18, 97, 78, - 118, + 117, 87, 96, 0, @@ -20156,19 +20155,19 @@ pub mod solvency_verifier { 21, 97, 78, - 144, + 143, 87, 97, 78, - 144, + 143, 97, 78, - 30, + 29, 86, 91, 97, 78, - 163, + 162, 96, 31, 130, @@ -20182,7 +20181,7 @@ pub mod solvency_verifier { 1, 97, 78, - 52, + 51, 86, 91, 129, @@ -20199,7 +20198,7 @@ pub mod solvency_verifier { 21, 97, 78, - 184, + 183, 87, 96, 0, @@ -20247,7 +20246,7 @@ pub mod solvency_verifier { 21, 97, 78, - 232, + 231, 87, 96, 0, @@ -20270,8 +20269,8 @@ pub mod solvency_verifier { 17, 21, 97, - 79, - 0, + 78, + 255, 87, 96, 0, @@ -20291,7 +20290,7 @@ pub mod solvency_verifier { 18, 97, 79, - 20, + 19, 87, 96, 0, @@ -20308,14 +20307,14 @@ pub mod solvency_verifier { 21, 97, 79, - 40, + 39, 87, 97, 79, - 40, + 39, 97, 78, - 30, + 29, 86, 91, 129, @@ -20324,13 +20323,13 @@ pub mod solvency_verifier { 27, 97, 79, - 55, + 54, 130, 130, 1, 97, 78, - 52, + 51, 86, 91, 146, @@ -20352,7 +20351,7 @@ pub mod solvency_verifier { 21, 97, 79, - 81, + 80, 87, 96, 0, @@ -20370,7 +20369,7 @@ pub mod solvency_verifier { 21, 97, 79, - 111, + 110, 87, 134, 53, @@ -20386,7 +20385,7 @@ pub mod solvency_verifier { 144, 97, 79, - 86, + 85, 86, 91, 151, @@ -20405,7 +20404,7 @@ pub mod solvency_verifier { 21, 97, 79, - 134, + 133, 87, 96, 0, @@ -20415,14 +20414,14 @@ pub mod solvency_verifier { 80, 97, 79, - 147, + 146, 133, 130, 134, 1, 97, 78, - 101, + 100, 86, 91, 145, @@ -20509,38 +20508,38 @@ pub mod solvency_verifier { 34, 18, 32, - 250, - 211, - 110, - 116, - 126, - 100, - 150, - 73, - 218, - 88, + 212, 178, - 114, - 190, - 104, - 158, - 148, - 192, - 225, - 150, - 168, - 23, - 41, - 86, - 119, - 112, - 19, - 25, - 95, - 88, - 149, - 153, + 220, 135, + 152, + 186, + 177, + 123, + 101, + 162, + 231, + 44, + 60, + 209, + 59, + 7, + 180, + 165, + 138, + 174, + 54, + 106, + 119, + 120, + 72, + 82, + 51, + 60, + 117, + 170, + 120, + 185, 100, 115, 111, @@ -20619,7 +20618,7 @@ pub mod solvency_verifier { 4, 97, 78, - 213, + 212, 86, 91, 97, @@ -20656,7 +20655,7 @@ pub mod solvency_verifier { 99, 97, 77, - 254, + 253, 86, 91, 96, @@ -20667,7 +20666,7 @@ pub mod solvency_verifier { 32, 97, 79, - 190, + 189, 131, 57, 129, @@ -20687,7 +20686,7 @@ pub mod solvency_verifier { 32, 97, 79, - 158, + 157, 131, 57, 129, @@ -20713,7 +20712,7 @@ pub mod solvency_verifier { 32, 97, 79, - 158, + 157, 131, 57, 129, @@ -20731,7 +20730,7 @@ pub mod solvency_verifier { 32, 97, 79, - 158, + 157, 131, 57, 129, @@ -20751,7 +20750,7 @@ pub mod solvency_verifier { 32, 97, 79, - 158, + 157, 131, 57, 129, @@ -20813,39 +20812,38 @@ pub mod solvency_verifier { 131, 1, 82, - 127, - 39, - 17, - 67, - 58, - 38, - 171, - 77, - 162, - 236, - 135, - 64, - 102, - 109, + 126, + 174, + 153, 177, - 247, - 13, - 49, - 129, - 136, - 36, - 224, - 161, + 55, + 145, + 111, + 244, 34, - 168, - 154, - 18, - 164, - 58, - 99, - 169, - 183, + 11, 13, + 167, + 23, + 154, + 70, + 1, + 48, + 28, + 130, + 52, + 111, + 198, + 101, + 205, + 51, + 105, + 165, + 78, + 31, + 2, + 212, + 234, 96, 0, 131, @@ -20876,7 +20874,7 @@ pub mod solvency_verifier { 132, 97, 1, - 68, + 67, 130, 132, 97, @@ -20914,7 +20912,7 @@ pub mod solvency_verifier { 132, 97, 1, - 106, + 105, 130, 132, 97, @@ -20954,7 +20952,7 @@ pub mod solvency_verifier { 132, 97, 1, - 146, + 145, 130, 132, 97, @@ -21032,7 +21030,7 @@ pub mod solvency_verifier { 132, 97, 1, - 224, + 223, 130, 132, 97, @@ -21074,7 +21072,7 @@ pub mod solvency_verifier { 132, 97, 2, - 10, + 9, 130, 132, 97, @@ -21189,7 +21187,7 @@ pub mod solvency_verifier { 132, 97, 2, - 125, + 124, 130, 132, 97, @@ -21231,7 +21229,7 @@ pub mod solvency_verifier { 132, 97, 2, - 167, + 166, 130, 132, 97, @@ -21273,7 +21271,7 @@ pub mod solvency_verifier { 132, 97, 2, - 209, + 208, 130, 132, 97, @@ -21315,7 +21313,7 @@ pub mod solvency_verifier { 132, 97, 2, - 251, + 250, 130, 132, 97, @@ -21395,7 +21393,7 @@ pub mod solvency_verifier { 132, 97, 3, - 75, + 74, 130, 132, 97, @@ -21437,7 +21435,7 @@ pub mod solvency_verifier { 132, 97, 3, - 117, + 116, 130, 132, 97, @@ -21479,7 +21477,7 @@ pub mod solvency_verifier { 132, 97, 3, - 159, + 158, 130, 132, 97, @@ -21521,7 +21519,7 @@ pub mod solvency_verifier { 132, 97, 3, - 201, + 200, 130, 132, 97, @@ -21563,7 +21561,7 @@ pub mod solvency_verifier { 132, 97, 3, - 243, + 242, 130, 132, 97, @@ -22184,7 +22182,7 @@ pub mod solvency_verifier { 132, 97, 6, - 96, + 95, 130, 132, 97, @@ -22263,7 +22261,7 @@ pub mod solvency_verifier { 132, 97, 6, - 175, + 174, 130, 132, 97, @@ -23565,7 +23563,7 @@ pub mod solvency_verifier { 32, 97, 79, - 190, + 189, 131, 57, 129, @@ -30628,7 +30626,7 @@ pub mod solvency_verifier { 32, 97, 79, - 190, + 189, 131, 57, 129, @@ -31460,7 +31458,7 @@ pub mod solvency_verifier { 32, 97, 79, - 190, + 189, 131, 57, 129, @@ -36414,38 +36412,38 @@ pub mod solvency_verifier { 146, 80, 127, - 47, - 118, - 187, - 91, - 135, - 166, - 150, + 6, + 85, + 214, + 41, + 121, + 220, + 6, + 45, + 193, + 232, + 193, + 83, + 52, + 191, + 23, + 207, + 92, + 126, + 99, + 82, + 33, 156, - 78, - 187, - 133, - 27, - 177, - 13, - 241, - 115, - 164, - 98, - 49, - 107, - 236, - 51, - 57, - 44, - 66, - 108, - 47, - 43, - 58, - 35, - 241, - 139, + 11, + 208, + 176, + 204, + 3, + 149, + 152, + 217, + 166, + 105, 97, 85, 32, @@ -36453,38 +36451,38 @@ pub mod solvency_verifier { 1, 82, 127, - 17, - 40, - 228, - 200, - 175, - 88, - 44, - 105, - 194, - 9, - 219, - 135, - 236, - 24, - 250, - 133, + 1, + 149, + 137, + 211, + 0, + 47, + 106, + 13, + 237, 70, - 110, - 167, - 27, - 113, - 152, - 246, - 216, - 199, + 166, 144, - 131, - 16, - 50, - 97, - 254, - 195, + 83, + 240, + 192, + 94, + 122, + 124, + 164, + 83, + 57, + 179, + 210, + 186, + 232, + 93, + 0, + 242, + 106, + 192, + 243, + 62, 97, 85, 64, @@ -36602,38 +36600,38 @@ pub mod solvency_verifier { 146, 80, 127, - 19, - 52, + 30, + 171, + 153, + 149, 146, - 73, + 56, + 82, + 8, + 180, + 42, + 18, + 220, + 192, + 71, + 118, 62, - 182, - 36, - 153, - 193, - 186, - 3, - 168, - 113, - 95, - 141, - 7, - 231, - 132, - 144, - 241, - 87, - 239, - 96, - 59, + 229, + 207, + 18, + 5, + 46, + 180, + 176, + 217, + 167, + 162, + 134, + 224, + 67, + 243, 223, - 186, - 251, - 57, - 106, - 27, - 220, - 191, + 159, 97, 86, 0, @@ -36641,38 +36639,38 @@ pub mod solvency_verifier { 1, 82, 127, - 7, - 155, - 11, - 93, - 88, - 231, - 57, - 238, - 166, - 189, - 254, - 64, - 146, - 226, - 50, - 186, - 206, - 224, - 208, - 39, - 189, - 15, - 81, - 134, - 194, - 41, - 119, - 191, - 210, + 24, + 136, + 126, + 179, + 198, 70, - 32, - 215, + 255, + 212, + 150, + 18, + 38, + 201, + 27, + 172, + 150, + 97, + 0, + 71, + 152, + 177, + 252, + 106, + 57, + 196, + 63, + 154, + 109, + 29, + 3, + 118, + 113, + 148, 97, 86, 32, @@ -36790,38 +36788,38 @@ pub mod solvency_verifier { 146, 80, 127, - 24, - 123, - 221, - 234, - 125, - 190, - 28, - 90, - 205, + 7, + 104, + 6, + 5, + 139, + 2, + 225, + 181, + 233, + 155, + 47, 46, - 1, - 175, - 173, - 193, - 192, + 142, + 238, + 97, + 49, + 148, + 248, 223, - 56, - 24, - 12, - 0, - 171, - 116, - 57, - 53, - 33, - 81, - 183, - 232, - 1, - 80, - 42, - 11, + 115, + 72, + 22, + 89, + 245, + 147, + 139, + 170, + 205, + 100, + 228, + 215, + 184, 97, 86, 224, @@ -36829,38 +36827,38 @@ pub mod solvency_verifier { 1, 82, 127, - 15, - 194, - 104, - 154, - 39, - 157, - 186, - 154, - 54, - 138, - 52, - 152, - 128, + 5, + 174, + 129, 100, - 229, - 220, - 79, - 28, - 211, - 242, - 89, - 139, - 210, - 166, - 148, - 158, - 27, - 26, - 2, - 209, - 11, - 118, + 75, + 36, + 77, + 206, + 234, + 83, + 80, + 168, + 74, + 121, + 203, + 240, + 161, + 153, + 187, + 214, + 193, + 250, + 217, + 136, + 116, + 35, + 248, + 200, + 4, + 142, + 96, + 57, 97, 87, 0, @@ -36978,38 +36976,38 @@ pub mod solvency_verifier { 146, 80, 127, - 22, - 251, - 208, - 175, - 75, - 89, - 220, - 137, - 3, - 70, - 48, + 4, + 56, + 135, + 63, + 192, + 2, + 49, + 174, + 82, + 126, + 252, + 247, 77, - 53, - 201, - 153, - 221, - 141, + 144, + 146, + 245, + 5, + 157, 250, - 211, - 160, - 106, - 216, - 161, - 15, - 71, - 69, + 5, 39, - 250, - 217, - 234, - 156, - 50, + 92, + 190, + 115, + 129, + 233, + 72, + 254, + 59, + 123, + 97, + 216, 97, 87, 192, @@ -37017,38 +37015,38 @@ pub mod solvency_verifier { 1, 82, 127, - 42, - 176, - 21, - 188, + 3, + 192, + 243, + 20, + 201, + 52, + 3, + 121, 43, - 138, - 25, - 180, - 131, - 56, - 146, - 129, - 135, - 99, - 129, - 116, - 6, - 85, - 98, - 208, - 165, 168, - 59, - 0, - 133, - 70, - 169, - 230, - 97, - 46, - 198, - 196, + 110, + 195, + 132, + 27, + 48, + 128, + 242, + 247, + 205, + 9, + 44, + 107, + 203, + 99, + 44, + 219, + 194, + 18, + 42, + 19, + 205, + 239, 97, 87, 224, @@ -37166,38 +37164,38 @@ pub mod solvency_verifier { 146, 80, 127, - 29, - 207, - 179, + 43, + 18, + 177, + 50, + 166, + 38, + 26, + 214, + 2, + 73, 20, - 144, - 181, - 147, - 39, - 100, - 47, - 75, - 147, - 146, - 70, - 91, - 216, - 130, + 117, + 153, + 202, + 224, + 213, + 179, + 84, + 126, + 81, + 13, + 234, + 187, + 166, + 85, + 38, + 209, + 48, + 240, 79, - 115, - 42, - 158, - 148, - 228, - 107, - 11, - 173, - 50, - 181, - 112, - 96, - 135, - 175, + 36, + 2, 97, 88, 160, @@ -37205,38 +37203,38 @@ pub mod solvency_verifier { 1, 82, 127, - 22, - 180, - 132, - 41, - 11, - 72, - 220, - 232, - 67, - 198, - 186, - 177, - 230, - 78, - 127, - 69, - 235, - 66, - 75, - 177, - 124, - 230, - 5, - 251, - 206, - 164, - 101, + 19, + 227, + 192, + 44, + 224, 15, + 107, + 126, + 0, + 213, 176, - 33, + 153, + 237, + 165, + 241, + 21, + 89, + 86, + 174, + 131, + 137, + 154, + 45, + 89, + 206, + 252, + 176, + 13, + 173, + 102, + 167, 246, - 0, 97, 88, 192, @@ -37354,38 +37352,38 @@ pub mod solvency_verifier { 146, 80, 127, - 30, - 235, - 63, - 123, - 38, - 213, - 201, - 135, - 27, - 194, - 193, - 106, - 78, - 213, - 5, - 109, - 190, - 97, - 58, - 75, - 173, - 7, - 161, - 134, + 14, + 216, + 51, + 112, + 39, + 126, + 15, + 211, 94, - 148, - 181, - 163, - 241, - 244, - 104, - 66, + 130, + 88, + 221, + 86, + 48, + 206, + 12, + 227, + 73, + 31, + 223, + 126, + 22, + 109, + 41, + 55, + 69, + 99, + 91, + 12, + 196, + 235, + 165, 97, 89, 128, @@ -37393,38 +37391,38 @@ pub mod solvency_verifier { 1, 82, 127, - 34, - 38, - 172, + 3, + 153, + 78, + 126, + 119, + 173, + 88, + 7, + 43, + 120, 117, 119, - 252, - 107, - 65, - 146, - 6, - 130, - 240, - 115, - 131, - 237, - 18, - 239, - 23, - 94, - 230, - 23, - 136, - 133, - 81, - 231, - 100, - 67, - 78, - 218, - 48, - 160, + 0, + 171, + 11, + 121, + 36, + 127, 46, + 70, + 43, + 12, + 246, + 165, + 161, + 139, + 96, + 116, + 20, + 192, + 149, + 219, 97, 89, 160, @@ -37542,38 +37540,38 @@ pub mod solvency_verifier { 146, 80, 127, - 38, - 227, - 251, + 35, + 186, + 75, + 196, + 155, + 170, + 181, + 99, + 233, 213, - 197, - 166, - 102, + 191, 7, - 205, - 131, - 113, - 65, - 156, - 172, - 72, - 190, - 70, - 69, - 57, - 248, - 131, - 241, - 237, - 250, - 202, - 60, + 218, + 35, + 26, + 68, + 150, + 211, + 91, 107, - 248, - 80, - 122, - 116, - 16, + 199, + 130, + 219, + 189, + 118, + 19, + 95, + 228, + 76, + 49, + 203, + 207, 97, 90, 96, @@ -37581,38 +37579,38 @@ pub mod solvency_verifier { 1, 82, 127, - 8, - 246, - 233, - 145, - 213, - 43, - 71, - 48, - 127, - 47, - 131, - 242, - 103, - 180, - 31, - 63, - 51, - 16, - 250, - 33, - 131, - 25, - 136, - 218, - 122, - 179, + 40, + 184, + 128, + 151, + 231, + 237, + 241, + 178, 144, + 79, + 108, + 37, + 193, + 227, + 12, + 160, + 227, + 140, + 116, + 165, + 33, + 37, + 178, + 153, + 92, + 76, + 240, + 167, + 80, + 104, + 56, 84, - 254, - 42, - 197, - 59, 97, 90, 128, @@ -37730,38 +37728,38 @@ pub mod solvency_verifier { 146, 80, 127, - 22, - 84, - 237, - 110, - 226, - 74, - 214, - 235, - 213, - 196, - 194, + 23, 220, - 15, - 235, 187, - 46, - 146, - 213, - 86, + 160, 187, - 148, - 111, - 51, - 108, - 124, - 193, - 86, - 97, - 112, + 226, + 210, + 69, + 102, + 222, + 98, + 9, + 152, 246, - 76, - 221, + 47, + 245, + 78, + 165, + 48, + 42, + 218, + 106, + 235, + 24, + 2, + 139, + 97, + 180, + 220, + 25, + 187, + 211, 97, 91, 64, @@ -37769,38 +37767,38 @@ pub mod solvency_verifier { 1, 82, 127, - 46, - 96, - 118, - 93, - 116, - 209, - 213, - 192, - 67, - 226, - 41, - 156, - 78, - 69, - 115, - 18, - 177, - 53, - 143, - 78, - 81, - 205, - 234, - 3, - 142, - 192, 14, - 244, + 31, + 144, + 128, + 7, + 165, + 194, + 204, + 147, + 68, + 38, + 194, + 109, + 231, + 32, + 108, 83, - 242, - 10, - 9, + 250, + 16, + 199, + 157, + 99, + 239, + 82, + 238, + 145, + 191, + 181, + 104, + 199, + 47, + 189, 97, 91, 96, @@ -37918,38 +37916,38 @@ pub mod solvency_verifier { 146, 80, 127, + 44, + 120, 35, - 160, - 197, - 65, - 100, - 57, - 98, - 253, - 55, - 81, - 243, - 134, - 103, - 0, - 87, - 162, - 76, - 42, - 41, - 102, - 214, 249, - 117, - 184, - 71, - 75, - 29, - 241, - 223, - 88, - 174, - 197, + 156, + 178, + 173, + 183, + 22, + 190, + 203, + 150, + 9, + 20, + 255, + 161, + 214, + 226, + 242, + 87, + 135, + 95, + 221, + 3, + 194, + 190, + 229, + 46, + 245, + 113, + 212, + 30, 97, 92, 32, @@ -37957,38 +37955,38 @@ pub mod solvency_verifier { 1, 82, 127, - 18, - 173, - 172, - 247, - 98, - 132, + 9, + 171, 131, - 201, - 221, - 29, - 1, - 76, - 176, - 2, - 67, - 170, - 113, - 97, - 0, - 104, - 15, - 25, - 93, - 37, - 213, - 155, - 200, - 94, - 231, - 253, - 242, - 2, + 235, + 198, + 128, + 62, + 101, + 178, + 230, + 131, + 28, + 135, + 6, + 217, + 161, + 52, + 246, + 177, + 207, + 111, + 110, + 197, + 194, + 105, + 122, + 254, + 224, + 149, + 50, + 14, + 225, 97, 92, 64, @@ -38106,38 +38104,38 @@ pub mod solvency_verifier { 146, 80, 127, - 25, - 120, - 10, - 226, - 144, - 27, - 127, - 93, - 222, - 223, - 148, + 45, 193, - 181, - 59, - 80, - 73, - 119, - 165, - 24, - 31, - 57, - 160, - 80, 44, - 110, - 134, - 184, + 32, + 81, + 82, + 191, + 172, + 195, + 84, + 200, + 56, + 34, + 85, + 113, + 23, + 44, + 33, + 94, + 1, + 166, + 77, + 230, + 162, + 202, + 102, + 101, + 199, + 9, 55, - 130, - 3, - 242, - 46, + 172, + 88, 97, 93, 0, @@ -38145,38 +38143,38 @@ pub mod solvency_verifier { 1, 82, 127, - 31, - 95, - 49, - 26, - 61, - 23, - 147, - 128, - 254, - 124, - 217, - 230, - 209, - 65, - 80, - 220, - 134, - 6, - 41, - 84, + 4, + 73, + 235, + 82, + 159, + 0, + 56, + 162, + 189, + 47, + 108, + 11, + 98, + 19, + 167, + 4, + 136, + 182, + 155, + 71, + 157, + 144, + 169, + 83, + 87, + 158, + 76, + 157, + 69, + 98, 27, - 178, - 200, - 248, - 129, - 16, - 227, - 29, - 233, - 28, - 123, - 250, + 133, 97, 93, 32, @@ -38294,38 +38292,38 @@ pub mod solvency_verifier { 146, 80, 127, - 2, - 31, - 161, - 31, - 44, - 130, - 43, - 73, - 70, - 111, - 71, - 59, - 199, - 80, - 225, - 114, - 190, - 102, - 255, - 157, - 243, + 9, + 162, + 171, + 57, + 19, + 164, + 119, + 15, + 213, + 15, + 107, + 169, + 236, + 76, + 224, + 179, + 23, + 139, + 84, + 215, + 191, + 202, 91, - 197, - 163, - 147, - 206, + 66, + 254, + 126, + 142, + 28, 229, - 146, - 148, - 244, - 43, - 152, + 207, + 96, + 169, 97, 93, 224, @@ -38333,38 +38331,38 @@ pub mod solvency_verifier { 1, 82, 127, - 34, - 129, - 68, + 19, + 236, + 49, + 249, + 64, + 38, 86, - 120, - 101, - 26, - 10, - 5, - 204, - 219, + 156, + 75, + 183, + 110, + 44, + 76, 234, - 71, - 189, + 163, 230, - 231, + 82, + 84, + 56, + 255, + 180, + 167, 166, - 200, - 46, - 67, + 156, 222, - 10, - 82, - 165, - 65, - 79, - 232, - 41, - 149, - 34, - 145, - 48, + 97, + 246, + 215, + 123, + 147, + 186, + 215, 97, 94, 0, @@ -38482,38 +38480,38 @@ pub mod solvency_verifier { 146, 80, 127, - 14, - 103, - 240, - 107, - 60, - 214, - 173, - 96, - 12, - 58, - 59, - 112, - 93, - 61, - 23, - 140, - 46, - 164, - 175, - 164, - 25, - 166, - 15, - 245, - 107, + 7, + 67, + 234, + 64, + 241, + 64, + 132, + 219, + 38, + 115, + 33, + 114, + 131, + 170, + 5, + 63, + 152, + 104, + 150, + 238, + 124, + 24, + 31, + 82, + 17, + 132, 66, - 119, - 74, - 68, - 242, - 193, - 81, + 233, + 156, + 69, + 41, + 116, 97, 94, 192, @@ -38521,38 +38519,38 @@ pub mod solvency_verifier { 1, 82, 127, - 28, - 192, - 221, - 69, - 178, - 126, - 153, - 220, - 186, - 126, - 76, - 114, - 28, - 66, - 85, - 235, - 222, - 122, - 91, + 2, + 3, + 227, + 73, 58, - 234, - 98, - 121, - 133, - 144, - 115, - 57, - 141, - 107, - 243, - 186, - 29, + 37, + 148, + 236, + 229, + 125, + 34, + 204, + 117, + 221, + 8, + 26, + 198, + 130, + 113, + 236, + 124, + 117, + 129, + 83, + 207, + 210, + 21, + 43, + 251, + 92, + 25, + 227, 97, 94, 224, @@ -38670,38 +38668,38 @@ pub mod solvency_verifier { 146, 80, 127, - 39, - 156, - 22, - 205, - 127, - 235, - 23, - 237, - 108, - 254, - 76, - 226, - 127, - 0, - 71, - 56, - 114, - 179, - 64, - 235, - 202, - 227, - 223, - 226, - 198, + 2, + 169, + 167, + 125, + 142, + 111, + 111, 216, - 170, - 151, - 217, - 96, - 34, - 115, + 159, + 51, + 186, + 86, + 254, + 69, + 246, + 245, + 201, + 7, + 229, + 11, + 162, + 140, + 221, + 65, + 152, + 172, + 251, + 86, + 46, + 178, + 17, + 3, 97, 95, 160, @@ -38709,38 +38707,38 @@ pub mod solvency_verifier { 1, 82, 127, - 10, - 175, - 252, - 135, - 44, - 121, - 132, - 115, - 223, + 35, + 171, + 238, + 104, + 216, + 60, + 45, + 102, + 50, + 87, + 110, + 94, + 149, + 202, 1, - 44, - 19, - 197, - 24, + 166, + 30, 94, - 183, - 204, - 163, - 155, - 165, - 28, - 191, - 3, - 88, - 167, - 245, - 183, - 144, - 63, - 189, - 230, - 77, + 62, + 109, + 148, + 56, + 194, + 172, + 100, + 40, + 200, + 182, + 237, + 254, + 42, + 186, 97, 95, 192, @@ -38858,38 +38856,38 @@ pub mod solvency_verifier { 146, 80, 127, - 27, - 113, - 26, - 191, - 213, - 202, - 55, - 155, - 12, - 122, - 5, - 154, - 60, - 10, - 35, - 248, - 170, + 44, + 243, 109, - 3, - 49, - 88, - 185, - 188, - 185, - 34, - 241, - 145, - 205, - 17, - 163, + 54, + 191, + 172, + 190, + 26, + 141, + 140, + 98, + 106, + 239, + 167, + 90, + 192, + 254, + 180, + 107, + 114, + 89, + 137, + 168, + 230, + 250, + 190, + 208, 116, - 219, + 191, + 159, + 106, + 247, 97, 96, 128, @@ -38897,38 +38895,38 @@ pub mod solvency_verifier { 1, 82, 127, - 34, - 147, - 228, - 53, + 6, 15, - 113, - 106, - 66, - 176, - 154, - 191, - 38, - 150, - 181, - 54, + 222, + 211, + 237, + 94, + 197, + 109, + 158, + 0, + 100, + 215, + 60, 71, - 185, - 134, - 86, - 226, - 23, - 223, - 195, - 144, - 113, - 178, - 32, - 124, - 179, - 72, + 34, + 69, + 164, 196, - 148, + 182, + 236, + 55, + 30, + 152, + 8, + 105, + 43, + 247, + 242, + 89, + 211, + 183, + 48, 97, 96, 160, @@ -40325,38 +40323,38 @@ pub mod solvency_verifier { 1, 82, 127, - 43, - 218, - 62, - 63, - 105, - 19, - 219, - 214, - 40, - 213, - 203, - 46, - 35, - 80, - 64, - 217, - 144, - 46, - 63, - 92, - 217, - 181, - 245, - 102, - 158, - 215, + 38, + 24, + 106, + 45, 101, - 152, + 238, 77, - 179, - 43, - 85, + 47, + 156, + 154, + 91, + 145, + 248, + 101, + 151, + 211, + 95, + 25, + 44, + 209, + 32, + 202, + 247, + 233, + 53, + 216, + 68, + 61, + 25, + 56, + 226, + 61, 97, 105, 96, @@ -40364,38 +40362,38 @@ pub mod solvency_verifier { 1, 82, 127, - 20, - 249, - 135, - 223, - 63, - 11, - 64, - 132, - 129, - 146, - 199, - 106, - 25, - 19, - 20, - 214, + 48, + 68, + 31, + 209, + 181, + 211, + 55, + 4, + 130, + 196, + 33, + 82, + 168, + 137, + 144, + 39, + 113, + 105, + 137, + 166, + 153, + 108, + 37, + 53, + 188, + 159, 127, - 177, - 242, - 97, - 143, - 186, - 51, - 225, - 99, - 226, - 140, - 233, - 232, - 149, - 171, - 128, + 238, + 138, + 174, + 247, + 158, 97, 105, 128, @@ -40403,38 +40401,38 @@ pub mod solvency_verifier { 1, 82, 127, - 43, - 17, - 165, - 127, - 227, - 232, - 101, - 49, - 138, - 156, - 186, - 39, - 164, - 16, - 135, - 25, - 135, - 161, - 118, - 183, - 116, - 106, - 204, - 204, - 122, - 166, - 197, - 156, - 71, - 201, - 192, + 22, + 243, + 99, + 241, + 3, + 200, + 13, 123, + 188, + 138, + 211, + 198, + 134, + 126, + 8, + 34, + 187, + 198, + 0, + 11, + 233, + 26, + 70, + 137, + 117, + 92, + 125, + 244, + 2, + 33, + 193, + 69, 97, 105, 160, @@ -40442,38 +40440,38 @@ pub mod solvency_verifier { 1, 82, 127, - 7, - 17, - 115, - 219, - 23, - 145, - 73, - 156, + 43, + 28, + 187, + 62, + 82, + 30, 223, - 233, - 185, - 202, - 138, - 137, - 196, - 5, - 205, - 249, - 162, - 142, + 90, 98, 45, - 195, - 65, - 123, - 125, - 60, - 112, - 136, - 45, - 3, - 79, + 130, + 118, + 42, + 68, + 165, + 230, + 63, + 30, + 80, + 179, + 50, + 215, + 17, + 84, + 164, + 167, + 149, + 141, + 96, + 17, + 222, + 255, 97, 105, 192, @@ -40611,14 +40609,14 @@ pub mod solvency_verifier { 21, 97, 78, - 93, + 92, 87, 97, 78, - 93, + 92, 97, 78, - 30, + 29, 86, 91, 96, @@ -40639,7 +40637,7 @@ pub mod solvency_verifier { 18, 97, 78, - 118, + 117, 87, 96, 0, @@ -40662,19 +40660,19 @@ pub mod solvency_verifier { 21, 97, 78, - 144, + 143, 87, 97, 78, - 144, + 143, 97, 78, - 30, + 29, 86, 91, 97, 78, - 163, + 162, 96, 31, 130, @@ -40688,7 +40686,7 @@ pub mod solvency_verifier { 1, 97, 78, - 52, + 51, 86, 91, 129, @@ -40705,7 +40703,7 @@ pub mod solvency_verifier { 21, 97, 78, - 184, + 183, 87, 96, 0, @@ -40753,7 +40751,7 @@ pub mod solvency_verifier { 21, 97, 78, - 232, + 231, 87, 96, 0, @@ -40776,8 +40774,8 @@ pub mod solvency_verifier { 17, 21, 97, - 79, - 0, + 78, + 255, 87, 96, 0, @@ -40797,7 +40795,7 @@ pub mod solvency_verifier { 18, 97, 79, - 20, + 19, 87, 96, 0, @@ -40814,14 +40812,14 @@ pub mod solvency_verifier { 21, 97, 79, - 40, + 39, 87, 97, 79, - 40, + 39, 97, 78, - 30, + 29, 86, 91, 129, @@ -40830,13 +40828,13 @@ pub mod solvency_verifier { 27, 97, 79, - 55, + 54, 130, 130, 1, 97, 78, - 52, + 51, 86, 91, 146, @@ -40858,7 +40856,7 @@ pub mod solvency_verifier { 21, 97, 79, - 81, + 80, 87, 96, 0, @@ -40876,7 +40874,7 @@ pub mod solvency_verifier { 21, 97, 79, - 111, + 110, 87, 134, 53, @@ -40892,7 +40890,7 @@ pub mod solvency_verifier { 144, 97, 79, - 86, + 85, 86, 91, 151, @@ -40911,7 +40909,7 @@ pub mod solvency_verifier { 21, 97, 79, - 134, + 133, 87, 96, 0, @@ -40921,14 +40919,14 @@ pub mod solvency_verifier { 80, 97, 79, - 147, + 146, 133, 130, 134, 1, 97, 78, - 101, + 100, 86, 91, 145, @@ -41015,38 +41013,38 @@ pub mod solvency_verifier { 34, 18, 32, - 250, - 211, - 110, - 116, - 126, - 100, - 150, - 73, - 218, - 88, + 212, 178, - 114, - 190, - 104, - 158, - 148, - 192, - 225, - 150, - 168, - 23, - 41, - 86, - 119, - 112, - 19, - 25, - 95, - 88, - 149, - 153, + 220, 135, + 152, + 186, + 177, + 123, + 101, + 162, + 231, + 44, + 60, + 209, + 59, + 7, + 180, + 165, + 138, + 174, + 54, + 106, + 119, + 120, + 72, + 82, + 51, + 60, + 117, + 170, + 120, + 185, 100, 115, 111, diff --git a/backend/src/contracts/mod.rs b/backend/src/contracts/mod.rs index 54378e10..a6499aca 100644 --- a/backend/src/contracts/mod.rs +++ b/backend/src/contracts/mod.rs @@ -1,4 +1,3 @@ pub mod generated; pub mod mock; pub(crate) mod signer; -pub(crate) mod tests; diff --git a/backend/src/contracts/signer.rs b/backend/src/contracts/signer.rs index e2d78646..67ee632c 100644 --- a/backend/src/contracts/signer.rs +++ b/backend/src/contracts/signer.rs @@ -99,11 +99,11 @@ impl SummaSigner { pub async fn submit_proof_of_address_ownership( &self, - cex_addresses: Vec, + address_ownership_proofs: Vec, ) -> Result<(), Box> { let submit_proof_of_address_ownership = &self .summa_contract - .submit_proof_of_address_ownership(cex_addresses); + .submit_proof_of_address_ownership(address_ownership_proofs); let tx = submit_proof_of_address_ownership.send().await.unwrap(); tx.await.unwrap(); @@ -128,3 +128,30 @@ impl SummaSigner { Ok(()) } } + +#[cfg(test)] +mod test { + use super::*; + use ethers::{types::Address, utils::Anvil}; + + #[tokio::test] + async fn test_sign_message() { + let anvil = Anvil::new().spawn(); + + let signer = SummaSigner::new( + //Account #1 + &vec!["0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"], + "0xde9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0", + 31337, + anvil.endpoint().as_str(), + //Verifier deployment is not necessary for this test + Address::random(), + ); + + let signatures = signer.generate_signatures().await.unwrap(); + assert_eq!(signatures.len(), 1); + //Signature produced by the account #1 + assert_eq!(signatures[0].to_string(), "089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b"); + drop(anvil); + } +} diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 7ed15b28..6c363179 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -1,4 +1,4 @@ #![feature(generic_const_exprs)] - pub mod apis; pub mod contracts; +pub mod tests; diff --git a/backend/src/contracts/tests.rs b/backend/src/tests.rs similarity index 54% rename from backend/src/contracts/tests.rs rename to backend/src/tests.rs index 7632fc9e..834bbefe 100644 --- a/backend/src/contracts/tests.rs +++ b/backend/src/tests.rs @@ -70,56 +70,29 @@ pub async fn initialize_anvil() -> ( (anvil, cex_addr_1, cex_addr_2, client, mock_erc20) } +#[cfg(test)] mod test { - use serde_json::from_str; - use std::{fs::read_to_string, sync::Arc}; + use std::sync::Arc; use ethers::{ abi::AbiEncode, - providers::Middleware, - types::{Address, Bytes, Filter, U256}, - utils::{keccak256, Anvil}, + types::{Bytes, U256}, + utils::to_checksum, }; - use snark_verifier_sdk::evm; - use summa_solvency::circuits::types::ProofSolidityCallData; - - use crate::contracts::{ - generated::{ - inclusion_verifier::InclusionVerifier, - solvency_verifier::SolvencyVerifier, - summa_contract::{ - AddressOwnershipProof, AddressOwnershipProofSubmittedFilter, Asset, - SolvencyProofSubmittedFilter, Summa, - }, + + use crate::apis::{address_ownership::AddressOwnership, round::Round}; + use crate::contracts::generated::{ + inclusion_verifier::InclusionVerifier, + solvency_verifier::SolvencyVerifier, + summa_contract::{ + AddressOwnershipProof, AddressOwnershipProofSubmittedFilter, Asset, + SolvencyProofSubmittedFilter, Summa, }, - mock::mock_erc20, - signer::SummaSigner, - tests::initialize_anvil, }; + use crate::tests::initialize_anvil; #[tokio::test] - async fn test_sign_message() { - let anvil = Anvil::new().spawn(); - - let signer = SummaSigner::new( - //Account #1 - &vec!["0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"], - "0xde9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0", - 31337, - anvil.endpoint().as_str(), - //Verifier deployment is not necessary for this test - Address::random(), - ); - - let signatures = signer.generate_signatures().await.unwrap(); - assert_eq!(signatures.len(), 1); - //Signature produced by the account #1 - assert_eq!(signatures[0].to_string(), "089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b"); - drop(anvil); - } - - #[tokio::test] - async fn test_submit_proof_of_solvency() { + async fn test_round_features() { let (anvil, cex_addr_1, cex_addr_2, client, _mock_erc20) = initialize_anvil().await; let solvency_verifer_contract = SolvencyVerifier::deploy(Arc::clone(&client), ()) @@ -146,35 +119,20 @@ mod test { .await .unwrap(); - let summa_signer = SummaSigner::new( - &vec![ - "0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e", - "0xde9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0", - ], + let mut address_ownership_client = AddressOwnership::new( "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", anvil.chain_id(), anvil.endpoint().as_str(), summa_contract.address(), - ); + "src/apis/csv/signatures.csv", + ) + .unwrap(); - let owned_addresses = vec![AddressOwnershipProof { - chain: "ETH".to_string(), - cex_address: cex_addr_1.to_string(), - signature: - ("0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b").parse().unwrap(), - message: "Summa proof of solvency for CryptoExchange".encode().into(), - },AddressOwnershipProof { - chain: "ETH".to_string(), - cex_address: cex_addr_2.to_string(), - signature: - ("0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c").parse().unwrap(), - message: "Summa proof of solvency for CryptoExchange".encode().into(), - }]; - let result = summa_signer - .submit_proof_of_address_ownership(owned_addresses) + let ownership_submitted_result = address_ownership_client + .dispatch_proof_of_address_ownership() .await; - assert_eq!(result.is_ok(), true); + assert_eq!(ownership_submitted_result.is_ok(), true); let logs = summa_contract .address_ownership_proof_submitted_filter() @@ -188,13 +146,13 @@ mod test { AddressOwnershipProofSubmittedFilter { address_ownership_proofs: vec![AddressOwnershipProof { chain: "ETH".to_string(), - cex_address: cex_addr_1.to_string(), + cex_address: to_checksum(&cex_addr_1, None), signature: ("0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b").parse().unwrap(), message: "Summa proof of solvency for CryptoExchange".encode().into(), },AddressOwnershipProof { chain: "ETH".to_string(), - cex_address: cex_addr_2.to_string(), + cex_address:to_checksum(&cex_addr_2, None), signature: ("0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c").parse().unwrap(), message: "Summa proof of solvency for CryptoExchange".encode().into(), @@ -203,61 +161,93 @@ mod test { } ); - let path = "../zk_prover/examples/solvency_proof_solidity_calldata.json"; - let json_data = read_to_string(path).expect("Unable to read the file"); - let calldata: ProofSolidityCallData = from_str(&json_data).unwrap(); - - let result = summa_signer - .submit_proof_of_solvency( - calldata.public_inputs[0], - vec![ - Asset { - asset_name: "ETH".to_string(), - chain: "ETH".to_string(), - amount: U256::from(556863), - }, - Asset { - asset_name: "USDT".to_string(), - chain: "ETH".to_string(), - amount: U256::from(556863), - }, - ], - calldata.proof.parse().unwrap(), - U256::from(0), - ) - .await; + // Initialize round + let asset_csv = "src/apis/csv/assets.csv"; + let entry_csv = "../zk_prover/src/merkle_sum_tree/csv/entry_16.csv"; + let params_path = "ptau/hermez-raw-11"; - assert_eq!(result.is_ok(), true); + let mut round = Round::<4, 2, 14>::new( + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", // anvil account [0] + anvil.chain_id(), + anvil.endpoint().as_str(), + summa_contract.address(), + entry_csv, + asset_csv, + params_path, + 1, + ) + .unwrap(); - let logs = summa_contract + // Verify solvency proof + let mut logs = summa_contract + .solvency_proof_submitted_filter() + .query() + .await + .unwrap(); + assert_eq!(logs.len(), 0); + + // Dispatch solvency proof + let assets = [ + Asset { + asset_name: "ETH".to_string(), + chain: "ETH".to_string(), + amount: U256::from(556863), + }, + Asset { + asset_name: "USDT".to_string(), + chain: "ETH".to_string(), + amount: U256::from(556863), + }, + ]; + + assert_eq!(round.dispatch_solvency_proof().await.unwrap(), ()); + + // After sending transaction of proof of solvency, logs should be updated + logs = summa_contract .solvency_proof_submitted_filter() .query() .await .unwrap(); + assert_eq!(logs.len(), 1); + assert_eq!(logs.len(), 1); assert_eq!( logs[0], SolvencyProofSubmittedFilter { - timestamp: U256::from(0), + timestamp: U256::from(1), mst_root: "0x2E021D9BF99C5BD7267488B6A7A5CF5F7D00222A41B6A9B971899C44089E0C5" .parse() .unwrap(), - assets: vec![ - Asset { - asset_name: "ETH".to_string(), - chain: "ETH".to_string(), - amount: U256::from(556863) - }, - Asset { - asset_name: "USDT".to_string(), - chain: "ETH".to_string(), - amount: U256::from(556863) - } - ], + assets: assets.to_vec() } ); + // Test inclusion proof + let inclusion_proof = round.get_proof_of_inclusion(0).unwrap(); + let proof = Bytes::from(inclusion_proof.get_proof().clone()); + let public_input_vec = inclusion_proof.get_public_inputs(); + + // Adjust for endianness + let mut leaf_hash = public_input_vec[0][0].to_bytes(); + let mut root_hash = public_input_vec[0][1].to_bytes(); + leaf_hash.reverse(); + root_hash.reverse(); + + let public_inputs = vec![ + U256::from_big_endian(&leaf_hash), + U256::from_big_endian(&root_hash), + ]; + + // Ensure the root hash matches the one from the contract + let onchain_mstroot = summa_contract.mst_roots(U256::from(1)).await.unwrap(); + assert_eq!(onchain_mstroot, U256::from_big_endian(&root_hash)); + + // Verify inclusion proof with onchain function + let _result = summa_contract + .verify_inclusion_proof(proof, public_inputs, U256::from(1)) + .await; + drop(anvil); } } diff --git a/contracts/src/InclusionVerifier.sol b/contracts/src/InclusionVerifier.sol index 0a279148..f6082fd5 100644 --- a/contracts/src/InclusionVerifier.sol +++ b/contracts/src/InclusionVerifier.sol @@ -8,4 +8,4 @@ ) public view returns (bool) { bool success = true; bytes32[902] memory transcript; - assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x0), 18446911396317205745533550639557898655359618293120280237620224741936191804828) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0x60), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0x80), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xa0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0xc0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0xe0), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x100), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x120), keccak256(add(transcript, 0x0), 288)){ let hash := mload(add(transcript, 0x120)) mstore(add(transcript, 0x140), mod(hash, f_q)) mstore(add(transcript, 0x160), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x180), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x1c0), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x1e0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x200), keccak256(add(transcript, 0x160), 160)){ let hash := mload(add(transcript, 0x200)) mstore(add(transcript, 0x220), mod(hash, f_q)) mstore(add(transcript, 0x240), hash) }mstore8(add(transcript, 0x260), 1)mstore(add(transcript, 0x260), keccak256(add(transcript, 0x240), 33)){ let hash := mload(add(transcript, 0x260)) mstore(add(transcript, 0x280), mod(hash, f_q)) mstore(add(transcript, 0x2a0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x2c0), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x2e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x300), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x320), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x340), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x360), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x380), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3a0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x3c0), keccak256(add(transcript, 0x2a0), 288)){ let hash := mload(add(transcript, 0x3c0)) mstore(add(transcript, 0x3e0), mod(hash, f_q)) mstore(add(transcript, 0x400), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x420), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x440), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x460), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x480), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4a0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x4c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x4e0), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x500), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x520), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x540), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x560), keccak256(add(transcript, 0x400), 352)){ let hash := mload(add(transcript, 0x560)) mstore(add(transcript, 0x580), mod(hash, f_q)) mstore(add(transcript, 0x5a0), hash) }mstore(add(transcript, 0x5c0), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x5e0), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x7c0)), f_q))mstore(add(transcript, 0xa00), mod(mload(add(proof, 0x7e0)), f_q))mstore(add(transcript, 0xa20), keccak256(add(transcript, 0x5a0), 1152)){ let hash := mload(add(transcript, 0xa20)) mstore(add(transcript, 0xa40), mod(hash, f_q)) mstore(add(transcript, 0xa60), hash) }mstore8(add(transcript, 0xa80), 1)mstore(add(transcript, 0xa80), keccak256(add(transcript, 0xa60), 33)){ let hash := mload(add(transcript, 0xa80)) mstore(add(transcript, 0xaa0), mod(hash, f_q)) mstore(add(transcript, 0xac0), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xae0), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb00), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb20), keccak256(add(transcript, 0xac0), 96)){ let hash := mload(add(transcript, 0xb20)) mstore(add(transcript, 0xb40), mod(hash, f_q)) mstore(add(transcript, 0xb60), hash) } { let x := mload(add(proof, 0x840)) mstore(add(transcript, 0xb80), x) let y := mload(add(proof, 0x860)) mstore(add(transcript, 0xba0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xbc0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x580)), f_q))mstore(add(transcript, 0xbe0), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0xbc0)), f_q))mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0xbe0)), mload(add(transcript, 0xbe0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0xd20), addmod(mload(add(transcript, 0xd00)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd40), mulmod(mload(add(transcript, 0xd20)), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q))mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0xd40)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xd80), addmod(mload(add(transcript, 0x580)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd40)), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x580)), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd40)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x580)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd40)), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x580)), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd40)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x580)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd40)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x580)), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd40)), 1, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x580)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd40)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x580)), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q)){ let prod := mload(add(transcript, 0xd80)) prod := mulmod(mload(add(transcript, 0xdc0)), prod, f_q) mstore(add(transcript, 0xf60), prod) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0xf80), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0xfa0), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0xfc0), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0xfe0), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x1000), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xd20)), prod, f_q) mstore(add(transcript, 0x1040), prod) }mstore(add(transcript, 0x1080), 32)mstore(add(transcript, 0x10a0), 32)mstore(add(transcript, 0x10c0), 32)mstore(add(transcript, 0x10e0), mload(add(transcript, 0x1040)))mstore(add(transcript, 0x1100), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1120), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x1080), 0xc0, add(transcript, 0x1060), 0x20), 1), success){ let inv := mload(add(transcript, 0x1060)) let v v := mload(add(transcript, 0xd20)) mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x1000)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0xfe0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0xfc0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0xfa0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0xf80)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xf60)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xdc0)) mstore(add(transcript, 0xdc0), mulmod(mload(add(transcript, 0xd80)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xd80), inv) }mstore(add(transcript, 0x1140), mulmod(mload(add(transcript, 0xd60)), mload(add(transcript, 0xd80)), f_q))mstore(add(transcript, 0x1160), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x1180), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x11a0), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x11c0), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x11e0), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x1200), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1220), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q)){ let result := mulmod(mload(add(transcript, 0x1200)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1220)), mload(add(transcript, 0x40)), f_q), result, f_q)mstore(add(transcript, 0x1240), result) }mstore(add(transcript, 0x1260), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1280), mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x1260)), f_q))mstore(add(transcript, 0x12a0), mulmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x1280)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0x12c0)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1300), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x1340), mulmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x1320)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x1340)), f_q))mstore(add(transcript, 0x1380), mulmod(mload(add(transcript, 0x1360)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x13a0), addmod(mload(add(transcript, 0x12e0)), mload(add(transcript, 0x1380)), f_q))mstore(add(transcript, 0x13c0), addmod(mload(add(transcript, 0x13a0)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x13e0), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1400), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x13e0)), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x12c0)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1440), mulmod(mload(add(transcript, 0x1360)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x1460), addmod(mload(add(transcript, 0x1420)), mload(add(transcript, 0x1440)), f_q))mstore(add(transcript, 0x1480), addmod(mload(add(transcript, 0x1460)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x14a0), mulmod(mload(add(transcript, 0x1480)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x14c0), addmod(mload(add(transcript, 0x1400)), mload(add(transcript, 0x14a0)), f_q))mstore(add(transcript, 0x14e0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x14c0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x12c0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1540), addmod(mload(add(transcript, 0x14e0)), mload(add(transcript, 0x1520)), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1540)), f_q))mstore(add(transcript, 0x1580), mulmod(mload(add(transcript, 0x640)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x15a0), mulmod(mload(add(transcript, 0x1300)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x15c0), addmod(mload(add(transcript, 0x1580)), mload(add(transcript, 0x15a0)), f_q))mstore(add(transcript, 0x15e0), addmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x6a0)), f_q))mstore(add(transcript, 0x1600), mulmod(mload(add(transcript, 0x15e0)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), mulmod(mload(add(transcript, 0x1600)), mload(add(transcript, 0x1600)), f_q))mstore(add(transcript, 0x1640), mulmod(mload(add(transcript, 0x15e0)), mload(add(transcript, 0x1620)), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x600)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x1680), mulmod(mload(add(transcript, 0x620)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x16a0), addmod(mload(add(transcript, 0x1660)), mload(add(transcript, 0x1680)), f_q))mstore(add(transcript, 0x16c0), addmod(mload(add(transcript, 0x1640)), sub(f_q, mload(add(transcript, 0x16a0))), f_q))mstore(add(transcript, 0x16e0), mulmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x1560)), mload(add(transcript, 0x16e0)), f_q))mstore(add(transcript, 0x1720), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1700)), f_q))mstore(add(transcript, 0x1740), mulmod(mload(add(transcript, 0x640)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x1300)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x1780), addmod(mload(add(transcript, 0x1740)), mload(add(transcript, 0x1760)), f_q))mstore(add(transcript, 0x17a0), addmod(mload(add(transcript, 0x1780)), mload(add(transcript, 0x6c0)), f_q))mstore(add(transcript, 0x17c0), mulmod(mload(add(transcript, 0x600)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x17e0), mulmod(mload(add(transcript, 0x620)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1800), addmod(mload(add(transcript, 0x17c0)), mload(add(transcript, 0x17e0)), f_q))mstore(add(transcript, 0x1820), addmod(mload(add(transcript, 0x17a0)), sub(f_q, mload(add(transcript, 0x1800))), f_q))mstore(add(transcript, 0x1840), mulmod(mload(add(transcript, 0x1820)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1860), addmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1840)), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1860)), f_q))mstore(add(transcript, 0x18a0), addmod(1, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x18c0), mulmod(mload(add(transcript, 0x18a0)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x18e0), addmod(2, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x18c0)), f_q))mstore(add(transcript, 0x1920), addmod(4, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1940), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1960), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0x1980), addmod(mload(add(transcript, 0x1960)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x19a0), mulmod(mload(add(transcript, 0x1980)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x19c0), addmod(mload(add(transcript, 0x1880)), mload(add(transcript, 0x19a0)), f_q))mstore(add(transcript, 0x19e0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x19c0)), f_q))mstore(add(transcript, 0x1a00), addmod(mload(add(transcript, 0x660)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1a20), mulmod(mload(add(transcript, 0x1a00)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x1a40), addmod(mload(add(transcript, 0x19e0)), mload(add(transcript, 0x1a20)), f_q))mstore(add(transcript, 0x1a60), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1a80), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1aa0), addmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1ac0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1aa0)), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1480)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1b00), addmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1b00)), f_q))mstore(add(transcript, 0x1b40), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1b60), addmod(mload(add(transcript, 0x1b20)), mload(add(transcript, 0x1b40)), f_q))mstore(add(transcript, 0x1b80), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1b60)), f_q))mstore(add(transcript, 0x1ba0), mulmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1bc0), addmod(mload(add(transcript, 0x1b80)), mload(add(transcript, 0x1ba0)), f_q))mstore(add(transcript, 0x1be0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1bc0)), f_q))mstore(add(transcript, 0x1c00), mulmod(mload(add(transcript, 0x1820)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1c20), addmod(mload(add(transcript, 0x1be0)), mload(add(transcript, 0x1c00)), f_q))mstore(add(transcript, 0x1c40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1c20)), f_q))mstore(add(transcript, 0x1c60), addmod(3, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1c80), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1ca0), mulmod(mload(add(transcript, 0x1980)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1cc0), addmod(mload(add(transcript, 0x1c40)), mload(add(transcript, 0x1ca0)), f_q))mstore(add(transcript, 0x1ce0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1cc0)), f_q))mstore(add(transcript, 0x1d00), mulmod(mload(add(transcript, 0x1a00)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1d20), addmod(mload(add(transcript, 0x1ce0)), mload(add(transcript, 0x1d00)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1d20)), f_q))mstore(add(transcript, 0x1d60), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x1d80), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1d60)), f_q))mstore(add(transcript, 0x1da0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1d80)), f_q))mstore(add(transcript, 0x1dc0), mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1de0), addmod(1, sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1e00), mulmod(mload(add(transcript, 0x1de0)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e20), addmod(mload(add(transcript, 0x1d40)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1e20)), f_q))mstore(add(transcript, 0x1e60), mulmod(2, mload(add(transcript, 0x640)), f_q))mstore(add(transcript, 0x1e80), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x5c0))), f_q))mstore(add(transcript, 0x1ea0), mulmod(mload(add(transcript, 0x1e80)), mload(add(transcript, 0x1e60)), f_q))mstore(add(transcript, 0x1ec0), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x5c0))), f_q))mstore(add(transcript, 0x1ee0), addmod(mload(add(transcript, 0x1ea0)), sub(f_q, mload(add(transcript, 0x1ec0))), f_q))mstore(add(transcript, 0x1f00), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1f20), addmod(mload(add(transcript, 0x1ee0)), sub(f_q, mload(add(transcript, 0x1f00))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1e40)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x18c0)), f_q))mstore(add(transcript, 0x1fc0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1fa0)), f_q))mstore(add(transcript, 0x1fe0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x5e0)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x1fe0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x2020), mulmod(mload(add(transcript, 0x2000)), mload(add(transcript, 0x1fc0)), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x2060), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2040)), f_q))mstore(add(transcript, 0x2080), addmod(mload(add(transcript, 0x2060)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x20a0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), addmod(1, sub(f_q, mload(add(transcript, 0x8e0))), f_q))mstore(add(transcript, 0x20e0), mulmod(mload(add(transcript, 0x20c0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2100), addmod(mload(add(transcript, 0x20a0)), mload(add(transcript, 0x20e0)), f_q))mstore(add(transcript, 0x2120), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2100)), f_q))mstore(add(transcript, 0x2140), mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2160), addmod(mload(add(transcript, 0x2140)), sub(f_q, mload(add(transcript, 0x940))), f_q))mstore(add(transcript, 0x2180), mulmod(mload(add(transcript, 0x2160)), mload(add(transcript, 0x1140)), f_q))mstore(add(transcript, 0x21a0), addmod(mload(add(transcript, 0x2120)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x21a0)), f_q))mstore(add(transcript, 0x21e0), addmod(mload(add(transcript, 0x940)), sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x2200), mulmod(mload(add(transcript, 0x21e0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2220), addmod(mload(add(transcript, 0x21c0)), mload(add(transcript, 0x2200)), f_q))mstore(add(transcript, 0x2240), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2220)), f_q))mstore(add(transcript, 0x2260), addmod(1, sub(f_q, mload(add(transcript, 0x1140))), f_q))mstore(add(transcript, 0x2280), addmod(mload(add(transcript, 0x1160)), mload(add(transcript, 0x1180)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), mload(add(transcript, 0x11a0)), f_q))mstore(add(transcript, 0x22c0), addmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x11c0)), f_q))mstore(add(transcript, 0x22e0), addmod(mload(add(transcript, 0x22c0)), mload(add(transcript, 0x11e0)), f_q))mstore(add(transcript, 0x2300), addmod(mload(add(transcript, 0x2260)), sub(f_q, mload(add(transcript, 0x22e0))), f_q))mstore(add(transcript, 0x2320), mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2340), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2320)), f_q))mstore(add(transcript, 0x2360), addmod(mload(add(transcript, 0x2340)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2380), mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x23a0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2380)), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x23a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x23e0), mulmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x2360)), f_q))mstore(add(transcript, 0x2400), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2420), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2400)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x2420)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2460), mulmod(mload(add(transcript, 0x2440)), mload(add(transcript, 0x23e0)), f_q))mstore(add(transcript, 0x2480), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x24a0), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x2480)), f_q))mstore(add(transcript, 0x24c0), addmod(mload(add(transcript, 0x24a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x24e0), mulmod(mload(add(transcript, 0x24c0)), mload(add(transcript, 0x2460)), f_q))mstore(add(transcript, 0x2500), mulmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x900)), f_q))mstore(add(transcript, 0x2520), mulmod(1, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2540), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x2560), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x2560)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x25a0), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x25a0)), f_q))mstore(add(transcript, 0x25e0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x25c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x25e0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x2580)), f_q))mstore(add(transcript, 0x2640), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2660), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2640)), f_q))mstore(add(transcript, 0x2680), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2660)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x2680)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x26c0), mulmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2620)), f_q))mstore(add(transcript, 0x26e0), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2700), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x2700)), f_q))mstore(add(transcript, 0x2740), addmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2780), mulmod(mload(add(transcript, 0x2760)), mload(add(transcript, 0x8e0)), f_q))mstore(add(transcript, 0x27a0), addmod(mload(add(transcript, 0x2500)), sub(f_q, mload(add(transcript, 0x2780))), f_q))mstore(add(transcript, 0x27c0), mulmod(mload(add(transcript, 0x27a0)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x2240)), mload(add(transcript, 0x27c0)), f_q))mstore(add(transcript, 0x2800), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x27e0)), f_q))mstore(add(transcript, 0x2820), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2840), addmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x2840)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2880), mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x28a0), addmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x2880)), f_q))mstore(add(transcript, 0x28c0), addmod(mload(add(transcript, 0x28a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x28e0), mulmod(mload(add(transcript, 0x28c0)), mload(add(transcript, 0x2860)), f_q))mstore(add(transcript, 0x2900), mulmod(mload(add(transcript, 0x28e0)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x2920), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2940), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2920)), f_q))mstore(add(transcript, 0x2960), addmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2940)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x2960)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x29a0), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x29a0)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x29c0)), f_q))mstore(add(transcript, 0x2a00), addmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2a20), mulmod(mload(add(transcript, 0x2a00)), mload(add(transcript, 0x2980)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x2a20)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2a60), addmod(mload(add(transcript, 0x2900)), sub(f_q, mload(add(transcript, 0x2a40))), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x2a60)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x2800)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ac0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2aa0)), f_q))mstore(add(transcript, 0x2ae0), addmod(1, sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2b00), mulmod(mload(add(transcript, 0x2ae0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2b20), addmod(mload(add(transcript, 0x2ac0)), mload(add(transcript, 0x2b00)), f_q))mstore(add(transcript, 0x2b40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2b20)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2b80), addmod(mload(add(transcript, 0x2b60)), sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2ba0), mulmod(mload(add(transcript, 0x2b80)), mload(add(transcript, 0x1140)), f_q))mstore(add(transcript, 0x2bc0), addmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x2ba0)), f_q))mstore(add(transcript, 0x2be0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2bc0)), f_q))mstore(add(transcript, 0x2c00), addmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2c20), mulmod(mload(add(transcript, 0x2c00)), mload(add(transcript, 0x9a0)), f_q))mstore(add(transcript, 0x2c40), addmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2c60), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x2c20)), f_q))mstore(add(transcript, 0x2c80), mulmod(256, mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x2ca0), addmod(mload(add(transcript, 0x5c0)), sub(f_q, mload(add(transcript, 0x2c80))), f_q))mstore(add(transcript, 0x2cc0), mulmod(mload(add(transcript, 0x2ca0)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x2ce0), addmod(mload(add(transcript, 0x2cc0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2d00), mulmod(mload(add(transcript, 0x2ce0)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2d20), addmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2d40), mulmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d60), addmod(mload(add(transcript, 0x2c60)), sub(f_q, mload(add(transcript, 0x2d40))), f_q))mstore(add(transcript, 0x2d80), mulmod(mload(add(transcript, 0x2d60)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2da0), addmod(mload(add(transcript, 0x2be0)), mload(add(transcript, 0x2d80)), f_q))mstore(add(transcript, 0x2dc0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2da0)), f_q))mstore(add(transcript, 0x2de0), addmod(mload(add(transcript, 0x9c0)), sub(f_q, mload(add(transcript, 0xa00))), f_q))mstore(add(transcript, 0x2e00), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2e20), addmod(mload(add(transcript, 0x2dc0)), mload(add(transcript, 0x2e00)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2e20)), f_q))mstore(add(transcript, 0x2e60), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2e80), addmod(mload(add(transcript, 0x9c0)), sub(f_q, mload(add(transcript, 0x9e0))), f_q))mstore(add(transcript, 0x2ea0), mulmod(mload(add(transcript, 0x2e80)), mload(add(transcript, 0x2e60)), f_q))mstore(add(transcript, 0x2ec0), addmod(mload(add(transcript, 0x2e40)), mload(add(transcript, 0x2ea0)), f_q))mstore(add(transcript, 0x2ee0), mulmod(mload(add(transcript, 0xd00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x2ee0)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f20), mulmod(mload(add(transcript, 0x2f00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f60), mulmod(1, mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f80), mulmod(1, mload(add(transcript, 0x2ee0)), f_q))mstore(add(transcript, 0x2fa0), mulmod(1, mload(add(transcript, 0x2f00)), f_q))mstore(add(transcript, 0x2fc0), mulmod(1, mload(add(transcript, 0x2f20)), f_q))mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x2ec0)), mload(add(transcript, 0xd20)), f_q))mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0x580)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0x580)), 1, f_q))mstore(add(transcript, 0x3040), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x3020))), f_q))mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0x3080), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x3060))), f_q))mstore(add(transcript, 0x30a0), mulmod(mload(add(transcript, 0x580)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0x30c0), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x30a0))), f_q))mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0x3100), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x30e0))), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q)mstore(add(transcript, 0x3120), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q)mstore(add(transcript, 0x3140), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q)mstore(add(transcript, 0x3160), result) }mstore(add(transcript, 0x3180), mulmod(1, mload(add(transcript, 0x3040)), f_q))mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x3080)), f_q))mstore(add(transcript, 0x31c0), mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x3100)), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x31e0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q)mstore(add(transcript, 0x3200), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q)mstore(add(transcript, 0x3220), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q)mstore(add(transcript, 0x3240), result) }mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x30c0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q)mstore(add(transcript, 0x3280), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q)mstore(add(transcript, 0x32a0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q)mstore(add(transcript, 0x32c0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q)mstore(add(transcript, 0x32e0), result) }mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x3100)), f_q)){ let prod := mload(add(transcript, 0x3120)) prod := mulmod(mload(add(transcript, 0x3140)), prod, f_q) mstore(add(transcript, 0x3320), prod) prod := mulmod(mload(add(transcript, 0x3160)), prod, f_q) mstore(add(transcript, 0x3340), prod) prod := mulmod(mload(add(transcript, 0x31e0)), prod, f_q) mstore(add(transcript, 0x3360), prod) prod := mulmod(mload(add(transcript, 0x3180)), prod, f_q) mstore(add(transcript, 0x3380), prod) prod := mulmod(mload(add(transcript, 0x3200)), prod, f_q) mstore(add(transcript, 0x33a0), prod) prod := mulmod(mload(add(transcript, 0x3220)), prod, f_q) mstore(add(transcript, 0x33c0), prod) prod := mulmod(mload(add(transcript, 0x3240)), prod, f_q) mstore(add(transcript, 0x33e0), prod) prod := mulmod(mload(add(transcript, 0x3260)), prod, f_q) mstore(add(transcript, 0x3400), prod) prod := mulmod(mload(add(transcript, 0x3280)), prod, f_q) mstore(add(transcript, 0x3420), prod) prod := mulmod(mload(add(transcript, 0x32a0)), prod, f_q) mstore(add(transcript, 0x3440), prod) prod := mulmod(mload(add(transcript, 0x31a0)), prod, f_q) mstore(add(transcript, 0x3460), prod) prod := mulmod(mload(add(transcript, 0x32c0)), prod, f_q) mstore(add(transcript, 0x3480), prod) prod := mulmod(mload(add(transcript, 0x32e0)), prod, f_q) mstore(add(transcript, 0x34a0), prod) prod := mulmod(mload(add(transcript, 0x3300)), prod, f_q) mstore(add(transcript, 0x34c0), prod) }mstore(add(transcript, 0x3500), 32)mstore(add(transcript, 0x3520), 32)mstore(add(transcript, 0x3540), 32)mstore(add(transcript, 0x3560), mload(add(transcript, 0x34c0)))mstore(add(transcript, 0x3580), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x35a0), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3500), 0xc0, add(transcript, 0x34e0), 0x20), 1), success){ let inv := mload(add(transcript, 0x34e0)) let v v := mload(add(transcript, 0x3300)) mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x34a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32e0)) mstore(add(transcript, 0x32e0), mulmod(mload(add(transcript, 0x3480)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32c0)) mstore(add(transcript, 0x32c0), mulmod(mload(add(transcript, 0x3460)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x31a0)) mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3440)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32a0)) mstore(add(transcript, 0x32a0), mulmod(mload(add(transcript, 0x3420)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3280)) mstore(add(transcript, 0x3280), mulmod(mload(add(transcript, 0x3400)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3260)) mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x33e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3240)) mstore(add(transcript, 0x3240), mulmod(mload(add(transcript, 0x33c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3220)) mstore(add(transcript, 0x3220), mulmod(mload(add(transcript, 0x33a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3200)) mstore(add(transcript, 0x3200), mulmod(mload(add(transcript, 0x3380)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3180)) mstore(add(transcript, 0x3180), mulmod(mload(add(transcript, 0x3360)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x31e0)) mstore(add(transcript, 0x31e0), mulmod(mload(add(transcript, 0x3340)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3160)) mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x3320)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3140)) mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x3120)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3120), inv) }{ let result := mload(add(transcript, 0x3120))result := addmod(mload(add(transcript, 0x3140)), result, f_q)result := addmod(mload(add(transcript, 0x3160)), result, f_q)mstore(add(transcript, 0x35c0), result) }mstore(add(transcript, 0x35e0), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3180)), f_q)){ let result := mload(add(transcript, 0x31e0))mstore(add(transcript, 0x3600), result) }mstore(add(transcript, 0x3620), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3260)), f_q)){ let result := mload(add(transcript, 0x3200))result := addmod(mload(add(transcript, 0x3220)), result, f_q)result := addmod(mload(add(transcript, 0x3240)), result, f_q)mstore(add(transcript, 0x3640), result) }mstore(add(transcript, 0x3660), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x31a0)), f_q)){ let result := mload(add(transcript, 0x3280))result := addmod(mload(add(transcript, 0x32a0)), result, f_q)mstore(add(transcript, 0x3680), result) }mstore(add(transcript, 0x36a0), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3300)), f_q)){ let result := mload(add(transcript, 0x32c0))result := addmod(mload(add(transcript, 0x32e0)), result, f_q)mstore(add(transcript, 0x36c0), result) }{ let prod := mload(add(transcript, 0x35c0)) prod := mulmod(mload(add(transcript, 0x3600)), prod, f_q) mstore(add(transcript, 0x36e0), prod) prod := mulmod(mload(add(transcript, 0x3640)), prod, f_q) mstore(add(transcript, 0x3700), prod) prod := mulmod(mload(add(transcript, 0x3680)), prod, f_q) mstore(add(transcript, 0x3720), prod) prod := mulmod(mload(add(transcript, 0x36c0)), prod, f_q) mstore(add(transcript, 0x3740), prod) }mstore(add(transcript, 0x3780), 32)mstore(add(transcript, 0x37a0), 32)mstore(add(transcript, 0x37c0), 32)mstore(add(transcript, 0x37e0), mload(add(transcript, 0x3740)))mstore(add(transcript, 0x3800), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3820), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3780), 0xc0, add(transcript, 0x3760), 0x20), 1), success){ let inv := mload(add(transcript, 0x3760)) let v v := mload(add(transcript, 0x36c0)) mstore(add(transcript, 0x36c0), mulmod(mload(add(transcript, 0x3720)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3680)) mstore(add(transcript, 0x3680), mulmod(mload(add(transcript, 0x3700)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3640)) mstore(add(transcript, 0x3640), mulmod(mload(add(transcript, 0x36e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3600)) mstore(add(transcript, 0x3600), mulmod(mload(add(transcript, 0x35c0)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x35c0), inv) }mstore(add(transcript, 0x3840), mulmod(mload(add(transcript, 0x35e0)), mload(add(transcript, 0x3600)), f_q))mstore(add(transcript, 0x3860), mulmod(mload(add(transcript, 0x3620)), mload(add(transcript, 0x3640)), f_q))mstore(add(transcript, 0x3880), mulmod(mload(add(transcript, 0x3660)), mload(add(transcript, 0x3680)), f_q))mstore(add(transcript, 0x38a0), mulmod(mload(add(transcript, 0x36a0)), mload(add(transcript, 0x36c0)), f_q))mstore(add(transcript, 0x38c0), mulmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x38e0), mulmod(mload(add(transcript, 0x38c0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3900), mulmod(mload(add(transcript, 0x38e0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3920), mulmod(mload(add(transcript, 0x3900)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3940), mulmod(mload(add(transcript, 0x3920)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3960), mulmod(mload(add(transcript, 0x3940)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3960)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39a0), mulmod(mload(add(transcript, 0x3980)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x39a0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39e0), mulmod(mload(add(transcript, 0x39c0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a00), mulmod(mload(add(transcript, 0x39e0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a40), mulmod(mload(add(transcript, 0x3a20)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a60), mulmod(mload(add(transcript, 0x3a40)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a80), mulmod(mload(add(transcript, 0x3a60)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ae0), mulmod(mload(add(transcript, 0x3ac0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b00), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b40), mulmod(mload(add(transcript, 0xaa0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3b80), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0xaa0)), f_q)){ let result := mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x3120)), f_q)result := addmod(mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x3140)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x3160)), f_q), result, f_q)mstore(add(transcript, 0x3bc0), result) }mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3bc0)), mload(add(transcript, 0x35c0)), f_q))mstore(add(transcript, 0x3c00), mulmod(sub(f_q, mload(add(transcript, 0x3be0))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x3120)), f_q)result := addmod(mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x3140)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3160)), f_q), result, f_q)mstore(add(transcript, 0x3c20), result) }mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0x35c0)), f_q))mstore(add(transcript, 0x3c60), mulmod(sub(f_q, mload(add(transcript, 0x3c40))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3c80), mulmod(1, mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ca0), addmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), 1, f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3c80)), 1, f_q))mstore(add(transcript, 0x3d00), mulmod(1, mload(add(transcript, 0x35e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3d20), result) }mstore(add(transcript, 0x3d40), mulmod(mload(add(transcript, 0x3d20)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3d60), mulmod(sub(f_q, mload(add(transcript, 0x3d40))), 1, f_q))mstore(add(transcript, 0x3d80), mulmod(mload(add(transcript, 0x3d00)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3da0), result) }mstore(add(transcript, 0x3dc0), mulmod(mload(add(transcript, 0x3da0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3de0), mulmod(sub(f_q, mload(add(transcript, 0x3dc0))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3e20), addmod(mload(add(transcript, 0x3d60)), mload(add(transcript, 0x3de0)), f_q)){ let result := mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3e40), result) }mstore(add(transcript, 0x3e60), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3e80), mulmod(sub(f_q, mload(add(transcript, 0x3e60))), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x3ea0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x3ec0), addmod(mload(add(transcript, 0x3e20)), mload(add(transcript, 0x3e80)), f_q)){ let result := mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3ee0), result) }mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3f20), mulmod(sub(f_q, mload(add(transcript, 0x3f00))), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x3f40), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x3f60), addmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3f20)), f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), mload(add(transcript, 0x3900)), f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3900)), f_q))mstore(add(transcript, 0x4000), addmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3fc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4020), result) }mstore(add(transcript, 0x4040), mulmod(mload(add(transcript, 0x4020)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4060), mulmod(sub(f_q, mload(add(transcript, 0x4040))), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x4080), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x40a0), addmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x4060)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x40c0), result) }mstore(add(transcript, 0x40e0), mulmod(mload(add(transcript, 0x40c0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4100), mulmod(sub(f_q, mload(add(transcript, 0x40e0))), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x4120), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x4140), addmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x4100)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4160), result) }mstore(add(transcript, 0x4180), mulmod(mload(add(transcript, 0x4160)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x41a0), mulmod(sub(f_q, mload(add(transcript, 0x4180))), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x41c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x41e0), addmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x41a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4200), result) }mstore(add(transcript, 0x4220), mulmod(mload(add(transcript, 0x4200)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4240), mulmod(sub(f_q, mload(add(transcript, 0x4220))), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4260), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4280), addmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x4240)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x42a0), result) }mstore(add(transcript, 0x42c0), mulmod(mload(add(transcript, 0x42a0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x42e0), mulmod(sub(f_q, mload(add(transcript, 0x42c0))), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x4300), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x4320), addmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x42e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4340), result) }mstore(add(transcript, 0x4360), mulmod(mload(add(transcript, 0x4340)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4380), mulmod(sub(f_q, mload(add(transcript, 0x4360))), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x43a0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x43c0), addmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x4380)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x43e0), result) }mstore(add(transcript, 0x4400), mulmod(mload(add(transcript, 0x43e0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4420), mulmod(sub(f_q, mload(add(transcript, 0x4400))), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x4440), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x4460), addmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x4420)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4480), result) }mstore(add(transcript, 0x44a0), mulmod(mload(add(transcript, 0x4480)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x44c0), mulmod(sub(f_q, mload(add(transcript, 0x44a0))), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x44e0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4500), addmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x44c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4520), result) }mstore(add(transcript, 0x4540), mulmod(mload(add(transcript, 0x4520)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4560), mulmod(sub(f_q, mload(add(transcript, 0x4540))), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x4580), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x45a0), addmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x4560)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x45c0), result) }mstore(add(transcript, 0x45e0), mulmod(mload(add(transcript, 0x45c0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4600), mulmod(sub(f_q, mload(add(transcript, 0x45e0))), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4620), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4640), addmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x4600)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4660), result) }mstore(add(transcript, 0x4680), mulmod(mload(add(transcript, 0x4660)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46a0), mulmod(sub(f_q, mload(add(transcript, 0x4680))), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x46c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x46e0), addmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x46a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4700), result) }mstore(add(transcript, 0x4720), mulmod(mload(add(transcript, 0x4700)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4740), mulmod(sub(f_q, mload(add(transcript, 0x4720))), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4760), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4780), addmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x4740)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x47a0), result) }mstore(add(transcript, 0x47c0), mulmod(mload(add(transcript, 0x47a0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x47e0), mulmod(sub(f_q, mload(add(transcript, 0x47c0))), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4800), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4820), addmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x47e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4840), result) }mstore(add(transcript, 0x4860), mulmod(mload(add(transcript, 0x4840)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4880), mulmod(sub(f_q, mload(add(transcript, 0x4860))), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x48a0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x48c0), addmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x4880)), f_q))mstore(add(transcript, 0x48e0), mulmod(mload(add(transcript, 0x2f60)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x2f80)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4920), mulmod(mload(add(transcript, 0x2fa0)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4940), mulmod(mload(add(transcript, 0x2fc0)), mload(add(transcript, 0x35e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4960), result) }mstore(add(transcript, 0x4980), mulmod(mload(add(transcript, 0x4960)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x49a0), mulmod(sub(f_q, mload(add(transcript, 0x4980))), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x49c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a00), mulmod(mload(add(transcript, 0x4900)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x4920)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a40), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a60), addmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x49a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4a80), result) }mstore(add(transcript, 0x4aa0), mulmod(mload(add(transcript, 0x4a80)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4ac0), mulmod(sub(f_q, mload(add(transcript, 0x4aa0))), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4ae0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4b00), addmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x4ac0)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x4b00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x3d80)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x3e00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x3ea0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ba0), mulmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4bc0), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c00), mulmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c40), mulmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x49c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4dc0), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4de0), mulmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e00), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e20), mulmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e40), mulmod(mload(add(transcript, 0x4ae0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e60), addmod(mload(add(transcript, 0x3cc0)), mload(add(transcript, 0x4b20)), f_q))mstore(add(transcript, 0x4e80), mulmod(1, mload(add(transcript, 0x3620)), f_q)){ let result := mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x3200)), f_q)result := addmod(mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x3220)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3240)), f_q), result, f_q)mstore(add(transcript, 0x4ea0), result) }mstore(add(transcript, 0x4ec0), mulmod(mload(add(transcript, 0x4ea0)), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4ee0), mulmod(sub(f_q, mload(add(transcript, 0x4ec0))), 1, f_q))mstore(add(transcript, 0x4f00), mulmod(mload(add(transcript, 0x4e80)), 1, f_q))mstore(add(transcript, 0x4f20), mulmod(mload(add(transcript, 0x4ee0)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4f40), mulmod(mload(add(transcript, 0x4f00)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4f60), addmod(mload(add(transcript, 0x4e60)), mload(add(transcript, 0x4f20)), f_q))mstore(add(transcript, 0x4f80), mulmod(1, mload(add(transcript, 0x3660)), f_q)){ let result := mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3280)), f_q)result := addmod(mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x4fa0), result) }mstore(add(transcript, 0x4fc0), mulmod(mload(add(transcript, 0x4fa0)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x4fe0), mulmod(sub(f_q, mload(add(transcript, 0x4fc0))), 1, f_q))mstore(add(transcript, 0x5000), mulmod(mload(add(transcript, 0x4f80)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x3280)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x5020), result) }mstore(add(transcript, 0x5040), mulmod(mload(add(transcript, 0x5020)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x5060), mulmod(sub(f_q, mload(add(transcript, 0x5040))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x5080), mulmod(mload(add(transcript, 0x4f80)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x50a0), addmod(mload(add(transcript, 0x4fe0)), mload(add(transcript, 0x5060)), f_q))mstore(add(transcript, 0x50c0), mulmod(mload(add(transcript, 0x50a0)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x50e0), mulmod(mload(add(transcript, 0x5000)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x5100), mulmod(mload(add(transcript, 0x5080)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x5120), addmod(mload(add(transcript, 0x4f60)), mload(add(transcript, 0x50c0)), f_q))mstore(add(transcript, 0x5140), mulmod(1, mload(add(transcript, 0x36a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x32c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x32e0)), f_q), result, f_q)mstore(add(transcript, 0x5160), result) }mstore(add(transcript, 0x5180), mulmod(mload(add(transcript, 0x5160)), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x51a0), mulmod(sub(f_q, mload(add(transcript, 0x5180))), 1, f_q))mstore(add(transcript, 0x51c0), mulmod(mload(add(transcript, 0x5140)), 1, f_q))mstore(add(transcript, 0x51e0), mulmod(mload(add(transcript, 0x51a0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x5200), mulmod(mload(add(transcript, 0x51c0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x5220), addmod(mload(add(transcript, 0x5120)), mload(add(transcript, 0x51e0)), f_q))mstore(add(transcript, 0x5240), mulmod(1, mload(add(transcript, 0x31c0)), f_q))mstore(add(transcript, 0x5260), mulmod(1, mload(add(transcript, 0xb40)), f_q))mstore(add(transcript, 0x5280), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x52a0), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x52c0), mload(add(transcript, 0x5220)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5280), 0x60, add(transcript, 0x5280), 0x40), 1), success)mstore(add(transcript, 0x52e0), mload(add(transcript, 0x5280))) mstore(add(transcript, 0x5300), mload(add(transcript, 0x52a0)))mstore(add(transcript, 0x5320), mload(add(transcript, 0x60))) mstore(add(transcript, 0x5340), mload(add(transcript, 0x80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x52e0), 0x80, add(transcript, 0x52e0), 0x40), 1), success)mstore(add(transcript, 0x5360), mload(add(transcript, 0xa0))) mstore(add(transcript, 0x5380), mload(add(transcript, 0xc0)))mstore(add(transcript, 0x53a0), mload(add(transcript, 0x3ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5360), 0x60, add(transcript, 0x5360), 0x40), 1), success)mstore(add(transcript, 0x53c0), mload(add(transcript, 0x52e0))) mstore(add(transcript, 0x53e0), mload(add(transcript, 0x5300)))mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360))) mstore(add(transcript, 0x5420), mload(add(transcript, 0x5380)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x53c0), 0x80, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5440), mload(add(transcript, 0xe0))) mstore(add(transcript, 0x5460), mload(add(transcript, 0x100)))mstore(add(transcript, 0x5480), mload(add(transcript, 0x4b40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5440), 0x60, add(transcript, 0x5440), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x5440))) mstore(add(transcript, 0x5500), mload(add(transcript, 0x5460)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x54a0), 0x80, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5520), mload(add(transcript, 0x1c0))) mstore(add(transcript, 0x5540), mload(add(transcript, 0x1e0)))mstore(add(transcript, 0x5560), mload(add(transcript, 0x4b60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5520), 0x60, add(transcript, 0x5520), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x54c0)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x5520))) mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5540)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5580), 0x80, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x5600), 0x23a3b90b52101f0a6b5743b3e901cc1ca3fedcf56639e3f5d092c1fe8918dd49) mstore(add(transcript, 0x5620), 0x2d1ac29c598a842f7865a78359fe925ab012907df3ef22ecee8c3e38775c47fd)mstore(add(transcript, 0x5640), mload(add(transcript, 0x4b80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5600), 0x60, add(transcript, 0x5600), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x55a0)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x5600))) mstore(add(transcript, 0x56c0), mload(add(transcript, 0x5620)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5660), 0x80, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56e0), 0x03889f612bd17e011b13902673a70688bbacdf22704cc8295740a0b855955fc0) mstore(add(transcript, 0x5700), 0x077a491ddd81dbd1802d89735ae881c56da97f908e0bb6a3a8ad6fd9f72db123)mstore(add(transcript, 0x5720), mload(add(transcript, 0x4ba0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x56e0), 0x60, add(transcript, 0x56e0), 0x40), 1), success)mstore(add(transcript, 0x5740), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5760), mload(add(transcript, 0x5680)))mstore(add(transcript, 0x5780), mload(add(transcript, 0x56e0))) mstore(add(transcript, 0x57a0), mload(add(transcript, 0x5700)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5740), 0x80, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57c0), 0x293f3eeabeb387e78c97a4de420d2336ff8ed1aaadf797c7dc3e622c9f144052) mstore(add(transcript, 0x57e0), 0x04f8141148a083ed78d264b622ccd39fdc2e5a4d4309def83c65f641fa1f73ae)mstore(add(transcript, 0x5800), mload(add(transcript, 0x4bc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x57c0), 0x60, add(transcript, 0x57c0), 0x40), 1), success)mstore(add(transcript, 0x5820), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5840), mload(add(transcript, 0x5760)))mstore(add(transcript, 0x5860), mload(add(transcript, 0x57c0))) mstore(add(transcript, 0x5880), mload(add(transcript, 0x57e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5820), 0x80, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x58a0), 0x153842f7c3d4213d1a0bdf0272dc0ac05b87949495a94680ea07f5528cd4cb65) mstore(add(transcript, 0x58c0), 0x197481eee392189181d33d51883b612dc4b9b7b40ac3c516d04ef58b4458f841)mstore(add(transcript, 0x58e0), mload(add(transcript, 0x4be0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x58a0), 0x60, add(transcript, 0x58a0), 0x40), 1), success)mstore(add(transcript, 0x5900), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x5920), mload(add(transcript, 0x5840)))mstore(add(transcript, 0x5940), mload(add(transcript, 0x58a0))) mstore(add(transcript, 0x5960), mload(add(transcript, 0x58c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5900), 0x80, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5980), 0x2eb2df9649175ed689ae9b18bd9c2da55e06f28b8bade40ece584fe646987af2) mstore(add(transcript, 0x59a0), 0x060bd862d267d622becf447c96e00a075a556a12d57a89cdfcccd59180d6e183)mstore(add(transcript, 0x59c0), mload(add(transcript, 0x4c00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5980), 0x60, add(transcript, 0x5980), 0x40), 1), success)mstore(add(transcript, 0x59e0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x5a00), mload(add(transcript, 0x5920)))mstore(add(transcript, 0x5a20), mload(add(transcript, 0x5980))) mstore(add(transcript, 0x5a40), mload(add(transcript, 0x59a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x59e0), 0x80, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a60), 0x261ab047cacbf6fda910b594e5a47fce17d7bf5912a803a159724638ac9a9293) mstore(add(transcript, 0x5a80), 0x1c19cf99cd99c0a2995e7b540f0e131d5a76ada19f52dbf97bf3f7e048e24d57)mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x4c20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5a60), 0x60, add(transcript, 0x5a60), 0x40), 1), success)mstore(add(transcript, 0x5ac0), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5ae0), mload(add(transcript, 0x5a00)))mstore(add(transcript, 0x5b00), mload(add(transcript, 0x5a60))) mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ac0), 0x80, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b40), 0x09852cc4d7e43585f80a71bb658d117c8bad4afd38c56250f79e2fe5ea36cbea) mstore(add(transcript, 0x5b60), 0x0eafdf1dc0ebc50c66a28ef4e4ce11d67dc26835ee8fca885308c4e800e503db)mstore(add(transcript, 0x5b80), mload(add(transcript, 0x4c40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5b40), 0x60, add(transcript, 0x5b40), 0x40), 1), success)mstore(add(transcript, 0x5ba0), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5bc0), mload(add(transcript, 0x5ae0)))mstore(add(transcript, 0x5be0), mload(add(transcript, 0x5b40))) mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ba0), 0x80, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c20), 0x060d05d9347318b8c482f43d589babe34c4feac67e633b7c7d205124e5942031) mstore(add(transcript, 0x5c40), 0x126bce5e065317f42c4ea09165d00008202438e1c490d572c6b76613f21a1ebf)mstore(add(transcript, 0x5c60), mload(add(transcript, 0x4c60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c20), 0x60, add(transcript, 0x5c20), 0x40), 1), success)mstore(add(transcript, 0x5c80), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5ca0), mload(add(transcript, 0x5bc0)))mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x5c20))) mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c80), 0x80, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5d00), 0x1d0f94f3535e58b5d06c339b6364b77cafc3894f0189d777a08f20ce239a1a34) mstore(add(transcript, 0x5d20), 0x0b53ad507c469a238239f93e42e07194761f396948a8d4af1b2ef3eda0ba369f)mstore(add(transcript, 0x5d40), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d00), 0x60, add(transcript, 0x5d00), 0x40), 1), success)mstore(add(transcript, 0x5d60), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d80), mload(add(transcript, 0x5ca0)))mstore(add(transcript, 0x5da0), mload(add(transcript, 0x5d00))) mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5d20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5d60), 0x80, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5de0), 0x05ffd6f47fadc13d413ff73d3dcd2b5413970d2328ace551b3b1d5f20a687375) mstore(add(transcript, 0x5e00), 0x267595ab27c68ff69d06c8c28585973ef0fbad8e0982871a193b026541e27893)mstore(add(transcript, 0x5e20), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5de0), 0x60, add(transcript, 0x5de0), 0x40), 1), success)mstore(add(transcript, 0x5e40), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e60), mload(add(transcript, 0x5d80)))mstore(add(transcript, 0x5e80), mload(add(transcript, 0x5de0))) mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5e00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5e40), 0x80, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ec0), 0x072dca4b7136fbd39742610eeae201e76bc2295ddc20cc18dd6b19aa7b724b13) mstore(add(transcript, 0x5ee0), 0x23048e9bb2debeafcf95628ab81b03275cdee33bca18d579dde2661f64645ec5)mstore(add(transcript, 0x5f00), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ec0), 0x60, add(transcript, 0x5ec0), 0x40), 1), success)mstore(add(transcript, 0x5f20), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f40), mload(add(transcript, 0x5e60)))mstore(add(transcript, 0x5f60), mload(add(transcript, 0x5ec0))) mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ee0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f20), 0x80, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5fa0), 0x05469c240f7b5fedc125ba1ee66cae1377ec75579599278f630f2d7640994fec) mstore(add(transcript, 0x5fc0), 0x08b814cfa26074aade7bab13b494f598aa5bfdbc49d0df4c4390dd69285d03d0)mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5fa0), 0x60, add(transcript, 0x5fa0), 0x40), 1), success)mstore(add(transcript, 0x6000), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x6020), mload(add(transcript, 0x5f40)))mstore(add(transcript, 0x6040), mload(add(transcript, 0x5fa0))) mstore(add(transcript, 0x6060), mload(add(transcript, 0x5fc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6000), 0x80, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6080), 0x07faf619bc79f6e8ecd37ee152e6befc7b7789c1b594544bf208493392a8ee28) mstore(add(transcript, 0x60a0), 0x2a91842e18f3ac761e5f65edc640dd42ef6d9115b649ad3acdff6cced7a274aa)mstore(add(transcript, 0x60c0), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6080), 0x60, add(transcript, 0x6080), 0x40), 1), success)mstore(add(transcript, 0x60e0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x6100), mload(add(transcript, 0x6020)))mstore(add(transcript, 0x6120), mload(add(transcript, 0x6080))) mstore(add(transcript, 0x6140), mload(add(transcript, 0x60a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x60e0), 0x80, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6160), 0x0fd4442f53e6b5a5f860c2c811cf4e498642314abc354e0a174be6b8bc0e27e5) mstore(add(transcript, 0x6180), 0x091f3fcbe89a23c4458c2e38c7b6444e28d8244c08549e9525ceedf4a320cbc0)mstore(add(transcript, 0x61a0), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6160), 0x60, add(transcript, 0x6160), 0x40), 1), success)mstore(add(transcript, 0x61c0), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61e0), mload(add(transcript, 0x6100)))mstore(add(transcript, 0x6200), mload(add(transcript, 0x6160))) mstore(add(transcript, 0x6220), mload(add(transcript, 0x6180)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x61c0), 0x80, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6240), 0x050cba2ca48cc882687a9e66867e984e2ce5494778a8bcaffdd2296ba9abdb56) mstore(add(transcript, 0x6260), 0x0e44d0ab2133714afce93a354d6271470c293f18ef29ecc874416f81ffb92818)mstore(add(transcript, 0x6280), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6240), 0x60, add(transcript, 0x6240), 0x40), 1), success)mstore(add(transcript, 0x62a0), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x62c0), mload(add(transcript, 0x61e0)))mstore(add(transcript, 0x62e0), mload(add(transcript, 0x6240))) mstore(add(transcript, 0x6300), mload(add(transcript, 0x6260)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x62a0), 0x80, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6320), 0x2f69a41fff5cbe55da07d30e789a0d7660d3e841c70ebb326f5825610a4a5c08) mstore(add(transcript, 0x6340), 0x1fe7e7411a599e8addf546471194a4851d36c711a88e926632f571f0d91fc9f6)mstore(add(transcript, 0x6360), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6320), 0x60, add(transcript, 0x6320), 0x40), 1), success)mstore(add(transcript, 0x6380), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x63a0), mload(add(transcript, 0x62c0)))mstore(add(transcript, 0x63c0), mload(add(transcript, 0x6320))) mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6340)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6380), 0x80, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x6400), 0x26a5a8097f66050a9a3d815d3915eb122d75020777f9e87b160e67cc7fa17e5e) mstore(add(transcript, 0x6420), 0x12c0173fdec4f54e72a0ab39fd9a5ffa14364bbb1ef304610af17195b993b316)mstore(add(transcript, 0x6440), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6400), 0x60, add(transcript, 0x6400), 0x40), 1), success)mstore(add(transcript, 0x6460), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6480), mload(add(transcript, 0x63a0)))mstore(add(transcript, 0x64a0), mload(add(transcript, 0x6400))) mstore(add(transcript, 0x64c0), mload(add(transcript, 0x6420)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6460), 0x80, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64e0), mload(add(transcript, 0x420))) mstore(add(transcript, 0x6500), mload(add(transcript, 0x440)))mstore(add(transcript, 0x6520), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x64e0), 0x60, add(transcript, 0x64e0), 0x40), 1), success)mstore(add(transcript, 0x6540), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6560), mload(add(transcript, 0x6480)))mstore(add(transcript, 0x6580), mload(add(transcript, 0x64e0))) mstore(add(transcript, 0x65a0), mload(add(transcript, 0x6500)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6540), 0x80, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65c0), mload(add(transcript, 0x460))) mstore(add(transcript, 0x65e0), mload(add(transcript, 0x480)))mstore(add(transcript, 0x6600), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x65c0), 0x60, add(transcript, 0x65c0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x6560)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x65c0))) mstore(add(transcript, 0x6680), mload(add(transcript, 0x65e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6620), 0x80, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x66a0), mload(add(transcript, 0x4a0))) mstore(add(transcript, 0x66c0), mload(add(transcript, 0x4c0)))mstore(add(transcript, 0x66e0), mload(add(transcript, 0x4de0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x66a0), 0x60, add(transcript, 0x66a0), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x6640)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x66a0))) mstore(add(transcript, 0x6760), mload(add(transcript, 0x66c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6700), 0x80, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6780), mload(add(transcript, 0x4e0))) mstore(add(transcript, 0x67a0), mload(add(transcript, 0x500)))mstore(add(transcript, 0x67c0), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6780), 0x60, add(transcript, 0x6780), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x6720)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x6780))) mstore(add(transcript, 0x6840), mload(add(transcript, 0x67a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x67e0), 0x80, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6860), mload(add(transcript, 0x520))) mstore(add(transcript, 0x6880), mload(add(transcript, 0x540)))mstore(add(transcript, 0x68a0), mload(add(transcript, 0x4e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6860), 0x60, add(transcript, 0x6860), 0x40), 1), success)mstore(add(transcript, 0x68c0), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x68e0), mload(add(transcript, 0x6800)))mstore(add(transcript, 0x6900), mload(add(transcript, 0x6860))) mstore(add(transcript, 0x6920), mload(add(transcript, 0x6880)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x68c0), 0x80, add(transcript, 0x68c0), 0x40), 1), success)mstore(add(transcript, 0x6940), mload(add(transcript, 0x380))) mstore(add(transcript, 0x6960), mload(add(transcript, 0x3a0)))mstore(add(transcript, 0x6980), mload(add(transcript, 0x4e40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6940), 0x60, add(transcript, 0x6940), 0x40), 1), success)mstore(add(transcript, 0x69a0), mload(add(transcript, 0x68c0))) mstore(add(transcript, 0x69c0), mload(add(transcript, 0x68e0)))mstore(add(transcript, 0x69e0), mload(add(transcript, 0x6940))) mstore(add(transcript, 0x6a00), mload(add(transcript, 0x6960)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x69a0), 0x80, add(transcript, 0x69a0), 0x40), 1), success)mstore(add(transcript, 0x6a20), mload(add(transcript, 0x2c0))) mstore(add(transcript, 0x6a40), mload(add(transcript, 0x2e0)))mstore(add(transcript, 0x6a60), mload(add(transcript, 0x4f40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6a20), 0x60, add(transcript, 0x6a20), 0x40), 1), success)mstore(add(transcript, 0x6a80), mload(add(transcript, 0x69a0))) mstore(add(transcript, 0x6aa0), mload(add(transcript, 0x69c0)))mstore(add(transcript, 0x6ac0), mload(add(transcript, 0x6a20))) mstore(add(transcript, 0x6ae0), mload(add(transcript, 0x6a40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6a80), 0x80, add(transcript, 0x6a80), 0x40), 1), success)mstore(add(transcript, 0x6b00), mload(add(transcript, 0x300))) mstore(add(transcript, 0x6b20), mload(add(transcript, 0x320)))mstore(add(transcript, 0x6b40), mload(add(transcript, 0x50e0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6b00), 0x60, add(transcript, 0x6b00), 0x40), 1), success)mstore(add(transcript, 0x6b60), mload(add(transcript, 0x6a80))) mstore(add(transcript, 0x6b80), mload(add(transcript, 0x6aa0)))mstore(add(transcript, 0x6ba0), mload(add(transcript, 0x6b00))) mstore(add(transcript, 0x6bc0), mload(add(transcript, 0x6b20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6b60), 0x80, add(transcript, 0x6b60), 0x40), 1), success)mstore(add(transcript, 0x6be0), mload(add(transcript, 0x340))) mstore(add(transcript, 0x6c00), mload(add(transcript, 0x360)))mstore(add(transcript, 0x6c20), mload(add(transcript, 0x5100)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6be0), 0x60, add(transcript, 0x6be0), 0x40), 1), success)mstore(add(transcript, 0x6c40), mload(add(transcript, 0x6b60))) mstore(add(transcript, 0x6c60), mload(add(transcript, 0x6b80)))mstore(add(transcript, 0x6c80), mload(add(transcript, 0x6be0))) mstore(add(transcript, 0x6ca0), mload(add(transcript, 0x6c00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6c40), 0x80, add(transcript, 0x6c40), 0x40), 1), success)mstore(add(transcript, 0x6cc0), mload(add(transcript, 0x180))) mstore(add(transcript, 0x6ce0), mload(add(transcript, 0x1a0)))mstore(add(transcript, 0x6d00), mload(add(transcript, 0x5200)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6cc0), 0x60, add(transcript, 0x6cc0), 0x40), 1), success)mstore(add(transcript, 0x6d20), mload(add(transcript, 0x6c40))) mstore(add(transcript, 0x6d40), mload(add(transcript, 0x6c60)))mstore(add(transcript, 0x6d60), mload(add(transcript, 0x6cc0))) mstore(add(transcript, 0x6d80), mload(add(transcript, 0x6ce0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6d20), 0x80, add(transcript, 0x6d20), 0x40), 1), success)mstore(add(transcript, 0x6da0), mload(add(transcript, 0xae0))) mstore(add(transcript, 0x6dc0), mload(add(transcript, 0xb00)))mstore(add(transcript, 0x6de0), sub(f_q, mload(add(transcript, 0x5240))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6da0), 0x60, add(transcript, 0x6da0), 0x40), 1), success)mstore(add(transcript, 0x6e00), mload(add(transcript, 0x6d20))) mstore(add(transcript, 0x6e20), mload(add(transcript, 0x6d40)))mstore(add(transcript, 0x6e40), mload(add(transcript, 0x6da0))) mstore(add(transcript, 0x6e60), mload(add(transcript, 0x6dc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6e00), 0x80, add(transcript, 0x6e00), 0x40), 1), success)mstore(add(transcript, 0x6e80), mload(add(transcript, 0xb80))) mstore(add(transcript, 0x6ea0), mload(add(transcript, 0xba0)))mstore(add(transcript, 0x6ec0), mload(add(transcript, 0x5260)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6e80), 0x60, add(transcript, 0x6e80), 0x40), 1), success)mstore(add(transcript, 0x6ee0), mload(add(transcript, 0x6e00))) mstore(add(transcript, 0x6f00), mload(add(transcript, 0x6e20)))mstore(add(transcript, 0x6f20), mload(add(transcript, 0x6e80))) mstore(add(transcript, 0x6f40), mload(add(transcript, 0x6ea0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ee0), 0x80, add(transcript, 0x6ee0), 0x40), 1), success)mstore(add(transcript, 0x6f60), mload(add(transcript, 0x6ee0))) mstore(add(transcript, 0x6f80), mload(add(transcript, 0x6f00)))mstore(add(transcript, 0x6fa0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x6fc0), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x6fe0), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x7000), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x7020), mload(add(transcript, 0xb80))) mstore(add(transcript, 0x7040), mload(add(transcript, 0xba0)))mstore(add(transcript, 0x7060), 0x1d34ba6e3b52afa8a8df056bfc5157fa16e2c5bb045aab7186aab58f70927fbc) mstore(add(transcript, 0x7080), 0x0b4a022eb8fc503d9d91660c783fc6e37ae61570ebe4883f3663d5b4a435665e) mstore(add(transcript, 0x70a0), 0x2495e03d5e5c9d6acf62cdf715118eebbda912e3092dfe3e9813ed642cdf0412) mstore(add(transcript, 0x70c0), 0x0b9a8ccf1bc9f1b36b74792ad10007ce579e8ba5574a9880d6dff4da84768efe)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x6f60), 0x180, add(transcript, 0x6f60), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x6f60)), 1), success)} return success; } } + assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x0), 20780565364750352931855234182745264522567546354850733883253409196481354617515) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0x60), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0x80), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xa0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0xc0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0xe0), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x100), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x120), keccak256(add(transcript, 0x0), 288)){ let hash := mload(add(transcript, 0x120)) mstore(add(transcript, 0x140), mod(hash, f_q)) mstore(add(transcript, 0x160), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x180), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x1c0), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x1e0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x200), keccak256(add(transcript, 0x160), 160)){ let hash := mload(add(transcript, 0x200)) mstore(add(transcript, 0x220), mod(hash, f_q)) mstore(add(transcript, 0x240), hash) }mstore8(add(transcript, 0x260), 1)mstore(add(transcript, 0x260), keccak256(add(transcript, 0x240), 33)){ let hash := mload(add(transcript, 0x260)) mstore(add(transcript, 0x280), mod(hash, f_q)) mstore(add(transcript, 0x2a0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x2c0), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x2e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x300), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x320), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x340), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x360), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x380), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3a0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x3c0), keccak256(add(transcript, 0x2a0), 288)){ let hash := mload(add(transcript, 0x3c0)) mstore(add(transcript, 0x3e0), mod(hash, f_q)) mstore(add(transcript, 0x400), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x420), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x440), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x460), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x480), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4a0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x4c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x4e0), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x500), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x520), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x540), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x560), keccak256(add(transcript, 0x400), 352)){ let hash := mload(add(transcript, 0x560)) mstore(add(transcript, 0x580), mod(hash, f_q)) mstore(add(transcript, 0x5a0), hash) }mstore(add(transcript, 0x5c0), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x5e0), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x7c0)), f_q))mstore(add(transcript, 0xa00), mod(mload(add(proof, 0x7e0)), f_q))mstore(add(transcript, 0xa20), keccak256(add(transcript, 0x5a0), 1152)){ let hash := mload(add(transcript, 0xa20)) mstore(add(transcript, 0xa40), mod(hash, f_q)) mstore(add(transcript, 0xa60), hash) }mstore8(add(transcript, 0xa80), 1)mstore(add(transcript, 0xa80), keccak256(add(transcript, 0xa60), 33)){ let hash := mload(add(transcript, 0xa80)) mstore(add(transcript, 0xaa0), mod(hash, f_q)) mstore(add(transcript, 0xac0), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xae0), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb00), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb20), keccak256(add(transcript, 0xac0), 96)){ let hash := mload(add(transcript, 0xb20)) mstore(add(transcript, 0xb40), mod(hash, f_q)) mstore(add(transcript, 0xb60), hash) } { let x := mload(add(proof, 0x840)) mstore(add(transcript, 0xb80), x) let y := mload(add(proof, 0x860)) mstore(add(transcript, 0xba0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xbc0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x580)), f_q))mstore(add(transcript, 0xbe0), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0xbc0)), f_q))mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0xbe0)), mload(add(transcript, 0xbe0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0xd20), addmod(mload(add(transcript, 0xd00)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd40), mulmod(mload(add(transcript, 0xd20)), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q))mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0xd40)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xd80), addmod(mload(add(transcript, 0x580)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd40)), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x580)), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd40)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x580)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd40)), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x580)), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd40)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x580)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd40)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x580)), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd40)), 1, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x580)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd40)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x580)), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q)){ let prod := mload(add(transcript, 0xd80)) prod := mulmod(mload(add(transcript, 0xdc0)), prod, f_q) mstore(add(transcript, 0xf60), prod) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0xf80), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0xfa0), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0xfc0), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0xfe0), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x1000), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xd20)), prod, f_q) mstore(add(transcript, 0x1040), prod) }mstore(add(transcript, 0x1080), 32)mstore(add(transcript, 0x10a0), 32)mstore(add(transcript, 0x10c0), 32)mstore(add(transcript, 0x10e0), mload(add(transcript, 0x1040)))mstore(add(transcript, 0x1100), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1120), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x1080), 0xc0, add(transcript, 0x1060), 0x20), 1), success){ let inv := mload(add(transcript, 0x1060)) let v v := mload(add(transcript, 0xd20)) mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x1000)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0xfe0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0xfc0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0xfa0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0xf80)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xf60)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xdc0)) mstore(add(transcript, 0xdc0), mulmod(mload(add(transcript, 0xd80)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xd80), inv) }mstore(add(transcript, 0x1140), mulmod(mload(add(transcript, 0xd60)), mload(add(transcript, 0xd80)), f_q))mstore(add(transcript, 0x1160), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x1180), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x11a0), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x11c0), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x11e0), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x1200), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1220), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q)){ let result := mulmod(mload(add(transcript, 0x1200)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1220)), mload(add(transcript, 0x40)), f_q), result, f_q)mstore(add(transcript, 0x1240), result) }mstore(add(transcript, 0x1260), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1280), mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x1260)), f_q))mstore(add(transcript, 0x12a0), mulmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x1280)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0x12c0)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1300), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x1340), mulmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x1320)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x1340)), f_q))mstore(add(transcript, 0x1380), mulmod(mload(add(transcript, 0x1360)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x13a0), addmod(mload(add(transcript, 0x12e0)), mload(add(transcript, 0x1380)), f_q))mstore(add(transcript, 0x13c0), addmod(mload(add(transcript, 0x13a0)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x13e0), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1400), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x13e0)), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x12c0)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1440), mulmod(mload(add(transcript, 0x1360)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x1460), addmod(mload(add(transcript, 0x1420)), mload(add(transcript, 0x1440)), f_q))mstore(add(transcript, 0x1480), addmod(mload(add(transcript, 0x1460)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x14a0), mulmod(mload(add(transcript, 0x1480)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x14c0), addmod(mload(add(transcript, 0x1400)), mload(add(transcript, 0x14a0)), f_q))mstore(add(transcript, 0x14e0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x14c0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x12c0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1540), addmod(mload(add(transcript, 0x14e0)), mload(add(transcript, 0x1520)), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1540)), f_q))mstore(add(transcript, 0x1580), mulmod(mload(add(transcript, 0x640)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x15a0), mulmod(mload(add(transcript, 0x1300)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x15c0), addmod(mload(add(transcript, 0x1580)), mload(add(transcript, 0x15a0)), f_q))mstore(add(transcript, 0x15e0), addmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x6a0)), f_q))mstore(add(transcript, 0x1600), mulmod(mload(add(transcript, 0x15e0)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), mulmod(mload(add(transcript, 0x1600)), mload(add(transcript, 0x1600)), f_q))mstore(add(transcript, 0x1640), mulmod(mload(add(transcript, 0x15e0)), mload(add(transcript, 0x1620)), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x600)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x1680), mulmod(mload(add(transcript, 0x620)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x16a0), addmod(mload(add(transcript, 0x1660)), mload(add(transcript, 0x1680)), f_q))mstore(add(transcript, 0x16c0), addmod(mload(add(transcript, 0x1640)), sub(f_q, mload(add(transcript, 0x16a0))), f_q))mstore(add(transcript, 0x16e0), mulmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x1560)), mload(add(transcript, 0x16e0)), f_q))mstore(add(transcript, 0x1720), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1700)), f_q))mstore(add(transcript, 0x1740), mulmod(mload(add(transcript, 0x640)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x1300)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x1780), addmod(mload(add(transcript, 0x1740)), mload(add(transcript, 0x1760)), f_q))mstore(add(transcript, 0x17a0), addmod(mload(add(transcript, 0x1780)), mload(add(transcript, 0x6c0)), f_q))mstore(add(transcript, 0x17c0), mulmod(mload(add(transcript, 0x600)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x17e0), mulmod(mload(add(transcript, 0x620)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1800), addmod(mload(add(transcript, 0x17c0)), mload(add(transcript, 0x17e0)), f_q))mstore(add(transcript, 0x1820), addmod(mload(add(transcript, 0x17a0)), sub(f_q, mload(add(transcript, 0x1800))), f_q))mstore(add(transcript, 0x1840), mulmod(mload(add(transcript, 0x1820)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1860), addmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1840)), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1860)), f_q))mstore(add(transcript, 0x18a0), addmod(1, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x18c0), mulmod(mload(add(transcript, 0x18a0)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x18e0), addmod(2, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x18c0)), f_q))mstore(add(transcript, 0x1920), addmod(4, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1940), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1960), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0x1980), addmod(mload(add(transcript, 0x1960)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x19a0), mulmod(mload(add(transcript, 0x1980)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x19c0), addmod(mload(add(transcript, 0x1880)), mload(add(transcript, 0x19a0)), f_q))mstore(add(transcript, 0x19e0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x19c0)), f_q))mstore(add(transcript, 0x1a00), addmod(mload(add(transcript, 0x660)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1a20), mulmod(mload(add(transcript, 0x1a00)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x1a40), addmod(mload(add(transcript, 0x19e0)), mload(add(transcript, 0x1a20)), f_q))mstore(add(transcript, 0x1a60), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1a80), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1aa0), addmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1ac0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1aa0)), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1480)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1b00), addmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1b00)), f_q))mstore(add(transcript, 0x1b40), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1b60), addmod(mload(add(transcript, 0x1b20)), mload(add(transcript, 0x1b40)), f_q))mstore(add(transcript, 0x1b80), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1b60)), f_q))mstore(add(transcript, 0x1ba0), mulmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1bc0), addmod(mload(add(transcript, 0x1b80)), mload(add(transcript, 0x1ba0)), f_q))mstore(add(transcript, 0x1be0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1bc0)), f_q))mstore(add(transcript, 0x1c00), mulmod(mload(add(transcript, 0x1820)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1c20), addmod(mload(add(transcript, 0x1be0)), mload(add(transcript, 0x1c00)), f_q))mstore(add(transcript, 0x1c40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1c20)), f_q))mstore(add(transcript, 0x1c60), addmod(3, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1c80), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1ca0), mulmod(mload(add(transcript, 0x1980)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1cc0), addmod(mload(add(transcript, 0x1c40)), mload(add(transcript, 0x1ca0)), f_q))mstore(add(transcript, 0x1ce0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1cc0)), f_q))mstore(add(transcript, 0x1d00), mulmod(mload(add(transcript, 0x1a00)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1d20), addmod(mload(add(transcript, 0x1ce0)), mload(add(transcript, 0x1d00)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1d20)), f_q))mstore(add(transcript, 0x1d60), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x1d80), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1d60)), f_q))mstore(add(transcript, 0x1da0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1d80)), f_q))mstore(add(transcript, 0x1dc0), mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1de0), addmod(1, sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1e00), mulmod(mload(add(transcript, 0x1de0)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e20), addmod(mload(add(transcript, 0x1d40)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1e20)), f_q))mstore(add(transcript, 0x1e60), mulmod(2, mload(add(transcript, 0x640)), f_q))mstore(add(transcript, 0x1e80), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x5c0))), f_q))mstore(add(transcript, 0x1ea0), mulmod(mload(add(transcript, 0x1e80)), mload(add(transcript, 0x1e60)), f_q))mstore(add(transcript, 0x1ec0), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x5c0))), f_q))mstore(add(transcript, 0x1ee0), addmod(mload(add(transcript, 0x1ea0)), sub(f_q, mload(add(transcript, 0x1ec0))), f_q))mstore(add(transcript, 0x1f00), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1f20), addmod(mload(add(transcript, 0x1ee0)), sub(f_q, mload(add(transcript, 0x1f00))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1e40)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x18c0)), f_q))mstore(add(transcript, 0x1fc0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1fa0)), f_q))mstore(add(transcript, 0x1fe0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x5e0)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x1fe0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x2020), mulmod(mload(add(transcript, 0x2000)), mload(add(transcript, 0x1fc0)), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x2060), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2040)), f_q))mstore(add(transcript, 0x2080), addmod(mload(add(transcript, 0x2060)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x20a0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), addmod(1, sub(f_q, mload(add(transcript, 0x8e0))), f_q))mstore(add(transcript, 0x20e0), mulmod(mload(add(transcript, 0x20c0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2100), addmod(mload(add(transcript, 0x20a0)), mload(add(transcript, 0x20e0)), f_q))mstore(add(transcript, 0x2120), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2100)), f_q))mstore(add(transcript, 0x2140), mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2160), addmod(mload(add(transcript, 0x2140)), sub(f_q, mload(add(transcript, 0x940))), f_q))mstore(add(transcript, 0x2180), mulmod(mload(add(transcript, 0x2160)), mload(add(transcript, 0x1140)), f_q))mstore(add(transcript, 0x21a0), addmod(mload(add(transcript, 0x2120)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x21a0)), f_q))mstore(add(transcript, 0x21e0), addmod(mload(add(transcript, 0x940)), sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x2200), mulmod(mload(add(transcript, 0x21e0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2220), addmod(mload(add(transcript, 0x21c0)), mload(add(transcript, 0x2200)), f_q))mstore(add(transcript, 0x2240), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2220)), f_q))mstore(add(transcript, 0x2260), addmod(1, sub(f_q, mload(add(transcript, 0x1140))), f_q))mstore(add(transcript, 0x2280), addmod(mload(add(transcript, 0x1160)), mload(add(transcript, 0x1180)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), mload(add(transcript, 0x11a0)), f_q))mstore(add(transcript, 0x22c0), addmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x11c0)), f_q))mstore(add(transcript, 0x22e0), addmod(mload(add(transcript, 0x22c0)), mload(add(transcript, 0x11e0)), f_q))mstore(add(transcript, 0x2300), addmod(mload(add(transcript, 0x2260)), sub(f_q, mload(add(transcript, 0x22e0))), f_q))mstore(add(transcript, 0x2320), mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2340), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2320)), f_q))mstore(add(transcript, 0x2360), addmod(mload(add(transcript, 0x2340)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2380), mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x23a0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2380)), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x23a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x23e0), mulmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x2360)), f_q))mstore(add(transcript, 0x2400), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2420), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2400)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x2420)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2460), mulmod(mload(add(transcript, 0x2440)), mload(add(transcript, 0x23e0)), f_q))mstore(add(transcript, 0x2480), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x24a0), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x2480)), f_q))mstore(add(transcript, 0x24c0), addmod(mload(add(transcript, 0x24a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x24e0), mulmod(mload(add(transcript, 0x24c0)), mload(add(transcript, 0x2460)), f_q))mstore(add(transcript, 0x2500), mulmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x900)), f_q))mstore(add(transcript, 0x2520), mulmod(1, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2540), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x2560), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x2560)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x25a0), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x25a0)), f_q))mstore(add(transcript, 0x25e0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x25c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x25e0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x2580)), f_q))mstore(add(transcript, 0x2640), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2660), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2640)), f_q))mstore(add(transcript, 0x2680), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2660)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x2680)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x26c0), mulmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2620)), f_q))mstore(add(transcript, 0x26e0), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2700), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x2700)), f_q))mstore(add(transcript, 0x2740), addmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2780), mulmod(mload(add(transcript, 0x2760)), mload(add(transcript, 0x8e0)), f_q))mstore(add(transcript, 0x27a0), addmod(mload(add(transcript, 0x2500)), sub(f_q, mload(add(transcript, 0x2780))), f_q))mstore(add(transcript, 0x27c0), mulmod(mload(add(transcript, 0x27a0)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x2240)), mload(add(transcript, 0x27c0)), f_q))mstore(add(transcript, 0x2800), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x27e0)), f_q))mstore(add(transcript, 0x2820), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2840), addmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x2840)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2880), mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x28a0), addmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x2880)), f_q))mstore(add(transcript, 0x28c0), addmod(mload(add(transcript, 0x28a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x28e0), mulmod(mload(add(transcript, 0x28c0)), mload(add(transcript, 0x2860)), f_q))mstore(add(transcript, 0x2900), mulmod(mload(add(transcript, 0x28e0)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x2920), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2940), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2920)), f_q))mstore(add(transcript, 0x2960), addmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2940)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x2960)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x29a0), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x29a0)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x29c0)), f_q))mstore(add(transcript, 0x2a00), addmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2a20), mulmod(mload(add(transcript, 0x2a00)), mload(add(transcript, 0x2980)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x2a20)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2a60), addmod(mload(add(transcript, 0x2900)), sub(f_q, mload(add(transcript, 0x2a40))), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x2a60)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x2800)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ac0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2aa0)), f_q))mstore(add(transcript, 0x2ae0), addmod(1, sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2b00), mulmod(mload(add(transcript, 0x2ae0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2b20), addmod(mload(add(transcript, 0x2ac0)), mload(add(transcript, 0x2b00)), f_q))mstore(add(transcript, 0x2b40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2b20)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2b80), addmod(mload(add(transcript, 0x2b60)), sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2ba0), mulmod(mload(add(transcript, 0x2b80)), mload(add(transcript, 0x1140)), f_q))mstore(add(transcript, 0x2bc0), addmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x2ba0)), f_q))mstore(add(transcript, 0x2be0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2bc0)), f_q))mstore(add(transcript, 0x2c00), addmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2c20), mulmod(mload(add(transcript, 0x2c00)), mload(add(transcript, 0x9a0)), f_q))mstore(add(transcript, 0x2c40), addmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2c60), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x2c20)), f_q))mstore(add(transcript, 0x2c80), mulmod(256, mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x2ca0), addmod(mload(add(transcript, 0x5c0)), sub(f_q, mload(add(transcript, 0x2c80))), f_q))mstore(add(transcript, 0x2cc0), mulmod(mload(add(transcript, 0x2ca0)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x2ce0), addmod(mload(add(transcript, 0x2cc0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2d00), mulmod(mload(add(transcript, 0x2ce0)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2d20), addmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2d40), mulmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d60), addmod(mload(add(transcript, 0x2c60)), sub(f_q, mload(add(transcript, 0x2d40))), f_q))mstore(add(transcript, 0x2d80), mulmod(mload(add(transcript, 0x2d60)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2da0), addmod(mload(add(transcript, 0x2be0)), mload(add(transcript, 0x2d80)), f_q))mstore(add(transcript, 0x2dc0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2da0)), f_q))mstore(add(transcript, 0x2de0), addmod(mload(add(transcript, 0x9c0)), sub(f_q, mload(add(transcript, 0xa00))), f_q))mstore(add(transcript, 0x2e00), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2e20), addmod(mload(add(transcript, 0x2dc0)), mload(add(transcript, 0x2e00)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2e20)), f_q))mstore(add(transcript, 0x2e60), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2e80), addmod(mload(add(transcript, 0x9c0)), sub(f_q, mload(add(transcript, 0x9e0))), f_q))mstore(add(transcript, 0x2ea0), mulmod(mload(add(transcript, 0x2e80)), mload(add(transcript, 0x2e60)), f_q))mstore(add(transcript, 0x2ec0), addmod(mload(add(transcript, 0x2e40)), mload(add(transcript, 0x2ea0)), f_q))mstore(add(transcript, 0x2ee0), mulmod(mload(add(transcript, 0xd00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x2ee0)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f20), mulmod(mload(add(transcript, 0x2f00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f60), mulmod(1, mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f80), mulmod(1, mload(add(transcript, 0x2ee0)), f_q))mstore(add(transcript, 0x2fa0), mulmod(1, mload(add(transcript, 0x2f00)), f_q))mstore(add(transcript, 0x2fc0), mulmod(1, mload(add(transcript, 0x2f20)), f_q))mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x2ec0)), mload(add(transcript, 0xd20)), f_q))mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0x580)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0x580)), 1, f_q))mstore(add(transcript, 0x3040), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x3020))), f_q))mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0x3080), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x3060))), f_q))mstore(add(transcript, 0x30a0), mulmod(mload(add(transcript, 0x580)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0x30c0), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x30a0))), f_q))mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0x3100), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x30e0))), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q)mstore(add(transcript, 0x3120), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q)mstore(add(transcript, 0x3140), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q)mstore(add(transcript, 0x3160), result) }mstore(add(transcript, 0x3180), mulmod(1, mload(add(transcript, 0x3040)), f_q))mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x3080)), f_q))mstore(add(transcript, 0x31c0), mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x3100)), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x31e0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q)mstore(add(transcript, 0x3200), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q)mstore(add(transcript, 0x3220), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q)mstore(add(transcript, 0x3240), result) }mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x30c0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q)mstore(add(transcript, 0x3280), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q)mstore(add(transcript, 0x32a0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q)mstore(add(transcript, 0x32c0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q)mstore(add(transcript, 0x32e0), result) }mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x3100)), f_q)){ let prod := mload(add(transcript, 0x3120)) prod := mulmod(mload(add(transcript, 0x3140)), prod, f_q) mstore(add(transcript, 0x3320), prod) prod := mulmod(mload(add(transcript, 0x3160)), prod, f_q) mstore(add(transcript, 0x3340), prod) prod := mulmod(mload(add(transcript, 0x31e0)), prod, f_q) mstore(add(transcript, 0x3360), prod) prod := mulmod(mload(add(transcript, 0x3180)), prod, f_q) mstore(add(transcript, 0x3380), prod) prod := mulmod(mload(add(transcript, 0x3200)), prod, f_q) mstore(add(transcript, 0x33a0), prod) prod := mulmod(mload(add(transcript, 0x3220)), prod, f_q) mstore(add(transcript, 0x33c0), prod) prod := mulmod(mload(add(transcript, 0x3240)), prod, f_q) mstore(add(transcript, 0x33e0), prod) prod := mulmod(mload(add(transcript, 0x3260)), prod, f_q) mstore(add(transcript, 0x3400), prod) prod := mulmod(mload(add(transcript, 0x3280)), prod, f_q) mstore(add(transcript, 0x3420), prod) prod := mulmod(mload(add(transcript, 0x32a0)), prod, f_q) mstore(add(transcript, 0x3440), prod) prod := mulmod(mload(add(transcript, 0x31a0)), prod, f_q) mstore(add(transcript, 0x3460), prod) prod := mulmod(mload(add(transcript, 0x32c0)), prod, f_q) mstore(add(transcript, 0x3480), prod) prod := mulmod(mload(add(transcript, 0x32e0)), prod, f_q) mstore(add(transcript, 0x34a0), prod) prod := mulmod(mload(add(transcript, 0x3300)), prod, f_q) mstore(add(transcript, 0x34c0), prod) }mstore(add(transcript, 0x3500), 32)mstore(add(transcript, 0x3520), 32)mstore(add(transcript, 0x3540), 32)mstore(add(transcript, 0x3560), mload(add(transcript, 0x34c0)))mstore(add(transcript, 0x3580), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x35a0), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3500), 0xc0, add(transcript, 0x34e0), 0x20), 1), success){ let inv := mload(add(transcript, 0x34e0)) let v v := mload(add(transcript, 0x3300)) mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x34a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32e0)) mstore(add(transcript, 0x32e0), mulmod(mload(add(transcript, 0x3480)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32c0)) mstore(add(transcript, 0x32c0), mulmod(mload(add(transcript, 0x3460)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x31a0)) mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3440)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32a0)) mstore(add(transcript, 0x32a0), mulmod(mload(add(transcript, 0x3420)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3280)) mstore(add(transcript, 0x3280), mulmod(mload(add(transcript, 0x3400)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3260)) mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x33e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3240)) mstore(add(transcript, 0x3240), mulmod(mload(add(transcript, 0x33c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3220)) mstore(add(transcript, 0x3220), mulmod(mload(add(transcript, 0x33a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3200)) mstore(add(transcript, 0x3200), mulmod(mload(add(transcript, 0x3380)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3180)) mstore(add(transcript, 0x3180), mulmod(mload(add(transcript, 0x3360)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x31e0)) mstore(add(transcript, 0x31e0), mulmod(mload(add(transcript, 0x3340)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3160)) mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x3320)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3140)) mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x3120)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3120), inv) }{ let result := mload(add(transcript, 0x3120))result := addmod(mload(add(transcript, 0x3140)), result, f_q)result := addmod(mload(add(transcript, 0x3160)), result, f_q)mstore(add(transcript, 0x35c0), result) }mstore(add(transcript, 0x35e0), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3180)), f_q)){ let result := mload(add(transcript, 0x31e0))mstore(add(transcript, 0x3600), result) }mstore(add(transcript, 0x3620), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3260)), f_q)){ let result := mload(add(transcript, 0x3200))result := addmod(mload(add(transcript, 0x3220)), result, f_q)result := addmod(mload(add(transcript, 0x3240)), result, f_q)mstore(add(transcript, 0x3640), result) }mstore(add(transcript, 0x3660), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x31a0)), f_q)){ let result := mload(add(transcript, 0x3280))result := addmod(mload(add(transcript, 0x32a0)), result, f_q)mstore(add(transcript, 0x3680), result) }mstore(add(transcript, 0x36a0), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3300)), f_q)){ let result := mload(add(transcript, 0x32c0))result := addmod(mload(add(transcript, 0x32e0)), result, f_q)mstore(add(transcript, 0x36c0), result) }{ let prod := mload(add(transcript, 0x35c0)) prod := mulmod(mload(add(transcript, 0x3600)), prod, f_q) mstore(add(transcript, 0x36e0), prod) prod := mulmod(mload(add(transcript, 0x3640)), prod, f_q) mstore(add(transcript, 0x3700), prod) prod := mulmod(mload(add(transcript, 0x3680)), prod, f_q) mstore(add(transcript, 0x3720), prod) prod := mulmod(mload(add(transcript, 0x36c0)), prod, f_q) mstore(add(transcript, 0x3740), prod) }mstore(add(transcript, 0x3780), 32)mstore(add(transcript, 0x37a0), 32)mstore(add(transcript, 0x37c0), 32)mstore(add(transcript, 0x37e0), mload(add(transcript, 0x3740)))mstore(add(transcript, 0x3800), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3820), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3780), 0xc0, add(transcript, 0x3760), 0x20), 1), success){ let inv := mload(add(transcript, 0x3760)) let v v := mload(add(transcript, 0x36c0)) mstore(add(transcript, 0x36c0), mulmod(mload(add(transcript, 0x3720)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3680)) mstore(add(transcript, 0x3680), mulmod(mload(add(transcript, 0x3700)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3640)) mstore(add(transcript, 0x3640), mulmod(mload(add(transcript, 0x36e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3600)) mstore(add(transcript, 0x3600), mulmod(mload(add(transcript, 0x35c0)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x35c0), inv) }mstore(add(transcript, 0x3840), mulmod(mload(add(transcript, 0x35e0)), mload(add(transcript, 0x3600)), f_q))mstore(add(transcript, 0x3860), mulmod(mload(add(transcript, 0x3620)), mload(add(transcript, 0x3640)), f_q))mstore(add(transcript, 0x3880), mulmod(mload(add(transcript, 0x3660)), mload(add(transcript, 0x3680)), f_q))mstore(add(transcript, 0x38a0), mulmod(mload(add(transcript, 0x36a0)), mload(add(transcript, 0x36c0)), f_q))mstore(add(transcript, 0x38c0), mulmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x38e0), mulmod(mload(add(transcript, 0x38c0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3900), mulmod(mload(add(transcript, 0x38e0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3920), mulmod(mload(add(transcript, 0x3900)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3940), mulmod(mload(add(transcript, 0x3920)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3960), mulmod(mload(add(transcript, 0x3940)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3960)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39a0), mulmod(mload(add(transcript, 0x3980)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x39a0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39e0), mulmod(mload(add(transcript, 0x39c0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a00), mulmod(mload(add(transcript, 0x39e0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a40), mulmod(mload(add(transcript, 0x3a20)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a60), mulmod(mload(add(transcript, 0x3a40)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a80), mulmod(mload(add(transcript, 0x3a60)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ae0), mulmod(mload(add(transcript, 0x3ac0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b00), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b40), mulmod(mload(add(transcript, 0xaa0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3b80), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0xaa0)), f_q)){ let result := mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x3120)), f_q)result := addmod(mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x3140)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x3160)), f_q), result, f_q)mstore(add(transcript, 0x3bc0), result) }mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3bc0)), mload(add(transcript, 0x35c0)), f_q))mstore(add(transcript, 0x3c00), mulmod(sub(f_q, mload(add(transcript, 0x3be0))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x3120)), f_q)result := addmod(mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x3140)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3160)), f_q), result, f_q)mstore(add(transcript, 0x3c20), result) }mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0x35c0)), f_q))mstore(add(transcript, 0x3c60), mulmod(sub(f_q, mload(add(transcript, 0x3c40))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3c80), mulmod(1, mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ca0), addmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), 1, f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3c80)), 1, f_q))mstore(add(transcript, 0x3d00), mulmod(1, mload(add(transcript, 0x35e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3d20), result) }mstore(add(transcript, 0x3d40), mulmod(mload(add(transcript, 0x3d20)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3d60), mulmod(sub(f_q, mload(add(transcript, 0x3d40))), 1, f_q))mstore(add(transcript, 0x3d80), mulmod(mload(add(transcript, 0x3d00)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3da0), result) }mstore(add(transcript, 0x3dc0), mulmod(mload(add(transcript, 0x3da0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3de0), mulmod(sub(f_q, mload(add(transcript, 0x3dc0))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3e20), addmod(mload(add(transcript, 0x3d60)), mload(add(transcript, 0x3de0)), f_q)){ let result := mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3e40), result) }mstore(add(transcript, 0x3e60), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3e80), mulmod(sub(f_q, mload(add(transcript, 0x3e60))), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x3ea0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x3ec0), addmod(mload(add(transcript, 0x3e20)), mload(add(transcript, 0x3e80)), f_q)){ let result := mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3ee0), result) }mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3f20), mulmod(sub(f_q, mload(add(transcript, 0x3f00))), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x3f40), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x3f60), addmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3f20)), f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), mload(add(transcript, 0x3900)), f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3900)), f_q))mstore(add(transcript, 0x4000), addmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3fc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4020), result) }mstore(add(transcript, 0x4040), mulmod(mload(add(transcript, 0x4020)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4060), mulmod(sub(f_q, mload(add(transcript, 0x4040))), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x4080), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x40a0), addmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x4060)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x40c0), result) }mstore(add(transcript, 0x40e0), mulmod(mload(add(transcript, 0x40c0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4100), mulmod(sub(f_q, mload(add(transcript, 0x40e0))), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x4120), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x4140), addmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x4100)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4160), result) }mstore(add(transcript, 0x4180), mulmod(mload(add(transcript, 0x4160)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x41a0), mulmod(sub(f_q, mload(add(transcript, 0x4180))), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x41c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x41e0), addmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x41a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4200), result) }mstore(add(transcript, 0x4220), mulmod(mload(add(transcript, 0x4200)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4240), mulmod(sub(f_q, mload(add(transcript, 0x4220))), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4260), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4280), addmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x4240)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x42a0), result) }mstore(add(transcript, 0x42c0), mulmod(mload(add(transcript, 0x42a0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x42e0), mulmod(sub(f_q, mload(add(transcript, 0x42c0))), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x4300), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x4320), addmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x42e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4340), result) }mstore(add(transcript, 0x4360), mulmod(mload(add(transcript, 0x4340)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4380), mulmod(sub(f_q, mload(add(transcript, 0x4360))), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x43a0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x43c0), addmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x4380)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x43e0), result) }mstore(add(transcript, 0x4400), mulmod(mload(add(transcript, 0x43e0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4420), mulmod(sub(f_q, mload(add(transcript, 0x4400))), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x4440), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x4460), addmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x4420)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4480), result) }mstore(add(transcript, 0x44a0), mulmod(mload(add(transcript, 0x4480)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x44c0), mulmod(sub(f_q, mload(add(transcript, 0x44a0))), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x44e0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4500), addmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x44c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4520), result) }mstore(add(transcript, 0x4540), mulmod(mload(add(transcript, 0x4520)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4560), mulmod(sub(f_q, mload(add(transcript, 0x4540))), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x4580), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x45a0), addmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x4560)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x45c0), result) }mstore(add(transcript, 0x45e0), mulmod(mload(add(transcript, 0x45c0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4600), mulmod(sub(f_q, mload(add(transcript, 0x45e0))), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4620), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4640), addmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x4600)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4660), result) }mstore(add(transcript, 0x4680), mulmod(mload(add(transcript, 0x4660)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46a0), mulmod(sub(f_q, mload(add(transcript, 0x4680))), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x46c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x46e0), addmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x46a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4700), result) }mstore(add(transcript, 0x4720), mulmod(mload(add(transcript, 0x4700)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4740), mulmod(sub(f_q, mload(add(transcript, 0x4720))), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4760), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4780), addmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x4740)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x47a0), result) }mstore(add(transcript, 0x47c0), mulmod(mload(add(transcript, 0x47a0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x47e0), mulmod(sub(f_q, mload(add(transcript, 0x47c0))), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4800), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4820), addmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x47e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4840), result) }mstore(add(transcript, 0x4860), mulmod(mload(add(transcript, 0x4840)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4880), mulmod(sub(f_q, mload(add(transcript, 0x4860))), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x48a0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x48c0), addmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x4880)), f_q))mstore(add(transcript, 0x48e0), mulmod(mload(add(transcript, 0x2f60)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x2f80)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4920), mulmod(mload(add(transcript, 0x2fa0)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4940), mulmod(mload(add(transcript, 0x2fc0)), mload(add(transcript, 0x35e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4960), result) }mstore(add(transcript, 0x4980), mulmod(mload(add(transcript, 0x4960)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x49a0), mulmod(sub(f_q, mload(add(transcript, 0x4980))), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x49c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a00), mulmod(mload(add(transcript, 0x4900)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x4920)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a40), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a60), addmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x49a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4a80), result) }mstore(add(transcript, 0x4aa0), mulmod(mload(add(transcript, 0x4a80)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4ac0), mulmod(sub(f_q, mload(add(transcript, 0x4aa0))), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4ae0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4b00), addmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x4ac0)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x4b00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x3d80)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x3e00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x3ea0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ba0), mulmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4bc0), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c00), mulmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c40), mulmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x49c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4dc0), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4de0), mulmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e00), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e20), mulmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e40), mulmod(mload(add(transcript, 0x4ae0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e60), addmod(mload(add(transcript, 0x3cc0)), mload(add(transcript, 0x4b20)), f_q))mstore(add(transcript, 0x4e80), mulmod(1, mload(add(transcript, 0x3620)), f_q)){ let result := mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x3200)), f_q)result := addmod(mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x3220)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3240)), f_q), result, f_q)mstore(add(transcript, 0x4ea0), result) }mstore(add(transcript, 0x4ec0), mulmod(mload(add(transcript, 0x4ea0)), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4ee0), mulmod(sub(f_q, mload(add(transcript, 0x4ec0))), 1, f_q))mstore(add(transcript, 0x4f00), mulmod(mload(add(transcript, 0x4e80)), 1, f_q))mstore(add(transcript, 0x4f20), mulmod(mload(add(transcript, 0x4ee0)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4f40), mulmod(mload(add(transcript, 0x4f00)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4f60), addmod(mload(add(transcript, 0x4e60)), mload(add(transcript, 0x4f20)), f_q))mstore(add(transcript, 0x4f80), mulmod(1, mload(add(transcript, 0x3660)), f_q)){ let result := mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3280)), f_q)result := addmod(mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x4fa0), result) }mstore(add(transcript, 0x4fc0), mulmod(mload(add(transcript, 0x4fa0)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x4fe0), mulmod(sub(f_q, mload(add(transcript, 0x4fc0))), 1, f_q))mstore(add(transcript, 0x5000), mulmod(mload(add(transcript, 0x4f80)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x3280)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x5020), result) }mstore(add(transcript, 0x5040), mulmod(mload(add(transcript, 0x5020)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x5060), mulmod(sub(f_q, mload(add(transcript, 0x5040))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x5080), mulmod(mload(add(transcript, 0x4f80)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x50a0), addmod(mload(add(transcript, 0x4fe0)), mload(add(transcript, 0x5060)), f_q))mstore(add(transcript, 0x50c0), mulmod(mload(add(transcript, 0x50a0)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x50e0), mulmod(mload(add(transcript, 0x5000)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x5100), mulmod(mload(add(transcript, 0x5080)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x5120), addmod(mload(add(transcript, 0x4f60)), mload(add(transcript, 0x50c0)), f_q))mstore(add(transcript, 0x5140), mulmod(1, mload(add(transcript, 0x36a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x32c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x32e0)), f_q), result, f_q)mstore(add(transcript, 0x5160), result) }mstore(add(transcript, 0x5180), mulmod(mload(add(transcript, 0x5160)), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x51a0), mulmod(sub(f_q, mload(add(transcript, 0x5180))), 1, f_q))mstore(add(transcript, 0x51c0), mulmod(mload(add(transcript, 0x5140)), 1, f_q))mstore(add(transcript, 0x51e0), mulmod(mload(add(transcript, 0x51a0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x5200), mulmod(mload(add(transcript, 0x51c0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x5220), addmod(mload(add(transcript, 0x5120)), mload(add(transcript, 0x51e0)), f_q))mstore(add(transcript, 0x5240), mulmod(1, mload(add(transcript, 0x31c0)), f_q))mstore(add(transcript, 0x5260), mulmod(1, mload(add(transcript, 0xb40)), f_q))mstore(add(transcript, 0x5280), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x52a0), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x52c0), mload(add(transcript, 0x5220)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5280), 0x60, add(transcript, 0x5280), 0x40), 1), success)mstore(add(transcript, 0x52e0), mload(add(transcript, 0x5280))) mstore(add(transcript, 0x5300), mload(add(transcript, 0x52a0)))mstore(add(transcript, 0x5320), mload(add(transcript, 0x60))) mstore(add(transcript, 0x5340), mload(add(transcript, 0x80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x52e0), 0x80, add(transcript, 0x52e0), 0x40), 1), success)mstore(add(transcript, 0x5360), mload(add(transcript, 0xa0))) mstore(add(transcript, 0x5380), mload(add(transcript, 0xc0)))mstore(add(transcript, 0x53a0), mload(add(transcript, 0x3ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5360), 0x60, add(transcript, 0x5360), 0x40), 1), success)mstore(add(transcript, 0x53c0), mload(add(transcript, 0x52e0))) mstore(add(transcript, 0x53e0), mload(add(transcript, 0x5300)))mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360))) mstore(add(transcript, 0x5420), mload(add(transcript, 0x5380)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x53c0), 0x80, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5440), mload(add(transcript, 0xe0))) mstore(add(transcript, 0x5460), mload(add(transcript, 0x100)))mstore(add(transcript, 0x5480), mload(add(transcript, 0x4b40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5440), 0x60, add(transcript, 0x5440), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x5440))) mstore(add(transcript, 0x5500), mload(add(transcript, 0x5460)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x54a0), 0x80, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5520), mload(add(transcript, 0x1c0))) mstore(add(transcript, 0x5540), mload(add(transcript, 0x1e0)))mstore(add(transcript, 0x5560), mload(add(transcript, 0x4b60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5520), 0x60, add(transcript, 0x5520), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x54c0)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x5520))) mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5540)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5580), 0x80, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x5600), 0x291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db425290) mstore(add(transcript, 0x5620), 0x154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc)mstore(add(transcript, 0x5640), mload(add(transcript, 0x4b80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5600), 0x60, add(transcript, 0x5600), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x55a0)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x5600))) mstore(add(transcript, 0x56c0), mload(add(transcript, 0x5620)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5660), 0x80, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56e0), 0x176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d) mstore(add(transcript, 0x5700), 0x1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51)mstore(add(transcript, 0x5720), mload(add(transcript, 0x4ba0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x56e0), 0x60, add(transcript, 0x56e0), 0x40), 1), success)mstore(add(transcript, 0x5740), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5760), mload(add(transcript, 0x5680)))mstore(add(transcript, 0x5780), mload(add(transcript, 0x56e0))) mstore(add(transcript, 0x57a0), mload(add(transcript, 0x5700)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5740), 0x80, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57c0), 0x019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e20250759) mstore(add(transcript, 0x57e0), 0x0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea83)mstore(add(transcript, 0x5800), mload(add(transcript, 0x4bc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x57c0), 0x60, add(transcript, 0x57c0), 0x40), 1), success)mstore(add(transcript, 0x5820), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5840), mload(add(transcript, 0x5760)))mstore(add(transcript, 0x5860), mload(add(transcript, 0x57c0))) mstore(add(transcript, 0x5880), mload(add(transcript, 0x57e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5820), 0x80, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x58a0), 0x0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af) mstore(add(transcript, 0x58c0), 0x24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c43)mstore(add(transcript, 0x58e0), mload(add(transcript, 0x4be0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x58a0), 0x60, add(transcript, 0x58a0), 0x40), 1), success)mstore(add(transcript, 0x5900), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x5920), mload(add(transcript, 0x5840)))mstore(add(transcript, 0x5940), mload(add(transcript, 0x58a0))) mstore(add(transcript, 0x5960), mload(add(transcript, 0x58c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5900), 0x80, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5980), 0x22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4) mstore(add(transcript, 0x59a0), 0x0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0)mstore(add(transcript, 0x59c0), mload(add(transcript, 0x4c00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5980), 0x60, add(transcript, 0x5980), 0x40), 1), success)mstore(add(transcript, 0x59e0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x5a00), mload(add(transcript, 0x5920)))mstore(add(transcript, 0x5a20), mload(add(transcript, 0x5980))) mstore(add(transcript, 0x5a40), mload(add(transcript, 0x59a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x59e0), 0x80, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a60), 0x0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed) mstore(add(transcript, 0x5a80), 0x286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf)mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x4c20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5a60), 0x60, add(transcript, 0x5a60), 0x40), 1), success)mstore(add(transcript, 0x5ac0), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5ae0), mload(add(transcript, 0x5a00)))mstore(add(transcript, 0x5b00), mload(add(transcript, 0x5a60))) mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ac0), 0x80, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b40), 0x14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5) mstore(add(transcript, 0x5b60), 0x0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2)mstore(add(transcript, 0x5b80), mload(add(transcript, 0x4c40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5b40), 0x60, add(transcript, 0x5b40), 0x40), 1), success)mstore(add(transcript, 0x5ba0), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5bc0), mload(add(transcript, 0x5ae0)))mstore(add(transcript, 0x5be0), mload(add(transcript, 0x5b40))) mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ba0), 0x80, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c20), 0x0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36) mstore(add(transcript, 0x5c40), 0x2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890)mstore(add(transcript, 0x5c60), mload(add(transcript, 0x4c60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c20), 0x60, add(transcript, 0x5c20), 0x40), 1), success)mstore(add(transcript, 0x5c80), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5ca0), mload(add(transcript, 0x5bc0)))mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x5c20))) mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c80), 0x80, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5d00), 0x1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f) mstore(add(transcript, 0x5d20), 0x1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d)mstore(add(transcript, 0x5d40), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d00), 0x60, add(transcript, 0x5d00), 0x40), 1), success)mstore(add(transcript, 0x5d60), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d80), mload(add(transcript, 0x5ca0)))mstore(add(transcript, 0x5da0), mload(add(transcript, 0x5d00))) mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5d20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5d60), 0x80, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5de0), 0x07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c) mstore(add(transcript, 0x5e00), 0x1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68)mstore(add(transcript, 0x5e20), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5de0), 0x60, add(transcript, 0x5de0), 0x40), 1), success)mstore(add(transcript, 0x5e40), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e60), mload(add(transcript, 0x5d80)))mstore(add(transcript, 0x5e80), mload(add(transcript, 0x5de0))) mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5e00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5e40), 0x80, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ec0), 0x0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701) mstore(add(transcript, 0x5ee0), 0x07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a)mstore(add(transcript, 0x5f00), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ec0), 0x60, add(transcript, 0x5ec0), 0x40), 1), success)mstore(add(transcript, 0x5f20), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f40), mload(add(transcript, 0x5e60)))mstore(add(transcript, 0x5f60), mload(add(transcript, 0x5ec0))) mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ee0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f20), 0x80, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5fa0), 0x2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d) mstore(add(transcript, 0x5fc0), 0x154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6)mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5fa0), 0x60, add(transcript, 0x5fa0), 0x40), 1), success)mstore(add(transcript, 0x6000), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x6020), mload(add(transcript, 0x5f40)))mstore(add(transcript, 0x6040), mload(add(transcript, 0x5fa0))) mstore(add(transcript, 0x6060), mload(add(transcript, 0x5fc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6000), 0x80, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6080), 0x2402db4b1c7746dcd9fe7eab82ab3fa7ebb1bd352a9af94ef6811b2af9ab6f8e) mstore(add(transcript, 0x60a0), 0x2a0047ec08a254753c466648f0dc6e077e88e5495829c3a845873b9058bf4407)mstore(add(transcript, 0x60c0), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6080), 0x60, add(transcript, 0x6080), 0x40), 1), success)mstore(add(transcript, 0x60e0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x6100), mload(add(transcript, 0x6020)))mstore(add(transcript, 0x6120), mload(add(transcript, 0x6080))) mstore(add(transcript, 0x6140), mload(add(transcript, 0x60a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x60e0), 0x80, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6160), 0x0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a) mstore(add(transcript, 0x6180), 0x27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28)mstore(add(transcript, 0x61a0), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6160), 0x60, add(transcript, 0x6160), 0x40), 1), success)mstore(add(transcript, 0x61c0), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61e0), mload(add(transcript, 0x6100)))mstore(add(transcript, 0x6200), mload(add(transcript, 0x6160))) mstore(add(transcript, 0x6220), mload(add(transcript, 0x6180)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x61c0), 0x80, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6240), 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) mstore(add(transcript, 0x6260), 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3)mstore(add(transcript, 0x6280), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6240), 0x60, add(transcript, 0x6240), 0x40), 1), success)mstore(add(transcript, 0x62a0), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x62c0), mload(add(transcript, 0x61e0)))mstore(add(transcript, 0x62e0), mload(add(transcript, 0x6240))) mstore(add(transcript, 0x6300), mload(add(transcript, 0x6260)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x62a0), 0x80, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6320), 0x1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a) mstore(add(transcript, 0x6340), 0x00b004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56)mstore(add(transcript, 0x6360), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6320), 0x60, add(transcript, 0x6320), 0x40), 1), success)mstore(add(transcript, 0x6380), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x63a0), mload(add(transcript, 0x62c0)))mstore(add(transcript, 0x63c0), mload(add(transcript, 0x6320))) mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6340)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6380), 0x80, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x6400), 0x2903a763c1c6b78667f906b6fe2b4ad197b55587c90e14e8502446da8c45ef7d) mstore(add(transcript, 0x6420), 0x13ea57986f9295e92def3303aef53f2b4f625ba985531201ab53dc7307f46b69)mstore(add(transcript, 0x6440), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6400), 0x60, add(transcript, 0x6400), 0x40), 1), success)mstore(add(transcript, 0x6460), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6480), mload(add(transcript, 0x63a0)))mstore(add(transcript, 0x64a0), mload(add(transcript, 0x6400))) mstore(add(transcript, 0x64c0), mload(add(transcript, 0x6420)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6460), 0x80, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64e0), mload(add(transcript, 0x420))) mstore(add(transcript, 0x6500), mload(add(transcript, 0x440)))mstore(add(transcript, 0x6520), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x64e0), 0x60, add(transcript, 0x64e0), 0x40), 1), success)mstore(add(transcript, 0x6540), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6560), mload(add(transcript, 0x6480)))mstore(add(transcript, 0x6580), mload(add(transcript, 0x64e0))) mstore(add(transcript, 0x65a0), mload(add(transcript, 0x6500)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6540), 0x80, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65c0), mload(add(transcript, 0x460))) mstore(add(transcript, 0x65e0), mload(add(transcript, 0x480)))mstore(add(transcript, 0x6600), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x65c0), 0x60, add(transcript, 0x65c0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x6560)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x65c0))) mstore(add(transcript, 0x6680), mload(add(transcript, 0x65e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6620), 0x80, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x66a0), mload(add(transcript, 0x4a0))) mstore(add(transcript, 0x66c0), mload(add(transcript, 0x4c0)))mstore(add(transcript, 0x66e0), mload(add(transcript, 0x4de0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x66a0), 0x60, add(transcript, 0x66a0), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x6640)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x66a0))) mstore(add(transcript, 0x6760), mload(add(transcript, 0x66c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6700), 0x80, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6780), mload(add(transcript, 0x4e0))) mstore(add(transcript, 0x67a0), mload(add(transcript, 0x500)))mstore(add(transcript, 0x67c0), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6780), 0x60, add(transcript, 0x6780), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x6720)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x6780))) mstore(add(transcript, 0x6840), mload(add(transcript, 0x67a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x67e0), 0x80, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6860), mload(add(transcript, 0x520))) mstore(add(transcript, 0x6880), mload(add(transcript, 0x540)))mstore(add(transcript, 0x68a0), mload(add(transcript, 0x4e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6860), 0x60, add(transcript, 0x6860), 0x40), 1), success)mstore(add(transcript, 0x68c0), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x68e0), mload(add(transcript, 0x6800)))mstore(add(transcript, 0x6900), mload(add(transcript, 0x6860))) mstore(add(transcript, 0x6920), mload(add(transcript, 0x6880)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x68c0), 0x80, add(transcript, 0x68c0), 0x40), 1), success)mstore(add(transcript, 0x6940), mload(add(transcript, 0x380))) mstore(add(transcript, 0x6960), mload(add(transcript, 0x3a0)))mstore(add(transcript, 0x6980), mload(add(transcript, 0x4e40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6940), 0x60, add(transcript, 0x6940), 0x40), 1), success)mstore(add(transcript, 0x69a0), mload(add(transcript, 0x68c0))) mstore(add(transcript, 0x69c0), mload(add(transcript, 0x68e0)))mstore(add(transcript, 0x69e0), mload(add(transcript, 0x6940))) mstore(add(transcript, 0x6a00), mload(add(transcript, 0x6960)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x69a0), 0x80, add(transcript, 0x69a0), 0x40), 1), success)mstore(add(transcript, 0x6a20), mload(add(transcript, 0x2c0))) mstore(add(transcript, 0x6a40), mload(add(transcript, 0x2e0)))mstore(add(transcript, 0x6a60), mload(add(transcript, 0x4f40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6a20), 0x60, add(transcript, 0x6a20), 0x40), 1), success)mstore(add(transcript, 0x6a80), mload(add(transcript, 0x69a0))) mstore(add(transcript, 0x6aa0), mload(add(transcript, 0x69c0)))mstore(add(transcript, 0x6ac0), mload(add(transcript, 0x6a20))) mstore(add(transcript, 0x6ae0), mload(add(transcript, 0x6a40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6a80), 0x80, add(transcript, 0x6a80), 0x40), 1), success)mstore(add(transcript, 0x6b00), mload(add(transcript, 0x300))) mstore(add(transcript, 0x6b20), mload(add(transcript, 0x320)))mstore(add(transcript, 0x6b40), mload(add(transcript, 0x50e0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6b00), 0x60, add(transcript, 0x6b00), 0x40), 1), success)mstore(add(transcript, 0x6b60), mload(add(transcript, 0x6a80))) mstore(add(transcript, 0x6b80), mload(add(transcript, 0x6aa0)))mstore(add(transcript, 0x6ba0), mload(add(transcript, 0x6b00))) mstore(add(transcript, 0x6bc0), mload(add(transcript, 0x6b20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6b60), 0x80, add(transcript, 0x6b60), 0x40), 1), success)mstore(add(transcript, 0x6be0), mload(add(transcript, 0x340))) mstore(add(transcript, 0x6c00), mload(add(transcript, 0x360)))mstore(add(transcript, 0x6c20), mload(add(transcript, 0x5100)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6be0), 0x60, add(transcript, 0x6be0), 0x40), 1), success)mstore(add(transcript, 0x6c40), mload(add(transcript, 0x6b60))) mstore(add(transcript, 0x6c60), mload(add(transcript, 0x6b80)))mstore(add(transcript, 0x6c80), mload(add(transcript, 0x6be0))) mstore(add(transcript, 0x6ca0), mload(add(transcript, 0x6c00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6c40), 0x80, add(transcript, 0x6c40), 0x40), 1), success)mstore(add(transcript, 0x6cc0), mload(add(transcript, 0x180))) mstore(add(transcript, 0x6ce0), mload(add(transcript, 0x1a0)))mstore(add(transcript, 0x6d00), mload(add(transcript, 0x5200)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6cc0), 0x60, add(transcript, 0x6cc0), 0x40), 1), success)mstore(add(transcript, 0x6d20), mload(add(transcript, 0x6c40))) mstore(add(transcript, 0x6d40), mload(add(transcript, 0x6c60)))mstore(add(transcript, 0x6d60), mload(add(transcript, 0x6cc0))) mstore(add(transcript, 0x6d80), mload(add(transcript, 0x6ce0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6d20), 0x80, add(transcript, 0x6d20), 0x40), 1), success)mstore(add(transcript, 0x6da0), mload(add(transcript, 0xae0))) mstore(add(transcript, 0x6dc0), mload(add(transcript, 0xb00)))mstore(add(transcript, 0x6de0), sub(f_q, mload(add(transcript, 0x5240))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6da0), 0x60, add(transcript, 0x6da0), 0x40), 1), success)mstore(add(transcript, 0x6e00), mload(add(transcript, 0x6d20))) mstore(add(transcript, 0x6e20), mload(add(transcript, 0x6d40)))mstore(add(transcript, 0x6e40), mload(add(transcript, 0x6da0))) mstore(add(transcript, 0x6e60), mload(add(transcript, 0x6dc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6e00), 0x80, add(transcript, 0x6e00), 0x40), 1), success)mstore(add(transcript, 0x6e80), mload(add(transcript, 0xb80))) mstore(add(transcript, 0x6ea0), mload(add(transcript, 0xba0)))mstore(add(transcript, 0x6ec0), mload(add(transcript, 0x5260)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6e80), 0x60, add(transcript, 0x6e80), 0x40), 1), success)mstore(add(transcript, 0x6ee0), mload(add(transcript, 0x6e00))) mstore(add(transcript, 0x6f00), mload(add(transcript, 0x6e20)))mstore(add(transcript, 0x6f20), mload(add(transcript, 0x6e80))) mstore(add(transcript, 0x6f40), mload(add(transcript, 0x6ea0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ee0), 0x80, add(transcript, 0x6ee0), 0x40), 1), success)mstore(add(transcript, 0x6f60), mload(add(transcript, 0x6ee0))) mstore(add(transcript, 0x6f80), mload(add(transcript, 0x6f00)))mstore(add(transcript, 0x6fa0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x6fc0), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x6fe0), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x7000), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x7020), mload(add(transcript, 0xb80))) mstore(add(transcript, 0x7040), mload(add(transcript, 0xba0)))mstore(add(transcript, 0x7060), 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) mstore(add(transcript, 0x7080), 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) mstore(add(transcript, 0x70a0), 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) mstore(add(transcript, 0x70c0), 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x6f60), 0x180, add(transcript, 0x6f60), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x6f60)), 1), success)} return success; } } diff --git a/contracts/src/InclusionVerifier.yul b/contracts/src/InclusionVerifier.yul index 0413d3da..55fc481d 100644 --- a/contracts/src/InclusionVerifier.yul +++ b/contracts/src/InclusionVerifier.yul @@ -33,7 +33,7 @@ } mstore(0x20, mod(calldataload(0x0), f_q)) mstore(0x40, mod(calldataload(0x20), f_q)) -mstore(0x0, 18446911396317205745533550639557898655359618293120280237620224741936191804828) +mstore(0x0, 20780565364750352931855234182745264522567546354850733883253409196481354617515) { let x := calldataload(0x40) @@ -1197,8 +1197,8 @@ mstore(0x5580, mload(0x54a0)) mstore(0x55c0, mload(0x5520)) mstore(0x55e0, mload(0x5540)) success := and(eq(staticcall(gas(), 0x6, 0x5580, 0x80, 0x5580, 0x40), 1), success) -mstore(0x5600, 0x23a3b90b52101f0a6b5743b3e901cc1ca3fedcf56639e3f5d092c1fe8918dd49) - mstore(0x5620, 0x2d1ac29c598a842f7865a78359fe925ab012907df3ef22ecee8c3e38775c47fd) +mstore(0x5600, 0x291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db425290) + mstore(0x5620, 0x154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc) mstore(0x5640, mload(0x4b80)) success := and(eq(staticcall(gas(), 0x7, 0x5600, 0x60, 0x5600, 0x40), 1), success) mstore(0x5660, mload(0x5580)) @@ -1206,8 +1206,8 @@ mstore(0x5660, mload(0x5580)) mstore(0x56a0, mload(0x5600)) mstore(0x56c0, mload(0x5620)) success := and(eq(staticcall(gas(), 0x6, 0x5660, 0x80, 0x5660, 0x40), 1), success) -mstore(0x56e0, 0x03889f612bd17e011b13902673a70688bbacdf22704cc8295740a0b855955fc0) - mstore(0x5700, 0x077a491ddd81dbd1802d89735ae881c56da97f908e0bb6a3a8ad6fd9f72db123) +mstore(0x56e0, 0x176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d) + mstore(0x5700, 0x1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51) mstore(0x5720, mload(0x4ba0)) success := and(eq(staticcall(gas(), 0x7, 0x56e0, 0x60, 0x56e0, 0x40), 1), success) mstore(0x5740, mload(0x5660)) @@ -1215,8 +1215,8 @@ mstore(0x5740, mload(0x5660)) mstore(0x5780, mload(0x56e0)) mstore(0x57a0, mload(0x5700)) success := and(eq(staticcall(gas(), 0x6, 0x5740, 0x80, 0x5740, 0x40), 1), success) -mstore(0x57c0, 0x293f3eeabeb387e78c97a4de420d2336ff8ed1aaadf797c7dc3e622c9f144052) - mstore(0x57e0, 0x04f8141148a083ed78d264b622ccd39fdc2e5a4d4309def83c65f641fa1f73ae) +mstore(0x57c0, 0x019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e20250759) + mstore(0x57e0, 0x0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea83) mstore(0x5800, mload(0x4bc0)) success := and(eq(staticcall(gas(), 0x7, 0x57c0, 0x60, 0x57c0, 0x40), 1), success) mstore(0x5820, mload(0x5740)) @@ -1224,8 +1224,8 @@ mstore(0x5820, mload(0x5740)) mstore(0x5860, mload(0x57c0)) mstore(0x5880, mload(0x57e0)) success := and(eq(staticcall(gas(), 0x6, 0x5820, 0x80, 0x5820, 0x40), 1), success) -mstore(0x58a0, 0x153842f7c3d4213d1a0bdf0272dc0ac05b87949495a94680ea07f5528cd4cb65) - mstore(0x58c0, 0x197481eee392189181d33d51883b612dc4b9b7b40ac3c516d04ef58b4458f841) +mstore(0x58a0, 0x0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af) + mstore(0x58c0, 0x24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c43) mstore(0x58e0, mload(0x4be0)) success := and(eq(staticcall(gas(), 0x7, 0x58a0, 0x60, 0x58a0, 0x40), 1), success) mstore(0x5900, mload(0x5820)) @@ -1233,8 +1233,8 @@ mstore(0x5900, mload(0x5820)) mstore(0x5940, mload(0x58a0)) mstore(0x5960, mload(0x58c0)) success := and(eq(staticcall(gas(), 0x6, 0x5900, 0x80, 0x5900, 0x40), 1), success) -mstore(0x5980, 0x2eb2df9649175ed689ae9b18bd9c2da55e06f28b8bade40ece584fe646987af2) - mstore(0x59a0, 0x060bd862d267d622becf447c96e00a075a556a12d57a89cdfcccd59180d6e183) +mstore(0x5980, 0x22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4) + mstore(0x59a0, 0x0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0) mstore(0x59c0, mload(0x4c00)) success := and(eq(staticcall(gas(), 0x7, 0x5980, 0x60, 0x5980, 0x40), 1), success) mstore(0x59e0, mload(0x5900)) @@ -1242,8 +1242,8 @@ mstore(0x59e0, mload(0x5900)) mstore(0x5a20, mload(0x5980)) mstore(0x5a40, mload(0x59a0)) success := and(eq(staticcall(gas(), 0x6, 0x59e0, 0x80, 0x59e0, 0x40), 1), success) -mstore(0x5a60, 0x261ab047cacbf6fda910b594e5a47fce17d7bf5912a803a159724638ac9a9293) - mstore(0x5a80, 0x1c19cf99cd99c0a2995e7b540f0e131d5a76ada19f52dbf97bf3f7e048e24d57) +mstore(0x5a60, 0x0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed) + mstore(0x5a80, 0x286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf) mstore(0x5aa0, mload(0x4c20)) success := and(eq(staticcall(gas(), 0x7, 0x5a60, 0x60, 0x5a60, 0x40), 1), success) mstore(0x5ac0, mload(0x59e0)) @@ -1251,8 +1251,8 @@ mstore(0x5ac0, mload(0x59e0)) mstore(0x5b00, mload(0x5a60)) mstore(0x5b20, mload(0x5a80)) success := and(eq(staticcall(gas(), 0x6, 0x5ac0, 0x80, 0x5ac0, 0x40), 1), success) -mstore(0x5b40, 0x09852cc4d7e43585f80a71bb658d117c8bad4afd38c56250f79e2fe5ea36cbea) - mstore(0x5b60, 0x0eafdf1dc0ebc50c66a28ef4e4ce11d67dc26835ee8fca885308c4e800e503db) +mstore(0x5b40, 0x14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5) + mstore(0x5b60, 0x0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2) mstore(0x5b80, mload(0x4c40)) success := and(eq(staticcall(gas(), 0x7, 0x5b40, 0x60, 0x5b40, 0x40), 1), success) mstore(0x5ba0, mload(0x5ac0)) @@ -1260,8 +1260,8 @@ mstore(0x5ba0, mload(0x5ac0)) mstore(0x5be0, mload(0x5b40)) mstore(0x5c00, mload(0x5b60)) success := and(eq(staticcall(gas(), 0x6, 0x5ba0, 0x80, 0x5ba0, 0x40), 1), success) -mstore(0x5c20, 0x060d05d9347318b8c482f43d589babe34c4feac67e633b7c7d205124e5942031) - mstore(0x5c40, 0x126bce5e065317f42c4ea09165d00008202438e1c490d572c6b76613f21a1ebf) +mstore(0x5c20, 0x0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36) + mstore(0x5c40, 0x2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890) mstore(0x5c60, mload(0x4c60)) success := and(eq(staticcall(gas(), 0x7, 0x5c20, 0x60, 0x5c20, 0x40), 1), success) mstore(0x5c80, mload(0x5ba0)) @@ -1269,8 +1269,8 @@ mstore(0x5c80, mload(0x5ba0)) mstore(0x5cc0, mload(0x5c20)) mstore(0x5ce0, mload(0x5c40)) success := and(eq(staticcall(gas(), 0x6, 0x5c80, 0x80, 0x5c80, 0x40), 1), success) -mstore(0x5d00, 0x1d0f94f3535e58b5d06c339b6364b77cafc3894f0189d777a08f20ce239a1a34) - mstore(0x5d20, 0x0b53ad507c469a238239f93e42e07194761f396948a8d4af1b2ef3eda0ba369f) +mstore(0x5d00, 0x1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f) + mstore(0x5d20, 0x1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d) mstore(0x5d40, mload(0x4c80)) success := and(eq(staticcall(gas(), 0x7, 0x5d00, 0x60, 0x5d00, 0x40), 1), success) mstore(0x5d60, mload(0x5c80)) @@ -1278,8 +1278,8 @@ mstore(0x5d60, mload(0x5c80)) mstore(0x5da0, mload(0x5d00)) mstore(0x5dc0, mload(0x5d20)) success := and(eq(staticcall(gas(), 0x6, 0x5d60, 0x80, 0x5d60, 0x40), 1), success) -mstore(0x5de0, 0x05ffd6f47fadc13d413ff73d3dcd2b5413970d2328ace551b3b1d5f20a687375) - mstore(0x5e00, 0x267595ab27c68ff69d06c8c28585973ef0fbad8e0982871a193b026541e27893) +mstore(0x5de0, 0x07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c) + mstore(0x5e00, 0x1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68) mstore(0x5e20, mload(0x4ca0)) success := and(eq(staticcall(gas(), 0x7, 0x5de0, 0x60, 0x5de0, 0x40), 1), success) mstore(0x5e40, mload(0x5d60)) @@ -1287,8 +1287,8 @@ mstore(0x5e40, mload(0x5d60)) mstore(0x5e80, mload(0x5de0)) mstore(0x5ea0, mload(0x5e00)) success := and(eq(staticcall(gas(), 0x6, 0x5e40, 0x80, 0x5e40, 0x40), 1), success) -mstore(0x5ec0, 0x072dca4b7136fbd39742610eeae201e76bc2295ddc20cc18dd6b19aa7b724b13) - mstore(0x5ee0, 0x23048e9bb2debeafcf95628ab81b03275cdee33bca18d579dde2661f64645ec5) +mstore(0x5ec0, 0x0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701) + mstore(0x5ee0, 0x07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a) mstore(0x5f00, mload(0x4cc0)) success := and(eq(staticcall(gas(), 0x7, 0x5ec0, 0x60, 0x5ec0, 0x40), 1), success) mstore(0x5f20, mload(0x5e40)) @@ -1296,8 +1296,8 @@ mstore(0x5f20, mload(0x5e40)) mstore(0x5f60, mload(0x5ec0)) mstore(0x5f80, mload(0x5ee0)) success := and(eq(staticcall(gas(), 0x6, 0x5f20, 0x80, 0x5f20, 0x40), 1), success) -mstore(0x5fa0, 0x05469c240f7b5fedc125ba1ee66cae1377ec75579599278f630f2d7640994fec) - mstore(0x5fc0, 0x08b814cfa26074aade7bab13b494f598aa5bfdbc49d0df4c4390dd69285d03d0) +mstore(0x5fa0, 0x2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d) + mstore(0x5fc0, 0x154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6) mstore(0x5fe0, mload(0x4ce0)) success := and(eq(staticcall(gas(), 0x7, 0x5fa0, 0x60, 0x5fa0, 0x40), 1), success) mstore(0x6000, mload(0x5f20)) @@ -1305,8 +1305,8 @@ mstore(0x6000, mload(0x5f20)) mstore(0x6040, mload(0x5fa0)) mstore(0x6060, mload(0x5fc0)) success := and(eq(staticcall(gas(), 0x6, 0x6000, 0x80, 0x6000, 0x40), 1), success) -mstore(0x6080, 0x07faf619bc79f6e8ecd37ee152e6befc7b7789c1b594544bf208493392a8ee28) - mstore(0x60a0, 0x2a91842e18f3ac761e5f65edc640dd42ef6d9115b649ad3acdff6cced7a274aa) +mstore(0x6080, 0x2402db4b1c7746dcd9fe7eab82ab3fa7ebb1bd352a9af94ef6811b2af9ab6f8e) + mstore(0x60a0, 0x2a0047ec08a254753c466648f0dc6e077e88e5495829c3a845873b9058bf4407) mstore(0x60c0, mload(0x4d00)) success := and(eq(staticcall(gas(), 0x7, 0x6080, 0x60, 0x6080, 0x40), 1), success) mstore(0x60e0, mload(0x6000)) @@ -1314,8 +1314,8 @@ mstore(0x60e0, mload(0x6000)) mstore(0x6120, mload(0x6080)) mstore(0x6140, mload(0x60a0)) success := and(eq(staticcall(gas(), 0x6, 0x60e0, 0x80, 0x60e0, 0x40), 1), success) -mstore(0x6160, 0x0fd4442f53e6b5a5f860c2c811cf4e498642314abc354e0a174be6b8bc0e27e5) - mstore(0x6180, 0x091f3fcbe89a23c4458c2e38c7b6444e28d8244c08549e9525ceedf4a320cbc0) +mstore(0x6160, 0x0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a) + mstore(0x6180, 0x27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28) mstore(0x61a0, mload(0x4d20)) success := and(eq(staticcall(gas(), 0x7, 0x6160, 0x60, 0x6160, 0x40), 1), success) mstore(0x61c0, mload(0x60e0)) @@ -1323,8 +1323,8 @@ mstore(0x61c0, mload(0x60e0)) mstore(0x6200, mload(0x6160)) mstore(0x6220, mload(0x6180)) success := and(eq(staticcall(gas(), 0x6, 0x61c0, 0x80, 0x61c0, 0x40), 1), success) -mstore(0x6240, 0x050cba2ca48cc882687a9e66867e984e2ce5494778a8bcaffdd2296ba9abdb56) - mstore(0x6260, 0x0e44d0ab2133714afce93a354d6271470c293f18ef29ecc874416f81ffb92818) +mstore(0x6240, 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) + mstore(0x6260, 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3) mstore(0x6280, mload(0x4d40)) success := and(eq(staticcall(gas(), 0x7, 0x6240, 0x60, 0x6240, 0x40), 1), success) mstore(0x62a0, mload(0x61c0)) @@ -1332,8 +1332,8 @@ mstore(0x62a0, mload(0x61c0)) mstore(0x62e0, mload(0x6240)) mstore(0x6300, mload(0x6260)) success := and(eq(staticcall(gas(), 0x6, 0x62a0, 0x80, 0x62a0, 0x40), 1), success) -mstore(0x6320, 0x2f69a41fff5cbe55da07d30e789a0d7660d3e841c70ebb326f5825610a4a5c08) - mstore(0x6340, 0x1fe7e7411a599e8addf546471194a4851d36c711a88e926632f571f0d91fc9f6) +mstore(0x6320, 0x1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a) + mstore(0x6340, 0x00b004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56) mstore(0x6360, mload(0x4d60)) success := and(eq(staticcall(gas(), 0x7, 0x6320, 0x60, 0x6320, 0x40), 1), success) mstore(0x6380, mload(0x62a0)) @@ -1341,8 +1341,8 @@ mstore(0x6380, mload(0x62a0)) mstore(0x63c0, mload(0x6320)) mstore(0x63e0, mload(0x6340)) success := and(eq(staticcall(gas(), 0x6, 0x6380, 0x80, 0x6380, 0x40), 1), success) -mstore(0x6400, 0x26a5a8097f66050a9a3d815d3915eb122d75020777f9e87b160e67cc7fa17e5e) - mstore(0x6420, 0x12c0173fdec4f54e72a0ab39fd9a5ffa14364bbb1ef304610af17195b993b316) +mstore(0x6400, 0x2903a763c1c6b78667f906b6fe2b4ad197b55587c90e14e8502446da8c45ef7d) + mstore(0x6420, 0x13ea57986f9295e92def3303aef53f2b4f625ba985531201ab53dc7307f46b69) mstore(0x6440, mload(0x4d80)) success := and(eq(staticcall(gas(), 0x7, 0x6400, 0x60, 0x6400, 0x40), 1), success) mstore(0x6460, mload(0x6380)) @@ -1466,10 +1466,10 @@ mstore(0x6fa0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c mstore(0x7000, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) mstore(0x7020, mload(0xb80)) mstore(0x7040, mload(0xba0)) -mstore(0x7060, 0x1d34ba6e3b52afa8a8df056bfc5157fa16e2c5bb045aab7186aab58f70927fbc) - mstore(0x7080, 0x0b4a022eb8fc503d9d91660c783fc6e37ae61570ebe4883f3663d5b4a435665e) - mstore(0x70a0, 0x2495e03d5e5c9d6acf62cdf715118eebbda912e3092dfe3e9813ed642cdf0412) - mstore(0x70c0, 0x0b9a8ccf1bc9f1b36b74792ad10007ce579e8ba5574a9880d6dff4da84768efe) +mstore(0x7060, 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) + mstore(0x7080, 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) + mstore(0x70a0, 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) + mstore(0x70c0, 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff) success := and(eq(staticcall(gas(), 0x8, 0x6f60, 0x180, 0x6f60, 0x20), 1), success) success := and(eq(mload(0x6f60), 1), success) @@ -1478,4 +1478,4 @@ success := and(eq(mload(0x6f60), 1), success) } } - } \ No newline at end of file + } diff --git a/contracts/src/SolvencyVerifier.sol b/contracts/src/SolvencyVerifier.sol index 6ebf5f7e..d1e940a9 100644 --- a/contracts/src/SolvencyVerifier.sol +++ b/contracts/src/SolvencyVerifier.sol @@ -8,4 +8,4 @@ ) public view returns (bool) { bool success = true; bytes32[846] memory transcript; - assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x60), mod(mload(add(pubInputs, 0x60)), f_q))mstore(add(transcript, 0x0), 17670701479603100502823625940353980192460425255394494203384293782765030717197) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0x80), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0xa0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xc0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0xe0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0x100), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x120), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x140), keccak256(add(transcript, 0x0), 320)){ let hash := mload(add(transcript, 0x140)) mstore(add(transcript, 0x160), mod(hash, f_q)) mstore(add(transcript, 0x180), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x1a0), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x1e0), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x200), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x220), keccak256(add(transcript, 0x180), 160)){ let hash := mload(add(transcript, 0x220)) mstore(add(transcript, 0x240), mod(hash, f_q)) mstore(add(transcript, 0x260), hash) }mstore8(add(transcript, 0x280), 1)mstore(add(transcript, 0x280), keccak256(add(transcript, 0x260), 33)){ let hash := mload(add(transcript, 0x280)) mstore(add(transcript, 0x2a0), mod(hash, f_q)) mstore(add(transcript, 0x2c0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x2e0), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x300), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x320), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x340), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x360), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x380), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x3a0), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3c0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x3e0), keccak256(add(transcript, 0x2c0), 288)){ let hash := mload(add(transcript, 0x3e0)) mstore(add(transcript, 0x400), mod(hash, f_q)) mstore(add(transcript, 0x420), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x440), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x460), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x480), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x4a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4c0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x4e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x500), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x520), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x540), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x560), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x580), keccak256(add(transcript, 0x420), 352)){ let hash := mload(add(transcript, 0x580)) mstore(add(transcript, 0x5a0), mod(hash, f_q)) mstore(add(transcript, 0x5c0), hash) }mstore(add(transcript, 0x5e0), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0xa00), keccak256(add(transcript, 0x5c0), 1088)){ let hash := mload(add(transcript, 0xa00)) mstore(add(transcript, 0xa20), mod(hash, f_q)) mstore(add(transcript, 0xa40), hash) }mstore8(add(transcript, 0xa60), 1)mstore(add(transcript, 0xa60), keccak256(add(transcript, 0xa40), 33)){ let hash := mload(add(transcript, 0xa60)) mstore(add(transcript, 0xa80), mod(hash, f_q)) mstore(add(transcript, 0xaa0), hash) } { let x := mload(add(proof, 0x7c0)) mstore(add(transcript, 0xac0), x) let y := mload(add(proof, 0x7e0)) mstore(add(transcript, 0xae0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb00), keccak256(add(transcript, 0xaa0), 96)){ let hash := mload(add(transcript, 0xb00)) mstore(add(transcript, 0xb20), mod(hash, f_q)) mstore(add(transcript, 0xb40), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xb60), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb80), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xba0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x5a0)), f_q))mstore(add(transcript, 0xbc0), mulmod(mload(add(transcript, 0xba0)), mload(add(transcript, 0xba0)), f_q))mstore(add(transcript, 0xbe0), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0xbc0)), f_q))mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0xbe0)), mload(add(transcript, 0xbe0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), addmod(mload(add(transcript, 0xcc0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), 21866867634659744680037180739646672280844703888306253060159436409049855557633, f_q))mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0xd00)), 9936069627611189518829255670237324269287146421271524553312532036927871056678, f_q))mstore(add(transcript, 0xd40), addmod(mload(add(transcript, 0x5a0)), 11952173244228085703417150075019950819261217979144509790385672149647937438939, f_q))mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0xd00)), 1680739780407307830605919050682431078078760076686599579086116998224280619988, f_q))mstore(add(transcript, 0xd80), addmod(mload(add(transcript, 0x5a0)), 20207503091431967391640486694574844010469604323729434764612087188351527875629, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd00)), 14158528901797138466244491986759313854666262535363044392173788062030301470987, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x5a0)), 7729713970042136756001913758497961233882101865052989951524416124545507024630, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd00)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x5a0)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd00)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x5a0)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd00)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x5a0)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd00)), 1, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x5a0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd00)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x5a0)), 2507682784038009475131574039120954579123549720846755509306663987687515178116, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd00)), 6252951856119339508807713076978770803512896272623217303779254502899773638908, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x5a0)), 15635291015719935713438692668278504285035468127792817039918949683676034856709, f_q)){ let prod := mload(add(transcript, 0xd40)) prod := mulmod(mload(add(transcript, 0xd80)), prod, f_q) mstore(add(transcript, 0xf60), prod) prod := mulmod(mload(add(transcript, 0xdc0)), prod, f_q) mstore(add(transcript, 0xf80), prod) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0xfa0), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0xfc0), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0xfe0), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0x1000), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x1040), prod) prod := mulmod(mload(add(transcript, 0xce0)), prod, f_q) mstore(add(transcript, 0x1060), prod) }mstore(add(transcript, 0x10a0), 32)mstore(add(transcript, 0x10c0), 32)mstore(add(transcript, 0x10e0), 32)mstore(add(transcript, 0x1100), mload(add(transcript, 0x1060)))mstore(add(transcript, 0x1120), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1140), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x10a0), 0xc0, add(transcript, 0x1080), 0x20), 1), success){ let inv := mload(add(transcript, 0x1080)) let v v := mload(add(transcript, 0xce0)) mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0x1040)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0x1000)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0xfe0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0xfc0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0xfa0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xf80)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xdc0)) mstore(add(transcript, 0xdc0), mulmod(mload(add(transcript, 0xf60)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xd80)) mstore(add(transcript, 0xd80), mulmod(mload(add(transcript, 0xd40)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xd40), inv) }mstore(add(transcript, 0x1160), mulmod(mload(add(transcript, 0xd20)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x1180), mulmod(mload(add(transcript, 0xd60)), mload(add(transcript, 0xd80)), f_q))mstore(add(transcript, 0x11a0), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x11c0), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x11e0), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x1200), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x1220), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x1240), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1260), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q)){ let result := mulmod(mload(add(transcript, 0x1220)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x40)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x60)), f_q), result, f_q)mstore(add(transcript, 0x1280), result) }mstore(add(transcript, 0x12a0), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x720)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0x12a0)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0x12c0)), mload(add(transcript, 0x12c0)), f_q))mstore(add(transcript, 0x1300), mulmod(mload(add(transcript, 0x12a0)), mload(add(transcript, 0x12e0)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0x1300)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1340), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x1340)), f_q))mstore(add(transcript, 0x1380), mulmod(mload(add(transcript, 0x1360)), mload(add(transcript, 0x1360)), f_q))mstore(add(transcript, 0x13a0), mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x1380)), f_q))mstore(add(transcript, 0x13c0), mulmod(mload(add(transcript, 0x13a0)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x13e0), addmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x13c0)), f_q))mstore(add(transcript, 0x1400), addmod(mload(add(transcript, 0x13e0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x1400)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1440), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1420)), f_q))mstore(add(transcript, 0x1460), mulmod(mload(add(transcript, 0x1300)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1480), mulmod(mload(add(transcript, 0x13a0)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x14a0), addmod(mload(add(transcript, 0x1460)), mload(add(transcript, 0x1480)), f_q))mstore(add(transcript, 0x14c0), addmod(mload(add(transcript, 0x14a0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x14e0), mulmod(mload(add(transcript, 0x14c0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x14e0)), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1500)), f_q))mstore(add(transcript, 0x1540), addmod(mload(add(transcript, 0x1300)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x1540)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1580), addmod(mload(add(transcript, 0x1520)), mload(add(transcript, 0x1560)), f_q))mstore(add(transcript, 0x15a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1580)), f_q))mstore(add(transcript, 0x15c0), mulmod(mload(add(transcript, 0x660)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x15e0), mulmod(mload(add(transcript, 0x1340)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x1600), addmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), addmod(mload(add(transcript, 0x1600)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1640), mulmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1620)), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x1640)), f_q))mstore(add(transcript, 0x1680), mulmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1660)), f_q))mstore(add(transcript, 0x16a0), mulmod(mload(add(transcript, 0x620)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x16c0), mulmod(mload(add(transcript, 0x640)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x16e0), addmod(mload(add(transcript, 0x16a0)), mload(add(transcript, 0x16c0)), f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x1680)), sub(f_q, mload(add(transcript, 0x16e0))), f_q))mstore(add(transcript, 0x1720), mulmod(mload(add(transcript, 0x1700)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1740), addmod(mload(add(transcript, 0x15a0)), mload(add(transcript, 0x1720)), f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1740)), f_q))mstore(add(transcript, 0x1780), mulmod(mload(add(transcript, 0x660)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x17a0), mulmod(mload(add(transcript, 0x1340)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x17c0), addmod(mload(add(transcript, 0x1780)), mload(add(transcript, 0x17a0)), f_q))mstore(add(transcript, 0x17e0), addmod(mload(add(transcript, 0x17c0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1800), mulmod(mload(add(transcript, 0x620)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x1820), mulmod(mload(add(transcript, 0x640)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1840), addmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x1820)), f_q))mstore(add(transcript, 0x1860), addmod(mload(add(transcript, 0x17e0)), sub(f_q, mload(add(transcript, 0x1840))), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x1860)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x18a0), addmod(mload(add(transcript, 0x1760)), mload(add(transcript, 0x1880)), f_q))mstore(add(transcript, 0x18c0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x18a0)), f_q))mstore(add(transcript, 0x18e0), addmod(1, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1920), addmod(2, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1940), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1960), addmod(3, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1980), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x19a0), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x5e0)), f_q))mstore(add(transcript, 0x19c0), addmod(mload(add(transcript, 0x19a0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x19e0), mulmod(mload(add(transcript, 0x19c0)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x1a00), addmod(mload(add(transcript, 0x18c0)), mload(add(transcript, 0x19e0)), f_q))mstore(add(transcript, 0x1a20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x1a40), addmod(mload(add(transcript, 0x680)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1a60), mulmod(mload(add(transcript, 0x1a40)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x1a80), addmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x1a60)), f_q))mstore(add(transcript, 0x1aa0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1ac0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1ac0)), f_q))mstore(add(transcript, 0x1b00), addmod(4, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b40), mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x1b20)), f_q))mstore(add(transcript, 0x1b60), addmod(1, sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1b80), mulmod(mload(add(transcript, 0x1b60)), mload(add(transcript, 0x1b40)), f_q))mstore(add(transcript, 0x1ba0), addmod(mload(add(transcript, 0x1aa0)), mload(add(transcript, 0x1b80)), f_q))mstore(add(transcript, 0x1bc0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ba0)), f_q))mstore(add(transcript, 0x1be0), mulmod(2, mload(add(transcript, 0x660)), f_q))mstore(add(transcript, 0x1c00), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x5e0))), f_q))mstore(add(transcript, 0x1c20), mulmod(mload(add(transcript, 0x1c00)), mload(add(transcript, 0x1be0)), f_q))mstore(add(transcript, 0x1c40), addmod(mload(add(transcript, 0x620)), sub(f_q, mload(add(transcript, 0x5e0))), f_q))mstore(add(transcript, 0x1c60), addmod(mload(add(transcript, 0x1c20)), sub(f_q, mload(add(transcript, 0x1c40))), f_q))mstore(add(transcript, 0x1c80), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1ca0), addmod(mload(add(transcript, 0x1c60)), sub(f_q, mload(add(transcript, 0x1c80))), f_q))mstore(add(transcript, 0x1cc0), mulmod(mload(add(transcript, 0x1ca0)), mload(add(transcript, 0x1b20)), f_q))mstore(add(transcript, 0x1ce0), addmod(mload(add(transcript, 0x1bc0)), mload(add(transcript, 0x1cc0)), f_q))mstore(add(transcript, 0x1d00), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ce0)), f_q))mstore(add(transcript, 0x1d20), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1d20)), f_q))mstore(add(transcript, 0x1d60), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x1d80), addmod(mload(add(transcript, 0x1d60)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1da0), mulmod(mload(add(transcript, 0x1d80)), mload(add(transcript, 0x1d40)), f_q))mstore(add(transcript, 0x1dc0), addmod(mload(add(transcript, 0x1d00)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1de0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e00), addmod(mload(add(transcript, 0x1de0)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1e20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x1e60), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x1e80), addmod(mload(add(transcript, 0x1e60)), 5192296858534827628530496329220096, f_q))mstore(add(transcript, 0x1ea0), addmod(mload(add(transcript, 0x1e80)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1ec0), mulmod(mload(add(transcript, 0x1ea0)), mload(add(transcript, 0x1e40)), f_q))mstore(add(transcript, 0x1ee0), addmod(mload(add(transcript, 0x1e20)), mload(add(transcript, 0x1ec0)), f_q))mstore(add(transcript, 0x1f00), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x1f20), addmod(1, sub(f_q, mload(add(transcript, 0x8c0))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1f00)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x1fc0), addmod(mload(add(transcript, 0x1fa0)), sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x1fe0), mulmod(mload(add(transcript, 0x1fc0)), mload(add(transcript, 0x1160)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x1fe0)), f_q))mstore(add(transcript, 0x2020), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2000)), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x920)), sub(f_q, mload(add(transcript, 0x900))), f_q))mstore(add(transcript, 0x2060), mulmod(mload(add(transcript, 0x2040)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2080), addmod(mload(add(transcript, 0x2020)), mload(add(transcript, 0x2060)), f_q))mstore(add(transcript, 0x20a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), addmod(1, sub(f_q, mload(add(transcript, 0x1160))), f_q))mstore(add(transcript, 0x20e0), addmod(mload(add(transcript, 0x1180)), mload(add(transcript, 0x11a0)), f_q))mstore(add(transcript, 0x2100), addmod(mload(add(transcript, 0x20e0)), mload(add(transcript, 0x11c0)), f_q))mstore(add(transcript, 0x2120), addmod(mload(add(transcript, 0x2100)), mload(add(transcript, 0x11e0)), f_q))mstore(add(transcript, 0x2140), addmod(mload(add(transcript, 0x2120)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2160), addmod(mload(add(transcript, 0x20c0)), sub(f_q, mload(add(transcript, 0x2140))), f_q))mstore(add(transcript, 0x2180), mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x21a0), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), addmod(mload(add(transcript, 0x21a0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x21e0), mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2200), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x21e0)), f_q))mstore(add(transcript, 0x2220), addmod(mload(add(transcript, 0x2200)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2240), mulmod(mload(add(transcript, 0x2220)), mload(add(transcript, 0x21c0)), f_q))mstore(add(transcript, 0x2260), mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2280), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2260)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x22c0), mulmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x2240)), f_q))mstore(add(transcript, 0x22e0), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2300), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x22e0)), f_q))mstore(add(transcript, 0x2320), addmod(mload(add(transcript, 0x2300)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2340), mulmod(mload(add(transcript, 0x2320)), mload(add(transcript, 0x22c0)), f_q))mstore(add(transcript, 0x2360), mulmod(mload(add(transcript, 0x2340)), mload(add(transcript, 0x8e0)), f_q))mstore(add(transcript, 0x2380), mulmod(1, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x23a0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2380)), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x23a0)), f_q))mstore(add(transcript, 0x23e0), addmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2400), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2420), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2400)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2420)), f_q))mstore(add(transcript, 0x2460), addmod(mload(add(transcript, 0x2440)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2480), mulmod(mload(add(transcript, 0x2460)), mload(add(transcript, 0x23e0)), f_q))mstore(add(transcript, 0x24a0), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x24c0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x24a0)), f_q))mstore(add(transcript, 0x24e0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x2500), addmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2520), mulmod(mload(add(transcript, 0x2500)), mload(add(transcript, 0x2480)), f_q))mstore(add(transcript, 0x2540), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2560), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x2560)), f_q))mstore(add(transcript, 0x25a0), addmod(mload(add(transcript, 0x2580)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x25a0)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x25e0), mulmod(mload(add(transcript, 0x25c0)), mload(add(transcript, 0x8c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x2360)), sub(f_q, mload(add(transcript, 0x25e0))), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2640), addmod(mload(add(transcript, 0x20a0)), mload(add(transcript, 0x2620)), f_q))mstore(add(transcript, 0x2660), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2640)), f_q))mstore(add(transcript, 0x2680), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x2680)), f_q))mstore(add(transcript, 0x26c0), addmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x26e0), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2700), addmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x2700)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2740), mulmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2780), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x27a0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2780)), f_q))mstore(add(transcript, 0x27c0), addmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x27a0)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x27c0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2800), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2820), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2800)), f_q))mstore(add(transcript, 0x2840), addmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x2840)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2880), mulmod(mload(add(transcript, 0x2860)), mload(add(transcript, 0x27e0)), f_q))mstore(add(transcript, 0x28a0), mulmod(mload(add(transcript, 0x2880)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x28c0), addmod(mload(add(transcript, 0x2760)), sub(f_q, mload(add(transcript, 0x28a0))), f_q))mstore(add(transcript, 0x28e0), mulmod(mload(add(transcript, 0x28c0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2900), addmod(mload(add(transcript, 0x2660)), mload(add(transcript, 0x28e0)), f_q))mstore(add(transcript, 0x2920), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2900)), f_q))mstore(add(transcript, 0x2940), addmod(1, sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x2960), mulmod(mload(add(transcript, 0x2940)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x2920)), mload(add(transcript, 0x2960)), f_q))mstore(add(transcript, 0x29a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2980)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x29c0)), sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x2a00), mulmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x1160)), f_q))mstore(add(transcript, 0x2a20), addmod(mload(add(transcript, 0x29a0)), mload(add(transcript, 0x2a00)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2a20)), f_q))mstore(add(transcript, 0x2a60), addmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x2a60)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2ac0), mulmod(mload(add(transcript, 0x2aa0)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ae0), mulmod(256, mload(add(transcript, 0x6c0)), f_q))mstore(add(transcript, 0x2b00), addmod(mload(add(transcript, 0x660)), sub(f_q, mload(add(transcript, 0x2ae0))), f_q))mstore(add(transcript, 0x2b20), mulmod(mload(add(transcript, 0x2b00)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x2b40), addmod(mload(add(transcript, 0x2b20)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x2b80), addmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2ba0), mulmod(mload(add(transcript, 0x2b80)), mload(add(transcript, 0x2b60)), f_q))mstore(add(transcript, 0x2bc0), addmod(mload(add(transcript, 0x2ac0)), sub(f_q, mload(add(transcript, 0x2ba0))), f_q))mstore(add(transcript, 0x2be0), mulmod(mload(add(transcript, 0x2bc0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2c00), addmod(mload(add(transcript, 0x2a40)), mload(add(transcript, 0x2be0)), f_q))mstore(add(transcript, 0x2c20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2c00)), f_q))mstore(add(transcript, 0x2c40), addmod(mload(add(transcript, 0x9a0)), sub(f_q, mload(add(transcript, 0x9e0))), f_q))mstore(add(transcript, 0x2c60), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2c80), addmod(mload(add(transcript, 0x2c20)), mload(add(transcript, 0x2c60)), f_q))mstore(add(transcript, 0x2ca0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2c80)), f_q))mstore(add(transcript, 0x2cc0), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2ce0), addmod(mload(add(transcript, 0x9a0)), sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2d00), mulmod(mload(add(transcript, 0x2ce0)), mload(add(transcript, 0x2cc0)), f_q))mstore(add(transcript, 0x2d20), addmod(mload(add(transcript, 0x2ca0)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d40), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2d60), mulmod(mload(add(transcript, 0x2d40)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2d80), mulmod(mload(add(transcript, 0x2d60)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2da0), mulmod(mload(add(transcript, 0x2d80)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2dc0), mulmod(1, mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2de0), mulmod(1, mload(add(transcript, 0x2d40)), f_q))mstore(add(transcript, 0x2e00), mulmod(1, mload(add(transcript, 0x2d60)), f_q))mstore(add(transcript, 0x2e20), mulmod(1, mload(add(transcript, 0x2d80)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0x2e60), mulmod(mload(add(transcript, 0xba0)), mload(add(transcript, 0x5a0)), f_q))mstore(add(transcript, 0x2e80), mulmod(mload(add(transcript, 0x5a0)), 1, f_q))mstore(add(transcript, 0x2ea0), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2e80))), f_q))mstore(add(transcript, 0x2ec0), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0x2ee0), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2ec0))), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x5a0)), 9936069627611189518829255670237324269287146421271524553312532036927871056678, f_q))mstore(add(transcript, 0x2f20), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2f00))), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0x2f60), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2f40))), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 19470333053884630052643688193991482022807116448657043890197497819686199857828, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 2417909817954645169602717551265793065741247951758990453500706366889608637789, f_q), f_q), result, f_q)mstore(add(transcript, 0x2f80), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 13686227242150003628673578706486473027501243666075718775893288845164412632930, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 10079503758141076467065204586507257535549232608832327988764044976944819876346, f_q), f_q), result, f_q)mstore(add(transcript, 0x2fa0), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 18715936898160381416714524359517348601997944075114713669820885373469568354766, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 15375775075249615866494035504844970190233299190010037655541891534730124992278, f_q), f_q), result, f_q)mstore(add(transcript, 0x2fc0), result) }mstore(add(transcript, 0x2fe0), mulmod(1, mload(add(transcript, 0x2ea0)), f_q))mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x2f60)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0x2ee0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 2507682784038009475131574039120954579123549720846755509306663987687515178117, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317500, f_q), f_q), result, f_q)mstore(add(transcript, 0x3040), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317500, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 13127608231681926238307118629157549705911918406946061530612285695988519678593, f_q), f_q), result, f_q)mstore(add(transcript, 0x3060), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 16140595808673403009154643164823336476463527776677864878778453135559733237044, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 5747647063165872213091762580433938612084836623738169464919751051016075258573, f_q), f_q), result, f_q)mstore(add(transcript, 0x3080), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 17015964487361230672162623735654618573844832338054897787312333529290879253714, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 3176732791729641355588945816447819802711920387939493967460175841862547409845, f_q), f_q), result, f_q)mstore(add(transcript, 0x30a0), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 19187508498431587163140984396833674282302409422288044257471288693049179355069, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 17472297497993506786357772047295541913219081564856233764575529621311665103799, f_q), f_q), result, f_q)mstore(add(transcript, 0x30c0), result) }mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0x2f20)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 16962650269846620577512114154870527443683566727810288380890833831998684679711, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815906, f_q), f_q), result, f_q)mstore(add(transcript, 0x3100), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815906, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 664623189640884330400307346618971907426870604454565164570654825418724962734, f_q), f_q), result, f_q)mstore(add(transcript, 0x3120), result) }mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x2ee0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x3160), result) }{ let prod := mload(add(transcript, 0x2f80)) prod := mulmod(mload(add(transcript, 0x2fa0)), prod, f_q) mstore(add(transcript, 0x3180), prod) prod := mulmod(mload(add(transcript, 0x2fc0)), prod, f_q) mstore(add(transcript, 0x31a0), prod) prod := mulmod(mload(add(transcript, 0x3040)), prod, f_q) mstore(add(transcript, 0x31c0), prod) prod := mulmod(mload(add(transcript, 0x3060)), prod, f_q) mstore(add(transcript, 0x31e0), prod) prod := mulmod(mload(add(transcript, 0x3000)), prod, f_q) mstore(add(transcript, 0x3200), prod) prod := mulmod(mload(add(transcript, 0x3080)), prod, f_q) mstore(add(transcript, 0x3220), prod) prod := mulmod(mload(add(transcript, 0x30a0)), prod, f_q) mstore(add(transcript, 0x3240), prod) prod := mulmod(mload(add(transcript, 0x30c0)), prod, f_q) mstore(add(transcript, 0x3260), prod) prod := mulmod(mload(add(transcript, 0x30e0)), prod, f_q) mstore(add(transcript, 0x3280), prod) prod := mulmod(mload(add(transcript, 0x3100)), prod, f_q) mstore(add(transcript, 0x32a0), prod) prod := mulmod(mload(add(transcript, 0x3120)), prod, f_q) mstore(add(transcript, 0x32c0), prod) prod := mulmod(mload(add(transcript, 0x3140)), prod, f_q) mstore(add(transcript, 0x32e0), prod) prod := mulmod(mload(add(transcript, 0x3160)), prod, f_q) mstore(add(transcript, 0x3300), prod) prod := mulmod(mload(add(transcript, 0x2fe0)), prod, f_q) mstore(add(transcript, 0x3320), prod) }mstore(add(transcript, 0x3360), 32)mstore(add(transcript, 0x3380), 32)mstore(add(transcript, 0x33a0), 32)mstore(add(transcript, 0x33c0), mload(add(transcript, 0x3320)))mstore(add(transcript, 0x33e0), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3400), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3360), 0xc0, add(transcript, 0x3340), 0x20), 1), success){ let inv := mload(add(transcript, 0x3340)) let v v := mload(add(transcript, 0x2fe0)) mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x3300)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3160)) mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x32e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3140)) mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x32c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3120)) mstore(add(transcript, 0x3120), mulmod(mload(add(transcript, 0x32a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3100)) mstore(add(transcript, 0x3100), mulmod(mload(add(transcript, 0x3280)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30e0)) mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x3260)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30c0)) mstore(add(transcript, 0x30c0), mulmod(mload(add(transcript, 0x3240)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30a0)) mstore(add(transcript, 0x30a0), mulmod(mload(add(transcript, 0x3220)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3080)) mstore(add(transcript, 0x3080), mulmod(mload(add(transcript, 0x3200)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3000)) mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0x31e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3060)) mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x31c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3040)) mstore(add(transcript, 0x3040), mulmod(mload(add(transcript, 0x31a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x2fc0)) mstore(add(transcript, 0x2fc0), mulmod(mload(add(transcript, 0x3180)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x2fa0)) mstore(add(transcript, 0x2fa0), mulmod(mload(add(transcript, 0x2f80)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x2f80), inv) }{ let result := mload(add(transcript, 0x2f80))result := addmod(mload(add(transcript, 0x2fa0)), result, f_q)result := addmod(mload(add(transcript, 0x2fc0)), result, f_q)mstore(add(transcript, 0x3420), result) }mstore(add(transcript, 0x3440), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x3000)), f_q)){ let result := mload(add(transcript, 0x3040))result := addmod(mload(add(transcript, 0x3060)), result, f_q)mstore(add(transcript, 0x3460), result) }mstore(add(transcript, 0x3480), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x30e0)), f_q)){ let result := mload(add(transcript, 0x3080))result := addmod(mload(add(transcript, 0x30a0)), result, f_q)result := addmod(mload(add(transcript, 0x30c0)), result, f_q)mstore(add(transcript, 0x34a0), result) }mstore(add(transcript, 0x34c0), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x3140)), f_q)){ let result := mload(add(transcript, 0x3100))result := addmod(mload(add(transcript, 0x3120)), result, f_q)mstore(add(transcript, 0x34e0), result) }mstore(add(transcript, 0x3500), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x2fe0)), f_q)){ let result := mload(add(transcript, 0x3160))mstore(add(transcript, 0x3520), result) }{ let prod := mload(add(transcript, 0x3420)) prod := mulmod(mload(add(transcript, 0x3460)), prod, f_q) mstore(add(transcript, 0x3540), prod) prod := mulmod(mload(add(transcript, 0x34a0)), prod, f_q) mstore(add(transcript, 0x3560), prod) prod := mulmod(mload(add(transcript, 0x34e0)), prod, f_q) mstore(add(transcript, 0x3580), prod) prod := mulmod(mload(add(transcript, 0x3520)), prod, f_q) mstore(add(transcript, 0x35a0), prod) }mstore(add(transcript, 0x35e0), 32)mstore(add(transcript, 0x3600), 32)mstore(add(transcript, 0x3620), 32)mstore(add(transcript, 0x3640), mload(add(transcript, 0x35a0)))mstore(add(transcript, 0x3660), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3680), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x35e0), 0xc0, add(transcript, 0x35c0), 0x20), 1), success){ let inv := mload(add(transcript, 0x35c0)) let v v := mload(add(transcript, 0x3520)) mstore(add(transcript, 0x3520), mulmod(mload(add(transcript, 0x3580)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x34e0)) mstore(add(transcript, 0x34e0), mulmod(mload(add(transcript, 0x3560)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x34a0)) mstore(add(transcript, 0x34a0), mulmod(mload(add(transcript, 0x3540)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3460)) mstore(add(transcript, 0x3460), mulmod(mload(add(transcript, 0x3420)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3420), inv) }mstore(add(transcript, 0x36a0), mulmod(mload(add(transcript, 0x3440)), mload(add(transcript, 0x3460)), f_q))mstore(add(transcript, 0x36c0), mulmod(mload(add(transcript, 0x3480)), mload(add(transcript, 0x34a0)), f_q))mstore(add(transcript, 0x36e0), mulmod(mload(add(transcript, 0x34c0)), mload(add(transcript, 0x34e0)), f_q))mstore(add(transcript, 0x3700), mulmod(mload(add(transcript, 0x3500)), mload(add(transcript, 0x3520)), f_q))mstore(add(transcript, 0x3720), mulmod(mload(add(transcript, 0xa20)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3740), mulmod(mload(add(transcript, 0x3720)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3760), mulmod(mload(add(transcript, 0x3740)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3780), mulmod(mload(add(transcript, 0x3760)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37a0), mulmod(mload(add(transcript, 0x3780)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37c0), mulmod(mload(add(transcript, 0x37a0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37e0), mulmod(mload(add(transcript, 0x37c0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3800), mulmod(mload(add(transcript, 0x37e0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3820), mulmod(mload(add(transcript, 0x3800)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3840), mulmod(mload(add(transcript, 0x3820)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3860), mulmod(mload(add(transcript, 0x3840)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3880), mulmod(mload(add(transcript, 0x3860)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38a0), mulmod(mload(add(transcript, 0x3880)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38c0), mulmod(mload(add(transcript, 0x38a0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38e0), mulmod(mload(add(transcript, 0x38c0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3900), mulmod(mload(add(transcript, 0x38e0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3920), mulmod(mload(add(transcript, 0xa80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3940), mulmod(mload(add(transcript, 0x3920)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3960), mulmod(mload(add(transcript, 0x3940)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3960)), mload(add(transcript, 0xa80)), f_q)){ let result := mulmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2f80)), f_q)result := addmod(mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x2fa0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2fc0)), f_q), result, f_q)mstore(add(transcript, 0x39a0), result) }mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x39a0)), mload(add(transcript, 0x3420)), f_q))mstore(add(transcript, 0x39e0), mulmod(sub(f_q, mload(add(transcript, 0x39c0))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2f80)), f_q)result := addmod(mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2fa0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2fc0)), f_q), result, f_q)mstore(add(transcript, 0x3a00), result) }mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0x3420)), f_q))mstore(add(transcript, 0x3a40), mulmod(sub(f_q, mload(add(transcript, 0x3a20))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3a60), mulmod(1, mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3a80), addmod(mload(add(transcript, 0x39e0)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), 1, f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3a60)), 1, f_q))mstore(add(transcript, 0x3ae0), mulmod(1, mload(add(transcript, 0x3440)), f_q)){ let result := mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3b00), result) }mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3b40), mulmod(sub(f_q, mload(add(transcript, 0x3b20))), 1, f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3ae0)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3b80), result) }mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3bc0), mulmod(sub(f_q, mload(add(transcript, 0x3ba0))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3c00), addmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0x3bc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3c20), result) }mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3c60), mulmod(sub(f_q, mload(add(transcript, 0x3c40))), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x3c80), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x3ca0), addmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d00), mulmod(mload(add(transcript, 0x3be0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d20), mulmod(mload(add(transcript, 0x3c80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d40), addmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x3d60), mulmod(1, mload(add(transcript, 0x3480)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x3080)), f_q)result := addmod(mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x30a0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x30c0)), f_q), result, f_q)mstore(add(transcript, 0x3d80), result) }mstore(add(transcript, 0x3da0), mulmod(mload(add(transcript, 0x3d80)), mload(add(transcript, 0x36c0)), f_q))mstore(add(transcript, 0x3dc0), mulmod(sub(f_q, mload(add(transcript, 0x3da0))), 1, f_q))mstore(add(transcript, 0x3de0), mulmod(mload(add(transcript, 0x3d60)), 1, f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3dc0)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x3e20), mulmod(mload(add(transcript, 0x3de0)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x3e40), addmod(mload(add(transcript, 0x3d40)), mload(add(transcript, 0x3e00)), f_q))mstore(add(transcript, 0x3e60), mulmod(1, mload(add(transcript, 0x34c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x3100)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x3120)), f_q), result, f_q)mstore(add(transcript, 0x3e80), result) }mstore(add(transcript, 0x3ea0), mulmod(mload(add(transcript, 0x3e80)), mload(add(transcript, 0x36e0)), f_q))mstore(add(transcript, 0x3ec0), mulmod(sub(f_q, mload(add(transcript, 0x3ea0))), 1, f_q))mstore(add(transcript, 0x3ee0), mulmod(mload(add(transcript, 0x3e60)), 1, f_q))mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x3f20), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x3f40), addmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3f00)), f_q))mstore(add(transcript, 0x3f60), mulmod(1, mload(add(transcript, 0x3500)), f_q)){ let result := mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), 1, f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3f60)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4000), result) }mstore(add(transcript, 0x4020), mulmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4040), mulmod(sub(f_q, mload(add(transcript, 0x4020))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x4060), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x4080), addmod(mload(add(transcript, 0x3fc0)), mload(add(transcript, 0x4040)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x40a0), result) }mstore(add(transcript, 0x40c0), mulmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x40e0), mulmod(sub(f_q, mload(add(transcript, 0x40c0))), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4100), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4120), addmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0x40e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4140), result) }mstore(add(transcript, 0x4160), mulmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4180), mulmod(sub(f_q, mload(add(transcript, 0x4160))), mload(add(transcript, 0x3740)), f_q))mstore(add(transcript, 0x41a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3740)), f_q))mstore(add(transcript, 0x41c0), addmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0x4180)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x41e0), result) }mstore(add(transcript, 0x4200), mulmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4220), mulmod(sub(f_q, mload(add(transcript, 0x4200))), mload(add(transcript, 0x3760)), f_q))mstore(add(transcript, 0x4240), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3760)), f_q))mstore(add(transcript, 0x4260), addmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0x4220)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4280), result) }mstore(add(transcript, 0x42a0), mulmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x42c0), mulmod(sub(f_q, mload(add(transcript, 0x42a0))), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x42e0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x4300), addmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0x42c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4320), result) }mstore(add(transcript, 0x4340), mulmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4360), mulmod(sub(f_q, mload(add(transcript, 0x4340))), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x4380), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x43a0), addmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0x4360)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x43c0), result) }mstore(add(transcript, 0x43e0), mulmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4400), mulmod(sub(f_q, mload(add(transcript, 0x43e0))), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x4420), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x4440), addmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0x4400)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4460), result) }mstore(add(transcript, 0x4480), mulmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x44a0), mulmod(sub(f_q, mload(add(transcript, 0x4480))), mload(add(transcript, 0x37e0)), f_q))mstore(add(transcript, 0x44c0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37e0)), f_q))mstore(add(transcript, 0x44e0), addmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0x44a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4500), result) }mstore(add(transcript, 0x4520), mulmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4540), mulmod(sub(f_q, mload(add(transcript, 0x4520))), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x4560), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x4580), addmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0x4540)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x45a0), result) }mstore(add(transcript, 0x45c0), mulmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x45e0), mulmod(sub(f_q, mload(add(transcript, 0x45c0))), mload(add(transcript, 0x3820)), f_q))mstore(add(transcript, 0x4600), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3820)), f_q))mstore(add(transcript, 0x4620), addmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0x45e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4640), result) }mstore(add(transcript, 0x4660), mulmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4680), mulmod(sub(f_q, mload(add(transcript, 0x4660))), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46c0), addmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0x4680)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x46e0), result) }mstore(add(transcript, 0x4700), mulmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4720), mulmod(sub(f_q, mload(add(transcript, 0x4700))), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4740), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4760), addmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0x4720)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4780), result) }mstore(add(transcript, 0x47a0), mulmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x47c0), mulmod(sub(f_q, mload(add(transcript, 0x47a0))), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x47e0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x4800), addmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0x47c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4820), result) }mstore(add(transcript, 0x4840), mulmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4860), mulmod(sub(f_q, mload(add(transcript, 0x4840))), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x4880), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x48a0), addmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0x4860)), f_q))mstore(add(transcript, 0x48c0), mulmod(mload(add(transcript, 0x2dc0)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x48e0), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x2e00)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x4920), mulmod(mload(add(transcript, 0x2e20)), mload(add(transcript, 0x3500)), f_q)){ let result := mulmod(mload(add(transcript, 0x2e40)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4940), result) }mstore(add(transcript, 0x4960), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4980), mulmod(sub(f_q, mload(add(transcript, 0x4960))), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49c0), mulmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a00), mulmod(mload(add(transcript, 0x4900)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x4920)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a40), addmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0x4980)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4a60), result) }mstore(add(transcript, 0x4a80), mulmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4aa0), mulmod(sub(f_q, mload(add(transcript, 0x4a80))), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x4ac0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x4ae0), addmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0x4aa0)), f_q))mstore(add(transcript, 0x4b00), mulmod(mload(add(transcript, 0x4ae0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x4060)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x4100)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x41a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ba0), mulmod(mload(add(transcript, 0x4240)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4bc0), mulmod(mload(add(transcript, 0x42e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4380)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c00), mulmod(mload(add(transcript, 0x4420)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x44c0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c40), mulmod(mload(add(transcript, 0x4560)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4600)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x46a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x4740)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x47e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4880)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x49a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x49c0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x4ac0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4dc0), addmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0x4b00)), f_q))mstore(add(transcript, 0x4de0), mulmod(1, mload(add(transcript, 0x3020)), f_q))mstore(add(transcript, 0x4e00), mulmod(1, mload(add(transcript, 0xb20)), f_q))mstore(add(transcript, 0x4e20), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x4e40), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x4e60), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4e20), 0x60, add(transcript, 0x4e20), 0x40), 1), success)mstore(add(transcript, 0x4e80), mload(add(transcript, 0x4e20))) mstore(add(transcript, 0x4ea0), mload(add(transcript, 0x4e40)))mstore(add(transcript, 0x4ec0), mload(add(transcript, 0x80))) mstore(add(transcript, 0x4ee0), mload(add(transcript, 0xa0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x4e80), 0x80, add(transcript, 0x4e80), 0x40), 1), success)mstore(add(transcript, 0x4f00), mload(add(transcript, 0xc0))) mstore(add(transcript, 0x4f20), mload(add(transcript, 0xe0)))mstore(add(transcript, 0x4f40), mload(add(transcript, 0x3ac0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4f00), 0x60, add(transcript, 0x4f00), 0x40), 1), success)mstore(add(transcript, 0x4f60), mload(add(transcript, 0x4e80))) mstore(add(transcript, 0x4f80), mload(add(transcript, 0x4ea0)))mstore(add(transcript, 0x4fa0), mload(add(transcript, 0x4f00))) mstore(add(transcript, 0x4fc0), mload(add(transcript, 0x4f20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x4f60), 0x80, add(transcript, 0x4f60), 0x40), 1), success)mstore(add(transcript, 0x4fe0), mload(add(transcript, 0x100))) mstore(add(transcript, 0x5000), mload(add(transcript, 0x120)))mstore(add(transcript, 0x5020), mload(add(transcript, 0x3ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4fe0), 0x60, add(transcript, 0x4fe0), 0x40), 1), success)mstore(add(transcript, 0x5040), mload(add(transcript, 0x4f60))) mstore(add(transcript, 0x5060), mload(add(transcript, 0x4f80)))mstore(add(transcript, 0x5080), mload(add(transcript, 0x4fe0))) mstore(add(transcript, 0x50a0), mload(add(transcript, 0x5000)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5040), 0x80, add(transcript, 0x5040), 0x40), 1), success)mstore(add(transcript, 0x50c0), mload(add(transcript, 0x320))) mstore(add(transcript, 0x50e0), mload(add(transcript, 0x340)))mstore(add(transcript, 0x5100), mload(add(transcript, 0x3d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x50c0), 0x60, add(transcript, 0x50c0), 0x40), 1), success)mstore(add(transcript, 0x5120), mload(add(transcript, 0x5040))) mstore(add(transcript, 0x5140), mload(add(transcript, 0x5060)))mstore(add(transcript, 0x5160), mload(add(transcript, 0x50c0))) mstore(add(transcript, 0x5180), mload(add(transcript, 0x50e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5120), 0x80, add(transcript, 0x5120), 0x40), 1), success)mstore(add(transcript, 0x51a0), mload(add(transcript, 0x360))) mstore(add(transcript, 0x51c0), mload(add(transcript, 0x380)))mstore(add(transcript, 0x51e0), mload(add(transcript, 0x3d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x51a0), 0x60, add(transcript, 0x51a0), 0x40), 1), success)mstore(add(transcript, 0x5200), mload(add(transcript, 0x5120))) mstore(add(transcript, 0x5220), mload(add(transcript, 0x5140)))mstore(add(transcript, 0x5240), mload(add(transcript, 0x51a0))) mstore(add(transcript, 0x5260), mload(add(transcript, 0x51c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5200), 0x80, add(transcript, 0x5200), 0x40), 1), success)mstore(add(transcript, 0x5280), mload(add(transcript, 0x2e0))) mstore(add(transcript, 0x52a0), mload(add(transcript, 0x300)))mstore(add(transcript, 0x52c0), mload(add(transcript, 0x3e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5280), 0x60, add(transcript, 0x5280), 0x40), 1), success)mstore(add(transcript, 0x52e0), mload(add(transcript, 0x5200))) mstore(add(transcript, 0x5300), mload(add(transcript, 0x5220)))mstore(add(transcript, 0x5320), mload(add(transcript, 0x5280))) mstore(add(transcript, 0x5340), mload(add(transcript, 0x52a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x52e0), 0x80, add(transcript, 0x52e0), 0x40), 1), success)mstore(add(transcript, 0x5360), mload(add(transcript, 0x1a0))) mstore(add(transcript, 0x5380), mload(add(transcript, 0x1c0)))mstore(add(transcript, 0x53a0), mload(add(transcript, 0x3f20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5360), 0x60, add(transcript, 0x5360), 0x40), 1), success)mstore(add(transcript, 0x53c0), mload(add(transcript, 0x52e0))) mstore(add(transcript, 0x53e0), mload(add(transcript, 0x5300)))mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360))) mstore(add(transcript, 0x5420), mload(add(transcript, 0x5380)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x53c0), 0x80, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5440), mload(add(transcript, 0x1e0))) mstore(add(transcript, 0x5460), mload(add(transcript, 0x200)))mstore(add(transcript, 0x5480), mload(add(transcript, 0x4b20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5440), 0x60, add(transcript, 0x5440), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x5440))) mstore(add(transcript, 0x5500), mload(add(transcript, 0x5460)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x54a0), 0x80, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5520), 0x2f76bb5b87a6969c4ebb851bb10df173a462316bec33392c426c2f2b3a23f18b) mstore(add(transcript, 0x5540), 0x1128e4c8af582c69c209db87ec18fa85466ea71b7198f6d8c79083103261fec3)mstore(add(transcript, 0x5560), mload(add(transcript, 0x4b40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5520), 0x60, add(transcript, 0x5520), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x54c0)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x5520))) mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5540)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5580), 0x80, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x5600), 0x133492493eb62499c1ba03a8715f8d07e78490f157ef603bdfbafb396a1bdcbf) mstore(add(transcript, 0x5620), 0x079b0b5d58e739eea6bdfe4092e232bacee0d027bd0f5186c22977bfd24620d7)mstore(add(transcript, 0x5640), mload(add(transcript, 0x4b60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5600), 0x60, add(transcript, 0x5600), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x55a0)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x5600))) mstore(add(transcript, 0x56c0), mload(add(transcript, 0x5620)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5660), 0x80, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56e0), 0x187bddea7dbe1c5acd2e01afadc1c0df38180c00ab7439352151b7e801502a0b) mstore(add(transcript, 0x5700), 0x0fc2689a279dba9a368a34988064e5dc4f1cd3f2598bd2a6949e1b1a02d10b76)mstore(add(transcript, 0x5720), mload(add(transcript, 0x4b80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x56e0), 0x60, add(transcript, 0x56e0), 0x40), 1), success)mstore(add(transcript, 0x5740), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5760), mload(add(transcript, 0x5680)))mstore(add(transcript, 0x5780), mload(add(transcript, 0x56e0))) mstore(add(transcript, 0x57a0), mload(add(transcript, 0x5700)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5740), 0x80, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57c0), 0x16fbd0af4b59dc890346304d35c999dd8dfad3a06ad8a10f474527fad9ea9c32) mstore(add(transcript, 0x57e0), 0x2ab015bc2b8a19b48338928187638174065562d0a5a83b008546a9e6612ec6c4)mstore(add(transcript, 0x5800), mload(add(transcript, 0x4ba0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x57c0), 0x60, add(transcript, 0x57c0), 0x40), 1), success)mstore(add(transcript, 0x5820), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5840), mload(add(transcript, 0x5760)))mstore(add(transcript, 0x5860), mload(add(transcript, 0x57c0))) mstore(add(transcript, 0x5880), mload(add(transcript, 0x57e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5820), 0x80, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x58a0), 0x1dcfb31490b59327642f4b9392465bd8824f732a9e94e46b0bad32b5706087af) mstore(add(transcript, 0x58c0), 0x16b484290b48dce843c6bab1e64e7f45eb424bb17ce605fbcea4650fb021f600)mstore(add(transcript, 0x58e0), mload(add(transcript, 0x4bc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x58a0), 0x60, add(transcript, 0x58a0), 0x40), 1), success)mstore(add(transcript, 0x5900), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x5920), mload(add(transcript, 0x5840)))mstore(add(transcript, 0x5940), mload(add(transcript, 0x58a0))) mstore(add(transcript, 0x5960), mload(add(transcript, 0x58c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5900), 0x80, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5980), 0x1eeb3f7b26d5c9871bc2c16a4ed5056dbe613a4bad07a1865e94b5a3f1f46842) mstore(add(transcript, 0x59a0), 0x2226ac7577fc6b41920682f07383ed12ef175ee617888551e764434eda30a02e)mstore(add(transcript, 0x59c0), mload(add(transcript, 0x4be0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5980), 0x60, add(transcript, 0x5980), 0x40), 1), success)mstore(add(transcript, 0x59e0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x5a00), mload(add(transcript, 0x5920)))mstore(add(transcript, 0x5a20), mload(add(transcript, 0x5980))) mstore(add(transcript, 0x5a40), mload(add(transcript, 0x59a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x59e0), 0x80, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a60), 0x26e3fbd5c5a66607cd8371419cac48be464539f883f1edfaca3c6bf8507a7410) mstore(add(transcript, 0x5a80), 0x08f6e991d52b47307f2f83f267b41f3f3310fa21831988da7ab39054fe2ac53b)mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x4c00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5a60), 0x60, add(transcript, 0x5a60), 0x40), 1), success)mstore(add(transcript, 0x5ac0), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5ae0), mload(add(transcript, 0x5a00)))mstore(add(transcript, 0x5b00), mload(add(transcript, 0x5a60))) mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ac0), 0x80, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b40), 0x1654ed6ee24ad6ebd5c4c2dc0febbb2e92d556bb946f336c7cc1566170f64cdd) mstore(add(transcript, 0x5b60), 0x2e60765d74d1d5c043e2299c4e457312b1358f4e51cdea038ec00ef453f20a09)mstore(add(transcript, 0x5b80), mload(add(transcript, 0x4c20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5b40), 0x60, add(transcript, 0x5b40), 0x40), 1), success)mstore(add(transcript, 0x5ba0), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5bc0), mload(add(transcript, 0x5ae0)))mstore(add(transcript, 0x5be0), mload(add(transcript, 0x5b40))) mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ba0), 0x80, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c20), 0x23a0c541643962fd3751f386670057a24c2a2966d6f975b8474b1df1df58aec5) mstore(add(transcript, 0x5c40), 0x12adacf7628483c9dd1d014cb00243aa716100680f195d25d59bc85ee7fdf202)mstore(add(transcript, 0x5c60), mload(add(transcript, 0x4c40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c20), 0x60, add(transcript, 0x5c20), 0x40), 1), success)mstore(add(transcript, 0x5c80), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5ca0), mload(add(transcript, 0x5bc0)))mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x5c20))) mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c80), 0x80, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5d00), 0x19780ae2901b7f5ddedf94c1b53b504977a5181f39a0502c6e86b8378203f22e) mstore(add(transcript, 0x5d20), 0x1f5f311a3d179380fe7cd9e6d14150dc860629541bb2c8f88110e31de91c7bfa)mstore(add(transcript, 0x5d40), mload(add(transcript, 0x4c60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d00), 0x60, add(transcript, 0x5d00), 0x40), 1), success)mstore(add(transcript, 0x5d60), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d80), mload(add(transcript, 0x5ca0)))mstore(add(transcript, 0x5da0), mload(add(transcript, 0x5d00))) mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5d20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5d60), 0x80, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5de0), 0x021fa11f2c822b49466f473bc750e172be66ff9df35bc5a393cee59294f42b98) mstore(add(transcript, 0x5e00), 0x2281445678651a0a05ccdbea47bde6e7a6c82e43de0a52a5414fe82995229130)mstore(add(transcript, 0x5e20), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5de0), 0x60, add(transcript, 0x5de0), 0x40), 1), success)mstore(add(transcript, 0x5e40), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e60), mload(add(transcript, 0x5d80)))mstore(add(transcript, 0x5e80), mload(add(transcript, 0x5de0))) mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5e00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5e40), 0x80, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ec0), 0x0e67f06b3cd6ad600c3a3b705d3d178c2ea4afa419a60ff56b42774a44f2c151) mstore(add(transcript, 0x5ee0), 0x1cc0dd45b27e99dcba7e4c721c4255ebde7a5b3aea6279859073398d6bf3ba1d)mstore(add(transcript, 0x5f00), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ec0), 0x60, add(transcript, 0x5ec0), 0x40), 1), success)mstore(add(transcript, 0x5f20), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f40), mload(add(transcript, 0x5e60)))mstore(add(transcript, 0x5f60), mload(add(transcript, 0x5ec0))) mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ee0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f20), 0x80, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5fa0), 0x279c16cd7feb17ed6cfe4ce27f00473872b340ebcae3dfe2c6d8aa97d9602273) mstore(add(transcript, 0x5fc0), 0x0aaffc872c798473df012c13c5185eb7cca39ba51cbf0358a7f5b7903fbde64d)mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5fa0), 0x60, add(transcript, 0x5fa0), 0x40), 1), success)mstore(add(transcript, 0x6000), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x6020), mload(add(transcript, 0x5f40)))mstore(add(transcript, 0x6040), mload(add(transcript, 0x5fa0))) mstore(add(transcript, 0x6060), mload(add(transcript, 0x5fc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6000), 0x80, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6080), 0x1b711abfd5ca379b0c7a059a3c0a23f8aa6d033158b9bcb922f191cd11a374db) mstore(add(transcript, 0x60a0), 0x2293e4350f716a42b09abf2696b53647b98656e217dfc39071b2207cb348c494)mstore(add(transcript, 0x60c0), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6080), 0x60, add(transcript, 0x6080), 0x40), 1), success)mstore(add(transcript, 0x60e0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x6100), mload(add(transcript, 0x6020)))mstore(add(transcript, 0x6120), mload(add(transcript, 0x6080))) mstore(add(transcript, 0x6140), mload(add(transcript, 0x60a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x60e0), 0x80, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6160), mload(add(transcript, 0x440))) mstore(add(transcript, 0x6180), mload(add(transcript, 0x460)))mstore(add(transcript, 0x61a0), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6160), 0x60, add(transcript, 0x6160), 0x40), 1), success)mstore(add(transcript, 0x61c0), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61e0), mload(add(transcript, 0x6100)))mstore(add(transcript, 0x6200), mload(add(transcript, 0x6160))) mstore(add(transcript, 0x6220), mload(add(transcript, 0x6180)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x61c0), 0x80, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6240), mload(add(transcript, 0x480))) mstore(add(transcript, 0x6260), mload(add(transcript, 0x4a0)))mstore(add(transcript, 0x6280), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6240), 0x60, add(transcript, 0x6240), 0x40), 1), success)mstore(add(transcript, 0x62a0), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x62c0), mload(add(transcript, 0x61e0)))mstore(add(transcript, 0x62e0), mload(add(transcript, 0x6240))) mstore(add(transcript, 0x6300), mload(add(transcript, 0x6260)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x62a0), 0x80, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6320), mload(add(transcript, 0x4c0))) mstore(add(transcript, 0x6340), mload(add(transcript, 0x4e0)))mstore(add(transcript, 0x6360), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6320), 0x60, add(transcript, 0x6320), 0x40), 1), success)mstore(add(transcript, 0x6380), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x63a0), mload(add(transcript, 0x62c0)))mstore(add(transcript, 0x63c0), mload(add(transcript, 0x6320))) mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6340)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6380), 0x80, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x6400), mload(add(transcript, 0x500))) mstore(add(transcript, 0x6420), mload(add(transcript, 0x520)))mstore(add(transcript, 0x6440), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6400), 0x60, add(transcript, 0x6400), 0x40), 1), success)mstore(add(transcript, 0x6460), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6480), mload(add(transcript, 0x63a0)))mstore(add(transcript, 0x64a0), mload(add(transcript, 0x6400))) mstore(add(transcript, 0x64c0), mload(add(transcript, 0x6420)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6460), 0x80, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64e0), mload(add(transcript, 0x540))) mstore(add(transcript, 0x6500), mload(add(transcript, 0x560)))mstore(add(transcript, 0x6520), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x64e0), 0x60, add(transcript, 0x64e0), 0x40), 1), success)mstore(add(transcript, 0x6540), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6560), mload(add(transcript, 0x6480)))mstore(add(transcript, 0x6580), mload(add(transcript, 0x64e0))) mstore(add(transcript, 0x65a0), mload(add(transcript, 0x6500)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6540), 0x80, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65c0), mload(add(transcript, 0x3a0))) mstore(add(transcript, 0x65e0), mload(add(transcript, 0x3c0)))mstore(add(transcript, 0x6600), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x65c0), 0x60, add(transcript, 0x65c0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x6560)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x65c0))) mstore(add(transcript, 0x6680), mload(add(transcript, 0x65e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6620), 0x80, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x66a0), mload(add(transcript, 0xac0))) mstore(add(transcript, 0x66c0), mload(add(transcript, 0xae0)))mstore(add(transcript, 0x66e0), sub(f_q, mload(add(transcript, 0x4de0))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x66a0), 0x60, add(transcript, 0x66a0), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x6640)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x66a0))) mstore(add(transcript, 0x6760), mload(add(transcript, 0x66c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6700), 0x80, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6780), mload(add(transcript, 0xb60))) mstore(add(transcript, 0x67a0), mload(add(transcript, 0xb80)))mstore(add(transcript, 0x67c0), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6780), 0x60, add(transcript, 0x6780), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x6720)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x6780))) mstore(add(transcript, 0x6840), mload(add(transcript, 0x67a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x67e0), 0x80, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6860), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x6880), mload(add(transcript, 0x6800)))mstore(add(transcript, 0x68a0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x68c0), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x68e0), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x6900), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x6920), mload(add(transcript, 0xb60))) mstore(add(transcript, 0x6940), mload(add(transcript, 0xb80)))mstore(add(transcript, 0x6960), 0x2bda3e3f6913dbd628d5cb2e235040d9902e3f5cd9b5f5669ed765984db32b55) mstore(add(transcript, 0x6980), 0x14f987df3f0b40848192c76a191314d67fb1f2618fba33e163e28ce9e895ab80) mstore(add(transcript, 0x69a0), 0x2b11a57fe3e865318a9cba27a410871987a176b7746acccc7aa6c59c47c9c07b) mstore(add(transcript, 0x69c0), 0x071173db1791499cdfe9b9ca8a89c405cdf9a28e622dc3417b7d3c70882d034f)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x6860), 0x180, add(transcript, 0x6860), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x6860)), 1), success)} return success; } } + assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x60), mod(mload(add(pubInputs, 0x60)), f_q))mstore(add(transcript, 0x0), 308492134225063399814226381520525808113815168934209933683689315739401114858) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0x80), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0xa0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xc0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0xe0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0x100), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x120), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x140), keccak256(add(transcript, 0x0), 320)){ let hash := mload(add(transcript, 0x140)) mstore(add(transcript, 0x160), mod(hash, f_q)) mstore(add(transcript, 0x180), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x1a0), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x1e0), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x200), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x220), keccak256(add(transcript, 0x180), 160)){ let hash := mload(add(transcript, 0x220)) mstore(add(transcript, 0x240), mod(hash, f_q)) mstore(add(transcript, 0x260), hash) }mstore8(add(transcript, 0x280), 1)mstore(add(transcript, 0x280), keccak256(add(transcript, 0x260), 33)){ let hash := mload(add(transcript, 0x280)) mstore(add(transcript, 0x2a0), mod(hash, f_q)) mstore(add(transcript, 0x2c0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x2e0), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x300), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x320), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x340), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x360), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x380), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x3a0), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3c0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x3e0), keccak256(add(transcript, 0x2c0), 288)){ let hash := mload(add(transcript, 0x3e0)) mstore(add(transcript, 0x400), mod(hash, f_q)) mstore(add(transcript, 0x420), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x440), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x460), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x480), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x4a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4c0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x4e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x500), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x520), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x540), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x560), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x580), keccak256(add(transcript, 0x420), 352)){ let hash := mload(add(transcript, 0x580)) mstore(add(transcript, 0x5a0), mod(hash, f_q)) mstore(add(transcript, 0x5c0), hash) }mstore(add(transcript, 0x5e0), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0xa00), keccak256(add(transcript, 0x5c0), 1088)){ let hash := mload(add(transcript, 0xa00)) mstore(add(transcript, 0xa20), mod(hash, f_q)) mstore(add(transcript, 0xa40), hash) }mstore8(add(transcript, 0xa60), 1)mstore(add(transcript, 0xa60), keccak256(add(transcript, 0xa40), 33)){ let hash := mload(add(transcript, 0xa60)) mstore(add(transcript, 0xa80), mod(hash, f_q)) mstore(add(transcript, 0xaa0), hash) } { let x := mload(add(proof, 0x7c0)) mstore(add(transcript, 0xac0), x) let y := mload(add(proof, 0x7e0)) mstore(add(transcript, 0xae0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb00), keccak256(add(transcript, 0xaa0), 96)){ let hash := mload(add(transcript, 0xb00)) mstore(add(transcript, 0xb20), mod(hash, f_q)) mstore(add(transcript, 0xb40), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xb60), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb80), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xba0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x5a0)), f_q))mstore(add(transcript, 0xbc0), mulmod(mload(add(transcript, 0xba0)), mload(add(transcript, 0xba0)), f_q))mstore(add(transcript, 0xbe0), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0xbc0)), f_q))mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0xbe0)), mload(add(transcript, 0xbe0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), addmod(mload(add(transcript, 0xcc0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), 21866867634659744680037180739646672280844703888306253060159436409049855557633, f_q))mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0xd00)), 9936069627611189518829255670237324269287146421271524553312532036927871056678, f_q))mstore(add(transcript, 0xd40), addmod(mload(add(transcript, 0x5a0)), 11952173244228085703417150075019950819261217979144509790385672149647937438939, f_q))mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0xd00)), 1680739780407307830605919050682431078078760076686599579086116998224280619988, f_q))mstore(add(transcript, 0xd80), addmod(mload(add(transcript, 0x5a0)), 20207503091431967391640486694574844010469604323729434764612087188351527875629, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd00)), 14158528901797138466244491986759313854666262535363044392173788062030301470987, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x5a0)), 7729713970042136756001913758497961233882101865052989951524416124545507024630, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd00)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x5a0)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd00)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x5a0)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd00)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x5a0)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd00)), 1, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x5a0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd00)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x5a0)), 2507682784038009475131574039120954579123549720846755509306663987687515178116, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd00)), 6252951856119339508807713076978770803512896272623217303779254502899773638908, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x5a0)), 15635291015719935713438692668278504285035468127792817039918949683676034856709, f_q)){ let prod := mload(add(transcript, 0xd40)) prod := mulmod(mload(add(transcript, 0xd80)), prod, f_q) mstore(add(transcript, 0xf60), prod) prod := mulmod(mload(add(transcript, 0xdc0)), prod, f_q) mstore(add(transcript, 0xf80), prod) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0xfa0), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0xfc0), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0xfe0), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0x1000), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x1040), prod) prod := mulmod(mload(add(transcript, 0xce0)), prod, f_q) mstore(add(transcript, 0x1060), prod) }mstore(add(transcript, 0x10a0), 32)mstore(add(transcript, 0x10c0), 32)mstore(add(transcript, 0x10e0), 32)mstore(add(transcript, 0x1100), mload(add(transcript, 0x1060)))mstore(add(transcript, 0x1120), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1140), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x10a0), 0xc0, add(transcript, 0x1080), 0x20), 1), success){ let inv := mload(add(transcript, 0x1080)) let v v := mload(add(transcript, 0xce0)) mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0x1040)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0x1000)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0xfe0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0xfc0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0xfa0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xf80)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xdc0)) mstore(add(transcript, 0xdc0), mulmod(mload(add(transcript, 0xf60)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xd80)) mstore(add(transcript, 0xd80), mulmod(mload(add(transcript, 0xd40)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xd40), inv) }mstore(add(transcript, 0x1160), mulmod(mload(add(transcript, 0xd20)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x1180), mulmod(mload(add(transcript, 0xd60)), mload(add(transcript, 0xd80)), f_q))mstore(add(transcript, 0x11a0), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x11c0), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x11e0), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x1200), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x1220), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x1240), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1260), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q)){ let result := mulmod(mload(add(transcript, 0x1220)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x40)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x60)), f_q), result, f_q)mstore(add(transcript, 0x1280), result) }mstore(add(transcript, 0x12a0), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x720)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0x12a0)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0x12c0)), mload(add(transcript, 0x12c0)), f_q))mstore(add(transcript, 0x1300), mulmod(mload(add(transcript, 0x12a0)), mload(add(transcript, 0x12e0)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0x1300)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1340), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x1340)), f_q))mstore(add(transcript, 0x1380), mulmod(mload(add(transcript, 0x1360)), mload(add(transcript, 0x1360)), f_q))mstore(add(transcript, 0x13a0), mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x1380)), f_q))mstore(add(transcript, 0x13c0), mulmod(mload(add(transcript, 0x13a0)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x13e0), addmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x13c0)), f_q))mstore(add(transcript, 0x1400), addmod(mload(add(transcript, 0x13e0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x1400)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1440), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1420)), f_q))mstore(add(transcript, 0x1460), mulmod(mload(add(transcript, 0x1300)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1480), mulmod(mload(add(transcript, 0x13a0)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x14a0), addmod(mload(add(transcript, 0x1460)), mload(add(transcript, 0x1480)), f_q))mstore(add(transcript, 0x14c0), addmod(mload(add(transcript, 0x14a0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x14e0), mulmod(mload(add(transcript, 0x14c0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x14e0)), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1500)), f_q))mstore(add(transcript, 0x1540), addmod(mload(add(transcript, 0x1300)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x1540)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1580), addmod(mload(add(transcript, 0x1520)), mload(add(transcript, 0x1560)), f_q))mstore(add(transcript, 0x15a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1580)), f_q))mstore(add(transcript, 0x15c0), mulmod(mload(add(transcript, 0x660)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x15e0), mulmod(mload(add(transcript, 0x1340)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x1600), addmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), addmod(mload(add(transcript, 0x1600)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1640), mulmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1620)), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x1640)), f_q))mstore(add(transcript, 0x1680), mulmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1660)), f_q))mstore(add(transcript, 0x16a0), mulmod(mload(add(transcript, 0x620)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x16c0), mulmod(mload(add(transcript, 0x640)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x16e0), addmod(mload(add(transcript, 0x16a0)), mload(add(transcript, 0x16c0)), f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x1680)), sub(f_q, mload(add(transcript, 0x16e0))), f_q))mstore(add(transcript, 0x1720), mulmod(mload(add(transcript, 0x1700)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1740), addmod(mload(add(transcript, 0x15a0)), mload(add(transcript, 0x1720)), f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1740)), f_q))mstore(add(transcript, 0x1780), mulmod(mload(add(transcript, 0x660)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x17a0), mulmod(mload(add(transcript, 0x1340)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x17c0), addmod(mload(add(transcript, 0x1780)), mload(add(transcript, 0x17a0)), f_q))mstore(add(transcript, 0x17e0), addmod(mload(add(transcript, 0x17c0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1800), mulmod(mload(add(transcript, 0x620)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x1820), mulmod(mload(add(transcript, 0x640)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1840), addmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x1820)), f_q))mstore(add(transcript, 0x1860), addmod(mload(add(transcript, 0x17e0)), sub(f_q, mload(add(transcript, 0x1840))), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x1860)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x18a0), addmod(mload(add(transcript, 0x1760)), mload(add(transcript, 0x1880)), f_q))mstore(add(transcript, 0x18c0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x18a0)), f_q))mstore(add(transcript, 0x18e0), addmod(1, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1920), addmod(2, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1940), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1960), addmod(3, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1980), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x19a0), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x5e0)), f_q))mstore(add(transcript, 0x19c0), addmod(mload(add(transcript, 0x19a0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x19e0), mulmod(mload(add(transcript, 0x19c0)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x1a00), addmod(mload(add(transcript, 0x18c0)), mload(add(transcript, 0x19e0)), f_q))mstore(add(transcript, 0x1a20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x1a40), addmod(mload(add(transcript, 0x680)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1a60), mulmod(mload(add(transcript, 0x1a40)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x1a80), addmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x1a60)), f_q))mstore(add(transcript, 0x1aa0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1ac0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1ac0)), f_q))mstore(add(transcript, 0x1b00), addmod(4, sub(f_q, mload(add(transcript, 0x780))), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b40), mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x1b20)), f_q))mstore(add(transcript, 0x1b60), addmod(1, sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1b80), mulmod(mload(add(transcript, 0x1b60)), mload(add(transcript, 0x1b40)), f_q))mstore(add(transcript, 0x1ba0), addmod(mload(add(transcript, 0x1aa0)), mload(add(transcript, 0x1b80)), f_q))mstore(add(transcript, 0x1bc0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ba0)), f_q))mstore(add(transcript, 0x1be0), mulmod(2, mload(add(transcript, 0x660)), f_q))mstore(add(transcript, 0x1c00), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x5e0))), f_q))mstore(add(transcript, 0x1c20), mulmod(mload(add(transcript, 0x1c00)), mload(add(transcript, 0x1be0)), f_q))mstore(add(transcript, 0x1c40), addmod(mload(add(transcript, 0x620)), sub(f_q, mload(add(transcript, 0x5e0))), f_q))mstore(add(transcript, 0x1c60), addmod(mload(add(transcript, 0x1c20)), sub(f_q, mload(add(transcript, 0x1c40))), f_q))mstore(add(transcript, 0x1c80), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1ca0), addmod(mload(add(transcript, 0x1c60)), sub(f_q, mload(add(transcript, 0x1c80))), f_q))mstore(add(transcript, 0x1cc0), mulmod(mload(add(transcript, 0x1ca0)), mload(add(transcript, 0x1b20)), f_q))mstore(add(transcript, 0x1ce0), addmod(mload(add(transcript, 0x1bc0)), mload(add(transcript, 0x1cc0)), f_q))mstore(add(transcript, 0x1d00), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ce0)), f_q))mstore(add(transcript, 0x1d20), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1d20)), f_q))mstore(add(transcript, 0x1d60), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x1d80), addmod(mload(add(transcript, 0x1d60)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1da0), mulmod(mload(add(transcript, 0x1d80)), mload(add(transcript, 0x1d40)), f_q))mstore(add(transcript, 0x1dc0), addmod(mload(add(transcript, 0x1d00)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1de0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e00), addmod(mload(add(transcript, 0x1de0)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1e20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x1b00)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x1e60), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x1e80), addmod(mload(add(transcript, 0x1e60)), 5192296858534827628530496329220096, f_q))mstore(add(transcript, 0x1ea0), addmod(mload(add(transcript, 0x1e80)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1ec0), mulmod(mload(add(transcript, 0x1ea0)), mload(add(transcript, 0x1e40)), f_q))mstore(add(transcript, 0x1ee0), addmod(mload(add(transcript, 0x1e20)), mload(add(transcript, 0x1ec0)), f_q))mstore(add(transcript, 0x1f00), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x1f20), addmod(1, sub(f_q, mload(add(transcript, 0x8c0))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1f00)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x1fc0), addmod(mload(add(transcript, 0x1fa0)), sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x1fe0), mulmod(mload(add(transcript, 0x1fc0)), mload(add(transcript, 0x1160)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x1fe0)), f_q))mstore(add(transcript, 0x2020), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2000)), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x920)), sub(f_q, mload(add(transcript, 0x900))), f_q))mstore(add(transcript, 0x2060), mulmod(mload(add(transcript, 0x2040)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2080), addmod(mload(add(transcript, 0x2020)), mload(add(transcript, 0x2060)), f_q))mstore(add(transcript, 0x20a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), addmod(1, sub(f_q, mload(add(transcript, 0x1160))), f_q))mstore(add(transcript, 0x20e0), addmod(mload(add(transcript, 0x1180)), mload(add(transcript, 0x11a0)), f_q))mstore(add(transcript, 0x2100), addmod(mload(add(transcript, 0x20e0)), mload(add(transcript, 0x11c0)), f_q))mstore(add(transcript, 0x2120), addmod(mload(add(transcript, 0x2100)), mload(add(transcript, 0x11e0)), f_q))mstore(add(transcript, 0x2140), addmod(mload(add(transcript, 0x2120)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2160), addmod(mload(add(transcript, 0x20c0)), sub(f_q, mload(add(transcript, 0x2140))), f_q))mstore(add(transcript, 0x2180), mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x21a0), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), addmod(mload(add(transcript, 0x21a0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x21e0), mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2200), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x21e0)), f_q))mstore(add(transcript, 0x2220), addmod(mload(add(transcript, 0x2200)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2240), mulmod(mload(add(transcript, 0x2220)), mload(add(transcript, 0x21c0)), f_q))mstore(add(transcript, 0x2260), mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2280), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2260)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x22c0), mulmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x2240)), f_q))mstore(add(transcript, 0x22e0), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2300), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x22e0)), f_q))mstore(add(transcript, 0x2320), addmod(mload(add(transcript, 0x2300)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2340), mulmod(mload(add(transcript, 0x2320)), mload(add(transcript, 0x22c0)), f_q))mstore(add(transcript, 0x2360), mulmod(mload(add(transcript, 0x2340)), mload(add(transcript, 0x8e0)), f_q))mstore(add(transcript, 0x2380), mulmod(1, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x23a0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2380)), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x23a0)), f_q))mstore(add(transcript, 0x23e0), addmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2400), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2420), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2400)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2420)), f_q))mstore(add(transcript, 0x2460), addmod(mload(add(transcript, 0x2440)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2480), mulmod(mload(add(transcript, 0x2460)), mload(add(transcript, 0x23e0)), f_q))mstore(add(transcript, 0x24a0), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x24c0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x24a0)), f_q))mstore(add(transcript, 0x24e0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x2500), addmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2520), mulmod(mload(add(transcript, 0x2500)), mload(add(transcript, 0x2480)), f_q))mstore(add(transcript, 0x2540), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2560), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x2560)), f_q))mstore(add(transcript, 0x25a0), addmod(mload(add(transcript, 0x2580)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x25a0)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x25e0), mulmod(mload(add(transcript, 0x25c0)), mload(add(transcript, 0x8c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x2360)), sub(f_q, mload(add(transcript, 0x25e0))), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2640), addmod(mload(add(transcript, 0x20a0)), mload(add(transcript, 0x2620)), f_q))mstore(add(transcript, 0x2660), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2640)), f_q))mstore(add(transcript, 0x2680), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x2680)), f_q))mstore(add(transcript, 0x26c0), addmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x26e0), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2700), addmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x2700)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2740), mulmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2780), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x27a0), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2780)), f_q))mstore(add(transcript, 0x27c0), addmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x27a0)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x27c0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2800), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2820), mulmod(mload(add(transcript, 0x5a0)), mload(add(transcript, 0x2800)), f_q))mstore(add(transcript, 0x2840), addmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x2840)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2880), mulmod(mload(add(transcript, 0x2860)), mload(add(transcript, 0x27e0)), f_q))mstore(add(transcript, 0x28a0), mulmod(mload(add(transcript, 0x2880)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x28c0), addmod(mload(add(transcript, 0x2760)), sub(f_q, mload(add(transcript, 0x28a0))), f_q))mstore(add(transcript, 0x28e0), mulmod(mload(add(transcript, 0x28c0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2900), addmod(mload(add(transcript, 0x2660)), mload(add(transcript, 0x28e0)), f_q))mstore(add(transcript, 0x2920), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2900)), f_q))mstore(add(transcript, 0x2940), addmod(1, sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x2960), mulmod(mload(add(transcript, 0x2940)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x2920)), mload(add(transcript, 0x2960)), f_q))mstore(add(transcript, 0x29a0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2980)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x29c0)), sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x2a00), mulmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x1160)), f_q))mstore(add(transcript, 0x2a20), addmod(mload(add(transcript, 0x29a0)), mload(add(transcript, 0x2a00)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2a20)), f_q))mstore(add(transcript, 0x2a60), addmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x2a60)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2ac0), mulmod(mload(add(transcript, 0x2aa0)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ae0), mulmod(256, mload(add(transcript, 0x6c0)), f_q))mstore(add(transcript, 0x2b00), addmod(mload(add(transcript, 0x660)), sub(f_q, mload(add(transcript, 0x2ae0))), f_q))mstore(add(transcript, 0x2b20), mulmod(mload(add(transcript, 0x2b00)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x2b40), addmod(mload(add(transcript, 0x2b20)), mload(add(transcript, 0x240)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x2b80), addmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x2a0)), f_q))mstore(add(transcript, 0x2ba0), mulmod(mload(add(transcript, 0x2b80)), mload(add(transcript, 0x2b60)), f_q))mstore(add(transcript, 0x2bc0), addmod(mload(add(transcript, 0x2ac0)), sub(f_q, mload(add(transcript, 0x2ba0))), f_q))mstore(add(transcript, 0x2be0), mulmod(mload(add(transcript, 0x2bc0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2c00), addmod(mload(add(transcript, 0x2a40)), mload(add(transcript, 0x2be0)), f_q))mstore(add(transcript, 0x2c20), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2c00)), f_q))mstore(add(transcript, 0x2c40), addmod(mload(add(transcript, 0x9a0)), sub(f_q, mload(add(transcript, 0x9e0))), f_q))mstore(add(transcript, 0x2c60), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x1220)), f_q))mstore(add(transcript, 0x2c80), addmod(mload(add(transcript, 0x2c20)), mload(add(transcript, 0x2c60)), f_q))mstore(add(transcript, 0x2ca0), mulmod(mload(add(transcript, 0x400)), mload(add(transcript, 0x2c80)), f_q))mstore(add(transcript, 0x2cc0), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x2ce0), addmod(mload(add(transcript, 0x9a0)), sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2d00), mulmod(mload(add(transcript, 0x2ce0)), mload(add(transcript, 0x2cc0)), f_q))mstore(add(transcript, 0x2d20), addmod(mload(add(transcript, 0x2ca0)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d40), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2d60), mulmod(mload(add(transcript, 0x2d40)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2d80), mulmod(mload(add(transcript, 0x2d60)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2da0), mulmod(mload(add(transcript, 0x2d80)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2dc0), mulmod(1, mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0x2de0), mulmod(1, mload(add(transcript, 0x2d40)), f_q))mstore(add(transcript, 0x2e00), mulmod(1, mload(add(transcript, 0x2d60)), f_q))mstore(add(transcript, 0x2e20), mulmod(1, mload(add(transcript, 0x2d80)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0x2e60), mulmod(mload(add(transcript, 0xba0)), mload(add(transcript, 0x5a0)), f_q))mstore(add(transcript, 0x2e80), mulmod(mload(add(transcript, 0x5a0)), 1, f_q))mstore(add(transcript, 0x2ea0), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2e80))), f_q))mstore(add(transcript, 0x2ec0), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0x2ee0), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2ec0))), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x5a0)), 9936069627611189518829255670237324269287146421271524553312532036927871056678, f_q))mstore(add(transcript, 0x2f20), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2f00))), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0x2f60), addmod(mload(add(transcript, 0xb20)), sub(f_q, mload(add(transcript, 0x2f40))), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 19470333053884630052643688193991482022807116448657043890197497819686199857828, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 2417909817954645169602717551265793065741247951758990453500706366889608637789, f_q), f_q), result, f_q)mstore(add(transcript, 0x2f80), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 13686227242150003628673578706486473027501243666075718775893288845164412632930, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 10079503758141076467065204586507257535549232608832327988764044976944819876346, f_q), f_q), result, f_q)mstore(add(transcript, 0x2fa0), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 18715936898160381416714524359517348601997944075114713669820885373469568354766, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 15375775075249615866494035504844970190233299190010037655541891534730124992278, f_q), f_q), result, f_q)mstore(add(transcript, 0x2fc0), result) }mstore(add(transcript, 0x2fe0), mulmod(1, mload(add(transcript, 0x2ea0)), f_q))mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x2f60)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0x2ee0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 2507682784038009475131574039120954579123549720846755509306663987687515178117, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317500, f_q), f_q), result, f_q)mstore(add(transcript, 0x3040), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 19380560087801265747114831706136320509424814679569278834391540198888293317500, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 13127608231681926238307118629157549705911918406946061530612285695988519678593, f_q), f_q), result, f_q)mstore(add(transcript, 0x3060), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 16140595808673403009154643164823336476463527776677864878778453135559733237044, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 5747647063165872213091762580433938612084836623738169464919751051016075258573, f_q), f_q), result, f_q)mstore(add(transcript, 0x3080), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 17015964487361230672162623735654618573844832338054897787312333529290879253714, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 3176732791729641355588945816447819802711920387939493967460175841862547409845, f_q), f_q), result, f_q)mstore(add(transcript, 0x30a0), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0xba0)), 19187508498431587163140984396833674282302409422288044257471288693049179355069, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0xba0)), 17472297497993506786357772047295541913219081564856233764575529621311665103799, f_q), f_q), result, f_q)mstore(add(transcript, 0x30c0), result) }mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0x2f20)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 16962650269846620577512114154870527443683566727810288380890833831998684679711, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815906, f_q), f_q), result, f_q)mstore(add(transcript, 0x3100), result) }{ let result := mulmod(mload(add(transcript, 0xb20)), mulmod(mload(add(transcript, 0x5a0)), 4925592601992654644734291590386747644864797672605745962807370354577123815906, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), mulmod(mload(add(transcript, 0x5a0)), 664623189640884330400307346618971907426870604454565164570654825418724962734, f_q), f_q), result, f_q)mstore(add(transcript, 0x3120), result) }mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x2ee0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb20)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x5a0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x3160), result) }{ let prod := mload(add(transcript, 0x2f80)) prod := mulmod(mload(add(transcript, 0x2fa0)), prod, f_q) mstore(add(transcript, 0x3180), prod) prod := mulmod(mload(add(transcript, 0x2fc0)), prod, f_q) mstore(add(transcript, 0x31a0), prod) prod := mulmod(mload(add(transcript, 0x3040)), prod, f_q) mstore(add(transcript, 0x31c0), prod) prod := mulmod(mload(add(transcript, 0x3060)), prod, f_q) mstore(add(transcript, 0x31e0), prod) prod := mulmod(mload(add(transcript, 0x3000)), prod, f_q) mstore(add(transcript, 0x3200), prod) prod := mulmod(mload(add(transcript, 0x3080)), prod, f_q) mstore(add(transcript, 0x3220), prod) prod := mulmod(mload(add(transcript, 0x30a0)), prod, f_q) mstore(add(transcript, 0x3240), prod) prod := mulmod(mload(add(transcript, 0x30c0)), prod, f_q) mstore(add(transcript, 0x3260), prod) prod := mulmod(mload(add(transcript, 0x30e0)), prod, f_q) mstore(add(transcript, 0x3280), prod) prod := mulmod(mload(add(transcript, 0x3100)), prod, f_q) mstore(add(transcript, 0x32a0), prod) prod := mulmod(mload(add(transcript, 0x3120)), prod, f_q) mstore(add(transcript, 0x32c0), prod) prod := mulmod(mload(add(transcript, 0x3140)), prod, f_q) mstore(add(transcript, 0x32e0), prod) prod := mulmod(mload(add(transcript, 0x3160)), prod, f_q) mstore(add(transcript, 0x3300), prod) prod := mulmod(mload(add(transcript, 0x2fe0)), prod, f_q) mstore(add(transcript, 0x3320), prod) }mstore(add(transcript, 0x3360), 32)mstore(add(transcript, 0x3380), 32)mstore(add(transcript, 0x33a0), 32)mstore(add(transcript, 0x33c0), mload(add(transcript, 0x3320)))mstore(add(transcript, 0x33e0), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3400), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3360), 0xc0, add(transcript, 0x3340), 0x20), 1), success){ let inv := mload(add(transcript, 0x3340)) let v v := mload(add(transcript, 0x2fe0)) mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x3300)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3160)) mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x32e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3140)) mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x32c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3120)) mstore(add(transcript, 0x3120), mulmod(mload(add(transcript, 0x32a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3100)) mstore(add(transcript, 0x3100), mulmod(mload(add(transcript, 0x3280)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30e0)) mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x3260)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30c0)) mstore(add(transcript, 0x30c0), mulmod(mload(add(transcript, 0x3240)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x30a0)) mstore(add(transcript, 0x30a0), mulmod(mload(add(transcript, 0x3220)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3080)) mstore(add(transcript, 0x3080), mulmod(mload(add(transcript, 0x3200)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3000)) mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0x31e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3060)) mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x31c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3040)) mstore(add(transcript, 0x3040), mulmod(mload(add(transcript, 0x31a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x2fc0)) mstore(add(transcript, 0x2fc0), mulmod(mload(add(transcript, 0x3180)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x2fa0)) mstore(add(transcript, 0x2fa0), mulmod(mload(add(transcript, 0x2f80)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x2f80), inv) }{ let result := mload(add(transcript, 0x2f80))result := addmod(mload(add(transcript, 0x2fa0)), result, f_q)result := addmod(mload(add(transcript, 0x2fc0)), result, f_q)mstore(add(transcript, 0x3420), result) }mstore(add(transcript, 0x3440), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x3000)), f_q)){ let result := mload(add(transcript, 0x3040))result := addmod(mload(add(transcript, 0x3060)), result, f_q)mstore(add(transcript, 0x3460), result) }mstore(add(transcript, 0x3480), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x30e0)), f_q)){ let result := mload(add(transcript, 0x3080))result := addmod(mload(add(transcript, 0x30a0)), result, f_q)result := addmod(mload(add(transcript, 0x30c0)), result, f_q)mstore(add(transcript, 0x34a0), result) }mstore(add(transcript, 0x34c0), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x3140)), f_q)){ let result := mload(add(transcript, 0x3100))result := addmod(mload(add(transcript, 0x3120)), result, f_q)mstore(add(transcript, 0x34e0), result) }mstore(add(transcript, 0x3500), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0x2fe0)), f_q)){ let result := mload(add(transcript, 0x3160))mstore(add(transcript, 0x3520), result) }{ let prod := mload(add(transcript, 0x3420)) prod := mulmod(mload(add(transcript, 0x3460)), prod, f_q) mstore(add(transcript, 0x3540), prod) prod := mulmod(mload(add(transcript, 0x34a0)), prod, f_q) mstore(add(transcript, 0x3560), prod) prod := mulmod(mload(add(transcript, 0x34e0)), prod, f_q) mstore(add(transcript, 0x3580), prod) prod := mulmod(mload(add(transcript, 0x3520)), prod, f_q) mstore(add(transcript, 0x35a0), prod) }mstore(add(transcript, 0x35e0), 32)mstore(add(transcript, 0x3600), 32)mstore(add(transcript, 0x3620), 32)mstore(add(transcript, 0x3640), mload(add(transcript, 0x35a0)))mstore(add(transcript, 0x3660), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3680), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x35e0), 0xc0, add(transcript, 0x35c0), 0x20), 1), success){ let inv := mload(add(transcript, 0x35c0)) let v v := mload(add(transcript, 0x3520)) mstore(add(transcript, 0x3520), mulmod(mload(add(transcript, 0x3580)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x34e0)) mstore(add(transcript, 0x34e0), mulmod(mload(add(transcript, 0x3560)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x34a0)) mstore(add(transcript, 0x34a0), mulmod(mload(add(transcript, 0x3540)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3460)) mstore(add(transcript, 0x3460), mulmod(mload(add(transcript, 0x3420)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3420), inv) }mstore(add(transcript, 0x36a0), mulmod(mload(add(transcript, 0x3440)), mload(add(transcript, 0x3460)), f_q))mstore(add(transcript, 0x36c0), mulmod(mload(add(transcript, 0x3480)), mload(add(transcript, 0x34a0)), f_q))mstore(add(transcript, 0x36e0), mulmod(mload(add(transcript, 0x34c0)), mload(add(transcript, 0x34e0)), f_q))mstore(add(transcript, 0x3700), mulmod(mload(add(transcript, 0x3500)), mload(add(transcript, 0x3520)), f_q))mstore(add(transcript, 0x3720), mulmod(mload(add(transcript, 0xa20)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3740), mulmod(mload(add(transcript, 0x3720)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3760), mulmod(mload(add(transcript, 0x3740)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3780), mulmod(mload(add(transcript, 0x3760)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37a0), mulmod(mload(add(transcript, 0x3780)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37c0), mulmod(mload(add(transcript, 0x37a0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x37e0), mulmod(mload(add(transcript, 0x37c0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3800), mulmod(mload(add(transcript, 0x37e0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3820), mulmod(mload(add(transcript, 0x3800)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3840), mulmod(mload(add(transcript, 0x3820)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3860), mulmod(mload(add(transcript, 0x3840)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3880), mulmod(mload(add(transcript, 0x3860)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38a0), mulmod(mload(add(transcript, 0x3880)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38c0), mulmod(mload(add(transcript, 0x38a0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x38e0), mulmod(mload(add(transcript, 0x38c0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3900), mulmod(mload(add(transcript, 0x38e0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3920), mulmod(mload(add(transcript, 0xa80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3940), mulmod(mload(add(transcript, 0x3920)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3960), mulmod(mload(add(transcript, 0x3940)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3960)), mload(add(transcript, 0xa80)), f_q)){ let result := mulmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2f80)), f_q)result := addmod(mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x2fa0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2fc0)), f_q), result, f_q)mstore(add(transcript, 0x39a0), result) }mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x39a0)), mload(add(transcript, 0x3420)), f_q))mstore(add(transcript, 0x39e0), mulmod(sub(f_q, mload(add(transcript, 0x39c0))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2f80)), f_q)result := addmod(mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2fa0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2fc0)), f_q), result, f_q)mstore(add(transcript, 0x3a00), result) }mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0x3420)), f_q))mstore(add(transcript, 0x3a40), mulmod(sub(f_q, mload(add(transcript, 0x3a20))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3a60), mulmod(1, mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3a80), addmod(mload(add(transcript, 0x39e0)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), 1, f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3a60)), 1, f_q))mstore(add(transcript, 0x3ae0), mulmod(1, mload(add(transcript, 0x3440)), f_q)){ let result := mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3b00), result) }mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3b40), mulmod(sub(f_q, mload(add(transcript, 0x3b20))), 1, f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3ae0)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3b80), result) }mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3bc0), mulmod(sub(f_q, mload(add(transcript, 0x3ba0))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x3c00), addmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0x3bc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x3040)), f_q)result := addmod(mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x3060)), f_q), result, f_q)mstore(add(transcript, 0x3c20), result) }mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0x36a0)), f_q))mstore(add(transcript, 0x3c60), mulmod(sub(f_q, mload(add(transcript, 0x3c40))), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x3c80), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x3ca0), addmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d00), mulmod(mload(add(transcript, 0x3be0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d20), mulmod(mload(add(transcript, 0x3c80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3d40), addmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x3d60), mulmod(1, mload(add(transcript, 0x3480)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x3080)), f_q)result := addmod(mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x30a0)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x30c0)), f_q), result, f_q)mstore(add(transcript, 0x3d80), result) }mstore(add(transcript, 0x3da0), mulmod(mload(add(transcript, 0x3d80)), mload(add(transcript, 0x36c0)), f_q))mstore(add(transcript, 0x3dc0), mulmod(sub(f_q, mload(add(transcript, 0x3da0))), 1, f_q))mstore(add(transcript, 0x3de0), mulmod(mload(add(transcript, 0x3d60)), 1, f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3dc0)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x3e20), mulmod(mload(add(transcript, 0x3de0)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x3e40), addmod(mload(add(transcript, 0x3d40)), mload(add(transcript, 0x3e00)), f_q))mstore(add(transcript, 0x3e60), mulmod(1, mload(add(transcript, 0x34c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x3100)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x3120)), f_q), result, f_q)mstore(add(transcript, 0x3e80), result) }mstore(add(transcript, 0x3ea0), mulmod(mload(add(transcript, 0x3e80)), mload(add(transcript, 0x36e0)), f_q))mstore(add(transcript, 0x3ec0), mulmod(sub(f_q, mload(add(transcript, 0x3ea0))), 1, f_q))mstore(add(transcript, 0x3ee0), mulmod(mload(add(transcript, 0x3e60)), 1, f_q))mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x3f20), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x3f40), addmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3f00)), f_q))mstore(add(transcript, 0x3f60), mulmod(1, mload(add(transcript, 0x3500)), f_q)){ let result := mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), 1, f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3f60)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4000), result) }mstore(add(transcript, 0x4020), mulmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4040), mulmod(sub(f_q, mload(add(transcript, 0x4020))), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x4060), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0xa20)), f_q))mstore(add(transcript, 0x4080), addmod(mload(add(transcript, 0x3fc0)), mload(add(transcript, 0x4040)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x40a0), result) }mstore(add(transcript, 0x40c0), mulmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x40e0), mulmod(sub(f_q, mload(add(transcript, 0x40c0))), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4100), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4120), addmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0x40e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4140), result) }mstore(add(transcript, 0x4160), mulmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4180), mulmod(sub(f_q, mload(add(transcript, 0x4160))), mload(add(transcript, 0x3740)), f_q))mstore(add(transcript, 0x41a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3740)), f_q))mstore(add(transcript, 0x41c0), addmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0x4180)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x41e0), result) }mstore(add(transcript, 0x4200), mulmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4220), mulmod(sub(f_q, mload(add(transcript, 0x4200))), mload(add(transcript, 0x3760)), f_q))mstore(add(transcript, 0x4240), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3760)), f_q))mstore(add(transcript, 0x4260), addmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0x4220)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4280), result) }mstore(add(transcript, 0x42a0), mulmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x42c0), mulmod(sub(f_q, mload(add(transcript, 0x42a0))), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x42e0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x4300), addmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0x42c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4320), result) }mstore(add(transcript, 0x4340), mulmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4360), mulmod(sub(f_q, mload(add(transcript, 0x4340))), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x4380), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37a0)), f_q))mstore(add(transcript, 0x43a0), addmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0x4360)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x43c0), result) }mstore(add(transcript, 0x43e0), mulmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4400), mulmod(sub(f_q, mload(add(transcript, 0x43e0))), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x4420), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x4440), addmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0x4400)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4460), result) }mstore(add(transcript, 0x4480), mulmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x44a0), mulmod(sub(f_q, mload(add(transcript, 0x4480))), mload(add(transcript, 0x37e0)), f_q))mstore(add(transcript, 0x44c0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x37e0)), f_q))mstore(add(transcript, 0x44e0), addmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0x44a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4500), result) }mstore(add(transcript, 0x4520), mulmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4540), mulmod(sub(f_q, mload(add(transcript, 0x4520))), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x4560), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x4580), addmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0x4540)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x45a0), result) }mstore(add(transcript, 0x45c0), mulmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x45e0), mulmod(sub(f_q, mload(add(transcript, 0x45c0))), mload(add(transcript, 0x3820)), f_q))mstore(add(transcript, 0x4600), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3820)), f_q))mstore(add(transcript, 0x4620), addmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0x45e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4640), result) }mstore(add(transcript, 0x4660), mulmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4680), mulmod(sub(f_q, mload(add(transcript, 0x4660))), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46c0), addmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0x4680)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x46e0), result) }mstore(add(transcript, 0x4700), mulmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4720), mulmod(sub(f_q, mload(add(transcript, 0x4700))), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4740), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4760), addmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0x4720)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4780), result) }mstore(add(transcript, 0x47a0), mulmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x47c0), mulmod(sub(f_q, mload(add(transcript, 0x47a0))), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x47e0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x4800), addmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0x47c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4820), result) }mstore(add(transcript, 0x4840), mulmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4860), mulmod(sub(f_q, mload(add(transcript, 0x4840))), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x4880), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x48a0), addmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0x4860)), f_q))mstore(add(transcript, 0x48c0), mulmod(mload(add(transcript, 0x2dc0)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x48e0), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x2e00)), mload(add(transcript, 0x3500)), f_q))mstore(add(transcript, 0x4920), mulmod(mload(add(transcript, 0x2e20)), mload(add(transcript, 0x3500)), f_q)){ let result := mulmod(mload(add(transcript, 0x2e40)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4940), result) }mstore(add(transcript, 0x4960), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4980), mulmod(sub(f_q, mload(add(transcript, 0x4960))), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49a0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49c0), mulmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a00), mulmod(mload(add(transcript, 0x4900)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x4920)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x4a40), addmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0x4980)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x3160)), f_q)mstore(add(transcript, 0x4a60), result) }mstore(add(transcript, 0x4a80), mulmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x4aa0), mulmod(sub(f_q, mload(add(transcript, 0x4a80))), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x4ac0), mulmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x4ae0), addmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0x4aa0)), f_q))mstore(add(transcript, 0x4b00), mulmod(mload(add(transcript, 0x4ae0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x4060)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x4100)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x41a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ba0), mulmod(mload(add(transcript, 0x4240)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4bc0), mulmod(mload(add(transcript, 0x42e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4380)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c00), mulmod(mload(add(transcript, 0x4420)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x44c0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c40), mulmod(mload(add(transcript, 0x4560)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4600)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x46a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x4740)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x47e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4880)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x49a0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x49c0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x4ac0)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x4dc0), addmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0x4b00)), f_q))mstore(add(transcript, 0x4de0), mulmod(1, mload(add(transcript, 0x3020)), f_q))mstore(add(transcript, 0x4e00), mulmod(1, mload(add(transcript, 0xb20)), f_q))mstore(add(transcript, 0x4e20), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x4e40), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x4e60), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4e20), 0x60, add(transcript, 0x4e20), 0x40), 1), success)mstore(add(transcript, 0x4e80), mload(add(transcript, 0x4e20))) mstore(add(transcript, 0x4ea0), mload(add(transcript, 0x4e40)))mstore(add(transcript, 0x4ec0), mload(add(transcript, 0x80))) mstore(add(transcript, 0x4ee0), mload(add(transcript, 0xa0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x4e80), 0x80, add(transcript, 0x4e80), 0x40), 1), success)mstore(add(transcript, 0x4f00), mload(add(transcript, 0xc0))) mstore(add(transcript, 0x4f20), mload(add(transcript, 0xe0)))mstore(add(transcript, 0x4f40), mload(add(transcript, 0x3ac0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4f00), 0x60, add(transcript, 0x4f00), 0x40), 1), success)mstore(add(transcript, 0x4f60), mload(add(transcript, 0x4e80))) mstore(add(transcript, 0x4f80), mload(add(transcript, 0x4ea0)))mstore(add(transcript, 0x4fa0), mload(add(transcript, 0x4f00))) mstore(add(transcript, 0x4fc0), mload(add(transcript, 0x4f20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x4f60), 0x80, add(transcript, 0x4f60), 0x40), 1), success)mstore(add(transcript, 0x4fe0), mload(add(transcript, 0x100))) mstore(add(transcript, 0x5000), mload(add(transcript, 0x120)))mstore(add(transcript, 0x5020), mload(add(transcript, 0x3ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x4fe0), 0x60, add(transcript, 0x4fe0), 0x40), 1), success)mstore(add(transcript, 0x5040), mload(add(transcript, 0x4f60))) mstore(add(transcript, 0x5060), mload(add(transcript, 0x4f80)))mstore(add(transcript, 0x5080), mload(add(transcript, 0x4fe0))) mstore(add(transcript, 0x50a0), mload(add(transcript, 0x5000)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5040), 0x80, add(transcript, 0x5040), 0x40), 1), success)mstore(add(transcript, 0x50c0), mload(add(transcript, 0x320))) mstore(add(transcript, 0x50e0), mload(add(transcript, 0x340)))mstore(add(transcript, 0x5100), mload(add(transcript, 0x3d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x50c0), 0x60, add(transcript, 0x50c0), 0x40), 1), success)mstore(add(transcript, 0x5120), mload(add(transcript, 0x5040))) mstore(add(transcript, 0x5140), mload(add(transcript, 0x5060)))mstore(add(transcript, 0x5160), mload(add(transcript, 0x50c0))) mstore(add(transcript, 0x5180), mload(add(transcript, 0x50e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5120), 0x80, add(transcript, 0x5120), 0x40), 1), success)mstore(add(transcript, 0x51a0), mload(add(transcript, 0x360))) mstore(add(transcript, 0x51c0), mload(add(transcript, 0x380)))mstore(add(transcript, 0x51e0), mload(add(transcript, 0x3d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x51a0), 0x60, add(transcript, 0x51a0), 0x40), 1), success)mstore(add(transcript, 0x5200), mload(add(transcript, 0x5120))) mstore(add(transcript, 0x5220), mload(add(transcript, 0x5140)))mstore(add(transcript, 0x5240), mload(add(transcript, 0x51a0))) mstore(add(transcript, 0x5260), mload(add(transcript, 0x51c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5200), 0x80, add(transcript, 0x5200), 0x40), 1), success)mstore(add(transcript, 0x5280), mload(add(transcript, 0x2e0))) mstore(add(transcript, 0x52a0), mload(add(transcript, 0x300)))mstore(add(transcript, 0x52c0), mload(add(transcript, 0x3e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5280), 0x60, add(transcript, 0x5280), 0x40), 1), success)mstore(add(transcript, 0x52e0), mload(add(transcript, 0x5200))) mstore(add(transcript, 0x5300), mload(add(transcript, 0x5220)))mstore(add(transcript, 0x5320), mload(add(transcript, 0x5280))) mstore(add(transcript, 0x5340), mload(add(transcript, 0x52a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x52e0), 0x80, add(transcript, 0x52e0), 0x40), 1), success)mstore(add(transcript, 0x5360), mload(add(transcript, 0x1a0))) mstore(add(transcript, 0x5380), mload(add(transcript, 0x1c0)))mstore(add(transcript, 0x53a0), mload(add(transcript, 0x3f20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5360), 0x60, add(transcript, 0x5360), 0x40), 1), success)mstore(add(transcript, 0x53c0), mload(add(transcript, 0x52e0))) mstore(add(transcript, 0x53e0), mload(add(transcript, 0x5300)))mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360))) mstore(add(transcript, 0x5420), mload(add(transcript, 0x5380)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x53c0), 0x80, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5440), mload(add(transcript, 0x1e0))) mstore(add(transcript, 0x5460), mload(add(transcript, 0x200)))mstore(add(transcript, 0x5480), mload(add(transcript, 0x4b20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5440), 0x60, add(transcript, 0x5440), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x5440))) mstore(add(transcript, 0x5500), mload(add(transcript, 0x5460)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x54a0), 0x80, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5520), 0x0655d62979dc062dc1e8c15334bf17cf5c7e6352219c0bd0b0cc039598d9a669) mstore(add(transcript, 0x5540), 0x019589d3002f6a0ded46a69053f0c05e7a7ca45339b3d2bae85d00f26ac0f33e)mstore(add(transcript, 0x5560), mload(add(transcript, 0x4b40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5520), 0x60, add(transcript, 0x5520), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x54c0)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x5520))) mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5540)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5580), 0x80, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x5600), 0x1eab999592385208b42a12dcc047763ee5cf12052eb4b0d9a7a286e043f3df9f) mstore(add(transcript, 0x5620), 0x18887eb3c646ffd4961226c91bac9661004798b1fc6a39c43f9a6d1d03767194)mstore(add(transcript, 0x5640), mload(add(transcript, 0x4b60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5600), 0x60, add(transcript, 0x5600), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x55a0)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x5600))) mstore(add(transcript, 0x56c0), mload(add(transcript, 0x5620)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5660), 0x80, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56e0), 0x076806058b02e1b5e99b2f2e8eee613194f8df73481659f5938baacd64e4d7b8) mstore(add(transcript, 0x5700), 0x05ae81644b244dceea5350a84a79cbf0a199bbd6c1fad9887423f8c8048e6039)mstore(add(transcript, 0x5720), mload(add(transcript, 0x4b80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x56e0), 0x60, add(transcript, 0x56e0), 0x40), 1), success)mstore(add(transcript, 0x5740), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5760), mload(add(transcript, 0x5680)))mstore(add(transcript, 0x5780), mload(add(transcript, 0x56e0))) mstore(add(transcript, 0x57a0), mload(add(transcript, 0x5700)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5740), 0x80, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57c0), 0x0438873fc00231ae527efcf74d9092f5059dfa05275cbe7381e948fe3b7b61d8) mstore(add(transcript, 0x57e0), 0x03c0f314c93403792ba86ec3841b3080f2f7cd092c6bcb632cdbc2122a13cdef)mstore(add(transcript, 0x5800), mload(add(transcript, 0x4ba0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x57c0), 0x60, add(transcript, 0x57c0), 0x40), 1), success)mstore(add(transcript, 0x5820), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5840), mload(add(transcript, 0x5760)))mstore(add(transcript, 0x5860), mload(add(transcript, 0x57c0))) mstore(add(transcript, 0x5880), mload(add(transcript, 0x57e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5820), 0x80, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x58a0), 0x2b12b132a6261ad60249147599cae0d5b3547e510deabba65526d130f04f2402) mstore(add(transcript, 0x58c0), 0x13e3c02ce00f6b7e00d5b099eda5f1155956ae83899a2d59cefcb00dad66a7f6)mstore(add(transcript, 0x58e0), mload(add(transcript, 0x4bc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x58a0), 0x60, add(transcript, 0x58a0), 0x40), 1), success)mstore(add(transcript, 0x5900), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x5920), mload(add(transcript, 0x5840)))mstore(add(transcript, 0x5940), mload(add(transcript, 0x58a0))) mstore(add(transcript, 0x5960), mload(add(transcript, 0x58c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5900), 0x80, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5980), 0x0ed83370277e0fd35e8258dd5630ce0ce3491fdf7e166d293745635b0cc4eba5) mstore(add(transcript, 0x59a0), 0x03994e7e77ad58072b78757700ab0b79247f2e462b0cf6a5a18b607414c095db)mstore(add(transcript, 0x59c0), mload(add(transcript, 0x4be0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5980), 0x60, add(transcript, 0x5980), 0x40), 1), success)mstore(add(transcript, 0x59e0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x5a00), mload(add(transcript, 0x5920)))mstore(add(transcript, 0x5a20), mload(add(transcript, 0x5980))) mstore(add(transcript, 0x5a40), mload(add(transcript, 0x59a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x59e0), 0x80, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a60), 0x23ba4bc49baab563e9d5bf07da231a4496d35b6bc782dbbd76135fe44c31cbcf) mstore(add(transcript, 0x5a80), 0x28b88097e7edf1b2904f6c25c1e30ca0e38c74a52125b2995c4cf0a750683854)mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x4c00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5a60), 0x60, add(transcript, 0x5a60), 0x40), 1), success)mstore(add(transcript, 0x5ac0), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5ae0), mload(add(transcript, 0x5a00)))mstore(add(transcript, 0x5b00), mload(add(transcript, 0x5a60))) mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ac0), 0x80, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b40), 0x17dcbba0bbe2d24566de620998f62ff54ea5302ada6aeb18028b61b4dc19bbd3) mstore(add(transcript, 0x5b60), 0x0e1f908007a5c2cc934426c26de7206c53fa10c79d63ef52ee91bfb568c72fbd)mstore(add(transcript, 0x5b80), mload(add(transcript, 0x4c20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5b40), 0x60, add(transcript, 0x5b40), 0x40), 1), success)mstore(add(transcript, 0x5ba0), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5bc0), mload(add(transcript, 0x5ae0)))mstore(add(transcript, 0x5be0), mload(add(transcript, 0x5b40))) mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ba0), 0x80, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c20), 0x2c7823f99cb2adb716becb960914ffa1d6e2f257875fdd03c2bee52ef571d41e) mstore(add(transcript, 0x5c40), 0x09ab83ebc6803e65b2e6831c8706d9a134f6b1cf6f6ec5c2697afee095320ee1)mstore(add(transcript, 0x5c60), mload(add(transcript, 0x4c40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c20), 0x60, add(transcript, 0x5c20), 0x40), 1), success)mstore(add(transcript, 0x5c80), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5ca0), mload(add(transcript, 0x5bc0)))mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x5c20))) mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c80), 0x80, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5d00), 0x2dc12c205152bfacc354c838225571172c215e01a64de6a2ca6665c70937ac58) mstore(add(transcript, 0x5d20), 0x0449eb529f0038a2bd2f6c0b6213a70488b69b479d90a953579e4c9d45621b85)mstore(add(transcript, 0x5d40), mload(add(transcript, 0x4c60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d00), 0x60, add(transcript, 0x5d00), 0x40), 1), success)mstore(add(transcript, 0x5d60), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d80), mload(add(transcript, 0x5ca0)))mstore(add(transcript, 0x5da0), mload(add(transcript, 0x5d00))) mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5d20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5d60), 0x80, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5de0), 0x09a2ab3913a4770fd50f6ba9ec4ce0b3178b54d7bfca5b42fe7e8e1ce5cf60a9) mstore(add(transcript, 0x5e00), 0x13ec31f94026569c4bb76e2c4ceaa3e6525438ffb4a7a69cde61f6d77b93bad7)mstore(add(transcript, 0x5e20), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5de0), 0x60, add(transcript, 0x5de0), 0x40), 1), success)mstore(add(transcript, 0x5e40), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e60), mload(add(transcript, 0x5d80)))mstore(add(transcript, 0x5e80), mload(add(transcript, 0x5de0))) mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5e00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5e40), 0x80, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ec0), 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) mstore(add(transcript, 0x5ee0), 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3)mstore(add(transcript, 0x5f00), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ec0), 0x60, add(transcript, 0x5ec0), 0x40), 1), success)mstore(add(transcript, 0x5f20), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f40), mload(add(transcript, 0x5e60)))mstore(add(transcript, 0x5f60), mload(add(transcript, 0x5ec0))) mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ee0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f20), 0x80, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5fa0), 0x02a9a77d8e6f6fd89f33ba56fe45f6f5c907e50ba28cdd4198acfb562eb21103) mstore(add(transcript, 0x5fc0), 0x23abee68d83c2d6632576e5e95ca01a61e5e3e6d9438c2ac6428c8b6edfe2aba)mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5fa0), 0x60, add(transcript, 0x5fa0), 0x40), 1), success)mstore(add(transcript, 0x6000), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x6020), mload(add(transcript, 0x5f40)))mstore(add(transcript, 0x6040), mload(add(transcript, 0x5fa0))) mstore(add(transcript, 0x6060), mload(add(transcript, 0x5fc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6000), 0x80, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6080), 0x2cf36d36bfacbe1a8d8c626aefa75ac0feb46b725989a8e6fabed074bf9f6af7) mstore(add(transcript, 0x60a0), 0x060fded3ed5ec56d9e0064d73c472245a4c4b6ec371e9808692bf7f259d3b730)mstore(add(transcript, 0x60c0), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6080), 0x60, add(transcript, 0x6080), 0x40), 1), success)mstore(add(transcript, 0x60e0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x6100), mload(add(transcript, 0x6020)))mstore(add(transcript, 0x6120), mload(add(transcript, 0x6080))) mstore(add(transcript, 0x6140), mload(add(transcript, 0x60a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x60e0), 0x80, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6160), mload(add(transcript, 0x440))) mstore(add(transcript, 0x6180), mload(add(transcript, 0x460)))mstore(add(transcript, 0x61a0), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6160), 0x60, add(transcript, 0x6160), 0x40), 1), success)mstore(add(transcript, 0x61c0), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61e0), mload(add(transcript, 0x6100)))mstore(add(transcript, 0x6200), mload(add(transcript, 0x6160))) mstore(add(transcript, 0x6220), mload(add(transcript, 0x6180)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x61c0), 0x80, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6240), mload(add(transcript, 0x480))) mstore(add(transcript, 0x6260), mload(add(transcript, 0x4a0)))mstore(add(transcript, 0x6280), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6240), 0x60, add(transcript, 0x6240), 0x40), 1), success)mstore(add(transcript, 0x62a0), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x62c0), mload(add(transcript, 0x61e0)))mstore(add(transcript, 0x62e0), mload(add(transcript, 0x6240))) mstore(add(transcript, 0x6300), mload(add(transcript, 0x6260)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x62a0), 0x80, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6320), mload(add(transcript, 0x4c0))) mstore(add(transcript, 0x6340), mload(add(transcript, 0x4e0)))mstore(add(transcript, 0x6360), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6320), 0x60, add(transcript, 0x6320), 0x40), 1), success)mstore(add(transcript, 0x6380), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x63a0), mload(add(transcript, 0x62c0)))mstore(add(transcript, 0x63c0), mload(add(transcript, 0x6320))) mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6340)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6380), 0x80, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x6400), mload(add(transcript, 0x500))) mstore(add(transcript, 0x6420), mload(add(transcript, 0x520)))mstore(add(transcript, 0x6440), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6400), 0x60, add(transcript, 0x6400), 0x40), 1), success)mstore(add(transcript, 0x6460), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6480), mload(add(transcript, 0x63a0)))mstore(add(transcript, 0x64a0), mload(add(transcript, 0x6400))) mstore(add(transcript, 0x64c0), mload(add(transcript, 0x6420)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6460), 0x80, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64e0), mload(add(transcript, 0x540))) mstore(add(transcript, 0x6500), mload(add(transcript, 0x560)))mstore(add(transcript, 0x6520), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x64e0), 0x60, add(transcript, 0x64e0), 0x40), 1), success)mstore(add(transcript, 0x6540), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6560), mload(add(transcript, 0x6480)))mstore(add(transcript, 0x6580), mload(add(transcript, 0x64e0))) mstore(add(transcript, 0x65a0), mload(add(transcript, 0x6500)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6540), 0x80, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65c0), mload(add(transcript, 0x3a0))) mstore(add(transcript, 0x65e0), mload(add(transcript, 0x3c0)))mstore(add(transcript, 0x6600), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x65c0), 0x60, add(transcript, 0x65c0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x6560)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x65c0))) mstore(add(transcript, 0x6680), mload(add(transcript, 0x65e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6620), 0x80, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x66a0), mload(add(transcript, 0xac0))) mstore(add(transcript, 0x66c0), mload(add(transcript, 0xae0)))mstore(add(transcript, 0x66e0), sub(f_q, mload(add(transcript, 0x4de0))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x66a0), 0x60, add(transcript, 0x66a0), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x6640)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x66a0))) mstore(add(transcript, 0x6760), mload(add(transcript, 0x66c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6700), 0x80, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6780), mload(add(transcript, 0xb60))) mstore(add(transcript, 0x67a0), mload(add(transcript, 0xb80)))mstore(add(transcript, 0x67c0), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6780), 0x60, add(transcript, 0x6780), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x6720)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x6780))) mstore(add(transcript, 0x6840), mload(add(transcript, 0x67a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x67e0), 0x80, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6860), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x6880), mload(add(transcript, 0x6800)))mstore(add(transcript, 0x68a0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x68c0), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x68e0), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x6900), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x6920), mload(add(transcript, 0xb60))) mstore(add(transcript, 0x6940), mload(add(transcript, 0xb80)))mstore(add(transcript, 0x6960), 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) mstore(add(transcript, 0x6980), 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) mstore(add(transcript, 0x69a0), 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) mstore(add(transcript, 0x69c0), 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x6860), 0x180, add(transcript, 0x6860), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x6860)), 1), success)} return success; } } diff --git a/contracts/src/SolvencyVerifier.yul b/contracts/src/SolvencyVerifier.yul index 6984cac0..d72d7d0e 100644 --- a/contracts/src/SolvencyVerifier.yul +++ b/contracts/src/SolvencyVerifier.yul @@ -34,7 +34,7 @@ mstore(0x20, mod(calldataload(0x0), f_q)) mstore(0x40, mod(calldataload(0x20), f_q)) mstore(0x60, mod(calldataload(0x40), f_q)) -mstore(0x0, 17670701479603100502823625940353980192460425255394494203384293782765030717197) +mstore(0x0, 308492134225063399814226381520525808113815168934209933683689315739401114858) { let x := calldataload(0x60) @@ -1197,8 +1197,8 @@ mstore(0x54a0, mload(0x53c0)) mstore(0x54e0, mload(0x5440)) mstore(0x5500, mload(0x5460)) success := and(eq(staticcall(gas(), 0x6, 0x54a0, 0x80, 0x54a0, 0x40), 1), success) -mstore(0x5520, 0x2f76bb5b87a6969c4ebb851bb10df173a462316bec33392c426c2f2b3a23f18b) - mstore(0x5540, 0x1128e4c8af582c69c209db87ec18fa85466ea71b7198f6d8c79083103261fec3) +mstore(0x5520, 0x0655d62979dc062dc1e8c15334bf17cf5c7e6352219c0bd0b0cc039598d9a669) + mstore(0x5540, 0x019589d3002f6a0ded46a69053f0c05e7a7ca45339b3d2bae85d00f26ac0f33e) mstore(0x5560, mload(0x4b40)) success := and(eq(staticcall(gas(), 0x7, 0x5520, 0x60, 0x5520, 0x40), 1), success) mstore(0x5580, mload(0x54a0)) @@ -1206,8 +1206,8 @@ mstore(0x5580, mload(0x54a0)) mstore(0x55c0, mload(0x5520)) mstore(0x55e0, mload(0x5540)) success := and(eq(staticcall(gas(), 0x6, 0x5580, 0x80, 0x5580, 0x40), 1), success) -mstore(0x5600, 0x133492493eb62499c1ba03a8715f8d07e78490f157ef603bdfbafb396a1bdcbf) - mstore(0x5620, 0x079b0b5d58e739eea6bdfe4092e232bacee0d027bd0f5186c22977bfd24620d7) +mstore(0x5600, 0x1eab999592385208b42a12dcc047763ee5cf12052eb4b0d9a7a286e043f3df9f) + mstore(0x5620, 0x18887eb3c646ffd4961226c91bac9661004798b1fc6a39c43f9a6d1d03767194) mstore(0x5640, mload(0x4b60)) success := and(eq(staticcall(gas(), 0x7, 0x5600, 0x60, 0x5600, 0x40), 1), success) mstore(0x5660, mload(0x5580)) @@ -1215,8 +1215,8 @@ mstore(0x5660, mload(0x5580)) mstore(0x56a0, mload(0x5600)) mstore(0x56c0, mload(0x5620)) success := and(eq(staticcall(gas(), 0x6, 0x5660, 0x80, 0x5660, 0x40), 1), success) -mstore(0x56e0, 0x187bddea7dbe1c5acd2e01afadc1c0df38180c00ab7439352151b7e801502a0b) - mstore(0x5700, 0x0fc2689a279dba9a368a34988064e5dc4f1cd3f2598bd2a6949e1b1a02d10b76) +mstore(0x56e0, 0x076806058b02e1b5e99b2f2e8eee613194f8df73481659f5938baacd64e4d7b8) + mstore(0x5700, 0x05ae81644b244dceea5350a84a79cbf0a199bbd6c1fad9887423f8c8048e6039) mstore(0x5720, mload(0x4b80)) success := and(eq(staticcall(gas(), 0x7, 0x56e0, 0x60, 0x56e0, 0x40), 1), success) mstore(0x5740, mload(0x5660)) @@ -1224,8 +1224,8 @@ mstore(0x5740, mload(0x5660)) mstore(0x5780, mload(0x56e0)) mstore(0x57a0, mload(0x5700)) success := and(eq(staticcall(gas(), 0x6, 0x5740, 0x80, 0x5740, 0x40), 1), success) -mstore(0x57c0, 0x16fbd0af4b59dc890346304d35c999dd8dfad3a06ad8a10f474527fad9ea9c32) - mstore(0x57e0, 0x2ab015bc2b8a19b48338928187638174065562d0a5a83b008546a9e6612ec6c4) +mstore(0x57c0, 0x0438873fc00231ae527efcf74d9092f5059dfa05275cbe7381e948fe3b7b61d8) + mstore(0x57e0, 0x03c0f314c93403792ba86ec3841b3080f2f7cd092c6bcb632cdbc2122a13cdef) mstore(0x5800, mload(0x4ba0)) success := and(eq(staticcall(gas(), 0x7, 0x57c0, 0x60, 0x57c0, 0x40), 1), success) mstore(0x5820, mload(0x5740)) @@ -1233,8 +1233,8 @@ mstore(0x5820, mload(0x5740)) mstore(0x5860, mload(0x57c0)) mstore(0x5880, mload(0x57e0)) success := and(eq(staticcall(gas(), 0x6, 0x5820, 0x80, 0x5820, 0x40), 1), success) -mstore(0x58a0, 0x1dcfb31490b59327642f4b9392465bd8824f732a9e94e46b0bad32b5706087af) - mstore(0x58c0, 0x16b484290b48dce843c6bab1e64e7f45eb424bb17ce605fbcea4650fb021f600) +mstore(0x58a0, 0x2b12b132a6261ad60249147599cae0d5b3547e510deabba65526d130f04f2402) + mstore(0x58c0, 0x13e3c02ce00f6b7e00d5b099eda5f1155956ae83899a2d59cefcb00dad66a7f6) mstore(0x58e0, mload(0x4bc0)) success := and(eq(staticcall(gas(), 0x7, 0x58a0, 0x60, 0x58a0, 0x40), 1), success) mstore(0x5900, mload(0x5820)) @@ -1242,8 +1242,8 @@ mstore(0x5900, mload(0x5820)) mstore(0x5940, mload(0x58a0)) mstore(0x5960, mload(0x58c0)) success := and(eq(staticcall(gas(), 0x6, 0x5900, 0x80, 0x5900, 0x40), 1), success) -mstore(0x5980, 0x1eeb3f7b26d5c9871bc2c16a4ed5056dbe613a4bad07a1865e94b5a3f1f46842) - mstore(0x59a0, 0x2226ac7577fc6b41920682f07383ed12ef175ee617888551e764434eda30a02e) +mstore(0x5980, 0x0ed83370277e0fd35e8258dd5630ce0ce3491fdf7e166d293745635b0cc4eba5) + mstore(0x59a0, 0x03994e7e77ad58072b78757700ab0b79247f2e462b0cf6a5a18b607414c095db) mstore(0x59c0, mload(0x4be0)) success := and(eq(staticcall(gas(), 0x7, 0x5980, 0x60, 0x5980, 0x40), 1), success) mstore(0x59e0, mload(0x5900)) @@ -1251,8 +1251,8 @@ mstore(0x59e0, mload(0x5900)) mstore(0x5a20, mload(0x5980)) mstore(0x5a40, mload(0x59a0)) success := and(eq(staticcall(gas(), 0x6, 0x59e0, 0x80, 0x59e0, 0x40), 1), success) -mstore(0x5a60, 0x26e3fbd5c5a66607cd8371419cac48be464539f883f1edfaca3c6bf8507a7410) - mstore(0x5a80, 0x08f6e991d52b47307f2f83f267b41f3f3310fa21831988da7ab39054fe2ac53b) +mstore(0x5a60, 0x23ba4bc49baab563e9d5bf07da231a4496d35b6bc782dbbd76135fe44c31cbcf) + mstore(0x5a80, 0x28b88097e7edf1b2904f6c25c1e30ca0e38c74a52125b2995c4cf0a750683854) mstore(0x5aa0, mload(0x4c00)) success := and(eq(staticcall(gas(), 0x7, 0x5a60, 0x60, 0x5a60, 0x40), 1), success) mstore(0x5ac0, mload(0x59e0)) @@ -1260,8 +1260,8 @@ mstore(0x5ac0, mload(0x59e0)) mstore(0x5b00, mload(0x5a60)) mstore(0x5b20, mload(0x5a80)) success := and(eq(staticcall(gas(), 0x6, 0x5ac0, 0x80, 0x5ac0, 0x40), 1), success) -mstore(0x5b40, 0x1654ed6ee24ad6ebd5c4c2dc0febbb2e92d556bb946f336c7cc1566170f64cdd) - mstore(0x5b60, 0x2e60765d74d1d5c043e2299c4e457312b1358f4e51cdea038ec00ef453f20a09) +mstore(0x5b40, 0x17dcbba0bbe2d24566de620998f62ff54ea5302ada6aeb18028b61b4dc19bbd3) + mstore(0x5b60, 0x0e1f908007a5c2cc934426c26de7206c53fa10c79d63ef52ee91bfb568c72fbd) mstore(0x5b80, mload(0x4c20)) success := and(eq(staticcall(gas(), 0x7, 0x5b40, 0x60, 0x5b40, 0x40), 1), success) mstore(0x5ba0, mload(0x5ac0)) @@ -1269,8 +1269,8 @@ mstore(0x5ba0, mload(0x5ac0)) mstore(0x5be0, mload(0x5b40)) mstore(0x5c00, mload(0x5b60)) success := and(eq(staticcall(gas(), 0x6, 0x5ba0, 0x80, 0x5ba0, 0x40), 1), success) -mstore(0x5c20, 0x23a0c541643962fd3751f386670057a24c2a2966d6f975b8474b1df1df58aec5) - mstore(0x5c40, 0x12adacf7628483c9dd1d014cb00243aa716100680f195d25d59bc85ee7fdf202) +mstore(0x5c20, 0x2c7823f99cb2adb716becb960914ffa1d6e2f257875fdd03c2bee52ef571d41e) + mstore(0x5c40, 0x09ab83ebc6803e65b2e6831c8706d9a134f6b1cf6f6ec5c2697afee095320ee1) mstore(0x5c60, mload(0x4c40)) success := and(eq(staticcall(gas(), 0x7, 0x5c20, 0x60, 0x5c20, 0x40), 1), success) mstore(0x5c80, mload(0x5ba0)) @@ -1278,8 +1278,8 @@ mstore(0x5c80, mload(0x5ba0)) mstore(0x5cc0, mload(0x5c20)) mstore(0x5ce0, mload(0x5c40)) success := and(eq(staticcall(gas(), 0x6, 0x5c80, 0x80, 0x5c80, 0x40), 1), success) -mstore(0x5d00, 0x19780ae2901b7f5ddedf94c1b53b504977a5181f39a0502c6e86b8378203f22e) - mstore(0x5d20, 0x1f5f311a3d179380fe7cd9e6d14150dc860629541bb2c8f88110e31de91c7bfa) +mstore(0x5d00, 0x2dc12c205152bfacc354c838225571172c215e01a64de6a2ca6665c70937ac58) + mstore(0x5d20, 0x0449eb529f0038a2bd2f6c0b6213a70488b69b479d90a953579e4c9d45621b85) mstore(0x5d40, mload(0x4c60)) success := and(eq(staticcall(gas(), 0x7, 0x5d00, 0x60, 0x5d00, 0x40), 1), success) mstore(0x5d60, mload(0x5c80)) @@ -1287,8 +1287,8 @@ mstore(0x5d60, mload(0x5c80)) mstore(0x5da0, mload(0x5d00)) mstore(0x5dc0, mload(0x5d20)) success := and(eq(staticcall(gas(), 0x6, 0x5d60, 0x80, 0x5d60, 0x40), 1), success) -mstore(0x5de0, 0x021fa11f2c822b49466f473bc750e172be66ff9df35bc5a393cee59294f42b98) - mstore(0x5e00, 0x2281445678651a0a05ccdbea47bde6e7a6c82e43de0a52a5414fe82995229130) +mstore(0x5de0, 0x09a2ab3913a4770fd50f6ba9ec4ce0b3178b54d7bfca5b42fe7e8e1ce5cf60a9) + mstore(0x5e00, 0x13ec31f94026569c4bb76e2c4ceaa3e6525438ffb4a7a69cde61f6d77b93bad7) mstore(0x5e20, mload(0x4c80)) success := and(eq(staticcall(gas(), 0x7, 0x5de0, 0x60, 0x5de0, 0x40), 1), success) mstore(0x5e40, mload(0x5d60)) @@ -1296,8 +1296,8 @@ mstore(0x5e40, mload(0x5d60)) mstore(0x5e80, mload(0x5de0)) mstore(0x5ea0, mload(0x5e00)) success := and(eq(staticcall(gas(), 0x6, 0x5e40, 0x80, 0x5e40, 0x40), 1), success) -mstore(0x5ec0, 0x0e67f06b3cd6ad600c3a3b705d3d178c2ea4afa419a60ff56b42774a44f2c151) - mstore(0x5ee0, 0x1cc0dd45b27e99dcba7e4c721c4255ebde7a5b3aea6279859073398d6bf3ba1d) +mstore(0x5ec0, 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) + mstore(0x5ee0, 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3) mstore(0x5f00, mload(0x4ca0)) success := and(eq(staticcall(gas(), 0x7, 0x5ec0, 0x60, 0x5ec0, 0x40), 1), success) mstore(0x5f20, mload(0x5e40)) @@ -1305,8 +1305,8 @@ mstore(0x5f20, mload(0x5e40)) mstore(0x5f60, mload(0x5ec0)) mstore(0x5f80, mload(0x5ee0)) success := and(eq(staticcall(gas(), 0x6, 0x5f20, 0x80, 0x5f20, 0x40), 1), success) -mstore(0x5fa0, 0x279c16cd7feb17ed6cfe4ce27f00473872b340ebcae3dfe2c6d8aa97d9602273) - mstore(0x5fc0, 0x0aaffc872c798473df012c13c5185eb7cca39ba51cbf0358a7f5b7903fbde64d) +mstore(0x5fa0, 0x02a9a77d8e6f6fd89f33ba56fe45f6f5c907e50ba28cdd4198acfb562eb21103) + mstore(0x5fc0, 0x23abee68d83c2d6632576e5e95ca01a61e5e3e6d9438c2ac6428c8b6edfe2aba) mstore(0x5fe0, mload(0x4cc0)) success := and(eq(staticcall(gas(), 0x7, 0x5fa0, 0x60, 0x5fa0, 0x40), 1), success) mstore(0x6000, mload(0x5f20)) @@ -1314,8 +1314,8 @@ mstore(0x6000, mload(0x5f20)) mstore(0x6040, mload(0x5fa0)) mstore(0x6060, mload(0x5fc0)) success := and(eq(staticcall(gas(), 0x6, 0x6000, 0x80, 0x6000, 0x40), 1), success) -mstore(0x6080, 0x1b711abfd5ca379b0c7a059a3c0a23f8aa6d033158b9bcb922f191cd11a374db) - mstore(0x60a0, 0x2293e4350f716a42b09abf2696b53647b98656e217dfc39071b2207cb348c494) +mstore(0x6080, 0x2cf36d36bfacbe1a8d8c626aefa75ac0feb46b725989a8e6fabed074bf9f6af7) + mstore(0x60a0, 0x060fded3ed5ec56d9e0064d73c472245a4c4b6ec371e9808692bf7f259d3b730) mstore(0x60c0, mload(0x4ce0)) success := and(eq(staticcall(gas(), 0x7, 0x6080, 0x60, 0x6080, 0x40), 1), success) mstore(0x60e0, mload(0x6000)) @@ -1403,10 +1403,10 @@ mstore(0x68a0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c mstore(0x6900, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) mstore(0x6920, mload(0xb60)) mstore(0x6940, mload(0xb80)) -mstore(0x6960, 0x2bda3e3f6913dbd628d5cb2e235040d9902e3f5cd9b5f5669ed765984db32b55) - mstore(0x6980, 0x14f987df3f0b40848192c76a191314d67fb1f2618fba33e163e28ce9e895ab80) - mstore(0x69a0, 0x2b11a57fe3e865318a9cba27a410871987a176b7746acccc7aa6c59c47c9c07b) - mstore(0x69c0, 0x071173db1791499cdfe9b9ca8a89c405cdf9a28e622dc3417b7d3c70882d034f) +mstore(0x6960, 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) + mstore(0x6980, 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) + mstore(0x69a0, 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) + mstore(0x69c0, 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff) success := and(eq(staticcall(gas(), 0x8, 0x6860, 0x180, 0x6860, 0x20), 1), success) success := and(eq(mload(0x6860), 1), success) @@ -1415,4 +1415,4 @@ success := and(eq(mload(0x6860), 1), success) } } - } \ No newline at end of file + } diff --git a/zk_prover/Cargo.toml b/zk_prover/Cargo.toml index e8d9a6c8..b7660f76 100644 --- a/zk_prover/Cargo.toml +++ b/zk_prover/Cargo.toml @@ -25,7 +25,7 @@ num_cpus = "1.15" snark-verifier-sdk = { git = "https://github.com/privacy-scaling-explorations/snark-verifier"} snark-verifier = { git = "https://github.com/privacy-scaling-explorations/snark-verifier"} itertools = "0.10.3" -ethers = { version = "2.0.7", default_features = false, features = ["ethers-solc"] } +ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc"] } regex-simple = { version = "1", package = "regex" } [dev-dependencies] @@ -33,4 +33,4 @@ criterion= "0.3" [[bench]] name = "full_solvency_flow" -harness = false \ No newline at end of file +harness = false diff --git a/zk_prover/examples/gen_inclusion_verifier.rs b/zk_prover/examples/gen_inclusion_verifier.rs index 60906b00..9f439aba 100644 --- a/zk_prover/examples/gen_inclusion_verifier.rs +++ b/zk_prover/examples/gen_inclusion_verifier.rs @@ -26,7 +26,9 @@ fn main() { let circuit = MstInclusionCircuit::::init_empty(); // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). - let (params, pk, _) = generate_setup_artifacts(11, None, circuit.clone()).unwrap(); + let (params, pk, _) = + generate_setup_artifacts(11, Some("../backend/ptau/hermez-raw-11"), circuit.clone()) + .unwrap(); let num_instances = circuit.num_instance(); diff --git a/zk_prover/examples/gen_solvency_verifier.rs b/zk_prover/examples/gen_solvency_verifier.rs index 385794a0..5bfc9430 100644 --- a/zk_prover/examples/gen_solvency_verifier.rs +++ b/zk_prover/examples/gen_solvency_verifier.rs @@ -50,6 +50,12 @@ fn main() { let circuit = SolvencyCircuit::::init(merkle_sum_tree, asset_sums); + // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). + let (params, pk, _) = + generate_setup_artifacts(10, Some("../backend/ptau/hermez-raw-11"), circuit.clone()) + .unwrap(); + + let num_instances = circuit.num_instance(); let instances = circuit.instances(); let proof = gen_evm_proof_shplonk(¶ms, &pk, circuit.clone(), instances.clone()); diff --git a/zk_prover/examples/inclusion_proof_solidity_calldata.json b/zk_prover/examples/inclusion_proof_solidity_calldata.json index 9a076c2c..7aad7233 100644 --- a/zk_prover/examples/inclusion_proof_solidity_calldata.json +++ b/zk_prover/examples/inclusion_proof_solidity_calldata.json @@ -1,7 +1,7 @@ { - "proof": "0x02ba50f7d51a0c62101c5f31db996d99a723c40de6b09af6041922f602e83dda17a5104cd74c9aa1c9fed8415ba9b8071b4dbfd70e0e2cea9d0b30dcdc4e6b0124547aa01d2c1cc5a663984090b33bcceae104547f9560d4115b98b20c55687e1188ba5f8ed5c5e0c5b6f6c8dd22a8a00c8f4037698f354640c890116fb82e9422858d106cc073dde18841efb7eabc6ca90ab7d5b52897e58ae588f546c761de0bcbefea56817c25c6837f251d6336c46947fcaa8f67f14e28a5bec7ee52cafd11aecd7034d3535843ca1e10ce09ba1c2da636d23f42cca8f3ffcb7b44b048e6159691681b95d5c5ff01d2e793aa5fe72b3ffc88eeb68d084a42c54cf750fd1924d7038d1a685cf18d4c0937a7289b79b1c93cd10e68e852849c92b466b85ee90cbba5a5ce16ccd9811603347c629f6bc259d9aa8e00570b498f2a84c2a6b810206515f5b51b76a7ff7eb2ce4db234af1eab63ecf07c1a7494728d67d74d94bc20a782954bc35368082bee63f6a0f654b62941a77978b1ee410a10c041f8867c1e8dfbe20ba0f49d7438a7fb9836d63f7b86a6b6667b543b5f49d6eaffc967a0009c7eb97db8181b6f89229ba9471714f8e796573786cd16a4da20f6c0719a8d0dfc125966883bc60e84a2739b1e2203097b68eab886faf0acbd1acde65b13532fa1528ff7f425fc14ff559fcd92d9152d7a1edcb280cfbeba4b225b6bfde8320f1d6c70d5b0e6c4cec6c061bb4ad5dd34470394fddb5a85c20df5bbd8bc3d11258973f49c1b7087d5028628f9c824a2e5607a8c77b0cfbc5df6db695495029a2926bf5adc04a416167ed589c14ad9d5b421baf5c3281adffe5cec49ad53f3382c2f712e9104766beb72f0cca4bba91499a1b01b1278f5c96709c644ff92a722113b39ca10fd30be35f88e9732dfd4f8f254d72a3d0f528cf6caaa5650a6559409d4a7de2b4b40c3c9790170ff614aa61dc06bbae9bc1de45251a1ea0468d77807779465ac7db7389fdea939b8ea8d0093f2430ef0cce031ca8b41a5cc18760b0285750e6c190f912a8365bfd33c202d05bb6c08b7e2654a368df6710de6659d2dec906817460fe555c46a2c9810d261a5a4aae62502fd3680371820894863580b6d1380ce561afb89e4e941f932596ef22d0fdfff4f89468ef2a81f3defe0410ec0f775259355408259ce1b718be1b296a0b123d209505a3aec314b0e002ef51a6d2ff383a46311399768ee1299857455de70f23963f2f9bc805b9a502699511aa82c830ed7f9218bdd56a7f8fd014100e3cb42b522b8f018b50e603579df201e72f796e3f64ddb3128d847a3709cb147c284921145079f3b3dced0c57f9b3d25304651f4cd2b5c5376892cd6a6388fa72d3a3fb45a698ac653b192fc5877a3075051050e71244a3c0b4d156ed081de1bdff275e9f042ee6bc4c821917e3271094f7bfc8bf6f5632cc01b2ed24b5922c1b5e728616a133fdc7e18401fa695a82d5344a92359b34bcc4cfa3457cfa57d4ccbe2f6232c8e0ea4e75ec60ae69edb2c0ea012af04d43cfd9a31f5e5e7eb62858d19152246cf03b2d22d2077edfde1071f221f9cbfb9f2d7b7a7ceaf725fb7dc90137cdcea5273bf421e3e8db7aa390fd1a8631b32764cb9be8f96bb71bb1205da5d05ef10c72c1690dd2a4389995a2932ab0a50de825f1559fcffff93e9a3c705c11c8cec9dcb5c485a7f729eb2182b804b08fac527b30ab869c3e76a6ec395036a757bd6f04dbcfee06ae7b6a9f414f3dd036d34d6411b8e0cf0771e1b1ebab2b344ddf22d1cf3e5b0cd4cc2f0ac0f42078f1f3d4d43424780d7699140818e29e2b512c989eaa9d34c5416631dac13ba3f115701c6412420b2b2385c75c8b42a89c8f20fb85b6703eb3d9cb4bd10022dca037a53bc98471039ecebcbe7b61feacc64850104d326bf5f69221395dd110f82bd76cb133b57afe5fe5cf82c4b4cf853e9d8e23b0305c7ec8bbd36d2f118ed209617a1a4c2414c91070a3e6b9ccbbd1f265701ca6407bdef1b52a41ac20f18582f3957c7a67129be7b81c853e3cf77c5c8b4798d78f7e561c425ce35c42eda5ee2e818c3f42f5143d400a64ff563c4d85172e551ed8c260c21ea6791850341df131391b0cf0fee324bb7019cf6643542d35887607a5a2716b3058f2e8c2b031843d211b906a0b7225968409b8dd6b31474f4e1c00b7487fb27277aede30662ae95d2c37b5889cea7ae2653909255b815c5eaac8da7bac5ee4b557dbb7f2cfd5ba6730e38ef34a44993de946e9a48e2fa7ac786fe34a5a96fb66a148bc007da19fe3b3a912bd3f2bd991e5349a8ba12f3f53f352f22b442dc7ddf82b9021b422dd989d86d0271f9f27222b93a90b56c9ccd81a209e470c26c4e41f2c8db1b12c873246b55f810e2c10ba48ddb1299fe444f88ffc47ec11c7e2c96c1a0910678794933e44ba174d3bc8ce2106f9ba9a0f810585ee5a999aa89eb488660e211e73f2634d7c46a53fd457c8d9b79b4c7b81be197054f125fa9c050294ae7a913ae8ae3d4a6b33f687751c951fa2cc0ce0bb8bc45d870f8270fa07965de112719ba66a596885300edcbb2f1bc88e3b719c4deb0e370bfe7b23b0f9829f1b1c32e8cee2013419794ec443125ce4cbf4218b36fe10050482c1e75c3540c489d1a0635ef62097a3262bc5189c2c3e3ac36a1a9d6fb2b072b66da11ed6aa3df05a10fdc564b20b9a08f078727cc759d25c202f182b3566f50f7bd14da69b40805080619b929ee38516f3121f7e6da9e8bc80063c5f28c683e55548486fb7fa54cd00bc43f14c29bffbe40d286026c1976d7c428709931dfb32cab8441c2a6cd080e2a443cc676bd1d1520a43ca3d6e01ae0e77ac315468df8526b8c93c4bbf8c52e1e9ed2c2f23306caa2b1d2414c6460a377bd9dcd45adfaa9d6fb2cb5d8d382a72e4c96b4ed64d75dda706ab6f783b0c9d7d311ba22e69a12ad71eb705676988b17a262213aeb107ed6a1f68409e5a6a703cf81171c58fd0d4cca92478185057f", + "proof": "0x20915f0d4ee13b0f773e691621c4928b83b08ae6e3aed158976eb2ef1781cfa109afb66750a062a7a8cbacaf1149308efe1b274fd61a768101c72dff47370b7e0447eafd8e01e3775851f6ce2aa6458b5193449ddc80ee0ae08f8213d98bd121135193e6fc64182ce38da867ed9eb9b163c10bffdd0639200b8097e98da05e140ddf7ebeb2e40ecbcca43014f3fafe4c7512a76e1c936f4e34a3c681ffe6da7003ff5fafde2132aae22440d510ce903a712dfe29a1f308311a5d0f95a6eacdd904d4197fbba0c2c589c35456629393cfa0740657645c854973e4cb902c33155e0d30a3f1cab21461def7045cf5c1514a390ddc4f89d082304fbb9bb72cd2aa1a242239b3e980df0348ec3a3360cbf3e72d83d6a85fe9431752cb689395c926f81eb1a04b332a5d9573f2cb7b988d0fe49687fa232ab2472f1aae47432335ac710c1d210547ff2f93a0a233d80fe3f4c2a683cc3273bf90676656f0d69ed1ccf721484460a99e140de309cbcee7f5ed9d0e84f021d214457349797275e40c7fc92c578c4bf2d1d6b9c9f5134261bf26c79a6437be946d72ac368add653fc007610c5be8be22dd3c99cdb24e024206619bd072cc068ea4828288f9d075b91720ff1a02871f0707d48d8217a6572ae8e4164012c9de818226ccd1be7db9f43eb6bc1312184bd7e125b9ab4ed04442fffb17052faf8fb35a4d2603520bf11cf228720dc9c4b63c83bfed43104528fab3dab4d9524881a9e6cf20a731dcf6f0def235258a98fc0bef2dfb9bfceb6f270009473f9cfa6739ac47e9d3eb5eb7444079d007add1686645f019607dd33e3e16041aaee1c8cf0692d867c1166347e2b090ec1928f9dc9d73dc3a3a596824d124ecae398f45a84b6cbbedfec416f94b788fd2211584dc44dffb9cdb5b24fbb36b8e06265f2e61d9c16abe43850b0e100be2702caee065ba5353038939d221fbda5824d5ec8e68b06f0198fda4829b40f588fb27dc7295709f4cad4f02b90096e57dc300af3cfc644c14aae7a6201e5c0d2a2e0b73428b9bd5f10c9be516c1f850a557f013cf27cc357ecf6b1a6e445f5d75e8167ff43a7e19acc59c240ed1d918f9d13347099ba8864b08a3ea1b06dab64a9a26f92c5035287181bfbb82dcf96132c4c28b4faf2779c3907424bac9529140fd2f73787050de67a9eb4ca2549aa42db52fa6558ff5ee441e43a708d0b7182d25026c6c54fb1b3a9cd7823d6861ea065a32b63e1fe11cda017cd9a969e20b7e9f1f9933de26c02f4e6645773d37be67573574de0e967553eba8dfa6f4728be0d6009e1dd03ea2010912a9b01d6641591229c43440869ad4561fef86c26ae463a1210680cf3f0af0c0328903b1b1af1e23109ecca9a8bca6b7fbbf091f4bf112a40802cfd52b8c4d1e02b09b56afac0d6aeb894fcafd3856d36542bc744a0661b52f6a13ac9ba1dcb552ca1b2205815b10d364237fb83db626c02d8b6670fff96d13f40532806e6c7e8f0e3656a0e75741cc6c37d450e198ccf276670029a4bc9c15650226898a98f4763a459c5aa18d28d67775ddb13ac9ae1dc62a08dd0f592c15b18565f0b46f61a3c92e3d80a938aa4fc70ea71c418c368ae73410cded87ac0079d60ac04155d44ebd9d53aa5967409bd81a23c6141b86f0b955298272d81828f5a90f08e6ecc22286dc97208ebb36876b81a26da23ba09dc529f8ebf7294d0d557e14755c1cc8af10977ff0ee5f5826d13eaee84cd0dc08a7a494f144b26529e2b4b41eeead5b7318d28faf23962493b4d06dc51a40ec03892727c1133bde0a2f6ba7bfa8f9d261fdf0aaf303cd6cc4c1a5483d45ef8451c19d209d7fb63e1ae22a2652fa3696b09d6834f2cab4cc0749bcb0a8f9210242b2485e6adb5aef23d9a545d08d2f0fe8a84120ca2c5ad5d998536ba9d86836949a28e246f22059206ba16b68a7510ea6ea801ff3af65490be25cb32c6e2e3e958de49cfb8501852f61fe1af50471376e10db200eb89accaa2a400a8235cf0cb3f7bc6d69d1c67e15bb88c4e2d8e5d4e25a8d890fbb95e6f7bf082ea795df8f29f54d0b9ccbecb72d7c76019c25584553ecd518face907a19d91131439bb63df871b53685d631931322d656297616a4ba7382b51d1cbe5fb15b56e1ba5c4ec093bfd8994f618f891ebfad8b93e48c57781ac7394372036010454d433fca08292b444da888cd469614029fece429cd043352ef39bf2bee9a15a6f878238ef4622a9d84d47e138dd81af3a39ebfdeccf85e3dfb61195fb062fb3dd2affb8efa0259a2fbf9a9541c7118a845fe2f4847840a84444b7f8dec8e6bb649e145b6d4815cae4d17563763950729f96fafd5fba5f24021188df77ab4b443497d8990e58d4855d8939738187b2bf0629c7150c0ac31aed7b10635615110713bdd1286a0f57e531e21b127a18e1866688a312d558158bd65237ecfb43b5256ccc65b3a9024f1fb59f2c3d71cea2232820ad7bceb6d70dae830ee378f36f7f338e4cd908eb6c1720395ad3d7faa300d12109f274bffb2684364a1f709b4da6c093ccdc5b2ce6e2fae39238b0b35035975b59a763024eaecb62aaeaf1857ee9551f8654bd98efc649dbd52ae0df0040c540283a6a8a121121e18b8d3ea1cec896f8a7d6b787d2eae3cfc6e2991d70cc456c8431a329b9bd4d2eef293172386075d8ff091e816373048940a10d93703c06b81f510b1df541089a83fdfeaff914b4c3cdae8a8d990daa4d941565ccc0222d574fc693b505a223d81580221208c156a02603632f2093b1f1d896d36a3049a3e85d60e7017e04ef5d78a0964d63b50cabdcd27de0a31aad462553d208a1da12050832f76381b6830d8796a06c8bef43ab4b6934704c8ab69d001bd02762a74e5e360a97682f5720c914b318353dc521fc0dd7404b362c389f8a333e3901198585a9ba11454f9076dee844fdac101c409d75314e5f728507661fb96818f0edf6564266421ca1e980fed4e747113712b1431107456eba6bdc998c62bcdd6", "public_inputs": [ "0xe113acd03b98f0bab0ef6f577245d5d008cbcc19ef2dab3608aa4f37f72a407", "0x2e021d9bf99c5bd7267488b6a7a5cf5f7d00222a41b6a9b971899c44089e0c5" ] -} \ No newline at end of file +} diff --git a/zk_prover/examples/solvency_proof_solidity_calldata.json b/zk_prover/examples/solvency_proof_solidity_calldata.json index 79563efe..c36f0396 100644 --- a/zk_prover/examples/solvency_proof_solidity_calldata.json +++ b/zk_prover/examples/solvency_proof_solidity_calldata.json @@ -1,8 +1,8 @@ { - "proof": "0x02cc6ce33b224db4620a3d1e9d569b4559dd7c373da89a3b4aa8dc05c9e077561b7b9bad8ea14270f44db7e4a7edc5960accaddd739b504708553a67de9d994030173928a1fff000e918d817734183191877eaf050d1a867416cb4d37e6431792251bb49c5ea59b2ecf865f89dcf073d25b7886c19d5b49583a7b3810c7d58a5180c4fa702018feb20a39483b0a3b13d3c63be516cc2de8ac5374cf1d2bd94940fe30ea351e0de235f5d000f5915044f7e6da810bacf0740645ababdb236103b08b9a869d0bcca15a29a0139428fc2385d79ab44f6259bc401d6751794d08ae41c45d619538a702f96137bb2ee3ee4c1b2d8c9be2127456bc1fffa896e1057fd071bd67c2aa5e7c1122946e489f8ad44658ae603671cbd866ac7259b9f1980d3230f2e5b0612a94ae0b886655089ccc7a2f42920cca7c37b7e21b8da27269fc5271e49b8e295a4a557d70c43155d81a3ed1e4541e93c9c789e3d17f0056af7fa2497d42dc67815ca77c8528fbcb8c76564449e72b2a26375d5aee33efbafd95117e3f8373f240a66db82787eba376db4572fa73c4e16bedbef7275054661895d22a5bfb5c060769aa863905e2ccb91f620257a99ae0d3a33a2adc4c5a6e86d2304e5dcd9bcebcec1654dab3c5c4e47417aabb0dac9a446ffc33db8391dde9a5c27d2acb15644fbc5bb2be251bf2548bd1c169e9c9ace20024fe672074c8f9c920a88e997acc633f47e9fb9de319b1e10a2eca1a380d10e722fa755206b9139ee144a9208d71adbd3eae4e5c91e2e4486d34f73c4b687b34d19ab6b941266053f158b5a2d78861f555bc147be1549fb3a5271b75718b4e89952535a16589de154297d458c0d6f2041947965c04bc786848a02c9cda45eeb13ab3ffb95c044a92b0bcf677b493880203d10b456ebd3f62b3eada978510987df4d26d0ff248d8924074a6f7159b2dac5cb2513cd225e8a22402169f0dc7b21b7348e3b791c5d5eb005ceefbd205847e0c97e8894337c8791b6f473d5f29d76cd42bf5ffbe6acd15b2b30a16a321e6dc2fd04674c9fc246c05d984c01d7131689583760d30c6874452e28b65f738428c559fde12b00b71269bf61b2735f1382732c76fc16b0f318322f752d9eea5a9ad7f819654a87659c31b5eaf56488359341e0a01e8923f756fe185b5bb9b5564a4af495c7a4ff42d367b27f57a6b82108128f5c2c4bf9aab705065c0392a6b8a0b7427c312c9affd4231f3bc5af06f22f810f918b6051a39c6a1e1d209d665ded7ef46404d945b39d0119efc39731623f8b4975c1996fb3fb91034993a31a366294ff66881b326135eb52e81e3cec45d095639de65b2b44a5bb096b8875102acdd6d5f752eca990bce62b802bbff4e5662567ecb47c152262e20f76c89b75ee1e5c651b017b5fa0cfe39e549700aa9c17dc80a02d33b83d5ee51940e56d3cd8d1bfd5b56ef2582f5f19f3dd01398615b617672efc5b14c9e9312a6a2c6426be6f265690babc360e1c125889ac126992dd3372fca1283dd9f68329f511d7916bf4a00c4f6c3c3698188f05b18f9b55ea6a3865f8b8f30267bdcb0203d167ac9a3ba32d39afe9b76631437153b98415482721c4f10ea1fe02b2081bb095ff49a9daa473e5bd42a633b8936677fa74f2dad72a7daa4ccfda4639b52d0ddd5046e4a8899b29c6376ac7438452270fb5760f60f986d7b8bdb1f0a54819c9b786c0503b727eeb78b023f97ffc7b438a5a5c8c044da18eae6ad94c89470a2d1369ad5c244035e3d827fa1c4dbaaa527862747bcea05d160450f5727fa92e8994dd97cb564e3ac57a4a7fe6b83804aaf38ed94d99bf85ddc2285cce40b81c7e5e6e238f49145a263ae4a579638337366f2ee5081e73742b8e624e82bc7f0c97ef10232a0b4c91755e36e12d94c4c01486f9c91fc4328c1c01a8a07fafe32b3e96600cfc3640fdc721a0f9176b8a20f9f989aa957c4c4245cdc5441a23f30902ee8713d3c677217a52cb1aa1f6baecac056de10e1a33c278f7652c4dff901270ed4995a0fdd1b5069f9725f9f7a2e2ee2458017cd924b0400fd464aa6ffc2482b58610cc3fed7ab26f06a333a92bec0223823ca04a2eaef331ea3bb4232116a8080ce42d374d24f75a61aec10d8d11d629209339bdd9714aa03ddc880d45142267fa553a5497e2745955a82bd99ec18bc7e2f2517eb9cfbc16ba9004839c17cae175bde6bc28d6521df18003822190cc8878d740411017f5fb0c0c2b5ccc2ea4b39b907391773711035ea5a5fc52f55fb458bb2077233af50c44f2bcadbd22c69d4face13880cfe08033cfb731f5e340be1ffec46aa64220b39c47d4a5a21e5aede19910fe0c1ea53b1158793d2027788122007ffd718160560f6828e6fd1aaa79d7f247bc869ab803e193f780c383927a80f7f8b572b916477a8f5b599816939033fd786372b72245a722afcc02812fb4e372b5798571e391b30a3c396721b6d1d7c51d1f523b69cc9f606743bc316648d02f52917a04a2248fd1d69d8f11f23ddc23fc9eebed092987b426ad4e2ffb327514e6bb5988ec7c6a7d66f2881c419c58cde670a918248bff77cc084d2b9babc3bb941f2c87303518b7dbe93a0903300cd7998863382e0b59c0e460b77e57e38f32f556d3ac77718c0e9d741815745e6ffa80b7e2e93e512346237c3c974888fb6e84f395aae34c6da9d88c850f91073ccf66957f121f0464be3c40ad0b4b326dbf9a0cd4193f1a5a9f198ab5304b2bfb9674851fa40cc40f1475fd39f41ec16c9adc6d857d4614c9819b4bfc130f61d428f2d3ca31a08a8558182ab672d6ec1f5dab222e846a5e53989f41b72e476f08329e092d91da755bff744927af61b33acdec856c05d7c47a0879822c2f9c5d29ab12f9898aff4570110724162b1ad50e253c1567eabb36281099cdb4", + "proof": "0x294a01e5e8169bc04c5c79e96566af34f6802cbe75a80f20eefa4a2a771efb7721c43380eca2289ab8876e66cd5b52d73e6ece7b43d7144de8a38d4ee033db0d0ba95ef7404070024598023f2cdc5bc54d55dd968900937110426ac0f711bcf92f6fa30db6b6274efc31960400f4355951028f5ea05c74f4ea9a43804d68ab8a1faae935f5d6891da738aea21e9fb4f4df779100ed79e8472e4743f50818f86715a98f3b91aef115e98ca337f57bc7b21c9ad2d672741525246aee1dfc26442110d259c4ffd040e1f8a7e573b9b46a4400f4bf72748504ce214a3001fad4c201043433cff2ff4bc51a5b012960d2884a1fa993a5462d463e156bf1af8b914c531c51ab717be7c4e29db1d808974477174dc99d463f6805d5f03dbb82cdab2bfd2ff7106202a03425ece58e8221e1052da0b83e3c65fc7763a7ab0dad4954c73f1952b13a33eb59681908eae3340c1920640e02c8ce375232e5c8ab5d31e753d70f2e23519a75905f14b606d2f2eb9c10da382672e0a33c9cdd3a12ba15c4ad8f2a46e5d579a7f672d24eec3888aefb2fe4ac548f6d835bc990747d582a3b0adb2e91ec2fbec6c1bc8d8e8e4b5fff97c0fbc0a43c7dd9789f96424db17d1e7640168dd2a598e140145be4d462e855cbd4d5dc4ac05610969749c62faccdfeb9660dcc91aaeb24a5b6972345c9f17307935e4f0a77043ab1e56a1c467bda4b6a120cff749fe9e8c61e57253d94a952fb1fa79bd1a1342bf735e63d992944ec42d400899ea57c1270173f60ea0cfa8ca5dccf4e8c51bcf2b6c501f790ecebb954b5181ff52913cc4b81a46977c3e40b9ae405cc6eea5b14601ed360781eac6cb58722e7563918338a4fa1e08d3cba14fef21bef0441b1c6a89be528faae6fbe2adb10e446fffaa6f99d87b83bfea201e5cd03bbf54a71fd3985447835e056c315e427235bd37e1b81cd3f68b0f878c55bc05f1808a02ef265061d6fed656f0c9bec0cee229a9ebb0d89412107254bfed767d6a901b40114341d8afc2edc2e34a34f0fb7abaeac1a071d9399c9cc02de7e48baccbb94a4b5a4b98f6262e9d4952e040760992864d804252902790fc3dfff37a7644c07cfb488b0f3b1e5c0eeb0808f044de336457432352a9b5fb25cc71c8fc8a7b37821cf4a0acb566382a9a01fce2df0a8d04416469401069c3e0b150277ced57b7ff7b3f49500b99d22dd88b7d210e7b92d3624c3a6d4adf525783dae26ad0ac156ab90710059ec4ff21c3662e3132b5bf2d76f84310a393635304224c44f3d13a6f57f26b5725d33a36543b9db0b72e9730c611eb00cc88b483dae28fb89af7add85f12b206e204de4fa8936ff05729686a309cc06f17e68dd8cee610666c1fa5d626f4b57f953bb36aeb0579e21e2aaeb30ee947d3b230e2d5c6965631a8f156cc7aa71eb686dd2ae74c1d0a5209779f450c9b24a234645243ee58e21d11f1dd57bfc92f787a6a3059f1237281f877e7346885b00a5d69195be3d5e5414be51e54bcf0b85b09fb7892f26058125676fbcb5a058e3e1c1164cfa948169c069d361623ab20ce8b689fcae7bc8220564a42a09f823ce54a4fe6b1c94939d19aba2103ef8f19e93bd0a64a3aeea500ee57170a4baee49b3f3d7b5968e2300c1e9ad1802bf888a69091c1deb21549b2657d57e3055764df26d0b537856f8e4ae7eaf6b7c2174f60003f59686137b3b2e854d57406ff9dd9d5e9a8279547871dde24894b4a8ad0ebc589b633ed7f09c06a3cdb87e0ec4c6e2337d3a4e1dd273fc09169793f22df47879d4733ad823932a18a303f90a298ff01347f8dc9f599fa8fbd469efc7f85520f0c0fe8e8e4f971546aad4b1720bac6209b030fa3d9302e1761fccc5f2587ad172b65ff7d944e91fc6db80b00a23ca68a205d109cff3cccaf4bff0bcdb6b17f0e02de74482b32d080519d1c985ea154c34ab927d9a1bae09968860458e97db6a13901d09f23e8d1988ab3c1230060dd33bc38dbc03581e83c63a7c5062b31280eb115322da48aa20538d0557dbd02599b22130bf8aae39674773e32fe2c179e012f4a0811ea5652374eb7e130adcdd370a68a4e488b3f0d71574b11065edff13f23059baacc6940fb1b26601b810d6507da8d229b306f61838a36dff66594a8be53a55272bc2ef1a8347b7c6d498630ab0005b9975190867689fafc1cc3f4d2f7718a39b71be792f028da06fa8b02843b1239afc4cca03b4a052b74abb2f5207001ccba33ea4af149fc50e954481cc95f55f4ea60f5866111809bc313c836173e3db24e1bcb48e2e292ab2e8f5538af4abd29ca864b9a29a2d7106c5308890db916cd51ed97a611485b6b8d571f63b23054ea38db45b3d9e5474039ec29bd5b944cf5307ef5d4621f322fbf1c20d0478f3aaf54b6cdb69c280eb75691152c3402ad946bc8a3e7324c0f7ba170fa64c61663c720801fd41a97417a79ff25887605e1835a915c49c071b15cf28cb95624e2656bf55661dbb466b0efceb7c544e6f3ab91c2a02481b213c7b285603ea2e09d8694dee99195d28c9de7ad4d12f5592badead2c3944972710811bff0dafa849f5194ef70ece117ad294866ba9354c3098cd0ee1109a7b0be853e683ec193490372163656977623aee93e8a2cb8721aec45391a714fdbd011ae72b577dcb12e2be3411103540570fca6f01cc14fcba0bcab834b6a728cd0ea41ae608423866f345cd38cd5c38b22a9ef5988ceff2a8482856688bdbaa0c0d75b6ddaefb9a40e8d04d1b75284e6b6ab8855413310bd537c50b2cfa45e0761dd5365989410d019c882e94500d605e5c4a9c3d70aa623fe9ff12e083423f550955c0660e0ee3555b4a521091ec9da13cbec536d2ee0a2711a98a752bf4e94108823f5374623a632d835cdbb9d0f63cf71b963a3322ce48c54588f727ff7476", "public_inputs": [ "0x2e021d9bf99c5bd7267488b6a7a5cf5f7d00222a41b6a9b971899c44089e0c5", "0x87f3f", "0x87f3f" ] -} \ No newline at end of file +}