From 7c95bb8dc0d7237010395f75fde22a465fdeeebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Wed, 22 May 2024 13:48:38 +0200 Subject: [PATCH 01/11] Migrate transactions --- ethereum/circuits/lib/src/transaction.nr | 2 + .../circuits/lib/src/transaction_int_test.nr | 30 +++++-- .../lib/src/verifiers/transaction_test.nr | 87 +++++++++++++++++++ 3 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 ethereum_history_api/circuits/lib/src/verifiers/transaction_test.nr diff --git a/ethereum/circuits/lib/src/transaction.nr b/ethereum/circuits/lib/src/transaction.nr index cf80ae7d..70c27f18 100644 --- a/ethereum/circuits/lib/src/transaction.nr +++ b/ethereum/circuits/lib/src/transaction.nr @@ -98,6 +98,8 @@ impl From for TxPartial { type ProofInputSerialized = [Field; LEN]; +type ProofInputSerialized = [Field; LEN]; + struct TransactionWithinBlock { transaction: TxPartial, block_hash: Bytes32 diff --git a/ethereum/circuits/lib/src/transaction_int_test.nr b/ethereum/circuits/lib/src/transaction_int_test.nr index 38144041..fa7d1d4c 100644 --- a/ethereum/circuits/lib/src/transaction_int_test.nr +++ b/ethereum/circuits/lib/src/transaction_int_test.nr @@ -27,7 +27,11 @@ fn get_transaction_success() { let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp)); let _ = OracleMock::mock("get_transaction").returns((tx_type, foreign_call_transaction, proof_input_serialized)); - let transaction_within_block: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, number, tx_idx); + let transaction_within_block: TransactionWithinBlock = get_transaction( + ETHEREUM_MAINNET_ID, + number, + tx_idx + ); assert_eq(transaction_within_block.block_hash, block_header_partial.hash); assert_eq(transaction_within_block.transaction, foreign_call_transaction.into()); @@ -39,7 +43,11 @@ fn get_transaction_wrong_block_number() { let _ = OracleMock::mock("get_transaction").returns((tx_type, foreign_call_transaction, proof_input_serialized)); let wrong_number = number + 1; - let _: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, wrong_number, tx_idx); + let _: TransactionWithinBlock = get_transaction( + ETHEREUM_MAINNET_ID, + wrong_number, + tx_idx + ); } #[test(should_fail_with = "Key does not match rlp-encoded transaction index")] @@ -48,7 +56,11 @@ fn get_transaction_wrong_tx_idx() { let _ = OracleMock::mock("get_transaction").returns((tx_type, foreign_call_transaction, proof_input_serialized)); let wrong_tx_idx = tx_idx + 1; - let _: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, number, wrong_tx_idx); + let _: TransactionWithinBlock = get_transaction( + ETHEREUM_MAINNET_ID, + number, + wrong_tx_idx + ); } #[test(should_fail_with = "Invalid node hash")] @@ -56,7 +68,11 @@ fn get_transaction_wrong_transaction() { let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp)); let _ = OracleMock::mock("get_transaction").returns((another_tx_type, another_foreign_call_transaction, another_proof_input_serialized)); - let _: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, number, another_tx_idx); + let _: TransactionWithinBlock = get_transaction( + ETHEREUM_MAINNET_ID, + number, + another_tx_idx + ); } #[test(should_fail_with = "Invalid node hash")] @@ -64,5 +80,9 @@ fn get_transaction_wrong_header() { let _ = OracleMock::mock("get_header").returns((another_block_header_partial, another_block_header_rlp)); let _ = OracleMock::mock("get_transaction").returns((tx_type, foreign_call_transaction, proof_input_serialized)); - let _: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, another_number, tx_idx); + let _: TransactionWithinBlock = get_transaction( + ETHEREUM_MAINNET_ID, + another_number, + tx_idx + ); } diff --git a/ethereum_history_api/circuits/lib/src/verifiers/transaction_test.nr b/ethereum_history_api/circuits/lib/src/verifiers/transaction_test.nr new file mode 100644 index 00000000..ebaa0c0e --- /dev/null +++ b/ethereum_history_api/circuits/lib/src/verifiers/transaction_test.nr @@ -0,0 +1,87 @@ +mod assert_tx_equals { + use crate::misc::fragment::Fragment; + use crate::verifiers::transaction::assert_tx_equals; + use crate::fixtures::mainnet::{ + cancun::small_block::transaction::{transaction, encoded_tx, tx_type}, + homestead::fork::transaction::{transaction as legacy_transaction, encoded_tx as legacy_encoded_tx, tx_type as legacy_tx_type} + }; + + #[test] + fn success() { + assert_tx_equals(tx_type, Fragment::from_array(encoded_tx), transaction); + } + + #[test] + fn legacy_tx() { + assert_tx_equals( + legacy_tx_type, + Fragment::from_array(legacy_encoded_tx), + legacy_transaction + ); + } + + #[test(should_fail_with="Invalid tx type")] + fn wrong_tx_type() { + let wrong_tx_type = tx_type + 1; + assert_tx_equals(wrong_tx_type, Fragment::from_array(encoded_tx), transaction); + } +} + +mod verify_tx { + use crate::verifiers::transaction::verify_tx; + use crate::misc::arrays::alter_array; + use crate::fixtures::mainnet::{ + cancun::small_block::{ + transaction::{transaction, encoded_tx, tx_type, tx_idx}, transaction_proof_new::proof_input, + header::transactions_root + }, + homestead::fork::{ + transaction::{ + transaction as legacy_transaction, encoded_tx as legacy_encoded_tx, tx_type as legacy_tx_type, + tx_idx as legacy_tx_idx + }, + transaction_proof_new::proof_input as legacy_proof_input, header::transactions_root as legacy_transactions_root + } + }; + + #[test] + fn success() { + verify_tx(tx_idx, tx_type, transaction, proof_input, transactions_root); + } + + #[test] + fn legacy_tx() { + verify_tx( + legacy_tx_idx, + legacy_tx_type, + legacy_transaction, + legacy_proof_input, + legacy_transactions_root + ); + } + + #[test(should_fail_with="Invalid tx type")] + fn wrong_tx_type() { + let wrong_tx_type = 1; + verify_tx(tx_idx, wrong_tx_type, transaction, proof_input, transactions_root); + } + + #[test(should_fail_with="Key does not match rlp-encoded transaction index")] + fn wrong_tx_idx() { + let mut wrong_tx_idx = tx_idx + 1; + verify_tx(wrong_tx_idx, tx_type, transaction, proof_input, transactions_root); + } + + #[test(should_fail_with="Nonce: Invalid RLP value")] + fn wrong_tx() { + let mut wrong_tx = transaction; + wrong_tx.nonce += 1; + verify_tx(tx_idx, tx_type, wrong_tx, proof_input, transactions_root); + } + + #[test(should_fail_with="Internal node hash does not match the hash extracted from the preceding node")] + fn wrong_tx_root() { + let mut wrong_tx_root = alter_array(transactions_root); + verify_tx(tx_idx, tx_type, transaction, proof_input, wrong_tx_root); + } +} From 57293f73ade9bcdcdb1566e5df417cbaa8654c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Wed, 22 May 2024 14:35:05 +0200 Subject: [PATCH 02/11] Update transaction Oracle --- .../circuits/get_transaction/src/main.nr | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 ethereum_history_api/circuits/get_transaction/src/main.nr diff --git a/ethereum_history_api/circuits/get_transaction/src/main.nr b/ethereum_history_api/circuits/get_transaction/src/main.nr new file mode 100644 index 00000000..9f04367e --- /dev/null +++ b/ethereum_history_api/circuits/get_transaction/src/main.nr @@ -0,0 +1,18 @@ +use dep::ethereum_history_api::transaction::{ + get_transaction, TransactionWithinBlock +}; + +global MAX_DATA_LEN_M = 1000; + +fn main( + chain_id: pub Field, + block_number: pub u64, + tx_idx: pub Field +) -> pub TransactionWithinBlock { + let transaction_within_block: TransactionWithinBlock = get_transaction( + chain_id, + block_number, + tx_idx + ); + transaction_within_block +} From 6bdc56b6fdbea6a468abbe2f456956d96b54fb3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Mon, 27 May 2024 11:24:10 +0200 Subject: [PATCH 03/11] Update oracles --- .../src/noir/oracles/rpc/accountOracle.ts | 8 +-- .../noir/oracles/rpc/accountOracle/encode.ts | 62 ++++++++++++++----- .../src/noir/oracles/rpc/proofOracle.ts | 2 +- 3 files changed, 51 insertions(+), 21 deletions(-) diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.ts index 9bb434dd..98f10ac9 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.ts @@ -18,10 +18,7 @@ export enum OFFSETS { BALANCE, STORAGE_ROOT, CODE_HASH, - PROOF_KEY, - PROOF_VALUE, - PROOF, - PROOF_DEPTH + PROOF_INPUT } export async function getAccountOracle( @@ -37,7 +34,8 @@ export async function getAccountOracle( }); const encodedAccount = encodeAccount(accountProof); const encodedProof = encodeStateProof(accountProof); - return [...encodedAccount, ...encodedProof]; + console.log(encodedProof.length); + return [...encodedAccount, encodedProof]; } export function decodeGetAccountArguments(args: NoirArguments): { diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts index 1dda00d4..0569cfa2 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts @@ -1,11 +1,12 @@ import { ForeignCallOutput } from '@noir-lang/noir_js'; -import { GetProofReturnType, Hex, fromRlp, isHex } from 'viem'; -import { encodeBytes32, encodeField, encodeHex, encodeProof } from '../../common/encode.js'; -import { padArray } from '../../../../util/array.js'; -import { ZERO_PAD_VALUE } from '../../common/const.js'; -import { assert } from '../../../../util/assert.js'; -import { accountProofConfig, LEGACY_MAX_ACCOUNT_STATE_LEN } from '../common/proofConfig/account.js'; +import { GetProofReturnType, Hex, fromRlp, isHex, keccak256, toRlp } from 'viem'; +import { encodeField, encodeHex, encodeProof } from '../common/encode.js'; +import { padArray } from '../../../util/array.js'; +import { MAX_TRIE_NODE_LEN, ZERO_PAD_VALUE } from '../common/const.js'; +import { assert } from '../../../util/assert.js'; +import { accountProofConfig } from '../common/proofConfig/account.js'; import { storageProofConfig } from '../common/proofConfig/storage.js'; +import { toHexString } from '../../../ethereum/blockHeader.js'; const RLP_VALUE_INDEX = 1; @@ -19,12 +20,25 @@ export function encodeAccount(ethProof: GetProofReturnType): ForeignCallOutput[] } export function encodeStateProof(ethProof: GetProofReturnType): ForeignCallOutput[] { - const key = encodeHex(ethProof.address); - const value = encodeValue(ethProof.accountProof); - const proof = encodeProof(ethProof.accountProof, accountProofConfig.maxProofLen); + const key = padArray( + encodeHex(keccak256(ethProof.address)), + accountProofConfig.maxPrefixedKeyNibbleLen, + ZERO_PAD_VALUE, + 'left' + ); + const value = padArray(encodeValue(ethProof.accountProof), accountProofConfig.maxValueLen, ZERO_PAD_VALUE, 'left'); + const nodes = encodeProof( + ethProof.accountProof.slice(0, ethProof.accountProof.length - 1), + (accountProofConfig.maxProofDepth - 1) * MAX_TRIE_NODE_LEN + ); + const leaf = padArray( + encodeHex(ethProof.accountProof[ethProof.accountProof.length - 1]), + accountProofConfig.maxLeafLen, + ZERO_PAD_VALUE + ); const depth = encodeField(ethProof.accountProof.length); - return [key, value, proof, depth]; + return [...key, ...value, ...nodes, ...leaf, depth]; } export function getValue(proof: Hex[]): Hex { @@ -35,16 +49,34 @@ export function getValue(proof: Hex[]): Hex { } export function encodeValue(proof: Hex[]): string[] { - return padArray(encodeHex(getValue(proof)), LEGACY_MAX_ACCOUNT_STATE_LEN, ZERO_PAD_VALUE, 'left'); + return padArray(encodeHex(getValue(proof)), accountProofConfig.maxValueLen, ZERO_PAD_VALUE, 'left'); } type StorageProof = GetProofReturnType['storageProof'][number]; export function encodeStorageProof(storageKey: Hex, storageProof: StorageProof): ForeignCallOutput[] { - const key = encodeHex(storageKey); - const value = encodeBytes32(storageProof.value); - const proof = encodeProof(storageProof.proof, storageProofConfig.maxProofLen); + const key = padArray( + encodeHex(keccak256(storageKey)), + storageProofConfig.maxPrefixedKeyNibbleLen, + ZERO_PAD_VALUE, + 'left' + ); + const value = padArray( + encodeHex(toRlp(toHexString(storageProof.value))), + storageProofConfig.maxValueLen, + ZERO_PAD_VALUE, + 'left' + ); + const nodes = encodeProof( + storageProof.proof.slice(0, storageProof.proof.length - 1), + (storageProofConfig.maxProofDepth - 1) * MAX_TRIE_NODE_LEN + ); + const leaf = padArray( + encodeHex(storageProof.proof[storageProof.proof.length - 1]), + storageProofConfig.maxLeafLen, + ZERO_PAD_VALUE + ); const depth = encodeField(storageProof.proof.length); - return [key, value, proof, depth]; + return [...key, ...value, ...nodes, ...leaf, depth]; } diff --git a/ethereum/oracles/src/noir/oracles/rpc/proofOracle.ts b/ethereum/oracles/src/noir/oracles/rpc/proofOracle.ts index c2d30f21..363b4fe1 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/proofOracle.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/proofOracle.ts @@ -28,7 +28,7 @@ export const getProofOracle = async ( const encodedAccount = encodeAccount(accountProof); const encodedStateProof = encodeStateProof(accountProof); const encodedStorageProof = encodeStorageProof(storageKey, accountProof.storageProof[0]); - return [...encodedAccount, ...encodedStateProof, ...encodedStorageProof]; + return [...encodedAccount, encodedStateProof, encodedStorageProof]; }; export function decodeGetProofArguments(args: NoirArguments): { From 9203200978ca82391f9c392f9e23ffff00e60a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Mon, 27 May 2024 11:26:38 +0200 Subject: [PATCH 04/11] Migrate state & storage to merkle_patricia_proofs, update fixtures --- ethereum/circuits/lib/src/account.nr | 46 +++-- ethereum/circuits/lib/src/account_int_test.nr | 20 +-- .../circuits/lib/src/account_with_storage.nr | 89 +++++++--- .../lib/src/account_with_storage_int_test.nr | 19 +- .../mainnet/frontier/first/account.nr | 2 +- .../mainnet/frontier/first/state_proof.nr | 6 +- .../mainnet/frontier/first/state_proof_new.nr | 2 + .../fixtures/mainnet/frontier/zero/account.nr | 2 +- .../mainnet/frontier/zero/state_proof.nr | 6 +- .../mainnet/frontier/zero/state_proof_new.nr | 2 + .../mainnet/london/crypto_punks/account.nr | 2 +- .../london/crypto_punks/state_proof.nr | 6 +- .../london/crypto_punks/state_proof_new.nr | 2 + .../london/crypto_punks/storage_proof.nr | 4 +- .../london/crypto_punks/storage_proof_new.nr | 3 + .../mainnet/london/vitalik_balance/account.nr | 2 +- .../london/vitalik_balance/state_proof.nr | 6 +- .../london/vitalik_balance/state_proof_new.nr | 2 + .../paris/bored_ape_yacht_club/account.nr | 2 +- .../paris/bored_ape_yacht_club/state_proof.nr | 6 +- .../bored_ape_yacht_club/state_proof_new.nr | 2 + .../bored_ape_yacht_club/storage_proof.nr | 4 +- .../bored_ape_yacht_club/storage_proof_new.nr | 3 + .../fixtures/mainnet/paris/nouns/account.nr | 2 +- .../mainnet/paris/nouns/state_proof.nr | 6 +- .../mainnet/paris/nouns/state_proof_new.nr | 2 + .../mainnet/paris/nouns/storage_proof.nr | 4 +- .../mainnet/paris/nouns/storage_proof_new.nr | 3 + .../mainnet/paris/usdc_circle/account.nr | 2 +- .../mainnet/paris/usdc_circle/state_proof.nr | 6 +- .../paris/usdc_circle/state_proof_new.nr | 2 + .../paris/usdc_circle/storage_proof.nr | 4 +- .../paris/usdc_circle/storage_proof_new.nr | 3 + .../mainnet/paris/usdc_uniswap/account.nr | 2 +- .../mainnet/paris/usdc_uniswap/state_proof.nr | 6 +- .../paris/usdc_uniswap/state_proof_new.nr | 2 + .../paris/usdc_uniswap/storage_proof.nr | 4 +- .../paris/usdc_uniswap/storage_proof_new.nr | 3 + ethereum/circuits/lib/src/misc/bytes.nr | 2 +- ethereum/circuits/lib/src/receipt.nr | 3 +- ethereum/circuits/lib/src/serde.nr | 162 +++++++++++++++++- ethereum/circuits/lib/src/serde_test.nr | 22 ++- ethereum/circuits/lib/src/transaction.nr | 4 +- .../circuits/lib/src/verifiers/account.nr | 45 +++-- .../lib/src/verifiers/account_test.nr | 24 +-- .../circuits/lib/src/verifiers/storage.nr | 27 +-- .../lib/src/verifiers/storage_test.nr | 53 +----- .../src/script/noir_fixtures/new_proof.ts | 2 + .../script/noir_fixtures/new_receipt_proof.ts | 4 +- .../script/noir_fixtures/new_storage_proof.ts | 3 + .../noir_fixtures/new_transaction_proof.ts | 4 +- .../src/script/noir_fixtures/state_proof.ts | 4 +- .../src/script/noir_fixtures/storage_proof.ts | 4 +- .../circuits/lib/src/token_int_test.nr | 6 +- .../circuits/is_ape_owner/src/main_test.nr | 6 +- .../is_crypto_punk_owner/src/main_test.nr | 6 +- .../circuits/is_dao_worthy/src/main_test.nr | 6 +- 57 files changed, 439 insertions(+), 237 deletions(-) diff --git a/ethereum/circuits/lib/src/account.nr b/ethereum/circuits/lib/src/account.nr index 07e4fe4d..d22af125 100644 --- a/ethereum/circuits/lib/src/account.nr +++ b/ethereum/circuits/lib/src/account.nr @@ -1,7 +1,19 @@ -use crate::account_with_storage::{Account, StateProof}; +use crate::account_with_storage::Account; use crate::header::get_header; use crate::misc::types::{Address, Bytes32, BYTES32_LENGTH}; use crate::verifiers::account::verify_account; +use crate::serde::Serde; +use crate::merkle_patricia_proofs::proof::ProofInput; + +global MAX_KEY_LEN = 32; +global MAX_PREFIXED_KEY_NIBBLE_LEN = 66; // (MAX_KEY_LEN + 1) * 2 +global MAX_ACCOUNT_DEPTH_NO_LEAF_M = 10; // Emperically correct values to be determined after we scan ethereum state trie. + +global MAX_ACCOUNT_STATE_LEN = 110; // Values taken from accountProofConfig in account.ts. +global MAX_ACCOUNT_LEAF_LEN = 148; + +global LEGACY_MAX_ACCOUNT_STATE_LEN = 134; // Legacy, incorrect (too big) limit. +global LEGACY_STATE_PROOF_LEN = 5852; // = 11 (MAX_STATE_PROOF_LEVELS) * 532 (MAX_TRIE_NODE_LEN) struct AccountWithinBlock { account: Account, @@ -14,22 +26,34 @@ impl Eq for AccountWithinBlock { } } -type AccountWithStateProof = (Account, StateProof); +struct LegacyStateProof { + key: Address, + value: [u8; MAX_ACCOUNT_STATE_LEN], + proof: [u8; LEGACY_STATE_PROOF_LEN], + depth: u64, +} + +type AccountWithStateProofM = (Account, ProofInput); + +type ProofInputSerialized = [Field; LEN]; pub fn get_account(chain_id: Field, block_no: u64, address: Address) -> AccountWithinBlock { - let (account, state_proof) = get_account_unconstrained(chain_id, block_no, address); + let (account, state_proof) = get_account_unconstrained_M(chain_id, block_no, address); let header = get_header(chain_id, block_no); verify_account(address, account, state_proof, header.state_root); AccountWithinBlock { account, block_hash: header.hash } } #[oracle(get_account)] -unconstrained fn get_account_oracle(_chain_id: Field, _block_no: u64, _address: [u8; 20]) -> AccountWithStateProof {} - -unconstrained fn get_account_unconstrained( - chain_id: Field, - block_no: u64, - address: Address -) -> AccountWithStateProof { - get_account_oracle(chain_id, block_no, address) +unconstrained fn get_account_oracle( + _chain_id: Field, + _block_no: u64, + _address: [u8; 20] +) -> (Account, ProofInputSerialized) {} + +unconstrained fn get_account_unconstrained_M(chain_id: Field, block_no: u64, address: Address) -> AccountWithStateProofM { + let (account, proof_input) = get_account_oracle(chain_id, block_no, address); + let proof_input: ProofInput = Serde::deserialize(proof_input); + + (account, proof_input) } diff --git a/ethereum/circuits/lib/src/account_int_test.nr b/ethereum/circuits/lib/src/account_int_test.nr index 9e2b628a..8714f64b 100644 --- a/ethereum/circuits/lib/src/account_int_test.nr +++ b/ethereum/circuits/lib/src/account_int_test.nr @@ -3,14 +3,14 @@ use crate::chain::ETHEREUM_MAINNET_ID; use crate::fixtures::mainnet::{ paris::{ usdc_circle::{ - header::{number, state_root, block_header_partial, block_header_rlp}, account::account, - state_proof::state_proof + header::{number, state_root, block_header_partial, block_header_rlp}, account::{account, address}, + state_proof_new::proof_input_serialized as state_proof_input_serialized } }, london::vitalik_balance::{ - account::account as account_from_different_header, + account::{account as account_from_different_header, address as address_from_different_header}, header::state_root as state_root_from_different_header, - state_proof::state_proof as state_proof_from_different_header + state_proof_new::proof_input_serialized as state_proof_input_from_different_header_serialized } }; use dep::std::test::OracleMock; @@ -18,9 +18,9 @@ use dep::std::test::OracleMock; #[test] fn test_get_account_success() { let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp)); - let _ = OracleMock::mock("get_account").returns((account, state_proof)); + let _ = OracleMock::mock("get_account").returns((account, state_proof_input_serialized)); - let account_within_block = get_account(ETHEREUM_MAINNET_ID, number, state_proof.key); + let account_within_block = get_account(ETHEREUM_MAINNET_ID, number, address); assert_eq(account.nonce, account_within_block.account.nonce); assert_eq(account.balance, account_within_block.account.balance); @@ -33,11 +33,7 @@ fn test_get_account_success() { #[test(should_fail)] fn test_get_account_wrong_state_root() { let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp)); - let _ = OracleMock::mock("get_account").returns((account_from_different_header, state_proof_from_different_header)); + let _ = OracleMock::mock("get_account").returns((account_from_different_header, state_proof_input_from_different_header_serialized)); - let _ = get_account( - ETHEREUM_MAINNET_ID, - number, - state_proof_from_different_header.key - ); + let _ = get_account(ETHEREUM_MAINNET_ID, number, address_from_different_header); } diff --git a/ethereum/circuits/lib/src/account_with_storage.nr b/ethereum/circuits/lib/src/account_with_storage.nr index c5bb2b21..309b2249 100644 --- a/ethereum/circuits/lib/src/account_with_storage.nr +++ b/ethereum/circuits/lib/src/account_with_storage.nr @@ -1,12 +1,22 @@ -use dep::proof::const::MAX_ACCOUNT_STATE_LENGTH; - use crate::header::{get_header, BlockHeaderPartial}; -use crate::misc::types::{Address, Bytes32}; +use crate::account::{MAX_ACCOUNT_STATE_LEN, MAX_ACCOUNT_DEPTH_NO_LEAF_M, MAX_ACCOUNT_LEAF_LEN}; +use crate::misc::{types::{Address, Bytes32, BYTES32_LENGTH, HASH_LEN}, bytes::right_pad, fragment::Fragment}; +use crate::serde::Serde; use crate::verifiers::account::verify_account; use crate::verifiers::storage::verify_storage_values; +use crate::merkle_patricia_proofs::proof::ProofInput; +use crate::rlp::decode::decode_string; + +use dep::std::hash::keccak256; + +global MAX_KEY_LEN = 32; +global MAX_PREFIXED_KEY_NIBBLE_LEN = 66; // (MAX_KEY_LEN + 1) * 2 +global MAX_STORAGE_DEPTH_NO_LEAF_M = 6; // Emperically correct values to be determined after we scan ethereum state trie. + +global MAX_STORAGE_VALUE_LEN = 32; // Values taken from storageProofConfig in storage.ts. +global MAX_STORAGE_LEAF_LEN = 69; -global STATE_PROOF_LEN = 5852; // = 11 (MAX_STATE_PROOF_LEVELS) * 532 (MAX_TRIE_NODE_LEN) -global STORAGE_PROOF_LEN = 3724; // = 7 (MAX_STORAGE_PROOF_LEVELS) * 532 (MAX_TRIE_NODE_LEN) +global LEGACY_STORAGE_PROOF_LEN = 3724; // = 7 (MAX_STORAGE_PROOF_LEVELS) * 532 (MAX_TRIE_NODE_LEN) struct Account { nonce: u64, @@ -21,26 +31,19 @@ impl Eq for Account { } } -struct StateProof { - key: Address, - value: [u8; MAX_ACCOUNT_STATE_LENGTH], - proof: [u8; STATE_PROOF_LEN], - depth: u64, -} - -struct StorageProof { +struct LegacyStorageProof { key: Bytes32, value: Bytes32, - proof: [u8; STORAGE_PROOF_LEN], + proof: [u8; LEGACY_STORAGE_PROOF_LEN], depth: u64 } // For now oracle does not support returning array of arrays so at the moment we support only one storage proof. // When https://github.com/noir-lang/noir/issues/4498 is resolved we can change to `StateAndStorageProof` and `storage_proof: [StorageProof; N]`. -struct StateAndStorageProof { +struct StateAndStorageProofInput { account: Account, - state_proof: StateProof, - storage_proof: StorageProof + state_proof_input: ProofInput, + storage_proof_input: ProofInput } struct StorageWithinBlock { @@ -49,12 +52,42 @@ struct StorageWithinBlock { values: [Bytes32; N], } +type ProofInputSerialized = [Field; LEN]; + impl Eq for StorageWithinBlock<1> { fn eq(self, other: Self) -> bool { (self.block_hash == other.block_hash) & (self.account == other.account) & (self.values[0] == other.values[0]) } } +fn assert_storage_key_equals( + storage_key: Bytes32, + storage_key_hash: [u8; MAX_PREFIXED_KEY_NIBBLE_LEN] +) { + let storage_key_hash_fragment = Fragment::new( + MAX_PREFIXED_KEY_NIBBLE_LEN - HASH_LEN, + HASH_LEN, + storage_key_hash + ); + let other_storage_key_hash_fragment = Fragment::from_array(keccak256(storage_key, BYTES32_LENGTH as u32)); + assert( + storage_key_hash_fragment.eq(other_storage_key_hash_fragment), "Storage key does not match the argument" + ); +} + +fn get_storage_value(rlp_encoded_value: [u8; MAX_STORAGE_VALUE_LEN]) -> [u8; MAX_STORAGE_VALUE_LEN] { + let mut storage_value = rlp_encoded_value; + let rlp_value_len = right_pad(rlp_encoded_value).len(); + let left_pad_len = MAX_STORAGE_VALUE_LEN - rlp_value_len; + let rlp_fragment = decode_string(Fragment::new(left_pad_len, rlp_value_len, rlp_encoded_value)); + if rlp_fragment.offset > 0 { + assert_eq(rlp_fragment.offset, 1, "Expected RLP header to be maximum 1 byte long"); + storage_value[left_pad_len] = 0; + } + + storage_value +} + pub fn get_account_with_storage( chain_id: Field, block_number: u64, @@ -62,29 +95,33 @@ pub fn get_account_with_storage( storage_key: Bytes32 ) -> StorageWithinBlock<1> { let BlockHeaderPartial { number: _, hash, state_root, transactions_root: _, receipts_root: _ } = get_header(chain_id, block_number); - let StateAndStorageProof { account, state_proof, storage_proof } = get_proof_unconstrained(chain_id, block_number, address, storage_key); + let StateAndStorageProofInput { account, state_proof_input, storage_proof_input } = get_proof_unconstrained(chain_id, block_number, address, storage_key); - verify_account(address, account, state_proof, state_root); - verify_storage_values(account.storage_root, [storage_proof]); + verify_account(address, account, state_proof_input, state_root); + verify_storage_values([storage_proof_input], account.storage_root); - assert(storage_key == storage_proof.key, "Storage key does not match the argument"); + assert_storage_key_equals(storage_key, storage_proof_input.key); - StorageWithinBlock { block_hash: hash, account, values: [storage_proof.value] } + StorageWithinBlock { block_hash: hash, account, values: [get_storage_value(storage_proof_input.value)] } } #[oracle(get_proof)] -unconstrained fn get_proof_oracle( +unconstrained fn get_proof_oracle( _chain_id: Field, _block_no: u64, _address: Address, _storage_key: Bytes32 -) -> StateAndStorageProof {} +) -> (Account, ProofInputSerialized, ProofInputSerialized) {} unconstrained fn get_proof_unconstrained( chain_id: Field, block_no: u64, address: Address, storage_key: Bytes32 -) -> StateAndStorageProof { - get_proof_oracle(chain_id, block_no, address, storage_key) +) -> StateAndStorageProofInput { + let (account, state_proof_input, storage_proof_input) = get_proof_oracle(chain_id, block_no, address, storage_key); + let state_proof_input: ProofInput = Serde::deserialize(state_proof_input); + let storage_proof_input: ProofInput = Serde::deserialize(storage_proof_input); + + StateAndStorageProofInput { account, state_proof_input, storage_proof_input } } diff --git a/ethereum/circuits/lib/src/account_with_storage_int_test.nr b/ethereum/circuits/lib/src/account_with_storage_int_test.nr index 61205848..c98b742f 100644 --- a/ethereum/circuits/lib/src/account_with_storage_int_test.nr +++ b/ethereum/circuits/lib/src/account_with_storage_int_test.nr @@ -1,11 +1,12 @@ use crate::misc::types::Bytes32; use crate::chain::ETHEREUM_MAINNET_ID; -use crate::account_with_storage::{StorageProof, get_account_with_storage}; +use crate::account_with_storage::{LegacyStorageProof, get_account_with_storage}; use crate::fixtures::mainnet::{ paris::{ usdc_circle::{ header::{number, block_header_partial, block_header_rlp}, account::{account, address}, - state_proof::state_proof, storage_proof::proofs, storage::{values, keys as storage_keys} + state_proof_new::proof_input_serialized as state_proof_input_serialized, + storage_proof_new::proofs_serialized, storage::{values, keys as storage_keys} }, usdc_uniswap::{storage::keys as usdc_uniswap_storage_keys} }, @@ -16,7 +17,7 @@ use crate::fixtures::mainnet::{ block_header_rlp as crypto_punks_block_header_rlp, number as crypto_punks_number }, account::{address as crypto_punks_address, account as crypto_punks_account}, - state_proof::state_proof as crypto_punks_state_proof + state_proof_new::proof_input_serialized as crypto_punks_state_proof_input_serialized } } }; @@ -25,7 +26,7 @@ use dep::std::test::OracleMock; #[test] fn test_get_account_with_storage_success() { let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let account_with_storage = get_account_with_storage(ETHEREUM_MAINNET_ID, number, address, storage_keys[0]); @@ -39,10 +40,10 @@ fn test_get_account_with_storage_success() { assert_eq(values[0], account_with_storage.values[0]); } -#[test(should_fail_with = "Internal node hash does not match the hash extracted from the preceding node")] +#[test(should_fail_with = "Invalid node hash")] fn test_get_account_with_storage_invalid_state_root() { let _ = OracleMock::mock("get_header").returns((crypto_punks_block_header_partial, crypto_punks_block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let _ = get_account_with_storage( ETHEREUM_MAINNET_ID, @@ -52,10 +53,10 @@ fn test_get_account_with_storage_invalid_state_root() { ); } -#[test(should_fail_with = "Internal node hash does not match the hash extracted from the preceding node")] +#[test(should_fail_with = "Invalid node hash")] fn test_get_account_with_storage_invalid_storage_root() { let _ = OracleMock::mock("get_header").returns((crypto_punks_block_header_partial, crypto_punks_block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((crypto_punks_account, crypto_punks_state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((crypto_punks_account, crypto_punks_state_proof_input_serialized, proofs_serialized[0])); let _ = get_account_with_storage( ETHEREUM_MAINNET_ID, @@ -68,7 +69,7 @@ fn test_get_account_with_storage_invalid_storage_root() { #[test(should_fail_with = "Storage key does not match the argument")] fn test_get_account_with_storage_storage_key_does_not_match_the_argument() { let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let _ = get_account_with_storage( ETHEREUM_MAINNET_ID, diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/account.nr b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/account.nr index 19fd1fb6..d4cc6fda 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/account.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/account.nr @@ -5,7 +5,7 @@ global address = [ ]; global rlp_encoded_left_padded_account = [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4e, 0x80, 0x8a, 0x15, 0x2d, 0x02, 0xc7, 0xe1, 0x4a, 0xf6, 0x80, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4e, 0x80, 0x8a, 0x15, 0x2d, 0x02, 0xc7, 0xe1, 0x4a, 0xf6, 0x80, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 ]; global nonce = 0; diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/state_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/state_proof.nr index 26383c5c..eb48175e 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/state_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/state_proof.nr @@ -1,11 +1,11 @@ -use crate::account::StateProof; +use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: [ 0x40, 0xd4, 0x5d, 0x9d, 0x76, 0x25, 0xd1, 0x51, 0x56, 0xc9, 0x32, 0xb7, 0x71, 0xca, 0x7b, 0x05, 0x27, 0x13, 0x09, 0x58 ], value: [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4e, 0x80, 0x8a, 0x15, 0x2d, 0x02, 0xc7, 0xe1, 0x4a, 0xf6, 0x80, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4e, 0x80, 0x8a, 0x15, 0x2d, 0x02, 0xc7, 0xe1, 0x4a, 0xf6, 0x80, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 ], proof: [ 0xf9, 0x02, 0x11, 0xa0, 0x90, 0xdc, 0xaf, 0x88, 0xc4, 0x0c, 0x7b, 0xbc, 0x95, 0xa9, 0x12, 0xcb, 0xdd, 0xe6, 0x7c, 0x17, 0x57, 0x67, 0xb3, 0x11, 0x73, 0xdf, 0x9e, 0xe4, 0xb0, 0xd7, 0x33, 0xbf, 0xdd, 0x51, 0x1c, 0x43, 0xa0, 0xba, 0xbe, 0x36, 0x9f, 0x6b, 0x12, 0x09, 0x2f, 0x49, 0x18, 0x1a, 0xe0, 0x4c, 0xa1, 0x73, 0xfb, 0x68, 0xd1, 0xa5, 0x45, 0x6f, 0x18, 0xd2, 0x0f, 0xa3, 0x2c, 0xba, 0x73, 0x95, 0x40, 0x52, 0xbd, 0xa0, 0x47, 0x3e, 0xcf, 0x8a, 0x7e, 0x36, 0xa8, 0x29, 0xe7, 0x50, 0x39, 0xa3, 0xb0, 0x55, 0xe5, 0x1b, 0x83, 0x32, 0xcb, 0xf0, 0x33, 0x24, 0xab, 0x4a, 0xf2, 0x06, 0x6b, 0xbd, 0x6f, 0xbf, 0x00, 0x21, 0xa0, 0xbb, 0xda, 0x34, 0x75, 0x3d, 0x7a, 0xa6, 0xc3, 0x8e, 0x60, 0x3f, 0x36, 0x02, 0x44, 0xe8, 0xf5, 0x96, 0x11, 0x92, 0x1d, 0x9e, 0x1f, 0x12, 0x83, 0x72, 0xfe, 0xc0, 0xd5, 0x86, 0xd4, 0xf9, 0xe0, 0xa0, 0xd9, 0xcf, 0xf5, 0xd5, 0xf2, 0x41, 0x8a, 0xfd, 0x16, 0xa4, 0xda, 0x5c, 0x22, 0x1f, 0xdc, 0x8b, 0xd4, 0x75, 0x20, 0xc5, 0x92, 0x79, 0x22, 0xf6, 0x9a, 0x68, 0x17, 0x7b, 0x64, 0xda, 0x6a, 0xc0, 0xa0, 0xa5, 0xf3, 0xf2, 0xf7, 0x54, 0x21, 0x48, 0xc9, 0x73, 0x97, 0x7c, 0x8a, 0x1e, 0x15, 0x4c, 0x43, 0x00, 0xfe, 0xc9, 0x2f, 0x75, 0x5f, 0x78, 0x46, 0xf1, 0xb7, 0x34, 0xd3, 0xab, 0x1d, 0x90, 0xe7, 0xa0, 0xe8, 0x23, 0x85, 0x0f, 0x50, 0xbf, 0x72, 0xba, 0xae, 0x9d, 0x17, 0x33, 0xa3, 0x6a, 0x44, 0x4a, 0xb6, 0x5d, 0x0a, 0x6f, 0xaa, 0xba, 0x40, 0x4f, 0x05, 0x83, 0xce, 0x0c, 0xa4, 0xda, 0xd9, 0x2d, 0xa0, 0xf7, 0xa0, 0x0c, 0xbe, 0x7d, 0x4b, 0x30, 0xb1, 0x1f, 0xae, 0xa3, 0xae, 0x61, 0xb7, 0xf1, 0xf2, 0xb3, 0x15, 0xb6, 0x1d, 0x9f, 0x6b, 0xd6, 0x8b, 0xfe, 0x58, 0x7a, 0xd0, 0xee, 0xce, 0xb7, 0x21, 0xa0, 0x71, 0x17, 0xef, 0x9f, 0xc9, 0x32, 0xf1, 0xa8, 0x8e, 0x90, 0x8e, 0xae, 0xad, 0x85, 0x65, 0xc1, 0x9b, 0x56, 0x45, 0xdc, 0x9e, 0x5b, 0x1b, 0x6e, 0x84, 0x1c, 0x5e, 0xdb, 0xdf, 0xd7, 0x16, 0x81, 0xa0, 0x69, 0xeb, 0x2d, 0xe2, 0x83, 0xf3, 0x2c, 0x11, 0xf8, 0x59, 0xd7, 0xbc, 0xf9, 0x3d, 0xa2, 0x39, 0x90, 0xd3, 0xe6, 0x62, 0x93, 0x5e, 0xd4, 0xd6, 0xb3, 0x9c, 0xe3, 0x67, 0x3e, 0xc8, 0x44, 0x72, 0xa0, 0x20, 0x3d, 0x26, 0x45, 0x63, 0x12, 0xbb, 0xc4, 0xda, 0x5c, 0xd2, 0x93, 0xb7, 0x5b, 0x84, 0x0f, 0xc5, 0x04, 0x5e, 0x49, 0x3d, 0x6f, 0x90, 0x4d, 0x18, 0x08, 0x23, 0xec, 0x22, 0xbf, 0xed, 0x8e, 0xa0, 0x92, 0x87, 0xb5, 0xc2, 0x1f, 0x22, 0x54, 0xaf, 0x4e, 0x64, 0xfc, 0xa7, 0x6a, 0xcc, 0x5c, 0xd8, 0x73, 0x99, 0xc7, 0xf1, 0xed, 0xe8, 0x18, 0xdb, 0x43, 0x26, 0xc9, 0x8c, 0xe2, 0xdc, 0x22, 0x08, 0xa0, 0x6f, 0xc2, 0xd7, 0x54, 0xe3, 0x04, 0xc4, 0x8c, 0xe6, 0xa5, 0x17, 0x75, 0x3c, 0x62, 0xb1, 0xa9, 0xc1, 0xd5, 0x92, 0x5b, 0x89, 0x70, 0x74, 0x86, 0xd7, 0xfc, 0x08, 0x91, 0x9e, 0x0a, 0x94, 0xec, 0xa0, 0x7b, 0x1c, 0x54, 0xf1, 0x5e, 0x29, 0x9b, 0xd5, 0x8b, 0xdf, 0xef, 0x97, 0x41, 0x53, 0x8c, 0x78, 0x28, 0xb5, 0xd7, 0xd1, 0x1a, 0x48, 0x9f, 0x9c, 0x20, 0xd0, 0x52, 0xb3, 0x47, 0x1d, 0xf4, 0x75, 0xa0, 0x51, 0xf9, 0xdd, 0x37, 0x39, 0xa9, 0x27, 0xc8, 0x9e, 0x35, 0x75, 0x80, 0xa4, 0xc9, 0x7b, 0x40, 0x23, 0x4a, 0xa0, 0x1e, 0xd3, 0xd5, 0xe0, 0x39, 0x0d, 0xc9, 0x82, 0xa7, 0x97, 0x58, 0x80, 0xa0, 0xa0, 0x89, 0xd6, 0x13, 0xf2, 0x61, 0x59, 0xaf, 0x43, 0x61, 0x6f, 0xd9, 0x45, 0x5b, 0xb4, 0x61, 0xf4, 0x86, 0x9b, 0xfe, 0xde, 0x26, 0xf2, 0x13, 0x08, 0x35, 0xed, 0x06, 0x7a, 0x8b, 0x96, 0x7b, 0xfb, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x72, 0x55, 0xa4, 0x31, 0x92, 0x72, 0x66, 0xa9, 0x0d, 0x40, 0xeb, 0x7a, 0x69, 0x2b, 0xba, 0x6c, 0x63, 0x66, 0xc9, 0xce, 0x11, 0x11, 0x3a, 0xb8, 0x56, 0xfc, 0x22, 0x03, 0xf3, 0xbd, 0xa0, 0xda, 0xa0, 0xc9, 0x54, 0xa3, 0x44, 0xa1, 0x29, 0x5f, 0x78, 0xab, 0x08, 0xd8, 0xcc, 0xd5, 0x6a, 0xd1, 0xbe, 0xcc, 0x3c, 0x64, 0xc1, 0x1b, 0x18, 0x79, 0x85, 0x26, 0x51, 0x84, 0x09, 0xaf, 0xf5, 0xa2, 0xd2, 0xa0, 0x32, 0xbc, 0x34, 0x11, 0xb8, 0x82, 0x37, 0x14, 0x02, 0xb1, 0x19, 0x5e, 0xe2, 0x97, 0xe8, 0xf5, 0x44, 0x32, 0xbc, 0xf5, 0x3b, 0xd1, 0xf3, 0x94, 0x49, 0xa2, 0x06, 0xea, 0x71, 0x55, 0x2c, 0xa2, 0xa0, 0x66, 0xac, 0xa8, 0x8f, 0xbf, 0x83, 0xcf, 0x71, 0x31, 0x45, 0x25, 0x18, 0x51, 0x9e, 0x9d, 0x91, 0x6a, 0xc9, 0xfd, 0x1d, 0xf0, 0xaf, 0x09, 0xcd, 0x4d, 0x37, 0x5b, 0x62, 0xdb, 0x68, 0x29, 0x71, 0xa0, 0xc7, 0xf0, 0xa8, 0x20, 0xb9, 0x50, 0xc3, 0xcd, 0x03, 0x25, 0x1b, 0x39, 0x8c, 0x8f, 0x2f, 0x55, 0x78, 0x27, 0xbc, 0x84, 0xf4, 0x2c, 0x84, 0x14, 0x0b, 0xc0, 0xf8, 0x7a, 0x4e, 0xee, 0x1d, 0xeb, 0xa0, 0xa0, 0x05, 0x67, 0x2e, 0xdc, 0xad, 0x23, 0x78, 0x53, 0x3c, 0x06, 0x50, 0xff, 0xf5, 0xbe, 0x0a, 0x98, 0x05, 0x04, 0x6b, 0x82, 0x4a, 0x7e, 0xed, 0xd0, 0x92, 0xd6, 0xeb, 0x0c, 0x36, 0x70, 0xc3, 0xa0, 0xb0, 0x18, 0x13, 0xf8, 0x06, 0xd5, 0xb7, 0x25, 0x15, 0x11, 0x54, 0xf3, 0x12, 0xc9, 0xc3, 0xff, 0x02, 0x6b, 0x8e, 0xec, 0x2a, 0xa4, 0x66, 0x51, 0x85, 0x16, 0x76, 0xf4, 0x59, 0xaf, 0xfb, 0xc0, 0xa0, 0x68, 0x37, 0xb4, 0xeb, 0xc5, 0xd2, 0xd6, 0x15, 0x0d, 0x24, 0xbd, 0xa8, 0x24, 0x65, 0x8c, 0xe9, 0xe0, 0x2a, 0x5b, 0x11, 0x21, 0x1e, 0x8f, 0xd0, 0xf0, 0xa3, 0xdc, 0x1e, 0xaa, 0x59, 0x63, 0xf8, 0xa0, 0x82, 0xd8, 0xd7, 0x32, 0x85, 0x3e, 0xd6, 0x57, 0x8d, 0x21, 0xe8, 0x12, 0xe4, 0xc0, 0x58, 0x65, 0x32, 0x43, 0xb9, 0x11, 0x66, 0x4e, 0xf6, 0x59, 0xa3, 0xa3, 0xb8, 0xa3, 0x18, 0x26, 0x6d, 0xc1, 0xa0, 0x71, 0x94, 0xc0, 0x5e, 0x82, 0xa5, 0x28, 0x01, 0x1a, 0x74, 0x06, 0x09, 0xc4, 0x41, 0xdf, 0x28, 0x60, 0xad, 0xe1, 0x4a, 0x98, 0xab, 0xf3, 0x82, 0xdc, 0x0c, 0xb6, 0x60, 0x88, 0x6a, 0xf8, 0x28, 0xa0, 0x96, 0xc4, 0x0d, 0xce, 0x3f, 0x7c, 0x06, 0xa7, 0x28, 0x04, 0xdc, 0x27, 0x32, 0xf4, 0x5a, 0x78, 0x01, 0x9a, 0x4f, 0x1a, 0x0a, 0x9a, 0x59, 0x18, 0x71, 0x0a, 0x8c, 0x52, 0xf1, 0xb2, 0x07, 0x86, 0xa0, 0x3e, 0x8b, 0xcb, 0x50, 0x7d, 0x8e, 0x47, 0xe4, 0xa1, 0x1e, 0x3b, 0x4c, 0xe7, 0x65, 0x8c, 0xc8, 0x1a, 0xe7, 0x76, 0xd3, 0x20, 0xd9, 0xea, 0x99, 0x8f, 0xd7, 0xbd, 0x06, 0x7e, 0x24, 0x87, 0x8a, 0xa0, 0xc9, 0x37, 0xa1, 0x56, 0x52, 0xcc, 0xbf, 0xc3, 0xbc, 0x37, 0x3f, 0x05, 0xdd, 0xb8, 0xf4, 0x80, 0x22, 0x47, 0xfc, 0x59, 0x9f, 0xf8, 0xe0, 0x8b, 0xa7, 0x2c, 0xcc, 0x56, 0xb3, 0x48, 0x21, 0x56, 0xa0, 0xaf, 0xfa, 0x9c, 0x12, 0xe3, 0x2c, 0xf1, 0x82, 0xe3, 0x38, 0xfc, 0x0c, 0x5f, 0x89, 0x23, 0x1e, 0xab, 0x07, 0x35, 0x3a, 0xce, 0x76, 0xb0, 0x5e, 0x4f, 0x1f, 0xe6, 0xfe, 0x78, 0x6b, 0x65, 0x2d, 0xa0, 0xd3, 0x01, 0xa9, 0xc7, 0xe4, 0x04, 0x1f, 0xdc, 0x22, 0xcf, 0x5c, 0x7c, 0xa9, 0x99, 0xc1, 0x4a, 0x06, 0xba, 0x20, 0x1c, 0x13, 0x4a, 0x1c, 0xcc, 0x7a, 0x18, 0xb5, 0xa7, 0x54, 0xaf, 0xa3, 0x90, 0xa0, 0x66, 0x87, 0x7a, 0xaf, 0xa1, 0x28, 0xb2, 0x5c, 0x70, 0x33, 0x64, 0x8d, 0x75, 0x99, 0x34, 0x48, 0x97, 0x30, 0x15, 0x0a, 0xd5, 0xe1, 0x98, 0x91, 0x9c, 0xb0, 0x89, 0x49, 0x7e, 0x1c, 0xe5, 0xaa, 0x80, 0xf9, 0x01, 0xd1, 0xa0, 0x56, 0x46, 0xfa, 0xd9, 0x82, 0x20, 0x72, 0xc8, 0x6f, 0xe4, 0xcc, 0x55, 0xef, 0xad, 0xc7, 0x50, 0x16, 0x01, 0x39, 0x70, 0x79, 0x36, 0x2a, 0x9e, 0x64, 0xfe, 0x2a, 0xb8, 0x5a, 0x5a, 0xb7, 0x64, 0xa0, 0x9e, 0xe5, 0xdd, 0xc9, 0xc8, 0xd3, 0xe9, 0xbf, 0x67, 0x0b, 0x1a, 0xc8, 0x12, 0x86, 0x64, 0xca, 0x91, 0x79, 0x73, 0xab, 0x5f, 0xc8, 0x59, 0xec, 0x9b, 0x32, 0xe1, 0x63, 0xa1, 0x39, 0xd9, 0x11, 0xa0, 0x08, 0xd8, 0x92, 0x76, 0xe2, 0x51, 0xe0, 0x0a, 0xd0, 0x5a, 0x5f, 0xc5, 0x83, 0x57, 0x8a, 0x12, 0x03, 0xb8, 0x95, 0xdb, 0x8b, 0x1f, 0x1a, 0x01, 0x82, 0x48, 0xfd, 0x70, 0x75, 0x09, 0x74, 0xf8, 0xa0, 0x85, 0x39, 0x5e, 0x5d, 0x4e, 0xe2, 0x89, 0x83, 0xa5, 0x64, 0xcf, 0x3d, 0x10, 0xa0, 0xf8, 0x8d, 0xb1, 0x5c, 0x5e, 0x3c, 0x11, 0xd2, 0x8d, 0x84, 0x97, 0xbe, 0x24, 0x69, 0x65, 0x8d, 0x22, 0x98, 0xa0, 0x5a, 0x56, 0x71, 0x98, 0x22, 0x5f, 0xa3, 0x41, 0x9b, 0x7c, 0xb9, 0xb3, 0xc3, 0xdb, 0x32, 0x94, 0xc8, 0x0b, 0xbd, 0xe0, 0xda, 0x39, 0xae, 0xfb, 0x91, 0x7e, 0x40, 0x4a, 0x68, 0xbb, 0x0a, 0x76, 0x80, 0xa0, 0xfb, 0x38, 0x24, 0x5a, 0x24, 0x15, 0xc8, 0x76, 0x4d, 0x7b, 0xa5, 0xbf, 0xbf, 0x0a, 0x49, 0xa9, 0x3f, 0xa8, 0x37, 0xf4, 0xb6, 0xa6, 0x71, 0x87, 0xdc, 0x7e, 0xf8, 0x18, 0x3b, 0xed, 0x02, 0x5a, 0xa0, 0x20, 0x78, 0xb7, 0x60, 0xdf, 0x25, 0xb7, 0x55, 0xe4, 0x35, 0xe7, 0x29, 0xa0, 0x64, 0x02, 0xc0, 0xce, 0x00, 0x75, 0x6d, 0x5a, 0x76, 0x25, 0x85, 0x24, 0xb7, 0x83, 0x8b, 0xf9, 0x67, 0x4e, 0x67, 0xa0, 0x45, 0xb2, 0x14, 0x14, 0xac, 0x9e, 0x70, 0x5b, 0xcb, 0xe9, 0xe1, 0x48, 0xf1, 0x89, 0x70, 0xfb, 0x1f, 0x57, 0x44, 0xc6, 0x52, 0xee, 0x7e, 0xdf, 0xc4, 0x6c, 0xe7, 0xee, 0xd6, 0x35, 0x6e, 0xd9, 0xa0, 0x1b, 0x23, 0x98, 0xd7, 0xbb, 0x4c, 0xae, 0x3d, 0xef, 0x14, 0x5c, 0xe5, 0x95, 0xee, 0x55, 0xfd, 0x99, 0x8a, 0x68, 0xca, 0x78, 0x3d, 0x34, 0xb3, 0xdf, 0x03, 0x89, 0x4e, 0xc9, 0x1f, 0x0f, 0xfd, 0xa0, 0x49, 0x7f, 0xfa, 0x33, 0xf0, 0x6d, 0xd2, 0x39, 0x0e, 0xed, 0xe5, 0x99, 0xe0, 0x23, 0x5f, 0x0b, 0x34, 0x98, 0xf2, 0x2d, 0xa9, 0x98, 0x2d, 0xcd, 0x6d, 0x1a, 0xb0, 0xe4, 0x70, 0x78, 0x57, 0x9b, 0xa0, 0x45, 0x51, 0x95, 0xdf, 0xf7, 0x14, 0x7d, 0x88, 0xb9, 0x2c, 0x2b, 0x49, 0x7c, 0xdc, 0xd6, 0xca, 0x67, 0x8e, 0xd3, 0x4d, 0x1c, 0xf2, 0xb6, 0xfb, 0xf6, 0x44, 0xb6, 0x82, 0x2d, 0xe9, 0xc9, 0xb0, 0xa0, 0x48, 0xca, 0x8d, 0x12, 0xd7, 0xa2, 0x8e, 0xed, 0xaa, 0xff, 0xb4, 0x6c, 0xc2, 0x29, 0x41, 0x6d, 0x9c, 0x99, 0x29, 0x5b, 0x2c, 0xa8, 0x00, 0xe1, 0x11, 0xbe, 0x6b, 0x94, 0xcf, 0x35, 0x41, 0x8a, 0xa0, 0x61, 0x8b, 0xfa, 0xb6, 0xe3, 0x36, 0xcd, 0x93, 0x84, 0x86, 0xdc, 0x75, 0x5f, 0xdf, 0x44, 0x2a, 0x2d, 0x5b, 0x8f, 0xdf, 0x26, 0xde, 0xa1, 0x67, 0xb8, 0x65, 0xb6, 0xff, 0xf9, 0x99, 0x6b, 0x3d, 0x80, 0xa0, 0xbe, 0x2c, 0xaa, 0x63, 0xd6, 0xbb, 0xb6, 0x6d, 0x91, 0x50, 0x9a, 0xda, 0x7f, 0x1e, 0xe9, 0x69, 0xa8, 0x14, 0x8a, 0xa1, 0xaa, 0x90, 0xb1, 0x79, 0x7a, 0x06, 0xa2, 0xbf, 0x65, 0xdb, 0x3c, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x51, 0x80, 0x80, 0x80, 0x80, 0xa0, 0x08, 0x6c, 0x9c, 0x57, 0x53, 0x1e, 0x3e, 0x46, 0xce, 0x16, 0x84, 0x3e, 0xca, 0xbc, 0x3b, 0x7d, 0xa2, 0x8d, 0x99, 0xc5, 0x11, 0x7b, 0x01, 0x43, 0xae, 0x33, 0x0d, 0x1e, 0x00, 0x58, 0x75, 0x4c, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xd4, 0x73, 0x69, 0x8a, 0x26, 0xd4, 0x40, 0x0f, 0x9f, 0x44, 0x58, 0x64, 0x9d, 0x4a, 0xf5, 0x1c, 0x53, 0x69, 0x29, 0x39, 0x15, 0xcc, 0x5e, 0xfa, 0x3f, 0xda, 0x44, 0xa3, 0x05, 0x0f, 0xca, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x72, 0x9f, 0x20, 0x91, 0xd6, 0x33, 0x14, 0xe4, 0xb1, 0x67, 0xde, 0x13, 0x2d, 0x1a, 0x52, 0xdf, 0xf4, 0xff, 0x97, 0x33, 0x90, 0x73, 0xa5, 0x62, 0x14, 0x69, 0x1d, 0x6a, 0x79, 0xa2, 0xa9, 0x40, 0x3b, 0xb8, 0x50, 0xf8, 0x4e, 0x80, 0x8a, 0x15, 0x2d, 0x02, 0xc7, 0xe1, 0x4a, 0xf6, 0x80, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/state_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/state_proof_new.nr index 09dc0ab0..b63959fb 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/state_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/first/state_proof_new.nr @@ -48,3 +48,5 @@ global proof_input = ProofInput { depth: 5 } }; + +global proof_input_serialized = proof_input.serialize(); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/account.nr b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/account.nr index 4e35b19f..d0ee9f18 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/account.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/account.nr @@ -5,7 +5,7 @@ global address = [ ]; global rlp_encoded_left_padded_account = [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4d, 0x80, 0x89, 0x0a, 0xd7, 0x8e, 0xbc, 0x5a, 0xc6, 0x20, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4d, 0x80, 0x89, 0x0a, 0xd7, 0x8e, 0xbc, 0x5a, 0xc6, 0x20, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 ]; global nonce = 0; diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/state_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/state_proof.nr index 686d6a4b..46b7aa79 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/state_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/state_proof.nr @@ -1,11 +1,11 @@ -use crate::account::StateProof; +use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: [ 0x75, 0x6f, 0x45, 0xe3, 0xfa, 0x69, 0x34, 0x7a, 0x9a, 0x97, 0x3a, 0x72, 0x5e, 0x3c, 0x98, 0xbc, 0x4d, 0xb0, 0xb5, 0xa0 ], value: [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4d, 0x80, 0x89, 0x0a, 0xd7, 0x8e, 0xbc, 0x5a, 0xc6, 0x20, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4d, 0x80, 0x89, 0x0a, 0xd7, 0x8e, 0xbc, 0x5a, 0xc6, 0x20, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 ], proof: [ 0xf9, 0x02, 0x11, 0xa0, 0x90, 0xdc, 0xaf, 0x88, 0xc4, 0x0c, 0x7b, 0xbc, 0x95, 0xa9, 0x12, 0xcb, 0xdd, 0xe6, 0x7c, 0x17, 0x57, 0x67, 0xb3, 0x11, 0x73, 0xdf, 0x9e, 0xe4, 0xb0, 0xd7, 0x33, 0xbf, 0xdd, 0x51, 0x1c, 0x43, 0xa0, 0xba, 0xbe, 0x36, 0x9f, 0x6b, 0x12, 0x09, 0x2f, 0x49, 0x18, 0x1a, 0xe0, 0x4c, 0xa1, 0x73, 0xfb, 0x68, 0xd1, 0xa5, 0x45, 0x6f, 0x18, 0xd2, 0x0f, 0xa3, 0x2c, 0xba, 0x73, 0x95, 0x40, 0x52, 0xbd, 0xa0, 0x47, 0x3e, 0xcf, 0x8a, 0x7e, 0x36, 0xa8, 0x29, 0xe7, 0x50, 0x39, 0xa3, 0xb0, 0x55, 0xe5, 0x1b, 0x83, 0x32, 0xcb, 0xf0, 0x33, 0x24, 0xab, 0x4a, 0xf2, 0x06, 0x6b, 0xbd, 0x6f, 0xbf, 0x00, 0x21, 0xa0, 0xbb, 0xda, 0x34, 0x75, 0x3d, 0x7a, 0xa6, 0xc3, 0x8e, 0x60, 0x3f, 0x36, 0x02, 0x44, 0xe8, 0xf5, 0x96, 0x11, 0x92, 0x1d, 0x9e, 0x1f, 0x12, 0x83, 0x72, 0xfe, 0xc0, 0xd5, 0x86, 0xd4, 0xf9, 0xe0, 0xa0, 0x4e, 0x44, 0xca, 0xec, 0xff, 0x45, 0xc9, 0x89, 0x1f, 0x74, 0xf6, 0xa2, 0x15, 0x67, 0x35, 0x88, 0x6e, 0xed, 0xf6, 0xf1, 0xa7, 0x33, 0x62, 0x8e, 0xbc, 0x80, 0x2e, 0xc7, 0x9d, 0x84, 0x46, 0x48, 0xa0, 0xa5, 0xf3, 0xf2, 0xf7, 0x54, 0x21, 0x48, 0xc9, 0x73, 0x97, 0x7c, 0x8a, 0x1e, 0x15, 0x4c, 0x43, 0x00, 0xfe, 0xc9, 0x2f, 0x75, 0x5f, 0x78, 0x46, 0xf1, 0xb7, 0x34, 0xd3, 0xab, 0x1d, 0x90, 0xe7, 0xa0, 0xe8, 0x23, 0x85, 0x0f, 0x50, 0xbf, 0x72, 0xba, 0xae, 0x9d, 0x17, 0x33, 0xa3, 0x6a, 0x44, 0x4a, 0xb6, 0x5d, 0x0a, 0x6f, 0xaa, 0xba, 0x40, 0x4f, 0x05, 0x83, 0xce, 0x0c, 0xa4, 0xda, 0xd9, 0x2d, 0xa0, 0xf7, 0xa0, 0x0c, 0xbe, 0x7d, 0x4b, 0x30, 0xb1, 0x1f, 0xae, 0xa3, 0xae, 0x61, 0xb7, 0xf1, 0xf2, 0xb3, 0x15, 0xb6, 0x1d, 0x9f, 0x6b, 0xd6, 0x8b, 0xfe, 0x58, 0x7a, 0xd0, 0xee, 0xce, 0xb7, 0x21, 0xa0, 0x71, 0x17, 0xef, 0x9f, 0xc9, 0x32, 0xf1, 0xa8, 0x8e, 0x90, 0x8e, 0xae, 0xad, 0x85, 0x65, 0xc1, 0x9b, 0x56, 0x45, 0xdc, 0x9e, 0x5b, 0x1b, 0x6e, 0x84, 0x1c, 0x5e, 0xdb, 0xdf, 0xd7, 0x16, 0x81, 0xa0, 0x69, 0xeb, 0x2d, 0xe2, 0x83, 0xf3, 0x2c, 0x11, 0xf8, 0x59, 0xd7, 0xbc, 0xf9, 0x3d, 0xa2, 0x39, 0x90, 0xd3, 0xe6, 0x62, 0x93, 0x5e, 0xd4, 0xd6, 0xb3, 0x9c, 0xe3, 0x67, 0x3e, 0xc8, 0x44, 0x72, 0xa0, 0x20, 0x3d, 0x26, 0x45, 0x63, 0x12, 0xbb, 0xc4, 0xda, 0x5c, 0xd2, 0x93, 0xb7, 0x5b, 0x84, 0x0f, 0xc5, 0x04, 0x5e, 0x49, 0x3d, 0x6f, 0x90, 0x4d, 0x18, 0x08, 0x23, 0xec, 0x22, 0xbf, 0xed, 0x8e, 0xa0, 0x92, 0x87, 0xb5, 0xc2, 0x1f, 0x22, 0x54, 0xaf, 0x4e, 0x64, 0xfc, 0xa7, 0x6a, 0xcc, 0x5c, 0xd8, 0x73, 0x99, 0xc7, 0xf1, 0xed, 0xe8, 0x18, 0xdb, 0x43, 0x26, 0xc9, 0x8c, 0xe2, 0xdc, 0x22, 0x08, 0xa0, 0x6f, 0xc2, 0xd7, 0x54, 0xe3, 0x04, 0xc4, 0x8c, 0xe6, 0xa5, 0x17, 0x75, 0x3c, 0x62, 0xb1, 0xa9, 0xc1, 0xd5, 0x92, 0x5b, 0x89, 0x70, 0x74, 0x86, 0xd7, 0xfc, 0x08, 0x91, 0x9e, 0x0a, 0x94, 0xec, 0xa0, 0x7b, 0x1c, 0x54, 0xf1, 0x5e, 0x29, 0x9b, 0xd5, 0x8b, 0xdf, 0xef, 0x97, 0x41, 0x53, 0x8c, 0x78, 0x28, 0xb5, 0xd7, 0xd1, 0x1a, 0x48, 0x9f, 0x9c, 0x20, 0xd0, 0x52, 0xb3, 0x47, 0x1d, 0xf4, 0x75, 0xa0, 0x51, 0xf9, 0xdd, 0x37, 0x39, 0xa9, 0x27, 0xc8, 0x9e, 0x35, 0x75, 0x80, 0xa4, 0xc9, 0x7b, 0x40, 0x23, 0x4a, 0xa0, 0x1e, 0xd3, 0xd5, 0xe0, 0x39, 0x0d, 0xc9, 0x82, 0xa7, 0x97, 0x58, 0x80, 0xa0, 0xa0, 0x89, 0xd6, 0x13, 0xf2, 0x61, 0x59, 0xaf, 0x43, 0x61, 0x6f, 0xd9, 0x45, 0x5b, 0xb4, 0x61, 0xf4, 0x86, 0x9b, 0xfe, 0xde, 0x26, 0xf2, 0x13, 0x08, 0x35, 0xed, 0x06, 0x7a, 0x8b, 0x96, 0x7b, 0xfb, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x53, 0xcc, 0x4a, 0x09, 0xc1, 0xce, 0xb7, 0x25, 0x76, 0xb2, 0xa1, 0xdc, 0x5a, 0x16, 0x85, 0xc4, 0x0f, 0xd5, 0x41, 0x8d, 0x77, 0x9f, 0x4b, 0x21, 0x42, 0x36, 0x11, 0xc1, 0xf7, 0x58, 0xee, 0xb3, 0xa0, 0x69, 0x6f, 0x9f, 0xee, 0x66, 0x20, 0xc6, 0x90, 0x23, 0x77, 0xc7, 0x80, 0xeb, 0x2b, 0xc0, 0x1f, 0x7c, 0x8d, 0x95, 0x06, 0x40, 0xd0, 0xac, 0x34, 0x67, 0x30, 0xbb, 0x28, 0x47, 0x74, 0x21, 0x68, 0xa0, 0x5a, 0xaa, 0x7f, 0xb3, 0x43, 0x0c, 0x7b, 0x47, 0x4f, 0x17, 0x7a, 0xe5, 0x1d, 0xd5, 0x7a, 0x22, 0x45, 0xb5, 0xfe, 0xcb, 0x06, 0xf3, 0xc9, 0xb5, 0xe9, 0x2c, 0xee, 0x92, 0xf0, 0x67, 0x8b, 0x12, 0xa0, 0x12, 0xd3, 0x3d, 0x28, 0x37, 0xea, 0xf7, 0x21, 0x07, 0x9f, 0x9f, 0xae, 0x40, 0x7b, 0xef, 0x14, 0x66, 0x0d, 0xbb, 0x43, 0x9f, 0x62, 0x92, 0x15, 0xde, 0x6c, 0x8a, 0x20, 0x4c, 0xbb, 0xf4, 0x15, 0xa0, 0x36, 0xf3, 0xfe, 0x4c, 0x06, 0x58, 0xcd, 0x35, 0x4a, 0x7c, 0xaf, 0xc7, 0x62, 0x59, 0xc2, 0x21, 0xf3, 0xaf, 0x83, 0x47, 0x5a, 0xd7, 0xcf, 0x18, 0x30, 0x19, 0x11, 0x52, 0xa9, 0x07, 0x3b, 0xa7, 0xa0, 0xaa, 0x45, 0xd9, 0x37, 0xdc, 0xaf, 0x37, 0xe3, 0x9f, 0x6d, 0xc4, 0xfe, 0x85, 0xc0, 0x6b, 0xf2, 0x98, 0xcd, 0xf1, 0x2d, 0xbc, 0x90, 0xd5, 0xec, 0x53, 0xea, 0x76, 0x7d, 0xb5, 0xee, 0x89, 0xac, 0xa0, 0x07, 0x2a, 0x68, 0xa0, 0xa4, 0x6c, 0x18, 0x96, 0x9b, 0x50, 0x13, 0xef, 0xbf, 0x11, 0xf9, 0x21, 0xeb, 0x5f, 0x2d, 0x8e, 0x68, 0x9e, 0xcf, 0x7c, 0x50, 0x56, 0x09, 0x1c, 0x23, 0xe7, 0xc6, 0xa5, 0xa0, 0x8f, 0xbc, 0x34, 0x67, 0xd7, 0x1c, 0x5d, 0xe7, 0x24, 0x38, 0x21, 0x0c, 0x64, 0x43, 0xf2, 0xeb, 0x77, 0x2f, 0x42, 0xf2, 0xaa, 0x4b, 0x79, 0x09, 0x43, 0xb8, 0x6b, 0x40, 0x7d, 0xa4, 0xf4, 0x6e, 0xa0, 0x5d, 0x13, 0x63, 0xe5, 0x62, 0xe8, 0xf6, 0xf2, 0xae, 0x8e, 0xcd, 0xe7, 0xe5, 0xe6, 0x5f, 0x45, 0x1f, 0xcf, 0xab, 0xf9, 0x49, 0x95, 0x2b, 0x8c, 0x60, 0x50, 0xb6, 0xde, 0x86, 0x31, 0xb9, 0x21, 0xa0, 0xcf, 0x2e, 0x55, 0x33, 0xee, 0x5c, 0xbb, 0x20, 0x03, 0x80, 0xd9, 0x69, 0xea, 0xea, 0x25, 0xae, 0x8c, 0xb3, 0x3a, 0x30, 0x34, 0x2e, 0x94, 0xdc, 0x85, 0x3b, 0xd0, 0xe4, 0xdf, 0x80, 0xc4, 0x3b, 0xa0, 0x3e, 0x2a, 0xcb, 0xa2, 0x25, 0x1f, 0xc8, 0x29, 0x2c, 0x2a, 0x6a, 0xa3, 0x6f, 0xfc, 0xd2, 0x20, 0x75, 0x01, 0x5d, 0x93, 0x7f, 0xeb, 0x36, 0xfc, 0xa6, 0xb1, 0x86, 0x60, 0x31, 0x4a, 0xf3, 0xad, 0xa0, 0x78, 0xc4, 0x9c, 0x02, 0x74, 0xf3, 0x85, 0x55, 0x22, 0xd0, 0x6e, 0x9d, 0x37, 0x62, 0xa9, 0x32, 0x08, 0xf3, 0xb4, 0x53, 0x33, 0x23, 0xda, 0x2d, 0x4f, 0x11, 0xc1, 0x21, 0x57, 0x03, 0x88, 0x2b, 0xa0, 0xcf, 0x66, 0x5e, 0xe3, 0xd7, 0x70, 0x1e, 0x6d, 0x9c, 0xa7, 0xa5, 0x13, 0x44, 0xe2, 0x22, 0x2e, 0x92, 0x1f, 0x71, 0xe5, 0x91, 0xdd, 0xaa, 0x31, 0xdf, 0xc7, 0xa5, 0x4d, 0x1d, 0x70, 0xd4, 0xe2, 0xa0, 0x19, 0xae, 0x77, 0x86, 0xc3, 0x77, 0x09, 0x77, 0xdf, 0x39, 0xd9, 0xbe, 0x65, 0x10, 0xb3, 0x9a, 0x17, 0xc3, 0xcb, 0x6a, 0xb7, 0x97, 0xfb, 0xcf, 0x1e, 0x67, 0x8e, 0x03, 0x33, 0x51, 0xc2, 0xe5, 0xa0, 0x08, 0x5b, 0x88, 0xc9, 0x8a, 0x92, 0x65, 0x98, 0x7e, 0xbf, 0xe8, 0xb9, 0x76, 0xee, 0x69, 0x4e, 0x05, 0xb8, 0x8c, 0xd0, 0x05, 0x02, 0xb0, 0xec, 0x24, 0xb0, 0xf7, 0x18, 0xc5, 0xa9, 0x8f, 0x0c, 0xa0, 0xb4, 0x57, 0x1a, 0x8a, 0x0e, 0x05, 0x5b, 0x4e, 0x99, 0x2a, 0x39, 0x57, 0x2b, 0x47, 0x37, 0x08, 0xd4, 0xd7, 0x40, 0x00, 0x00, 0xef, 0xc7, 0x9e, 0x18, 0xa2, 0x95, 0x05, 0x16, 0x17, 0xa5, 0xd5, 0x80, 0xf9, 0x01, 0xb1, 0xa0, 0xc5, 0x27, 0xb1, 0x34, 0xdf, 0x88, 0x5d, 0xb8, 0xa5, 0x79, 0x7e, 0x72, 0x73, 0x1a, 0x7c, 0xf8, 0x3a, 0xf9, 0xf3, 0x72, 0xbf, 0x04, 0xac, 0x15, 0xae, 0xd5, 0x79, 0xc9, 0x87, 0x42, 0x76, 0x8a, 0xa0, 0x74, 0xdb, 0x27, 0xd1, 0xdf, 0x76, 0xf7, 0x30, 0xd6, 0xf7, 0x14, 0xa8, 0xd3, 0x0e, 0xc6, 0xde, 0x60, 0x7a, 0x98, 0x14, 0x89, 0x69, 0xf7, 0xc6, 0x1d, 0x58, 0xc9, 0x3e, 0x3d, 0x31, 0x1d, 0xb6, 0xa0, 0x40, 0xb1, 0xc3, 0xb9, 0xe4, 0xd2, 0x0c, 0x79, 0xfe, 0x51, 0x87, 0x3b, 0x94, 0x0f, 0x27, 0xde, 0xf3, 0x50, 0x74, 0x1f, 0x82, 0x67, 0x58, 0xc8, 0x68, 0x03, 0xc3, 0x09, 0x8c, 0x5d, 0x8b, 0xa6, 0x80, 0x80, 0xa0, 0x98, 0x6d, 0x8e, 0x22, 0xb3, 0x15, 0x9a, 0xcb, 0x18, 0x0a, 0x8e, 0x6b, 0x43, 0x8b, 0x9c, 0x2a, 0xab, 0xd0, 0xd2, 0xaa, 0x17, 0xe1, 0x5e, 0xc2, 0x6d, 0xec, 0x5f, 0x06, 0xd1, 0x32, 0x40, 0x2c, 0xa0, 0x73, 0xd3, 0x09, 0x54, 0x9c, 0xab, 0x55, 0x5b, 0xd5, 0x87, 0x89, 0x44, 0xe3, 0xfa, 0xa5, 0xf3, 0x7b, 0x5c, 0xa3, 0x29, 0x31, 0xd6, 0x12, 0xda, 0x7f, 0xe0, 0x57, 0xb3, 0xc5, 0x89, 0x70, 0x6e, 0xa0, 0x3e, 0x84, 0x75, 0xfa, 0xf2, 0xde, 0x33, 0x4a, 0x9f, 0x00, 0xbf, 0x10, 0x04, 0xe2, 0x1b, 0x08, 0x6d, 0x6b, 0xd5, 0x5f, 0x5a, 0x18, 0x33, 0xb1, 0x51, 0xe9, 0x58, 0x4a, 0xcd, 0x44, 0x3c, 0x7a, 0xa0, 0x21, 0x2b, 0x1a, 0x68, 0x5b, 0xb7, 0x59, 0x25, 0xbb, 0x1a, 0x8f, 0x78, 0xde, 0xb6, 0x08, 0xaa, 0x96, 0x44, 0x49, 0x52, 0xaa, 0x69, 0x80, 0xd6, 0xef, 0x69, 0xce, 0x77, 0xfb, 0x4c, 0xfd, 0x4b, 0xa0, 0xfa, 0xa0, 0x0e, 0x5a, 0x9d, 0xf8, 0xb2, 0xd7, 0x27, 0x97, 0x2a, 0xb2, 0x2b, 0x62, 0xa3, 0x67, 0x7a, 0xde, 0x93, 0xb2, 0x9d, 0x11, 0x68, 0x17, 0x1f, 0xc4, 0x08, 0xe9, 0xa5, 0x2e, 0x24, 0x49, 0xa0, 0xc7, 0x69, 0xc1, 0xf0, 0x2f, 0xaa, 0x20, 0x05, 0xc5, 0x6c, 0x3a, 0x53, 0xd2, 0x9d, 0x52, 0xd1, 0x62, 0x50, 0x98, 0xad, 0x69, 0xcd, 0x58, 0x57, 0xa5, 0xbd, 0x54, 0x6d, 0xce, 0xe8, 0x11, 0x45, 0x80, 0xa0, 0x88, 0xd4, 0x30, 0xb0, 0x8e, 0x90, 0xcb, 0x74, 0x92, 0x52, 0x7e, 0x8b, 0x31, 0x2d, 0x3c, 0x32, 0x12, 0x0a, 0x25, 0xd7, 0xc5, 0x60, 0x1d, 0x0b, 0x63, 0xed, 0x62, 0xa0, 0x64, 0x74, 0xb0, 0xd4, 0xa0, 0x5f, 0x4c, 0x78, 0x35, 0x23, 0x7c, 0x01, 0xb5, 0x20, 0xc3, 0x9f, 0xc3, 0xb9, 0xd1, 0xaf, 0x47, 0xe4, 0x7f, 0x86, 0x88, 0x6c, 0x30, 0x1e, 0x6b, 0xb8, 0x79, 0x28, 0xc4, 0x92, 0x47, 0x09, 0x15, 0xa0, 0x8e, 0x74, 0xf8, 0x84, 0xe4, 0xb7, 0x85, 0x32, 0xda, 0xef, 0x60, 0x4e, 0x5f, 0x43, 0x42, 0xcf, 0x63, 0xe7, 0xe4, 0x86, 0xd0, 0xea, 0x8f, 0x64, 0xd6, 0x4e, 0x05, 0x56, 0x99, 0xa4, 0x8f, 0x47, 0xa0, 0x93, 0xe7, 0x9c, 0x09, 0x90, 0x9d, 0x4d, 0x2d, 0x9e, 0xcd, 0xc3, 0xb3, 0x80, 0x14, 0x82, 0x54, 0x0c, 0x25, 0x5a, 0xde, 0x22, 0x65, 0xa9, 0xaf, 0x11, 0x99, 0x86, 0x9b, 0x08, 0xff, 0x0b, 0x51, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb1, 0xa0, 0x96, 0x41, 0x05, 0x61, 0xdd, 0x86, 0x43, 0x5a, 0x10, 0x0d, 0xdc, 0xe7, 0x8e, 0xf6, 0xb3, 0x3f, 0x77, 0x17, 0x06, 0x28, 0xa4, 0x14, 0x12, 0xc7, 0xc7, 0xde, 0x8d, 0xeb, 0x5e, 0xb9, 0x70, 0xde, 0x80, 0x80, 0xa0, 0x2c, 0xa0, 0x3d, 0x41, 0xfa, 0xc2, 0xf7, 0x58, 0x47, 0xde, 0x0d, 0x10, 0x11, 0xf6, 0x70, 0x6d, 0xb1, 0xad, 0x20, 0xa9, 0x9f, 0x40, 0x85, 0xfb, 0xe8, 0x00, 0x2c, 0xc5, 0x7f, 0x02, 0x28, 0x32, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xd3, 0x3f, 0x3b, 0x68, 0x7d, 0x8f, 0xf4, 0x40, 0x9b, 0x22, 0xf4, 0x21, 0x75, 0xd7, 0x7a, 0x15, 0xcd, 0x28, 0xd3, 0xd1, 0x97, 0xee, 0x22, 0x81, 0x5d, 0x6f, 0x38, 0x81, 0xf5, 0xef, 0x70, 0x13, 0x80, 0x80, 0xa0, 0xd1, 0x25, 0xfb, 0xec, 0x78, 0x4d, 0xb5, 0x12, 0x3e, 0xba, 0x02, 0x7c, 0x8f, 0xe7, 0x93, 0x9f, 0x57, 0xe9, 0x51, 0xb2, 0xe5, 0xcc, 0xb0, 0xa8, 0xe0, 0xb9, 0x79, 0x83, 0x45, 0x76, 0x6d, 0x95, 0xa0, 0xef, 0xd0, 0x58, 0x9e, 0x1c, 0xe6, 0xc6, 0x3b, 0x26, 0x7a, 0x73, 0xff, 0xe4, 0x40, 0xae, 0x56, 0xf0, 0xe8, 0x44, 0x5c, 0xc0, 0x84, 0x78, 0xc3, 0x88, 0xec, 0xa7, 0xe9, 0xa9, 0xc7, 0xd6, 0xe8, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x71, 0x9f, 0x20, 0xa9, 0xa6, 0x68, 0x67, 0x08, 0x7b, 0xac, 0xf2, 0x55, 0x84, 0xb4, 0x28, 0xea, 0xf6, 0xf2, 0x8e, 0xb8, 0x99, 0x2a, 0x80, 0xb7, 0x7a, 0xac, 0x12, 0x2d, 0xf5, 0xcf, 0x11, 0xa5, 0x41, 0xb8, 0x4f, 0xf8, 0x4d, 0x80, 0x89, 0x0a, 0xd7, 0x8e, 0xbc, 0x5a, 0xc6, 0x20, 0x00, 0x00, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/state_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/state_proof_new.nr index 2616154c..deb27ce8 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/state_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/frontier/zero/state_proof_new.nr @@ -48,3 +48,5 @@ global proof_input = ProofInput { depth: 5 } }; + +global proof_input_serialized = proof_input.serialize(); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/account.nr b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/account.nr index 503de937..52036e93 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/account.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/account.nr @@ -5,7 +5,7 @@ global address = [ ]; global rlp_encoded_left_padded_account = [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4e, 0x01, 0x8a, 0x03, 0x13, 0x57, 0x0a, 0x84, 0xbf, 0x37, 0x8e, 0xfd, 0x25, 0xa0, 0xae, 0x27, 0x92, 0x24, 0x44, 0x17, 0xbc, 0x17, 0x49, 0xb9, 0xcd, 0x9a, 0x0b, 0xdc, 0x1c, 0x4a, 0x6c, 0xf3, 0x2f, 0x14, 0x7b, 0x37, 0x20, 0x2c, 0x8c, 0xb3, 0x59, 0x07, 0x77, 0x65, 0x9a, 0xec, 0xa0, 0xe2, 0xe7, 0xa7, 0x52, 0x4a, 0x98, 0xce, 0x62, 0x9e, 0xe4, 0x06, 0xc1, 0x5c, 0x51, 0xa6, 0x83, 0xe4, 0x16, 0x7f, 0x0b, 0x74, 0xea, 0x23, 0x05, 0x66, 0xdd, 0xec, 0xe7, 0xae, 0x9d, 0x6f, 0x0b + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4e, 0x01, 0x8a, 0x03, 0x13, 0x57, 0x0a, 0x84, 0xbf, 0x37, 0x8e, 0xfd, 0x25, 0xa0, 0xae, 0x27, 0x92, 0x24, 0x44, 0x17, 0xbc, 0x17, 0x49, 0xb9, 0xcd, 0x9a, 0x0b, 0xdc, 0x1c, 0x4a, 0x6c, 0xf3, 0x2f, 0x14, 0x7b, 0x37, 0x20, 0x2c, 0x8c, 0xb3, 0x59, 0x07, 0x77, 0x65, 0x9a, 0xec, 0xa0, 0xe2, 0xe7, 0xa7, 0x52, 0x4a, 0x98, 0xce, 0x62, 0x9e, 0xe4, 0x06, 0xc1, 0x5c, 0x51, 0xa6, 0x83, 0xe4, 0x16, 0x7f, 0x0b, 0x74, 0xea, 0x23, 0x05, 0x66, 0xdd, 0xec, 0xe7, 0xae, 0x9d, 0x6f, 0x0b ]; global nonce = 1; diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/state_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/state_proof.nr index 156a330c..7074d34d 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/state_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/state_proof.nr @@ -1,11 +1,11 @@ -use crate::account::StateProof; +use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: [ 0xb4, 0x7e, 0x3c, 0xd8, 0x37, 0xdd, 0xf8, 0xe4, 0xc5, 0x7f, 0x05, 0xd7, 0x0a, 0xb8, 0x65, 0xde, 0x6e, 0x19, 0x3b, 0xbb ], value: [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4e, 0x01, 0x8a, 0x03, 0x13, 0x57, 0x0a, 0x84, 0xbf, 0x37, 0x8e, 0xfd, 0x25, 0xa0, 0xae, 0x27, 0x92, 0x24, 0x44, 0x17, 0xbc, 0x17, 0x49, 0xb9, 0xcd, 0x9a, 0x0b, 0xdc, 0x1c, 0x4a, 0x6c, 0xf3, 0x2f, 0x14, 0x7b, 0x37, 0x20, 0x2c, 0x8c, 0xb3, 0x59, 0x07, 0x77, 0x65, 0x9a, 0xec, 0xa0, 0xe2, 0xe7, 0xa7, 0x52, 0x4a, 0x98, 0xce, 0x62, 0x9e, 0xe4, 0x06, 0xc1, 0x5c, 0x51, 0xa6, 0x83, 0xe4, 0x16, 0x7f, 0x0b, 0x74, 0xea, 0x23, 0x05, 0x66, 0xdd, 0xec, 0xe7, 0xae, 0x9d, 0x6f, 0x0b + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4e, 0x01, 0x8a, 0x03, 0x13, 0x57, 0x0a, 0x84, 0xbf, 0x37, 0x8e, 0xfd, 0x25, 0xa0, 0xae, 0x27, 0x92, 0x24, 0x44, 0x17, 0xbc, 0x17, 0x49, 0xb9, 0xcd, 0x9a, 0x0b, 0xdc, 0x1c, 0x4a, 0x6c, 0xf3, 0x2f, 0x14, 0x7b, 0x37, 0x20, 0x2c, 0x8c, 0xb3, 0x59, 0x07, 0x77, 0x65, 0x9a, 0xec, 0xa0, 0xe2, 0xe7, 0xa7, 0x52, 0x4a, 0x98, 0xce, 0x62, 0x9e, 0xe4, 0x06, 0xc1, 0x5c, 0x51, 0xa6, 0x83, 0xe4, 0x16, 0x7f, 0x0b, 0x74, 0xea, 0x23, 0x05, 0x66, 0xdd, 0xec, 0xe7, 0xae, 0x9d, 0x6f, 0x0b ], proof: [ 0xf9, 0x02, 0x11, 0xa0, 0x61, 0x72, 0xaf, 0xee, 0xf7, 0x72, 0xee, 0x1a, 0x97, 0x76, 0x70, 0xa5, 0xe9, 0xe3, 0x1e, 0x37, 0x76, 0xa1, 0x65, 0x5e, 0x8d, 0x2c, 0x89, 0x7d, 0x18, 0xd6, 0xda, 0xf4, 0xf6, 0x26, 0x73, 0x99, 0xa0, 0x03, 0xb9, 0x7a, 0x7a, 0x00, 0xa2, 0x0e, 0xe4, 0xb2, 0xab, 0x93, 0x71, 0x64, 0x7b, 0x17, 0xf7, 0x93, 0xc2, 0x48, 0xdf, 0xd6, 0x39, 0xad, 0x0b, 0x99, 0xb7, 0x63, 0xd2, 0x6d, 0x94, 0x1b, 0x39, 0xa0, 0xab, 0x43, 0xae, 0xed, 0x0c, 0xdc, 0x2c, 0x63, 0x09, 0x87, 0x5f, 0xdd, 0x32, 0x4f, 0x0e, 0x9a, 0xd9, 0xfb, 0x1d, 0xad, 0xe3, 0x56, 0x5f, 0x9e, 0x57, 0x25, 0xd2, 0x9a, 0x95, 0xb8, 0xf3, 0x4e, 0xa0, 0xbb, 0xa2, 0x36, 0xfd, 0x4e, 0x70, 0x7b, 0x69, 0xa2, 0xfc, 0xcd, 0x53, 0x3d, 0xe7, 0x09, 0xb2, 0x52, 0x8d, 0x86, 0xa9, 0xec, 0x10, 0x9d, 0xb5, 0xb8, 0x56, 0x06, 0xe3, 0x17, 0x02, 0x23, 0xcd, 0xa0, 0x85, 0x36, 0xd7, 0x86, 0x74, 0xf0, 0xf6, 0xbe, 0x32, 0x2f, 0xeb, 0x47, 0xdd, 0x12, 0x3d, 0x4b, 0x88, 0xc0, 0x7e, 0x6e, 0x89, 0x18, 0x57, 0x21, 0xd8, 0xdb, 0x8e, 0x77, 0x0d, 0x65, 0xaf, 0x41, 0xa0, 0xeb, 0xf5, 0xfe, 0xe5, 0x13, 0x09, 0x52, 0x04, 0x1b, 0x8c, 0xb6, 0x31, 0x73, 0x90, 0xff, 0xd2, 0xf6, 0x2a, 0x06, 0x86, 0xa1, 0x2f, 0x92, 0x1f, 0x8b, 0x5a, 0x10, 0xfa, 0xd8, 0x20, 0x6b, 0x04, 0xa0, 0xd1, 0x3b, 0x26, 0x21, 0x19, 0x15, 0xe8, 0xe8, 0xf3, 0xe2, 0xd7, 0x90, 0xde, 0x51, 0xc1, 0x7c, 0xb4, 0x19, 0x1d, 0x80, 0x50, 0x8e, 0x35, 0x18, 0x2e, 0xa0, 0x2a, 0xe8, 0xd2, 0xe0, 0xad, 0x65, 0xa0, 0xce, 0xb3, 0xf8, 0x12, 0x25, 0xdd, 0x03, 0x12, 0xbd, 0xd7, 0x7c, 0x27, 0x6c, 0x0e, 0xc2, 0xb0, 0x18, 0x34, 0xd0, 0x26, 0xc3, 0xe1, 0xad, 0xf0, 0x88, 0x78, 0xcb, 0xf9, 0x83, 0xa0, 0x2a, 0xb1, 0xa0, 0x9d, 0xf8, 0x02, 0xd9, 0x50, 0x95, 0x0e, 0xc9, 0xd7, 0x5b, 0x83, 0x2e, 0xb7, 0x68, 0xdc, 0x22, 0x36, 0xaf, 0x93, 0xfa, 0x64, 0x82, 0xc9, 0xf2, 0xf8, 0x23, 0x67, 0xa9, 0x13, 0xea, 0x03, 0x83, 0xa0, 0xb1, 0x5d, 0xe6, 0xc8, 0x74, 0xcf, 0xa1, 0x05, 0x50, 0x52, 0xaa, 0x73, 0x6a, 0x45, 0xae, 0x7d, 0x9d, 0xbb, 0x7f, 0xa7, 0xe0, 0xce, 0x26, 0x08, 0x5b, 0x0c, 0x21, 0x44, 0xd2, 0xbe, 0xfb, 0x10, 0xa0, 0x72, 0x70, 0xcf, 0xd2, 0x54, 0x5d, 0x3d, 0x19, 0xd2, 0x2c, 0x85, 0x8e, 0xc8, 0xa9, 0xc8, 0x71, 0x5b, 0xbb, 0x4c, 0xa8, 0x68, 0x9c, 0x5d, 0xe3, 0x24, 0xc4, 0xb0, 0x00, 0xfd, 0xa2, 0x5d, 0x9b, 0xa0, 0x57, 0x7a, 0xd2, 0xdd, 0xbc, 0x4a, 0xd6, 0xae, 0xef, 0x33, 0x5a, 0x30, 0xe5, 0x11, 0xbf, 0x01, 0x52, 0xa0, 0x22, 0xaf, 0xdf, 0xbe, 0x23, 0x34, 0xd6, 0x97, 0xc9, 0xb4, 0x71, 0x1e, 0xd7, 0xae, 0xa0, 0x80, 0x8e, 0x84, 0x95, 0x0d, 0xd7, 0xca, 0x8b, 0x7d, 0x2d, 0x31, 0xde, 0xbf, 0x49, 0x21, 0xda, 0x4b, 0x21, 0xfd, 0xe2, 0xd7, 0xa7, 0x6e, 0xd6, 0x99, 0xda, 0xd7, 0xb8, 0xbc, 0x51, 0xf2, 0xf4, 0xa0, 0x8a, 0x27, 0xad, 0xcb, 0xa9, 0x47, 0x86, 0xe0, 0x07, 0x19, 0xec, 0x95, 0x0a, 0xb8, 0x6a, 0x28, 0x2e, 0x4d, 0x6d, 0x1d, 0x63, 0x9f, 0xa1, 0x3f, 0x20, 0xc6, 0x09, 0x51, 0xe3, 0x20, 0xec, 0x3a, 0xa0, 0x68, 0xdb, 0xba, 0xb1, 0x2b, 0x77, 0x33, 0x02, 0x27, 0x6f, 0x79, 0x58, 0xc9, 0xbc, 0x8c, 0x72, 0xd0, 0xf6, 0xa2, 0x6f, 0x82, 0x46, 0x07, 0x4a, 0x61, 0x89, 0xd1, 0x84, 0x20, 0x21, 0xf4, 0x58, 0xa0, 0x16, 0x84, 0x74, 0x7f, 0xc7, 0x72, 0x2e, 0x70, 0x49, 0x2f, 0x2e, 0x5f, 0xd3, 0x4d, 0x69, 0xbd, 0xe8, 0xc0, 0x80, 0x63, 0x40, 0xf8, 0x1c, 0x6c, 0xca, 0x3e, 0x1e, 0x75, 0x84, 0x68, 0x63, 0x56, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x77, 0x81, 0xb4, 0xf7, 0xc1, 0xa3, 0x10, 0xe3, 0x79, 0x44, 0x31, 0xab, 0x12, 0xac, 0xd1, 0x11, 0xe8, 0x72, 0x45, 0xf5, 0x11, 0x09, 0x4e, 0xc3, 0xa3, 0xc3, 0xd7, 0x9b, 0x1c, 0xf2, 0xe9, 0x01, 0xa0, 0x7b, 0x38, 0x57, 0xe4, 0x0e, 0xa3, 0x2e, 0x1a, 0x91, 0x62, 0xba, 0x7e, 0xee, 0xe2, 0x38, 0x92, 0xb2, 0x24, 0xba, 0xec, 0x9c, 0x1e, 0x1b, 0x82, 0xba, 0x3b, 0x6d, 0xcf, 0x95, 0xb6, 0x63, 0xbe, 0xa0, 0x7f, 0x5d, 0xe5, 0xb2, 0x6b, 0xd2, 0xa0, 0xe7, 0x39, 0x82, 0x3d, 0x5b, 0x02, 0x60, 0x83, 0x1d, 0x89, 0x8a, 0x9d, 0x62, 0x17, 0x33, 0x44, 0x20, 0xf0, 0x5a, 0xfa, 0x88, 0x3c, 0x08, 0xfe, 0x87, 0xa0, 0x21, 0x2d, 0x50, 0xc1, 0x54, 0xcb, 0x43, 0xce, 0x85, 0xc0, 0x97, 0xee, 0x5a, 0x7e, 0xf0, 0x2e, 0x99, 0xf3, 0x47, 0x6c, 0xb8, 0xdb, 0x70, 0x71, 0x55, 0xa3, 0xf3, 0xa8, 0x43, 0xea, 0x2f, 0x50, 0xa0, 0xea, 0xab, 0xfe, 0x00, 0x20, 0xce, 0x72, 0x87, 0xcd, 0xf2, 0x75, 0xd1, 0x2d, 0x54, 0x73, 0xd7, 0xb6, 0x65, 0xd8, 0xb7, 0xb8, 0xc0, 0x69, 0x5c, 0xa3, 0x1f, 0xb0, 0xac, 0xef, 0x2b, 0xc6, 0x54, 0xa0, 0xe5, 0x19, 0x02, 0x1a, 0xaf, 0x35, 0xef, 0x10, 0xc1, 0x5e, 0x0e, 0xce, 0x0f, 0xd3, 0xea, 0x85, 0x1e, 0xe0, 0x08, 0x34, 0x64, 0xec, 0x38, 0x60, 0xc5, 0x06, 0x83, 0xb3, 0x7b, 0x45, 0xe3, 0xf1, 0xa0, 0x98, 0xd9, 0x2c, 0x93, 0xb8, 0x3a, 0x85, 0x0b, 0x1d, 0xbd, 0x4e, 0xb8, 0x89, 0x27, 0x18, 0xb2, 0x2d, 0xd5, 0x82, 0x9e, 0xc2, 0x5b, 0x1c, 0xcf, 0x5d, 0x33, 0xa3, 0xd3, 0x3d, 0xd3, 0xde, 0xeb, 0xa0, 0x7a, 0xf2, 0xc0, 0x17, 0xec, 0xdc, 0xba, 0xc6, 0x12, 0xe7, 0x5f, 0x23, 0x5b, 0x80, 0x64, 0x76, 0x61, 0xb9, 0xbb, 0x65, 0x5b, 0xf8, 0xbe, 0x5d, 0x1e, 0x09, 0xfc, 0xe2, 0xb8, 0x99, 0xe0, 0xda, 0xa0, 0xa2, 0xfc, 0x04, 0xa2, 0x01, 0x99, 0xd4, 0x8b, 0xc5, 0xe0, 0x73, 0x27, 0x19, 0x2e, 0xfd, 0x12, 0x73, 0x02, 0xe8, 0x8c, 0x35, 0x48, 0x2c, 0xfa, 0xde, 0xf6, 0xb8, 0x72, 0xcb, 0x25, 0xd5, 0x3f, 0xa0, 0xc9, 0x44, 0x1f, 0x2b, 0xb4, 0x3b, 0x1c, 0xfc, 0x65, 0x26, 0x83, 0x2a, 0x59, 0xb4, 0x88, 0x3e, 0x01, 0x80, 0xee, 0x80, 0xa8, 0xc5, 0x87, 0xa2, 0xff, 0x6e, 0xb5, 0x8f, 0x4d, 0x4a, 0xe7, 0xf1, 0xa0, 0x01, 0x4b, 0x31, 0x9e, 0x42, 0x24, 0xe0, 0xfa, 0x1b, 0x5f, 0x73, 0x3a, 0x93, 0x8b, 0x46, 0x2c, 0xf4, 0x2f, 0x33, 0xae, 0x46, 0x45, 0xd1, 0xbf, 0x9c, 0xb1, 0x86, 0x3a, 0xc4, 0x3d, 0x8d, 0x0c, 0xa0, 0x7c, 0x41, 0xc9, 0xeb, 0x69, 0xc7, 0x63, 0x7e, 0xd5, 0xd2, 0xca, 0x23, 0x7d, 0x09, 0x11, 0x6b, 0x21, 0x6c, 0x7a, 0xfb, 0x88, 0x9a, 0x07, 0xb5, 0x27, 0x08, 0x12, 0x46, 0x90, 0x4c, 0x3b, 0x74, 0xa0, 0x70, 0xa0, 0x51, 0xa9, 0xa3, 0x72, 0x6f, 0x08, 0xf2, 0x07, 0x45, 0x0f, 0x40, 0xb3, 0x79, 0xf2, 0xeb, 0x60, 0xff, 0x9d, 0xf2, 0xbc, 0xca, 0x38, 0xbc, 0xe4, 0x43, 0xc7, 0xfb, 0x0b, 0x8c, 0x2b, 0xa0, 0x67, 0x64, 0x0e, 0xa6, 0x74, 0xd6, 0xc7, 0xa0, 0xa0, 0x0f, 0x0c, 0x42, 0xa3, 0x55, 0x10, 0x69, 0x69, 0x62, 0x58, 0xc0, 0xff, 0x1c, 0x26, 0x3d, 0xac, 0x90, 0xb6, 0x82, 0xad, 0xac, 0xd7, 0x9a, 0xa0, 0x02, 0xd1, 0x3f, 0x9c, 0xef, 0xb7, 0x66, 0xb4, 0xb3, 0x95, 0xba, 0xbd, 0x1f, 0x18, 0x7a, 0x56, 0xea, 0x5a, 0xa3, 0x4e, 0xeb, 0x44, 0x94, 0x60, 0x81, 0x62, 0xc0, 0x95, 0x80, 0xe9, 0x06, 0x26, 0xa0, 0x02, 0xa4, 0xaa, 0xd3, 0x28, 0x04, 0x2a, 0x75, 0xc1, 0x21, 0x36, 0x57, 0xd7, 0x0c, 0xa7, 0x13, 0x99, 0x91, 0xed, 0x23, 0xac, 0xc4, 0x0b, 0x88, 0x7a, 0x7f, 0x67, 0x48, 0x4f, 0xbb, 0x38, 0x4f, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xe8, 0x1d, 0x41, 0x8b, 0xba, 0x15, 0xbe, 0xdc, 0x12, 0x09, 0x3d, 0x5a, 0xbb, 0x2c, 0x14, 0x67, 0xe0, 0x3b, 0x5d, 0x00, 0x65, 0xdd, 0x89, 0x71, 0x32, 0x5e, 0xb8, 0xdb, 0x13, 0xfd, 0xfe, 0xae, 0xa0, 0xc0, 0x43, 0x70, 0x9a, 0x52, 0x8b, 0x0a, 0x49, 0x70, 0xf8, 0x21, 0x6e, 0xe4, 0xf1, 0x23, 0x98, 0x81, 0x30, 0xd4, 0x28, 0xe0, 0x02, 0x8a, 0x59, 0xbe, 0x64, 0x59, 0x3f, 0xbe, 0x6f, 0x7a, 0xea, 0xa0, 0x60, 0x17, 0x66, 0x37, 0x8a, 0x71, 0xa1, 0x2f, 0xfb, 0xc7, 0xce, 0xb2, 0xfa, 0x24, 0x66, 0x8f, 0xf1, 0x58, 0x96, 0x4c, 0xbd, 0xc6, 0xad, 0x1e, 0x05, 0xf1, 0xad, 0x2d, 0xb9, 0x8a, 0x25, 0x5b, 0xa0, 0x8f, 0xb3, 0x09, 0xef, 0x67, 0xd4, 0x8e, 0xf9, 0x9a, 0x86, 0xc1, 0x21, 0x44, 0x8f, 0x4d, 0xf7, 0x3e, 0x9a, 0x93, 0xd5, 0xea, 0x33, 0x14, 0xfa, 0x6d, 0x8a, 0x13, 0x4b, 0x2e, 0xc1, 0xf7, 0x7e, 0xa0, 0x1b, 0x91, 0x76, 0x35, 0x27, 0x34, 0x0d, 0x86, 0xe6, 0x1b, 0x32, 0xd4, 0x3a, 0x8c, 0x57, 0xb5, 0x85, 0x8a, 0x17, 0x48, 0xcc, 0x6d, 0x1e, 0x2f, 0x07, 0x73, 0x7d, 0x30, 0xb2, 0x58, 0x6d, 0xa9, 0xa0, 0xb5, 0x97, 0x2c, 0xcc, 0x58, 0x71, 0xb6, 0x4f, 0x08, 0xd2, 0xc7, 0x76, 0x38, 0x47, 0xe9, 0xc5, 0x57, 0x67, 0x99, 0x64, 0x50, 0x53, 0xcd, 0xd0, 0x02, 0x4d, 0x83, 0x4f, 0x04, 0x27, 0x43, 0x20, 0xa0, 0xa8, 0x90, 0xe4, 0x71, 0xa6, 0xfb, 0x3b, 0x2e, 0x7e, 0xf1, 0x27, 0xf0, 0xea, 0x46, 0xcb, 0x27, 0x98, 0x1e, 0xca, 0x73, 0x9e, 0xda, 0x97, 0xac, 0x0d, 0x94, 0xc2, 0x60, 0x10, 0x36, 0xc1, 0x13, 0xa0, 0xac, 0xc6, 0x87, 0xb7, 0x30, 0xd3, 0xba, 0x5b, 0xc8, 0x51, 0xc8, 0xf4, 0x27, 0x0a, 0x7e, 0x13, 0x32, 0x25, 0x7f, 0xa4, 0x82, 0x78, 0x83, 0x3a, 0xc5, 0x89, 0x58, 0x34, 0xc4, 0xe3, 0x4c, 0x94, 0xa0, 0xba, 0xe8, 0xfb, 0x16, 0x59, 0x67, 0xa6, 0xe5, 0xac, 0xc4, 0x4c, 0x49, 0x35, 0xe3, 0xc6, 0x8a, 0x77, 0xe1, 0x64, 0x71, 0x14, 0xa1, 0x3c, 0xdf, 0x37, 0x91, 0x30, 0x95, 0xa9, 0x26, 0xca, 0xad, 0xa0, 0x20, 0x21, 0x42, 0xfb, 0x0a, 0x49, 0xe1, 0xa6, 0xdf, 0x7c, 0x1b, 0x5b, 0xa3, 0x4b, 0x52, 0xd0, 0x2a, 0x19, 0x33, 0xb2, 0xe1, 0x41, 0xc5, 0x7c, 0x23, 0x55, 0x25, 0x0e, 0x66, 0x9f, 0xa1, 0x50, 0xa0, 0xc8, 0x3b, 0x5b, 0x4c, 0xb6, 0xa6, 0x84, 0xa5, 0x4c, 0x84, 0xff, 0x69, 0x17, 0xc7, 0x96, 0xb8, 0xbb, 0xf4, 0x95, 0x25, 0xda, 0xf4, 0x19, 0xb5, 0x11, 0xaa, 0xb9, 0x73, 0x06, 0x56, 0x6f, 0xeb, 0xa0, 0x70, 0xa9, 0x23, 0x37, 0xc6, 0x06, 0xd8, 0x23, 0x62, 0xf7, 0x39, 0x56, 0x9d, 0x1d, 0x51, 0xe1, 0xcf, 0x9b, 0x46, 0x18, 0xda, 0xfb, 0x77, 0x7f, 0xa7, 0x9a, 0xe7, 0x23, 0x99, 0xb8, 0x49, 0xcb, 0xa0, 0x05, 0x0d, 0xc6, 0x43, 0xf8, 0xfa, 0xb3, 0x1f, 0x38, 0x30, 0x11, 0x28, 0x1f, 0xa5, 0xfe, 0xd7, 0x31, 0xbc, 0xbb, 0xf4, 0x1a, 0x32, 0xfd, 0x9d, 0x72, 0x5c, 0xbf, 0x5c, 0x20, 0x07, 0x3e, 0x64, 0xa0, 0x48, 0x96, 0x74, 0x94, 0x27, 0xda, 0x28, 0x4e, 0x92, 0x18, 0x7b, 0x00, 0x49, 0x24, 0xd1, 0x47, 0x7f, 0xe4, 0xb4, 0x09, 0x72, 0x9e, 0x6b, 0xb4, 0x0d, 0xeb, 0xb8, 0x83, 0xbd, 0x7a, 0x52, 0xb5, 0xa0, 0x81, 0xa1, 0xdd, 0xd9, 0x03, 0x0b, 0xaf, 0x96, 0x72, 0x7e, 0x4d, 0x77, 0xe0, 0x51, 0x8a, 0x2b, 0xfb, 0xd0, 0x80, 0xc8, 0x99, 0xdd, 0xd1, 0x8f, 0x9c, 0xd9, 0x93, 0xd1, 0xf5, 0xb9, 0x20, 0x26, 0xa0, 0x4a, 0x62, 0x00, 0xe4, 0xc1, 0x0c, 0x39, 0xf6, 0xe5, 0xd5, 0xab, 0x78, 0x65, 0xc9, 0x02, 0x71, 0xad, 0x4c, 0x97, 0x51, 0x68, 0xe3, 0xdf, 0xdb, 0x16, 0x2b, 0x7e, 0x9f, 0xee, 0x44, 0xf2, 0x3d, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x8f, 0x23, 0x53, 0xff, 0xe6, 0xb5, 0xbb, 0xd8, 0x64, 0xae, 0x31, 0x9e, 0x73, 0xfe, 0xa6, 0x79, 0xa4, 0x4e, 0x8b, 0xe9, 0xf3, 0x97, 0xab, 0xfc, 0x08, 0xe3, 0x54, 0x67, 0xae, 0x37, 0x52, 0x6a, 0xa0, 0x0a, 0xf7, 0x98, 0x13, 0xf8, 0x37, 0x83, 0x9b, 0xdc, 0xdb, 0xc3, 0x95, 0xf2, 0xd3, 0x95, 0xdb, 0xb7, 0xa2, 0x16, 0x0a, 0x56, 0xde, 0x58, 0x00, 0x11, 0x0a, 0xac, 0xc2, 0x8e, 0xf1, 0x40, 0x8b, 0xa0, 0xe1, 0xba, 0xc2, 0xe0, 0x08, 0x02, 0x81, 0x0d, 0x86, 0xd6, 0x4f, 0xbe, 0x91, 0x83, 0xc6, 0x15, 0xde, 0x7c, 0x0e, 0xc3, 0xc0, 0x82, 0xa7, 0x5c, 0x23, 0x4d, 0xf4, 0xb5, 0x5c, 0x7b, 0xc3, 0x5a, 0xa0, 0x90, 0x17, 0xac, 0xe8, 0x6e, 0x99, 0xf4, 0x61, 0xb0, 0x17, 0x37, 0x8c, 0xbd, 0xf9, 0xd8, 0x71, 0x7a, 0x72, 0x27, 0xae, 0xec, 0x05, 0xb7, 0xbc, 0xaa, 0xc7, 0x2f, 0x79, 0x88, 0xc9, 0x18, 0x66, 0xa0, 0x26, 0x72, 0xb9, 0x82, 0x1e, 0xe5, 0xcb, 0x29, 0x3b, 0xbf, 0x96, 0x4e, 0xa1, 0x87, 0xb6, 0x7e, 0x29, 0x0d, 0xf8, 0x92, 0x3e, 0x5f, 0xde, 0xdd, 0xaf, 0x70, 0xe1, 0x7e, 0x6b, 0xb4, 0x74, 0xb5, 0xa0, 0x74, 0x33, 0x7e, 0xec, 0xdb, 0xdc, 0x83, 0x46, 0x81, 0x1e, 0x91, 0x16, 0xdd, 0x45, 0xd7, 0xc9, 0xf1, 0x5e, 0x4f, 0x30, 0x8b, 0x1e, 0x9f, 0xdf, 0x0c, 0xb9, 0x9c, 0x65, 0x49, 0x12, 0x3f, 0x62, 0xa0, 0x60, 0x47, 0xe4, 0x48, 0xa8, 0x49, 0xa0, 0xb8, 0x11, 0xba, 0x56, 0x41, 0x92, 0x67, 0xad, 0xb2, 0xaa, 0xa0, 0xce, 0x94, 0x85, 0x6c, 0x0d, 0x09, 0x01, 0xb8, 0xa9, 0xfe, 0x96, 0x8a, 0x26, 0xdb, 0xa0, 0x0a, 0xd5, 0x15, 0x76, 0x93, 0xac, 0xd8, 0xd5, 0x43, 0x35, 0x26, 0x47, 0x7f, 0x0e, 0x2c, 0xc3, 0xb5, 0x47, 0x40, 0x45, 0x51, 0xe6, 0xd0, 0xff, 0x96, 0x52, 0xea, 0xa8, 0xb7, 0x59, 0xfc, 0xba, 0xa0, 0x39, 0x20, 0xe3, 0x42, 0x30, 0x44, 0x41, 0x85, 0xeb, 0x1b, 0xf3, 0x69, 0xff, 0x18, 0x2b, 0xdd, 0x14, 0xbd, 0xdf, 0x1e, 0x48, 0xe9, 0xf9, 0x3d, 0x6e, 0xf2, 0xf3, 0xff, 0x96, 0xbc, 0x83, 0xeb, 0xa0, 0x83, 0xdf, 0xe2, 0x1a, 0x24, 0x58, 0x11, 0x65, 0xcf, 0x3d, 0x8a, 0xf4, 0xfd, 0xfd, 0x3f, 0x89, 0x17, 0xc5, 0xe7, 0x22, 0x3e, 0x72, 0x34, 0x86, 0x43, 0x7e, 0xe1, 0xb9, 0x2a, 0x63, 0x53, 0xcb, 0xa0, 0xe7, 0xb3, 0x06, 0x02, 0xa9, 0x84, 0x66, 0x3f, 0x7b, 0x1f, 0x78, 0x04, 0x9d, 0xe2, 0x45, 0x62, 0x85, 0x61, 0x9d, 0x78, 0x26, 0xb1, 0xd4, 0xcb, 0xb6, 0xaf, 0xf1, 0x5b, 0x39, 0xfb, 0x5f, 0x66, 0xa0, 0x7e, 0x1f, 0x7c, 0x5c, 0x9b, 0xc6, 0x19, 0x9e, 0x1c, 0x81, 0x15, 0xc5, 0x10, 0xbc, 0x31, 0xb0, 0x01, 0x91, 0x9f, 0x42, 0x7d, 0xe1, 0x81, 0x94, 0x16, 0x6c, 0xba, 0x54, 0x72, 0x0b, 0x6b, 0x45, 0xa0, 0x79, 0xbd, 0x4e, 0x23, 0xbe, 0x86, 0x92, 0x63, 0xaa, 0xea, 0x55, 0x62, 0x20, 0x75, 0x19, 0xdd, 0x36, 0x09, 0x5c, 0x5e, 0x9a, 0x8d, 0xff, 0x4b, 0xe2, 0x28, 0x5b, 0x0d, 0x98, 0x5f, 0xff, 0xca, 0xa0, 0x35, 0x6b, 0x7d, 0x6a, 0x33, 0x3d, 0xbf, 0x1d, 0xd1, 0x64, 0x0d, 0xb6, 0xf1, 0x03, 0xe5, 0x1d, 0x37, 0x03, 0xf8, 0x48, 0x45, 0x19, 0xcb, 0x25, 0x21, 0xe1, 0x88, 0x35, 0x82, 0x2c, 0x94, 0xd7, 0xa0, 0x70, 0xdc, 0x45, 0x11, 0x75, 0x51, 0x34, 0xb3, 0xdf, 0xf6, 0x23, 0x26, 0x3c, 0xaa, 0xd4, 0xcb, 0x34, 0x41, 0xde, 0xcc, 0xe1, 0xd4, 0x9f, 0x82, 0x34, 0x2f, 0x58, 0xa2, 0x60, 0xf4, 0x75, 0xc8, 0xa0, 0x88, 0xa2, 0xef, 0x81, 0xa1, 0x8b, 0x04, 0x39, 0x22, 0x78, 0x00, 0xf0, 0x80, 0xe1, 0x18, 0x92, 0x7b, 0x65, 0xf0, 0xa8, 0x53, 0x8f, 0x9a, 0x5e, 0xae, 0xe0, 0x9a, 0x2e, 0xec, 0x49, 0x1f, 0x58, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xea, 0xa9, 0x29, 0x93, 0x83, 0x65, 0x1e, 0x9d, 0x91, 0xe3, 0xcf, 0xc6, 0x64, 0x2b, 0x33, 0xd5, 0x33, 0x40, 0x82, 0x72, 0x36, 0x1a, 0x9f, 0x8f, 0xa4, 0x52, 0xf3, 0x04, 0xfe, 0x37, 0x86, 0x38, 0xa0, 0xf9, 0xd2, 0x0e, 0x25, 0x31, 0x64, 0x5a, 0xc9, 0xe8, 0x34, 0x77, 0xf9, 0x2c, 0x24, 0x6b, 0x10, 0x6b, 0xbf, 0x27, 0x2d, 0x94, 0xb1, 0x77, 0xb1, 0x82, 0x3c, 0x82, 0x4e, 0xb1, 0xb5, 0x7c, 0x28, 0xa0, 0xf8, 0x39, 0x1d, 0x05, 0x26, 0x89, 0x71, 0xfd, 0x73, 0x12, 0x1c, 0xd5, 0xfd, 0x21, 0x45, 0x23, 0x29, 0xf2, 0x9e, 0xef, 0x68, 0xe8, 0x15, 0xe6, 0x2c, 0xbd, 0x28, 0x24, 0x99, 0x23, 0x8e, 0xc6, 0xa0, 0x7f, 0xf1, 0x92, 0xa3, 0xd9, 0x49, 0x57, 0x84, 0xcb, 0xca, 0x63, 0x92, 0x6b, 0x26, 0x4d, 0xe8, 0x4a, 0xa9, 0x9b, 0xa4, 0x58, 0xda, 0x37, 0x7a, 0x71, 0x6d, 0xc1, 0xab, 0xe6, 0x0a, 0x55, 0x6f, 0xa0, 0x89, 0xd8, 0xfd, 0x1e, 0x9a, 0xfc, 0x9a, 0x12, 0xa1, 0xab, 0xd6, 0x5c, 0x6d, 0xe0, 0x13, 0xbe, 0x8b, 0x55, 0x74, 0x42, 0xc6, 0x04, 0xf2, 0xfc, 0xa2, 0xda, 0xdc, 0x45, 0x17, 0x8f, 0x1d, 0xaa, 0xa0, 0xde, 0x25, 0x55, 0x43, 0x09, 0x70, 0xdd, 0x42, 0x8e, 0xf8, 0xa4, 0x7b, 0xd0, 0xa2, 0xd1, 0x1e, 0x52, 0xb9, 0xec, 0x1f, 0x0d, 0x15, 0xf1, 0xae, 0x95, 0xfd, 0x4b, 0xf4, 0xa0, 0x33, 0x0c, 0xef, 0xa0, 0xc7, 0xba, 0x2f, 0xc1, 0xd3, 0x62, 0x4a, 0x63, 0xd0, 0x91, 0xfa, 0x7d, 0x17, 0xae, 0xf3, 0xc1, 0x10, 0x52, 0xc0, 0xa8, 0x9b, 0xbe, 0x27, 0xc9, 0x4d, 0x89, 0x90, 0xf4, 0xbe, 0x98, 0x3c, 0x46, 0xa0, 0x30, 0xb3, 0x90, 0x4f, 0x0f, 0xa5, 0x20, 0x29, 0x1e, 0x63, 0x8c, 0xc3, 0xf1, 0x4f, 0xd0, 0x36, 0x1b, 0xc9, 0x16, 0x88, 0x11, 0xd5, 0x86, 0xa6, 0xcb, 0x51, 0x6d, 0x8a, 0x2d, 0x83, 0x09, 0x00, 0xa0, 0xb2, 0xc7, 0x50, 0xa1, 0xfc, 0xbd, 0xbb, 0x51, 0xc7, 0x70, 0xb8, 0xf7, 0x69, 0x9d, 0xf0, 0x79, 0xa2, 0x59, 0x93, 0xf6, 0x44, 0xae, 0x6c, 0xc4, 0x77, 0x3d, 0x14, 0xdb, 0xb4, 0x2f, 0xbf, 0x07, 0xa0, 0x67, 0x03, 0x2f, 0xbe, 0x25, 0xfc, 0x69, 0x8d, 0x71, 0x25, 0x97, 0x7b, 0x40, 0x5d, 0x2e, 0xe8, 0x3f, 0x54, 0xa1, 0xb5, 0xc1, 0x39, 0x43, 0x37, 0xb8, 0x86, 0x50, 0xa6, 0xb4, 0x8e, 0x92, 0x3f, 0xa0, 0x84, 0xbf, 0x36, 0x72, 0xc8, 0x34, 0x68, 0x1e, 0x40, 0xec, 0xee, 0x6a, 0x04, 0xdc, 0x23, 0x4c, 0x6b, 0xc9, 0x5c, 0xb5, 0xa2, 0xd0, 0xb7, 0x1d, 0xe9, 0x52, 0xc2, 0x82, 0x6a, 0x2b, 0x09, 0x63, 0xa0, 0xb9, 0xb0, 0x94, 0xdc, 0x10, 0xc4, 0xd4, 0x51, 0x6a, 0x3f, 0xa2, 0x63, 0xf8, 0x0d, 0x17, 0x43, 0x33, 0x9d, 0xc8, 0xd1, 0x32, 0x36, 0xb4, 0x04, 0x00, 0xc6, 0x9e, 0xda, 0x73, 0xff, 0x3c, 0x89, 0xa0, 0xf5, 0x08, 0xf9, 0x59, 0x68, 0x9b, 0xc1, 0x94, 0xe3, 0x32, 0xf8, 0xa9, 0x61, 0x88, 0x26, 0x96, 0x9e, 0x0f, 0x4d, 0x86, 0x3c, 0xfb, 0x19, 0xad, 0xd1, 0x93, 0x81, 0x6c, 0x56, 0xf4, 0x3e, 0xc7, 0xa0, 0x26, 0xe3, 0xd6, 0x24, 0x5c, 0x5e, 0x29, 0xa9, 0x19, 0xbe, 0x23, 0x98, 0xbf, 0x09, 0xff, 0xd1, 0xf6, 0x37, 0xcb, 0xf9, 0xa7, 0x61, 0xc2, 0x98, 0xc2, 0x84, 0x25, 0x7b, 0xab, 0x56, 0xf7, 0xed, 0xa0, 0x6c, 0xb8, 0x65, 0x12, 0x02, 0x69, 0x48, 0xa1, 0x68, 0x95, 0x37, 0x32, 0x0e, 0xd9, 0xd5, 0x76, 0x5f, 0x01, 0x1c, 0x47, 0x08, 0x4a, 0xb7, 0x5f, 0xaa, 0xb3, 0x8e, 0xd7, 0x7d, 0x7b, 0x38, 0x0c, 0xa0, 0x41, 0x3e, 0x29, 0xa1, 0x78, 0xe5, 0x18, 0x10, 0xfb, 0x9e, 0xa3, 0x62, 0x20, 0x75, 0xd4, 0xce, 0xad, 0x12, 0x83, 0xec, 0xfb, 0x76, 0xef, 0x5c, 0x9d, 0x52, 0xc6, 0xe9, 0x77, 0xfc, 0x87, 0xd2, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x2c, 0x44, 0xeb, 0xc5, 0xe6, 0x6c, 0xd8, 0x3e, 0x4c, 0x5d, 0x72, 0xd7, 0x99, 0x31, 0x11, 0xd9, 0x85, 0xfe, 0x4c, 0x31, 0xc9, 0xd0, 0xab, 0x7a, 0xcc, 0x9a, 0x91, 0x38, 0x3c, 0x94, 0xe2, 0x95, 0xa0, 0x3e, 0x82, 0xe4, 0x45, 0xda, 0x29, 0x0a, 0xe8, 0x06, 0x38, 0xa8, 0xd4, 0xb6, 0x78, 0xf3, 0xa9, 0x99, 0xc3, 0x31, 0xc7, 0x9c, 0x6f, 0x27, 0x20, 0xf8, 0x3c, 0x4d, 0x70, 0x1c, 0x89, 0xb7, 0x0b, 0xa0, 0x1e, 0xe0, 0x1c, 0xad, 0x94, 0xb3, 0x07, 0x3f, 0x47, 0xf0, 0xef, 0x01, 0x8b, 0x17, 0x24, 0x3f, 0xa0, 0x3b, 0x61, 0x5b, 0x83, 0xff, 0x53, 0x24, 0x30, 0xaa, 0x58, 0x17, 0x74, 0x2c, 0x62, 0x49, 0xa0, 0xe3, 0xb7, 0x2c, 0x68, 0xad, 0x42, 0x55, 0x6b, 0x42, 0xf7, 0x6b, 0xde, 0x86, 0x87, 0xe0, 0x66, 0x56, 0xc8, 0x9f, 0x83, 0x0f, 0xf2, 0x7d, 0xd7, 0x4e, 0x9f, 0x30, 0x85, 0x9e, 0x0a, 0x49, 0xab, 0xa0, 0xa4, 0xf8, 0x2d, 0xc3, 0x4d, 0xab, 0x21, 0x64, 0x59, 0xed, 0x81, 0xd0, 0x92, 0x2b, 0xb2, 0x20, 0xcd, 0xcd, 0xda, 0x0b, 0x17, 0x23, 0xe5, 0xd9, 0xf4, 0xab, 0xae, 0xf5, 0xeb, 0x8d, 0x36, 0x5a, 0xa0, 0x5e, 0x40, 0x54, 0x7e, 0x9c, 0xf3, 0x25, 0x8e, 0x69, 0xd7, 0x37, 0x1e, 0x71, 0x09, 0xf1, 0x31, 0x92, 0x82, 0x75, 0xd7, 0x90, 0x77, 0x50, 0xb9, 0x1b, 0x68, 0x9d, 0x83, 0x8a, 0xd2, 0x06, 0x92, 0xa0, 0x1b, 0xce, 0xca, 0xb0, 0xd5, 0x13, 0xe1, 0x31, 0x0a, 0x68, 0x18, 0xd2, 0x72, 0x4e, 0xbb, 0x84, 0x4e, 0xc6, 0x51, 0xcf, 0x82, 0x7d, 0x47, 0xbc, 0x6a, 0xc5, 0x14, 0x07, 0xb5, 0x89, 0xa5, 0x20, 0xa0, 0xd9, 0xc8, 0x38, 0xae, 0x12, 0x69, 0x03, 0x73, 0x9f, 0xbd, 0xd4, 0xf5, 0xcb, 0x72, 0xf6, 0x1e, 0xdb, 0x32, 0xdb, 0x50, 0xf4, 0xc5, 0x7a, 0xc9, 0x17, 0xc9, 0xb3, 0xf5, 0x22, 0x89, 0x59, 0x78, 0xa0, 0x6c, 0x64, 0x87, 0x2d, 0x05, 0x72, 0x73, 0xb7, 0x62, 0x58, 0x40, 0xb3, 0xc2, 0x34, 0x4a, 0xd9, 0x09, 0x85, 0xdb, 0xd0, 0xdf, 0x27, 0xff, 0x71, 0xd1, 0xcc, 0xa0, 0x9a, 0xcb, 0x5b, 0xb0, 0x51, 0xa0, 0x96, 0x2f, 0x73, 0xa5, 0x54, 0xc1, 0xdf, 0x11, 0x27, 0xbb, 0xd0, 0x98, 0xdb, 0x7b, 0x30, 0x20, 0xcf, 0x9b, 0xbf, 0xd9, 0x9e, 0x6a, 0xa2, 0x25, 0x45, 0xa2, 0x49, 0x57, 0x34, 0xe8, 0xa0, 0x66, 0xa0, 0xc4, 0xf6, 0x9d, 0xd1, 0x7b, 0x5e, 0x39, 0x6d, 0x6d, 0x34, 0x5a, 0x62, 0xcc, 0x0e, 0xca, 0x36, 0xc4, 0xa0, 0x0e, 0x21, 0xe2, 0x5b, 0xc6, 0xdf, 0xaa, 0xd1, 0x30, 0xb6, 0xbd, 0x63, 0x31, 0xbe, 0xa0, 0xa4, 0x72, 0x70, 0x46, 0xf3, 0xf2, 0x25, 0x2a, 0x82, 0x8e, 0x2e, 0x38, 0x09, 0xc2, 0x0c, 0xee, 0x7d, 0x62, 0x2a, 0xa9, 0xe6, 0x6d, 0xc0, 0xcf, 0xb3, 0xfb, 0xd2, 0x68, 0xea, 0xce, 0xdf, 0x9f, 0xa0, 0xd7, 0x64, 0x1c, 0x25, 0x19, 0xb6, 0xfe, 0x99, 0x87, 0xea, 0xb4, 0xf9, 0x72, 0x7c, 0x7b, 0xe3, 0x3d, 0xd7, 0x97, 0x3b, 0xc2, 0x44, 0xdc, 0x51, 0xc8, 0x2f, 0x46, 0x5e, 0x47, 0x0c, 0xff, 0xf4, 0xa0, 0xaf, 0xd3, 0xa3, 0x5e, 0xcf, 0xa0, 0x6e, 0xbb, 0x7a, 0x05, 0x52, 0x70, 0xcc, 0xf0, 0xbb, 0xb0, 0xf6, 0x24, 0x2f, 0xbc, 0xe3, 0x5b, 0x7b, 0x71, 0xcd, 0x01, 0x54, 0x42, 0x24, 0xd4, 0x62, 0xb9, 0xa0, 0x7a, 0x69, 0x9f, 0x74, 0xe4, 0x2a, 0x2e, 0x03, 0xc2, 0x9a, 0x31, 0x04, 0x86, 0x91, 0x15, 0xf6, 0x8a, 0xfc, 0x0d, 0x26, 0x2d, 0x6d, 0x6e, 0x7d, 0x0a, 0xdc, 0x1b, 0xdb, 0x75, 0xac, 0xd7, 0x01, 0xa0, 0xb3, 0xc7, 0x11, 0xf8, 0xf6, 0x79, 0x2a, 0xe0, 0xa9, 0xa9, 0x1c, 0xdb, 0xd4, 0xd7, 0x72, 0x6c, 0x0f, 0x9b, 0x80, 0xa4, 0x7e, 0x44, 0x78, 0x94, 0x69, 0x16, 0x96, 0xbd, 0x87, 0x55, 0xb9, 0x75, 0x80, 0xf8, 0xd1, 0x80, 0x80, 0xa0, 0xb5, 0x61, 0xe8, 0x58, 0x42, 0x11, 0x12, 0x23, 0x03, 0x8f, 0xd7, 0xef, 0x28, 0x5a, 0xbf, 0x8a, 0xf3, 0x48, 0xd3, 0xf4, 0x9f, 0xdb, 0x2a, 0x4a, 0x6a, 0x19, 0x76, 0xf0, 0xa0, 0x77, 0x50, 0x69, 0x80, 0xa0, 0xe1, 0xd8, 0x9f, 0x1f, 0x0b, 0x09, 0x1e, 0xde, 0x19, 0x4a, 0x7f, 0xd7, 0xc1, 0x74, 0xda, 0x2d, 0x80, 0x41, 0x08, 0x99, 0xfa, 0x28, 0x15, 0xa3, 0xcc, 0xd3, 0xa5, 0x1a, 0x64, 0xcf, 0x1f, 0xec, 0x80, 0x80, 0x80, 0xa0, 0x6b, 0x9e, 0x98, 0x9c, 0xf2, 0x9f, 0x77, 0xbc, 0x45, 0x58, 0x4c, 0x8a, 0xd6, 0x8b, 0x1f, 0x94, 0xc5, 0x43, 0xba, 0xee, 0x8a, 0x1b, 0x0f, 0x11, 0x0f, 0x52, 0x86, 0x82, 0x81, 0x7b, 0x0d, 0x95, 0x80, 0xa0, 0xef, 0x14, 0x4c, 0x6c, 0x46, 0x71, 0x2f, 0xb2, 0x44, 0x9e, 0x73, 0x8d, 0x20, 0x3d, 0xae, 0x68, 0xe0, 0x0f, 0xbd, 0x6b, 0x28, 0x78, 0x77, 0x29, 0xc9, 0x26, 0xa7, 0x62, 0x47, 0x1b, 0x81, 0xdf, 0xa0, 0x64, 0x05, 0xec, 0x9c, 0xaf, 0x9e, 0x5c, 0x84, 0x13, 0x86, 0x6d, 0x4b, 0x68, 0xbb, 0x46, 0x81, 0x2d, 0x2b, 0xfd, 0xef, 0x2c, 0x87, 0x3a, 0xfc, 0x80, 0xab, 0x87, 0xbe, 0xb6, 0x55, 0x4d, 0xe2, 0xa0, 0xf3, 0x06, 0xdc, 0xea, 0x8a, 0x09, 0x53, 0xc8, 0xe1, 0x4d, 0x8f, 0x27, 0xa5, 0xdf, 0xfc, 0x38, 0xf4, 0xcb, 0xbb, 0xa5, 0x6b, 0xd3, 0x71, 0xa3, 0x6f, 0x84, 0x7a, 0x11, 0xf6, 0xe6, 0xee, 0xb9, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x70, 0x9d, 0x3f, 0x8c, 0x7f, 0xab, 0x57, 0x47, 0x1a, 0x2a, 0x41, 0x38, 0x7f, 0x9b, 0x0d, 0x0e, 0xab, 0x22, 0x94, 0x57, 0xc5, 0x02, 0x4b, 0xd6, 0xcf, 0xb7, 0x2d, 0xd7, 0xbb, 0xa2, 0xfe, 0xb8, 0x50, 0xf8, 0x4e, 0x01, 0x8a, 0x03, 0x13, 0x57, 0x0a, 0x84, 0xbf, 0x37, 0x8e, 0xfd, 0x25, 0xa0, 0xae, 0x27, 0x92, 0x24, 0x44, 0x17, 0xbc, 0x17, 0x49, 0xb9, 0xcd, 0x9a, 0x0b, 0xdc, 0x1c, 0x4a, 0x6c, 0xf3, 0x2f, 0x14, 0x7b, 0x37, 0x20, 0x2c, 0x8c, 0xb3, 0x59, 0x07, 0x77, 0x65, 0x9a, 0xec, 0xa0, 0xe2, 0xe7, 0xa7, 0x52, 0x4a, 0x98, 0xce, 0x62, 0x9e, 0xe4, 0x06, 0xc1, 0x5c, 0x51, 0xa6, 0x83, 0xe4, 0x16, 0x7f, 0x0b, 0x74, 0xea, 0x23, 0x05, 0x66, 0xdd, 0xec, 0xe7, 0xae, 0x9d, 0x6f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/state_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/state_proof_new.nr index 41d54d94..e70bbe8d 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/state_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/state_proof_new.nr @@ -48,3 +48,5 @@ global proof_input = ProofInput { depth: 8 } }; + +global proof_input_serialized = proof_input.serialize(); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/storage_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/storage_proof.nr index b222764a..4a3b638c 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/storage_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/storage_proof.nr @@ -1,7 +1,7 @@ -use crate::account_with_storage::StorageProof; +use crate::account_with_storage::LegacyStorageProof; global proofs = [ - StorageProof { + LegacyStorageProof { key: [ 0x82, 0x5e, 0xb4, 0xcd, 0xa6, 0xb8, 0xb4, 0x45, 0x78, 0xc5, 0x57, 0x70, 0x49, 0x6c, 0x59, 0xe6, 0xdc, 0x3c, 0xf2, 0x23, 0x5f, 0x69, 0x0b, 0xcd, 0xaf, 0x51, 0xa6, 0x18, 0x98, 0xce, 0xb2, 0x84 ], diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/storage_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/storage_proof_new.nr index a462ef73..9dfdc20f 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/storage_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/london/crypto_punks/storage_proof_new.nr @@ -1,4 +1,5 @@ use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; +use crate::account_with_storage::{MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_STORAGE_DEPTH_NO_LEAF_M, MAX_STORAGE_VALUE_LEN, MAX_STORAGE_LEAF_LEN}; global proofs = [ ProofInput { @@ -38,3 +39,5 @@ global proofs = [ } } ]; + +global proofs_serialized = proofs.map(|proof: ProofInput| proof.serialize()); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/account.nr b/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/account.nr index 435b4635..e3908d96 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/account.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/account.nr @@ -5,7 +5,7 @@ global address = [ ]; global rlp_encoded_left_padded_account = [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x50, 0x82, 0x02, 0xcb, 0x8a, 0x01, 0x9c, 0x54, 0xc1, 0xcc, 0x8b, 0x1a, 0xd5, 0x99, 0x4d, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x50, 0x82, 0x02, 0xcb, 0x8a, 0x01, 0x9c, 0x54, 0xc1, 0xcc, 0x8b, 0x1a, 0xd5, 0x99, 0x4d, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 ]; global nonce = 715; diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/state_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/state_proof.nr index bb86d584..b6c3ddae 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/state_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/state_proof.nr @@ -1,11 +1,11 @@ -use crate::account::StateProof; +use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: [ 0xd8, 0xda, 0x6b, 0xf2, 0x69, 0x64, 0xaf, 0x9d, 0x7e, 0xed, 0x9e, 0x03, 0xe5, 0x34, 0x15, 0xd3, 0x7a, 0xa9, 0x60, 0x45 ], value: [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x50, 0x82, 0x02, 0xcb, 0x8a, 0x01, 0x9c, 0x54, 0xc1, 0xcc, 0x8b, 0x1a, 0xd5, 0x99, 0x4d, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x50, 0x82, 0x02, 0xcb, 0x8a, 0x01, 0x9c, 0x54, 0xc1, 0xcc, 0x8b, 0x1a, 0xd5, 0x99, 0x4d, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70 ], proof: [ 0xf9, 0x02, 0x11, 0xa0, 0xd0, 0x83, 0x9b, 0x14, 0x27, 0xa9, 0x5b, 0x02, 0x2e, 0xa8, 0xf0, 0xa3, 0xa8, 0x3e, 0x7e, 0x97, 0x66, 0x33, 0x63, 0xd1, 0x8c, 0x8e, 0x2d, 0x68, 0xf3, 0x5a, 0xca, 0xfc, 0xf1, 0x38, 0xfb, 0x8b, 0xa0, 0xb2, 0x3d, 0x4b, 0x9c, 0x60, 0xac, 0x90, 0x15, 0xe3, 0x3e, 0x70, 0xdf, 0xcb, 0x60, 0x4d, 0xd2, 0x0e, 0x40, 0x51, 0x0c, 0x13, 0x6a, 0x22, 0x79, 0xfd, 0xec, 0x1c, 0x12, 0x4c, 0x3f, 0x2d, 0x3c, 0xa0, 0x77, 0x6a, 0x7d, 0xf3, 0x6a, 0x0b, 0xac, 0x0a, 0x3d, 0x4f, 0x41, 0xd9, 0xd8, 0x0a, 0x3c, 0x8a, 0x40, 0xfe, 0x05, 0x4a, 0x4d, 0x63, 0x97, 0x7f, 0x85, 0x5e, 0x95, 0xe5, 0xb5, 0xd7, 0x75, 0x91, 0xa0, 0xdb, 0x5e, 0xb1, 0x83, 0x95, 0xa4, 0x9c, 0xca, 0x1c, 0x5b, 0x88, 0x22, 0x10, 0x77, 0x2d, 0x40, 0x5f, 0xb6, 0xf9, 0x70, 0x46, 0xb0, 0xbd, 0x93, 0x25, 0x1c, 0xef, 0x46, 0xc2, 0x21, 0x10, 0x76, 0xa0, 0x0a, 0x33, 0xaf, 0x12, 0x31, 0x79, 0x70, 0x47, 0xa9, 0xd8, 0x6b, 0x45, 0xd4, 0xd0, 0xfc, 0x8d, 0xa0, 0xee, 0x31, 0x98, 0x83, 0x7f, 0xbc, 0xbb, 0x74, 0x73, 0x25, 0xba, 0x0c, 0x13, 0x04, 0x9c, 0xa0, 0xe7, 0xaf, 0x08, 0xcc, 0x90, 0xc0, 0x68, 0x8c, 0x4c, 0x3f, 0x73, 0xb4, 0x8e, 0x17, 0x6e, 0x62, 0xed, 0x62, 0xe5, 0xae, 0xeb, 0x0b, 0xba, 0x65, 0xc4, 0xdb, 0xd7, 0x11, 0xb8, 0x2a, 0xbd, 0xf0, 0xa0, 0x22, 0xb4, 0x9e, 0x75, 0x6f, 0x00, 0xf8, 0x88, 0x59, 0xb5, 0x33, 0xe6, 0x0d, 0xe5, 0x15, 0x13, 0xb6, 0x75, 0xa0, 0x95, 0x85, 0x6c, 0xee, 0x8f, 0x1a, 0xa9, 0xb9, 0x47, 0xb5, 0xd9, 0x11, 0x2f, 0xa0, 0x74, 0x7b, 0xdc, 0x20, 0xe2, 0xbb, 0x2c, 0x88, 0x57, 0xde, 0xb5, 0xa4, 0x84, 0x2e, 0xca, 0x0b, 0x1a, 0x74, 0xd9, 0x80, 0x21, 0xc6, 0xee, 0x3a, 0x0d, 0xa6, 0xce, 0x7e, 0x61, 0x69, 0x63, 0x27, 0xa0, 0xa5, 0x4f, 0x65, 0x73, 0xb6, 0x96, 0xe6, 0xa1, 0x5c, 0xbc, 0xc9, 0xff, 0xcc, 0x32, 0x01, 0x59, 0x02, 0x70, 0x68, 0x1b, 0xd5, 0x03, 0xb1, 0x1f, 0xf1, 0xd8, 0x74, 0x04, 0xe4, 0xd9, 0xc3, 0xa9, 0xa0, 0x06, 0xbb, 0x22, 0x43, 0x32, 0x53, 0x46, 0xd1, 0xcb, 0x3d, 0x47, 0x70, 0x21, 0x84, 0x2e, 0xee, 0x6f, 0x2b, 0x11, 0xe0, 0x56, 0x62, 0x6f, 0x4c, 0x49, 0x8e, 0x9a, 0x2c, 0x87, 0x8c, 0x9b, 0x3b, 0xa0, 0xd5, 0x5a, 0x57, 0x51, 0x3c, 0xcc, 0xfa, 0xdb, 0x3a, 0xde, 0xa3, 0x28, 0xe6, 0x81, 0xc5, 0xf1, 0xd1, 0xce, 0xe5, 0x28, 0x15, 0x9b, 0xf1, 0x30, 0x39, 0x94, 0x12, 0xb9, 0x40, 0x2a, 0x8e, 0x97, 0xa0, 0xe7, 0x92, 0xf2, 0x05, 0xbd, 0xcd, 0xb4, 0x5d, 0x1a, 0xaf, 0x4c, 0x22, 0x44, 0x30, 0x2c, 0xb8, 0x7e, 0x0a, 0x22, 0xf2, 0x4f, 0x23, 0x25, 0xa1, 0x4a, 0x00, 0x20, 0x3c, 0xfa, 0x05, 0x97, 0x8e, 0xa0, 0x89, 0x0c, 0x78, 0x9c, 0x20, 0x2b, 0x85, 0x72, 0x67, 0x2a, 0x74, 0xf0, 0x58, 0x8f, 0x1d, 0x4e, 0x99, 0x3e, 0x7d, 0x6f, 0x01, 0x09, 0x52, 0x5f, 0x20, 0x30, 0xdc, 0x14, 0x5b, 0x35, 0xcf, 0xb0, 0xa0, 0xda, 0x2f, 0x2f, 0x1b, 0xc4, 0xe5, 0x2e, 0x1a, 0x2b, 0x70, 0x84, 0xcd, 0xef, 0x8b, 0xc8, 0x9b, 0x75, 0x67, 0x15, 0xae, 0x66, 0x65, 0x4e, 0xc2, 0x1e, 0x8c, 0xcf, 0x6d, 0x17, 0xfc, 0x2f, 0x21, 0xa0, 0x6b, 0xb2, 0x17, 0xc1, 0xe3, 0x63, 0xae, 0x92, 0xef, 0xd1, 0xdc, 0x7b, 0x64, 0x35, 0xe1, 0x6b, 0x8c, 0xc4, 0xf0, 0x3f, 0xcd, 0x55, 0xcd, 0x98, 0x11, 0x55, 0x88, 0xc8, 0x10, 0x17, 0xfe, 0x82, 0xa0, 0xa9, 0xd2, 0x80, 0xbd, 0x57, 0x13, 0xbb, 0x0a, 0x4b, 0x99, 0x83, 0xb0, 0xb6, 0x0f, 0x00, 0x40, 0x41, 0x10, 0xbf, 0x09, 0xb0, 0x3c, 0x41, 0x0b, 0x52, 0x27, 0x7b, 0xc0, 0x65, 0x95, 0x3e, 0x6d, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xbe, 0xef, 0x5d, 0x98, 0xea, 0x75, 0xf9, 0x8b, 0x63, 0x27, 0x90, 0x44, 0x47, 0x33, 0xac, 0xe1, 0x73, 0x87, 0xd3, 0x7c, 0x79, 0x63, 0x74, 0x48, 0x2e, 0x94, 0x35, 0xb1, 0x8f, 0x5f, 0xf1, 0x18, 0xa0, 0x01, 0x7d, 0xe7, 0x0b, 0x9c, 0x89, 0x73, 0x92, 0x33, 0xf6, 0x8b, 0x9e, 0x2d, 0xf0, 0xdc, 0xe9, 0x83, 0x95, 0x79, 0xb5, 0xbe, 0x0d, 0xd1, 0x40, 0xa5, 0x24, 0xe5, 0xc2, 0xa6, 0xc5, 0xde, 0xad, 0xa0, 0x60, 0x26, 0x56, 0xc0, 0x38, 0x65, 0x53, 0x67, 0x8e, 0xc3, 0x05, 0x0f, 0xaf, 0x28, 0x26, 0xee, 0xb0, 0x99, 0xa0, 0x3f, 0x82, 0x6e, 0x21, 0xa5, 0xf7, 0xa6, 0xb4, 0xf0, 0x6d, 0x20, 0x1a, 0x13, 0xa0, 0x3e, 0x79, 0xa6, 0xae, 0xae, 0x73, 0xa2, 0x09, 0x9f, 0x9b, 0x1c, 0x12, 0x33, 0xf8, 0xd8, 0xdb, 0x9c, 0x3c, 0xa7, 0xcc, 0xf3, 0xb9, 0x12, 0xac, 0xcc, 0xaa, 0x6a, 0x92, 0xf0, 0x5f, 0x79, 0xbc, 0xa0, 0x9a, 0x79, 0x14, 0xbb, 0x03, 0x37, 0xbb, 0x0c, 0x85, 0xae, 0x3f, 0x04, 0xae, 0xa9, 0xa4, 0x7b, 0x8e, 0x4e, 0xb8, 0x70, 0x9a, 0x9e, 0x78, 0x46, 0xa3, 0x32, 0x3d, 0x74, 0x2c, 0xcc, 0x04, 0x29, 0xa0, 0xf1, 0xec, 0xec, 0x77, 0xc6, 0xa5, 0x48, 0x05, 0x18, 0x3b, 0x6b, 0xe9, 0xd8, 0x92, 0x12, 0xe9, 0x71, 0x9a, 0x76, 0xe8, 0xab, 0x42, 0x83, 0xd6, 0x78, 0x38, 0xb8, 0x60, 0xb8, 0xd9, 0x83, 0x28, 0xa0, 0xb8, 0x11, 0x1d, 0xf7, 0x13, 0x82, 0xd1, 0xb7, 0x2c, 0x36, 0x09, 0x80, 0x59, 0xc1, 0x23, 0x9e, 0xfc, 0x8e, 0xf5, 0x3d, 0x98, 0xad, 0x45, 0x92, 0x0f, 0x92, 0x37, 0x5c, 0x96, 0x62, 0x06, 0xa4, 0xa0, 0xb9, 0xe3, 0x45, 0x45, 0xce, 0x6b, 0xed, 0xf5, 0x3a, 0xe6, 0xb9, 0x1e, 0x59, 0x3d, 0xbf, 0xa4, 0x94, 0x8b, 0x51, 0x84, 0xff, 0xfd, 0x98, 0x79, 0x69, 0x5b, 0xa9, 0xd1, 0x4f, 0xf2, 0xa5, 0xa5, 0xa0, 0x31, 0x75, 0xe5, 0xbf, 0x3d, 0x5d, 0x03, 0xaf, 0xa8, 0x8f, 0x25, 0x27, 0x49, 0xb0, 0x40, 0x20, 0xdd, 0x8c, 0xca, 0x9c, 0xcd, 0x39, 0xca, 0x96, 0xb8, 0x6a, 0x64, 0xb2, 0x33, 0x15, 0x99, 0xf7, 0xa0, 0xf2, 0x54, 0xc7, 0xa3, 0x1a, 0x61, 0xd9, 0xe7, 0x42, 0x9c, 0x26, 0xdf, 0xb5, 0x75, 0xc6, 0xac, 0xeb, 0x44, 0xed, 0x40, 0x25, 0xd0, 0x7e, 0x51, 0x73, 0x72, 0x96, 0x73, 0x0d, 0xc1, 0x67, 0x91, 0xa0, 0x99, 0x43, 0x98, 0xd0, 0xae, 0x9f, 0x56, 0xb3, 0xc2, 0x89, 0xd8, 0x58, 0x6b, 0x42, 0x89, 0xc6, 0x9e, 0xd3, 0x76, 0x01, 0x0b, 0x17, 0xcb, 0x6a, 0xa8, 0x2e, 0xc9, 0x25, 0xcc, 0xb2, 0x9d, 0x9b, 0xa0, 0x00, 0x63, 0x66, 0x7d, 0xcf, 0x5f, 0x7b, 0x73, 0x99, 0x4a, 0xff, 0xea, 0x6e, 0x98, 0xdd, 0x20, 0xde, 0x61, 0xcb, 0x7a, 0xb6, 0xdd, 0x28, 0x49, 0x0b, 0x52, 0xbc, 0x25, 0x11, 0x3b, 0x92, 0x5f, 0xa0, 0x07, 0x12, 0x74, 0xda, 0x1b, 0x88, 0x65, 0xa5, 0xd6, 0x5f, 0x30, 0xbc, 0xeb, 0x51, 0x36, 0x01, 0x8e, 0x09, 0x1a, 0xf8, 0xa1, 0x66, 0xa6, 0x3f, 0x71, 0xf6, 0x06, 0x6b, 0x29, 0x1c, 0x6d, 0x48, 0xa0, 0x89, 0xb4, 0xf8, 0xaa, 0x0d, 0xfc, 0xd7, 0xba, 0x6d, 0x09, 0x30, 0xee, 0xbc, 0xac, 0xbe, 0x15, 0x94, 0x8e, 0xe6, 0x9d, 0xe0, 0x50, 0x83, 0xf5, 0x6d, 0x67, 0xd4, 0x58, 0x5f, 0x3a, 0x6f, 0x18, 0xa0, 0xe4, 0x68, 0x22, 0x7f, 0xcd, 0xe3, 0xf7, 0x81, 0x14, 0x59, 0x27, 0x72, 0x59, 0xa3, 0xca, 0x27, 0x77, 0x78, 0x99, 0x5d, 0x5d, 0xea, 0xe3, 0x3d, 0x0a, 0xb8, 0x33, 0xa0, 0xfe, 0x4c, 0x7c, 0x3a, 0xa0, 0xa1, 0xf5, 0x57, 0x17, 0x01, 0xbe, 0x00, 0x04, 0xcb, 0x83, 0x8f, 0xd7, 0x6b, 0x10, 0xc3, 0xe4, 0x63, 0xaa, 0xda, 0xfd, 0x80, 0xd7, 0xa5, 0xd6, 0xbe, 0x5c, 0x69, 0x63, 0xa7, 0x21, 0x0e, 0x54, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xf0, 0x9f, 0x67, 0x31, 0xce, 0x53, 0xd0, 0x09, 0x50, 0x39, 0xf8, 0x2b, 0x5c, 0x18, 0xe4, 0xdb, 0x85, 0x3c, 0x43, 0x2c, 0x12, 0xf4, 0x8e, 0xf8, 0x20, 0x6c, 0x81, 0x37, 0x16, 0xa0, 0x08, 0x73, 0xa0, 0x22, 0x11, 0xee, 0x84, 0x3f, 0x05, 0x4a, 0xd6, 0x72, 0x6a, 0xaf, 0x0c, 0xe4, 0xa1, 0xa6, 0xe7, 0xb2, 0x25, 0xda, 0xdd, 0x19, 0x67, 0x67, 0x98, 0x81, 0xa4, 0xda, 0xd9, 0xf0, 0xd2, 0x76, 0xd7, 0xa0, 0xe8, 0xfd, 0x11, 0xe9, 0xde, 0x48, 0x30, 0xd3, 0x55, 0x6b, 0xad, 0xa5, 0x43, 0xd5, 0xe2, 0xbc, 0x82, 0x5c, 0xe3, 0x79, 0xcf, 0x95, 0xda, 0xc4, 0x73, 0xb3, 0xc8, 0xfc, 0xd7, 0xc9, 0x35, 0xdb, 0xa0, 0x8f, 0x9e, 0xcd, 0x8b, 0xb0, 0xf6, 0x3b, 0x20, 0x55, 0xbe, 0x9c, 0xde, 0xcd, 0xd8, 0xe5, 0x3b, 0x7e, 0x1b, 0x25, 0xfd, 0xa6, 0x92, 0xd5, 0x1e, 0xc7, 0xa3, 0x9c, 0x99, 0x65, 0x9b, 0x3d, 0x45, 0xa0, 0x97, 0x58, 0x7e, 0xb3, 0x2b, 0x86, 0x03, 0xd6, 0x61, 0x3a, 0xe4, 0x3a, 0xb5, 0x11, 0x6a, 0x3f, 0x12, 0xe6, 0xf3, 0xf5, 0xe0, 0x80, 0x56, 0x2b, 0xbc, 0x6f, 0xd3, 0x2f, 0x8c, 0xbf, 0xd0, 0xa6, 0xa0, 0xfc, 0xd5, 0x56, 0x68, 0x87, 0xb4, 0xae, 0x28, 0x50, 0xad, 0xa9, 0x5b, 0xce, 0xec, 0x07, 0x0e, 0x88, 0xe0, 0xad, 0xbf, 0x36, 0xc5, 0x0b, 0xfd, 0xa3, 0xbd, 0xe6, 0x6a, 0x8f, 0x1c, 0x54, 0x84, 0xa0, 0x05, 0xf8, 0x3e, 0x3f, 0xeb, 0x16, 0x83, 0xaf, 0x58, 0xdc, 0x32, 0x2d, 0x41, 0xb6, 0x1d, 0x57, 0x4b, 0xd3, 0x52, 0xde, 0xb4, 0x3d, 0xd6, 0x8e, 0x39, 0x83, 0xad, 0xc4, 0xf9, 0x77, 0x2d, 0x51, 0xa0, 0xf6, 0x02, 0x41, 0x8f, 0x71, 0xec, 0x42, 0x58, 0x52, 0x59, 0x7a, 0x65, 0x73, 0xb1, 0x54, 0xa8, 0x60, 0x3e, 0xc8, 0x6c, 0xfd, 0x5d, 0x7d, 0xc5, 0x9d, 0x89, 0xe1, 0x3c, 0x8a, 0xdb, 0xe7, 0xe1, 0xa0, 0xdb, 0x00, 0x6e, 0x46, 0x72, 0xc0, 0xb0, 0xd2, 0x3c, 0x25, 0x0b, 0x1a, 0x74, 0xd6, 0xc0, 0x4f, 0x6b, 0xff, 0xc5, 0x95, 0x63, 0x04, 0x91, 0x7c, 0xb9, 0x35, 0x64, 0xae, 0xdb, 0xa2, 0x31, 0x53, 0xa0, 0x72, 0xf2, 0x99, 0xca, 0x36, 0xc8, 0x76, 0x41, 0xa3, 0x13, 0x03, 0xda, 0xf3, 0x38, 0x84, 0x65, 0xdf, 0xcd, 0xfe, 0xf0, 0x2d, 0x16, 0x08, 0xbe, 0x9d, 0x55, 0x00, 0xcc, 0xb5, 0x42, 0x8a, 0x48, 0xa0, 0x93, 0x10, 0xdd, 0x20, 0x5d, 0x3b, 0xa8, 0x89, 0x09, 0xfa, 0x41, 0xf5, 0x71, 0x4d, 0x10, 0x1c, 0x0b, 0x78, 0x15, 0x60, 0x6d, 0x9e, 0x5b, 0xf3, 0x57, 0x56, 0xdc, 0xb9, 0x9b, 0x6c, 0x0c, 0xaf, 0xa0, 0xff, 0x45, 0x38, 0x21, 0x2a, 0x77, 0xca, 0x62, 0xc1, 0x3c, 0x76, 0x73, 0xfd, 0x44, 0x14, 0x0e, 0x5e, 0x0c, 0x67, 0x4b, 0xe1, 0x24, 0x35, 0xbd, 0xf8, 0x3a, 0xff, 0x7e, 0x44, 0x63, 0x16, 0xe2, 0xa0, 0x38, 0x87, 0xca, 0x70, 0xd8, 0x5c, 0x91, 0x57, 0xf1, 0x27, 0x47, 0x42, 0x3e, 0xa4, 0x59, 0xe9, 0x2f, 0xd3, 0x9b, 0xe7, 0x4f, 0xaf, 0x2b, 0x8e, 0xee, 0xda, 0x6b, 0x88, 0xe1, 0xb8, 0x2d, 0x60, 0xa0, 0xa3, 0xbd, 0xc3, 0xc0, 0x1a, 0x20, 0x97, 0x0d, 0xaa, 0x5c, 0xbe, 0xd5, 0xbb, 0x28, 0xe6, 0x93, 0xbf, 0xc7, 0xd4, 0xf5, 0x2b, 0x05, 0x2c, 0x07, 0x17, 0xcd, 0x31, 0x7c, 0x39, 0xd4, 0x01, 0xc9, 0xa0, 0x3d, 0x1a, 0x4e, 0xce, 0xee, 0x5b, 0x61, 0x2e, 0x0d, 0xa3, 0x3d, 0x71, 0x7f, 0xc0, 0xf9, 0x38, 0xa3, 0x9f, 0xd0, 0x32, 0x4c, 0x94, 0x17, 0xf1, 0x77, 0xb3, 0x3f, 0xfc, 0xec, 0x46, 0x96, 0xd3, 0xa0, 0xae, 0x1a, 0x4b, 0x14, 0x20, 0x5a, 0x30, 0x1a, 0x8e, 0xd4, 0x5b, 0xd8, 0xfa, 0x55, 0x94, 0xcc, 0x8e, 0xfd, 0x8a, 0xe5, 0x30, 0xab, 0x93, 0xe5, 0x34, 0x97, 0x48, 0xf3, 0x3b, 0x8f, 0xff, 0x3b, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x88, 0x84, 0xa8, 0x59, 0x82, 0xc1, 0xff, 0x71, 0x45, 0x00, 0xab, 0xb1, 0xf6, 0x1d, 0x63, 0xff, 0x55, 0x56, 0x16, 0xf9, 0xce, 0x06, 0x04, 0x14, 0x84, 0x46, 0x10, 0x62, 0x8b, 0xaf, 0xef, 0xf0, 0xa0, 0x48, 0x25, 0xef, 0x85, 0x44, 0x0a, 0x57, 0x9e, 0xce, 0x97, 0x09, 0x7d, 0x64, 0x28, 0x0a, 0x0b, 0x6b, 0x44, 0x4c, 0x91, 0x74, 0x1b, 0x4a, 0x85, 0x5d, 0x95, 0xe5, 0xf5, 0x0c, 0xcb, 0x07, 0xbc, 0xa0, 0xba, 0xdf, 0x7b, 0x64, 0x0c, 0xe2, 0x9a, 0x56, 0xc1, 0x35, 0x62, 0x5f, 0x35, 0x8d, 0xe7, 0x59, 0xcf, 0x32, 0xb7, 0x7b, 0xa5, 0x2a, 0xab, 0x35, 0x4c, 0xc5, 0xd9, 0x16, 0x03, 0x98, 0x67, 0x2a, 0xa0, 0xfe, 0x62, 0x4c, 0x27, 0xa9, 0xdc, 0x2c, 0xd0, 0x71, 0x21, 0x5f, 0xde, 0x64, 0x60, 0xf0, 0xa1, 0xfa, 0x4f, 0x28, 0x83, 0x41, 0x73, 0x31, 0x7e, 0xdf, 0xc9, 0x20, 0x8b, 0x91, 0x78, 0xa1, 0x53, 0xa0, 0x64, 0x1a, 0x11, 0x0e, 0x81, 0xd9, 0xec, 0xaf, 0x3f, 0x64, 0x96, 0xbf, 0x65, 0x04, 0x4f, 0x5a, 0x43, 0x4e, 0x7f, 0x54, 0x4c, 0xc1, 0xc9, 0xb8, 0xe2, 0x55, 0x6f, 0x54, 0x18, 0xdd, 0x6f, 0xdc, 0xa0, 0x82, 0x3e, 0x09, 0x1d, 0xcf, 0xf6, 0x12, 0xe3, 0x20, 0xae, 0x8e, 0xd7, 0x49, 0x78, 0xea, 0x74, 0x3a, 0x25, 0x70, 0x83, 0x0f, 0x88, 0x45, 0x11, 0xad, 0xbd, 0xc9, 0xfa, 0xc6, 0x1c, 0x69, 0x12, 0xa0, 0x71, 0xab, 0x91, 0x52, 0x11, 0xfb, 0xd9, 0xab, 0x2c, 0xcf, 0x2b, 0xf3, 0x24, 0xcc, 0x45, 0x0b, 0xe9, 0x36, 0x23, 0x5e, 0xf3, 0x19, 0x63, 0xfa, 0x39, 0x41, 0x19, 0x7c, 0xbd, 0x07, 0xda, 0x7c, 0xa0, 0x84, 0x1e, 0xba, 0x1f, 0x07, 0x54, 0x31, 0x32, 0xab, 0xd3, 0x81, 0xfb, 0xb9, 0x54, 0xe3, 0xc6, 0x06, 0x91, 0xda, 0xd0, 0x50, 0xeb, 0x2c, 0xb2, 0xf6, 0x59, 0xad, 0x92, 0x0d, 0xdd, 0xc1, 0x02, 0xa0, 0x4d, 0x7f, 0xdb, 0xfd, 0x73, 0x21, 0xa1, 0xd4, 0x72, 0x34, 0xb9, 0xab, 0xd0, 0xf3, 0xb8, 0x84, 0x5f, 0xd9, 0xf6, 0x7d, 0x69, 0xe4, 0xe5, 0x5a, 0x5b, 0x7f, 0x30, 0xda, 0x1b, 0x4d, 0x3a, 0xe7, 0xa0, 0xc1, 0x92, 0xbf, 0xa6, 0x7d, 0xe7, 0x02, 0x84, 0xef, 0x72, 0x01, 0xc3, 0x0d, 0xc2, 0x62, 0x90, 0x71, 0x2c, 0xec, 0x81, 0x3e, 0x8b, 0x1a, 0x43, 0xac, 0xd4, 0xd6, 0x14, 0x26, 0xe0, 0x55, 0x22, 0xa0, 0x41, 0xfc, 0xd8, 0x4c, 0xc9, 0x0e, 0x24, 0xd0, 0x2a, 0xea, 0x4d, 0x41, 0xf6, 0x87, 0xa5, 0x8e, 0xd8, 0xc5, 0xf4, 0x14, 0x4b, 0x67, 0xa2, 0x63, 0x16, 0x22, 0xce, 0x8a, 0xa7, 0x8d, 0x4b, 0x9c, 0xa0, 0x01, 0xfb, 0x4c, 0xd6, 0xd2, 0x99, 0x41, 0x14, 0x62, 0x57, 0xe6, 0x5e, 0xd9, 0xe6, 0x1a, 0x13, 0xa6, 0x5e, 0xec, 0xfb, 0x8d, 0x86, 0x24, 0xe0, 0x25, 0xde, 0x7e, 0xf0, 0x08, 0xb0, 0x6d, 0xd1, 0xa0, 0xa1, 0xa7, 0x01, 0xb5, 0xba, 0xac, 0xb3, 0x3f, 0xed, 0x30, 0x23, 0x13, 0x33, 0xe5, 0x3f, 0x86, 0x99, 0x58, 0xb9, 0x8e, 0x90, 0x2b, 0x75, 0xdc, 0x3a, 0xc0, 0x19, 0x65, 0x6e, 0x29, 0x69, 0xba, 0xa0, 0x04, 0xbf, 0x05, 0xe5, 0x66, 0x7c, 0xbe, 0x60, 0x39, 0x10, 0x3d, 0x72, 0xa1, 0xdc, 0xcb, 0x7e, 0x48, 0x3b, 0x55, 0x02, 0x6e, 0x2a, 0xdf, 0x71, 0xd6, 0x6a, 0xb6, 0xea, 0xe5, 0x16, 0x60, 0x93, 0xa0, 0x2f, 0x6a, 0x0d, 0x07, 0xca, 0xb6, 0xbc, 0xf1, 0x67, 0xdb, 0x2f, 0x15, 0xa1, 0x7d, 0xf2, 0x6e, 0x47, 0xe3, 0x6c, 0xbd, 0xa2, 0x94, 0x21, 0x59, 0xd7, 0x17, 0x89, 0xc9, 0xdc, 0x7f, 0xee, 0x42, 0xa0, 0x30, 0xec, 0x68, 0xaf, 0x45, 0x11, 0x48, 0xce, 0x84, 0x6f, 0x83, 0x72, 0x9e, 0x18, 0x1a, 0x74, 0xef, 0x38, 0x18, 0xf2, 0x55, 0x3f, 0xb2, 0xa0, 0xda, 0xec, 0xd2, 0x6c, 0x21, 0xa8, 0xb0, 0xec, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x0b, 0x50, 0xbe, 0xfd, 0xf8, 0x38, 0xda, 0xe3, 0x95, 0xb8, 0x6f, 0x86, 0x0c, 0x0b, 0xe0, 0xcd, 0x17, 0x69, 0x67, 0x0d, 0x6f, 0x75, 0x66, 0x60, 0x3b, 0xfa, 0xc1, 0x04, 0xd2, 0xa2, 0x30, 0x73, 0xa0, 0xd4, 0xdb, 0x96, 0x1d, 0x11, 0x50, 0x5c, 0xb9, 0x69, 0xe3, 0x2b, 0x13, 0x74, 0xf2, 0xd2, 0xfe, 0xe5, 0x42, 0x4b, 0xf1, 0x99, 0x63, 0x93, 0x84, 0x0a, 0xdd, 0xd5, 0xdc, 0xe2, 0x07, 0x48, 0xa8, 0xa0, 0x77, 0x4c, 0x05, 0x9e, 0x30, 0x4c, 0x8d, 0x00, 0xcf, 0x5d, 0x96, 0xc7, 0x26, 0x81, 0x71, 0xa3, 0x87, 0x40, 0x3f, 0x5f, 0x70, 0x4f, 0x93, 0x71, 0xf3, 0x2b, 0x45, 0x37, 0xd0, 0x4c, 0x25, 0x2d, 0xa0, 0x7b, 0xd6, 0x89, 0xf5, 0x60, 0xc6, 0x81, 0x61, 0xbc, 0x7c, 0x43, 0x10, 0xca, 0x3d, 0x55, 0x80, 0xe6, 0x1a, 0xa6, 0xff, 0x64, 0xcc, 0x46, 0x73, 0xe3, 0xbd, 0x0e, 0x42, 0xe8, 0x96, 0x07, 0x7d, 0xa0, 0x05, 0xfe, 0x17, 0xaf, 0x56, 0x9e, 0x44, 0x37, 0x62, 0xfe, 0x10, 0xe0, 0xbc, 0xcb, 0x65, 0xdf, 0x21, 0x83, 0xd7, 0x4b, 0x77, 0x84, 0x61, 0x4b, 0x02, 0x13, 0x91, 0x14, 0x02, 0x33, 0x0f, 0x90, 0xa0, 0x70, 0x7e, 0xd6, 0x6a, 0xba, 0xb9, 0xc3, 0x26, 0xcb, 0xa5, 0x87, 0x73, 0x3d, 0xd4, 0x7b, 0x38, 0x60, 0x6e, 0x2c, 0x22, 0x39, 0x4e, 0x93, 0x01, 0x98, 0x3b, 0x00, 0x77, 0x8f, 0x3f, 0x9b, 0x82, 0xa0, 0x76, 0xa0, 0x84, 0xc8, 0x99, 0x3c, 0xc7, 0x16, 0xc3, 0x04, 0x0b, 0x74, 0xae, 0xb1, 0x13, 0xa7, 0x84, 0x20, 0x34, 0x9a, 0xfb, 0x80, 0x37, 0xd6, 0x82, 0xa4, 0x59, 0x85, 0xbe, 0x34, 0xd5, 0x20, 0xa0, 0x5b, 0x67, 0xcb, 0x05, 0x72, 0x23, 0xdc, 0x5e, 0x4f, 0xc2, 0x36, 0xfa, 0x49, 0xe7, 0x00, 0x3c, 0xc8, 0x8f, 0xd1, 0xee, 0x50, 0xf6, 0xb9, 0x7b, 0xd8, 0xe8, 0xd9, 0xa0, 0xc5, 0x86, 0x63, 0x35, 0xa0, 0x26, 0x43, 0xef, 0xe9, 0x06, 0x7f, 0x3e, 0x5e, 0x35, 0x89, 0x94, 0x5f, 0x49, 0xa4, 0x75, 0x80, 0x06, 0xb4, 0x59, 0xe6, 0x67, 0xf5, 0xf3, 0xb7, 0xd6, 0xfb, 0x8f, 0x5c, 0x04, 0x75, 0x3c, 0xc3, 0xa0, 0x01, 0xf4, 0xf5, 0x8e, 0xa5, 0x61, 0xf3, 0x83, 0x38, 0xe5, 0x10, 0x7e, 0x4b, 0x46, 0x9e, 0x07, 0x85, 0x85, 0x10, 0xdd, 0x67, 0x67, 0x2e, 0x0c, 0x6a, 0xa7, 0x5e, 0xb5, 0x80, 0x8f, 0x78, 0x08, 0xa0, 0x01, 0xf0, 0xc6, 0x37, 0xdc, 0x9a, 0xcc, 0x3c, 0xed, 0x8f, 0x7a, 0x51, 0xa5, 0x5f, 0x56, 0x3f, 0xbe, 0xcd, 0xa0, 0x51, 0x30, 0x9c, 0x93, 0x79, 0x52, 0xdb, 0xf5, 0x2f, 0x13, 0x98, 0x93, 0xc2, 0xa0, 0x0a, 0x20, 0x87, 0x2a, 0x87, 0x15, 0xe6, 0x9e, 0x4b, 0x79, 0x28, 0xf4, 0x93, 0xc0, 0xcd, 0xa4, 0xda, 0x84, 0x7f, 0x48, 0x32, 0x2a, 0x4e, 0x24, 0xe1, 0xeb, 0xe4, 0x08, 0xde, 0x5c, 0x23, 0x2a, 0xa0, 0xc2, 0xdd, 0xed, 0x11, 0x87, 0x37, 0xd8, 0x11, 0x95, 0xf1, 0x13, 0xc2, 0xab, 0x8f, 0x29, 0xf4, 0x54, 0x3b, 0x81, 0xe5, 0x75, 0x89, 0x10, 0x8d, 0x16, 0x54, 0x2f, 0xc7, 0x08, 0x47, 0xd5, 0xf8, 0xa0, 0x4b, 0xc3, 0xbc, 0x3a, 0x9c, 0xc0, 0xcf, 0x31, 0xa0, 0xf7, 0x31, 0x53, 0xc2, 0x53, 0xe4, 0xbb, 0xb6, 0xd2, 0x71, 0x85, 0x6d, 0x81, 0x1e, 0x3c, 0x70, 0x1b, 0xac, 0x94, 0x9c, 0xe5, 0xff, 0x61, 0xa0, 0x04, 0x41, 0x28, 0x6e, 0x4f, 0x8f, 0x57, 0xbb, 0x6c, 0xb3, 0x97, 0xe9, 0xfd, 0x6d, 0x77, 0x71, 0x78, 0x20, 0x31, 0x6d, 0xb1, 0x03, 0x60, 0xd5, 0x43, 0xdc, 0xf7, 0x25, 0x21, 0x7b, 0x54, 0xa3, 0xa0, 0xf4, 0x92, 0x8d, 0xea, 0x7c, 0xb8, 0xe2, 0xc4, 0x66, 0xe7, 0x8d, 0x0b, 0x0c, 0xf1, 0x71, 0xd9, 0x4d, 0xe6, 0xe6, 0xa5, 0xce, 0xa6, 0x4b, 0x3a, 0x0d, 0x8b, 0xf8, 0x7c, 0x31, 0xe6, 0xab, 0xfd, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x37, 0x36, 0x33, 0xbe, 0xd1, 0x26, 0xfd, 0xb4, 0x3f, 0xcc, 0x10, 0xeb, 0x55, 0x39, 0xe4, 0x82, 0x94, 0x76, 0x2b, 0xef, 0xbc, 0xc6, 0xd5, 0x77, 0x75, 0x07, 0xab, 0x41, 0xa4, 0x29, 0x7c, 0xc8, 0xa0, 0xad, 0x8b, 0xc6, 0x49, 0x36, 0xdc, 0xce, 0xcb, 0x57, 0x5b, 0x18, 0xfd, 0x8d, 0xa6, 0xa0, 0x78, 0x83, 0x49, 0xa4, 0xad, 0xaf, 0x0b, 0x9d, 0xe3, 0x21, 0x4e, 0x9f, 0xce, 0xd3, 0xf6, 0xb0, 0x06, 0xa0, 0x1e, 0xca, 0xf7, 0xc9, 0x78, 0xfd, 0x53, 0xaf, 0x9a, 0xa9, 0xe5, 0x8a, 0x3f, 0x07, 0xb6, 0x0d, 0xda, 0x83, 0xda, 0xa0, 0x35, 0xdb, 0xd3, 0x5f, 0xc9, 0x7f, 0xa9, 0x93, 0x76, 0xad, 0x7e, 0x50, 0xa0, 0xff, 0x72, 0x09, 0x77, 0xf2, 0x74, 0xff, 0xda, 0xf8, 0x18, 0xfe, 0xdb, 0xb9, 0xfc, 0x7a, 0xed, 0x0f, 0xe4, 0xa6, 0xf2, 0x30, 0xff, 0x21, 0xa1, 0x6c, 0x2b, 0x2e, 0x90, 0x83, 0x60, 0xe3, 0xc4, 0xa0, 0xa6, 0xcd, 0x24, 0x52, 0x1e, 0x53, 0xe3, 0x57, 0xeb, 0x07, 0x2f, 0xe2, 0xfa, 0x75, 0x4a, 0xac, 0xa8, 0xf5, 0xf8, 0x88, 0xb1, 0x87, 0x02, 0x26, 0x99, 0x45, 0x25, 0x8c, 0x7d, 0x92, 0x7f, 0x08, 0xa0, 0xdd, 0x47, 0xe2, 0xff, 0x38, 0xc9, 0x45, 0xf8, 0x56, 0x8a, 0x6a, 0x40, 0xa6, 0x4f, 0xa8, 0x72, 0xd1, 0xe0, 0x3e, 0x02, 0x2c, 0x02, 0x53, 0xdd, 0x37, 0xe5, 0x2a, 0x65, 0x24, 0x01, 0xb6, 0x4e, 0xa0, 0xde, 0xcd, 0x87, 0x67, 0xf9, 0x0e, 0x23, 0x2c, 0x89, 0xc1, 0xc1, 0x55, 0xa0, 0x25, 0x12, 0x3a, 0x71, 0x5d, 0x68, 0x96, 0x69, 0x69, 0x26, 0x81, 0x74, 0x93, 0xf1, 0xc9, 0x6f, 0xab, 0xbe, 0xf1, 0xa0, 0x49, 0x81, 0x42, 0x63, 0x8e, 0xc5, 0xc0, 0xd6, 0xd1, 0x32, 0xbc, 0xe2, 0xd4, 0x1e, 0x46, 0x9f, 0xb2, 0xc5, 0x67, 0x9f, 0x4e, 0xdf, 0x53, 0xec, 0xce, 0x3f, 0x59, 0x81, 0x93, 0xf8, 0xc9, 0x9d, 0xa0, 0xca, 0x26, 0x2d, 0xb4, 0xba, 0x6b, 0x46, 0xaa, 0x7d, 0xea, 0xa5, 0x75, 0x86, 0xd7, 0x1a, 0xfc, 0x48, 0xd3, 0xb2, 0x02, 0x81, 0xd9, 0x58, 0x28, 0x57, 0xdd, 0x13, 0x26, 0xb5, 0xf6, 0x56, 0x6a, 0xa0, 0x53, 0x3e, 0x07, 0x44, 0x25, 0x00, 0x3a, 0x86, 0xac, 0xe7, 0x2d, 0x6a, 0xa4, 0xd7, 0x31, 0x7c, 0xd8, 0xa8, 0x87, 0x62, 0xdb, 0xf8, 0x92, 0xa0, 0xe8, 0xdf, 0x41, 0x3e, 0xe4, 0xcc, 0x58, 0xf4, 0xa0, 0x0d, 0x1e, 0x7b, 0xac, 0x6e, 0xdf, 0x82, 0x50, 0x3a, 0x0e, 0x68, 0x3e, 0xf3, 0x5f, 0xed, 0x19, 0xd2, 0x73, 0x4e, 0xe9, 0x7a, 0x44, 0xa0, 0xb4, 0x15, 0xb0, 0x2f, 0x49, 0xee, 0x03, 0x40, 0x5c, 0xa0, 0x18, 0xe1, 0x63, 0xac, 0x5a, 0x87, 0x1b, 0xef, 0x1f, 0x36, 0x07, 0xf9, 0x66, 0x67, 0xfb, 0x73, 0xbb, 0x5a, 0x28, 0xc3, 0x8d, 0x18, 0x81, 0x16, 0x46, 0x86, 0x42, 0x14, 0x0b, 0x12, 0x02, 0x51, 0xa0, 0xe7, 0xd9, 0x91, 0x7d, 0xa4, 0x1b, 0x22, 0x53, 0x2c, 0xa1, 0x87, 0x5c, 0x60, 0x4b, 0xea, 0xe7, 0x65, 0x97, 0x86, 0x30, 0x1c, 0x42, 0x31, 0x49, 0x2e, 0xa8, 0xbf, 0x5a, 0xd9, 0x3d, 0xe2, 0x42, 0xa0, 0x0e, 0x4b, 0x1d, 0x79, 0x61, 0x43, 0xe6, 0xfe, 0xa3, 0x2f, 0x96, 0xcb, 0x24, 0x15, 0x04, 0x69, 0x4b, 0xe0, 0xe9, 0x89, 0x77, 0x19, 0x3f, 0xcd, 0x32, 0x11, 0x1b, 0x4d, 0xd3, 0x20, 0xe2, 0x02, 0xa0, 0x49, 0xd7, 0x9e, 0xb3, 0x2d, 0x75, 0x8d, 0x17, 0xfa, 0xb6, 0x2d, 0xdd, 0x39, 0x1f, 0xcc, 0xba, 0x97, 0x47, 0x31, 0xec, 0xc4, 0x8e, 0x40, 0xc0, 0xf9, 0x5c, 0x3f, 0x2f, 0x67, 0x3f, 0x95, 0x71, 0xa0, 0x3f, 0x23, 0x99, 0x93, 0x02, 0x9c, 0x1f, 0x99, 0xb0, 0xd0, 0x8f, 0xcc, 0x26, 0xcc, 0xa6, 0x99, 0xc3, 0x79, 0x85, 0x9e, 0x12, 0xc4, 0x93, 0xc9, 0xf8, 0x7c, 0xb3, 0xbc, 0xa0, 0xbb, 0x31, 0x1e, 0x80, 0xf8, 0x91, 0x80, 0x80, 0x80, 0x80, 0xa0, 0x62, 0xad, 0x32, 0xd4, 0xe7, 0x6c, 0x4f, 0x5c, 0xb5, 0xee, 0x4b, 0x4d, 0x9a, 0xa4, 0x05, 0x92, 0x67, 0xab, 0xc3, 0xb8, 0x89, 0x4f, 0xec, 0xaa, 0x9e, 0x8c, 0x3e, 0xd9, 0x8e, 0x6f, 0xd6, 0xc5, 0x80, 0x80, 0xa0, 0xec, 0x55, 0x5b, 0x10, 0x25, 0x1c, 0x3e, 0x04, 0xd7, 0xe6, 0x72, 0xfb, 0x16, 0x82, 0x58, 0xf9, 0x19, 0xe4, 0xd1, 0x98, 0xe2, 0xff, 0xd9, 0x66, 0x28, 0x1e, 0x8d, 0x6e, 0x51, 0x93, 0x70, 0x3f, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xae, 0x50, 0x0f, 0x74, 0xdf, 0xf4, 0xe8, 0x12, 0x4f, 0xf4, 0x6e, 0xcd, 0x70, 0x39, 0x5f, 0xdd, 0xe3, 0x23, 0x62, 0x7a, 0x15, 0xde, 0x18, 0xad, 0xdd, 0xb1, 0x6a, 0x83, 0xec, 0x01, 0x09, 0x6b, 0xa0, 0x89, 0xe4, 0x44, 0xbd, 0x8a, 0xc2, 0x55, 0xf3, 0xe3, 0x8f, 0x74, 0x75, 0xcf, 0xff, 0xf8, 0x0c, 0x3d, 0x38, 0x92, 0x96, 0x34, 0x16, 0xd2, 0xd7, 0xdc, 0xd9, 0xe9, 0x23, 0x13, 0x39, 0x40, 0x0e, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x51, 0x80, 0x80, 0xa0, 0x6b, 0x77, 0x35, 0xf6, 0x9b, 0x62, 0xc1, 0x0c, 0xcf, 0xfc, 0xbd, 0x15, 0xe2, 0xc9, 0x45, 0x29, 0xe7, 0x5b, 0x50, 0xc8, 0x88, 0x09, 0xa7, 0x99, 0xdc, 0xf8, 0xd7, 0x04, 0x0f, 0x9e, 0xf1, 0x1d, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, 0x55, 0x0a, 0x27, 0x73, 0xf1, 0x69, 0xae, 0x53, 0xac, 0xf4, 0x43, 0xa6, 0x2e, 0x00, 0xb7, 0x38, 0x65, 0xab, 0xb5, 0xbc, 0xeb, 0x67, 0x29, 0xdf, 0x40, 0x12, 0xb9, 0xb9, 0x37, 0x0e, 0xac, 0x30, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x72, 0x9d, 0x20, 0xc3, 0x54, 0x7c, 0x60, 0xee, 0x47, 0xf7, 0x12, 0xd3, 0x2e, 0x5a, 0xcf, 0x38, 0xb3, 0x5d, 0x1c, 0xc6, 0x2e, 0x23, 0xb0, 0x55, 0xa6, 0x9b, 0xb8, 0x82, 0x84, 0xc2, 0x81, 0xb8, 0x52, 0xf8, 0x50, 0x82, 0x02, 0xcb, 0x8a, 0x01, 0x9c, 0x54, 0xc1, 0xcc, 0x8b, 0x1a, 0xd5, 0x99, 0x4d, 0xa0, 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, 0xa0, 0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/state_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/state_proof_new.nr index ccb217f0..ea349fdf 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/state_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/london/vitalik_balance/state_proof_new.nr @@ -48,3 +48,5 @@ global proof_input = ProofInput { depth: 9 } }; + +global proof_input_serialized = proof_input.serialize(); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/account.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/account.nr index 95248c73..dc3ad689 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/account.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/account.nr @@ -5,7 +5,7 @@ global address = [ ]; global rlp_encoded_left_padded_account = [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4b, 0x01, 0x87, 0x24, 0x3d, 0xc1, 0x65, 0x5a, 0x90, 0x00, 0xa0, 0xf2, 0xb1, 0x58, 0x8b, 0xe2, 0x23, 0xbb, 0xb7, 0x2b, 0x6f, 0x2f, 0x2f, 0x5d, 0x25, 0xf7, 0x42, 0x4f, 0xb0, 0x9e, 0x21, 0x23, 0x97, 0xf4, 0xd7, 0x16, 0xa6, 0xa8, 0x78, 0x5a, 0x6e, 0xda, 0x4d, 0xa0, 0x0b, 0xa5, 0xe2, 0x5e, 0x74, 0xd8, 0x1b, 0xab, 0x32, 0x71, 0x10, 0xc8, 0xd8, 0xb4, 0x43, 0x20, 0xf5, 0x0a, 0xd5, 0xc3, 0xe9, 0x1a, 0x54, 0x6a, 0x5c, 0x5a, 0x9b, 0x60, 0x5c, 0xf6, 0x53, 0xb3 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4b, 0x01, 0x87, 0x24, 0x3d, 0xc1, 0x65, 0x5a, 0x90, 0x00, 0xa0, 0xf2, 0xb1, 0x58, 0x8b, 0xe2, 0x23, 0xbb, 0xb7, 0x2b, 0x6f, 0x2f, 0x2f, 0x5d, 0x25, 0xf7, 0x42, 0x4f, 0xb0, 0x9e, 0x21, 0x23, 0x97, 0xf4, 0xd7, 0x16, 0xa6, 0xa8, 0x78, 0x5a, 0x6e, 0xda, 0x4d, 0xa0, 0x0b, 0xa5, 0xe2, 0x5e, 0x74, 0xd8, 0x1b, 0xab, 0x32, 0x71, 0x10, 0xc8, 0xd8, 0xb4, 0x43, 0x20, 0xf5, 0x0a, 0xd5, 0xc3, 0xe9, 0x1a, 0x54, 0x6a, 0x5c, 0x5a, 0x9b, 0x60, 0x5c, 0xf6, 0x53, 0xb3 ]; global nonce = 1; diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/state_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/state_proof.nr index a16bcd82..d8c2a258 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/state_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/state_proof.nr @@ -1,11 +1,11 @@ -use crate::account::StateProof; +use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: [ 0xbc, 0x4c, 0xa0, 0xed, 0xa7, 0x64, 0x7a, 0x8a, 0xb7, 0xc2, 0x06, 0x1c, 0x2e, 0x11, 0x8a, 0x18, 0xa9, 0x36, 0xf1, 0x3d ], value: [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4b, 0x01, 0x87, 0x24, 0x3d, 0xc1, 0x65, 0x5a, 0x90, 0x00, 0xa0, 0xf2, 0xb1, 0x58, 0x8b, 0xe2, 0x23, 0xbb, 0xb7, 0x2b, 0x6f, 0x2f, 0x2f, 0x5d, 0x25, 0xf7, 0x42, 0x4f, 0xb0, 0x9e, 0x21, 0x23, 0x97, 0xf4, 0xd7, 0x16, 0xa6, 0xa8, 0x78, 0x5a, 0x6e, 0xda, 0x4d, 0xa0, 0x0b, 0xa5, 0xe2, 0x5e, 0x74, 0xd8, 0x1b, 0xab, 0x32, 0x71, 0x10, 0xc8, 0xd8, 0xb4, 0x43, 0x20, 0xf5, 0x0a, 0xd5, 0xc3, 0xe9, 0x1a, 0x54, 0x6a, 0x5c, 0x5a, 0x9b, 0x60, 0x5c, 0xf6, 0x53, 0xb3 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4b, 0x01, 0x87, 0x24, 0x3d, 0xc1, 0x65, 0x5a, 0x90, 0x00, 0xa0, 0xf2, 0xb1, 0x58, 0x8b, 0xe2, 0x23, 0xbb, 0xb7, 0x2b, 0x6f, 0x2f, 0x2f, 0x5d, 0x25, 0xf7, 0x42, 0x4f, 0xb0, 0x9e, 0x21, 0x23, 0x97, 0xf4, 0xd7, 0x16, 0xa6, 0xa8, 0x78, 0x5a, 0x6e, 0xda, 0x4d, 0xa0, 0x0b, 0xa5, 0xe2, 0x5e, 0x74, 0xd8, 0x1b, 0xab, 0x32, 0x71, 0x10, 0xc8, 0xd8, 0xb4, 0x43, 0x20, 0xf5, 0x0a, 0xd5, 0xc3, 0xe9, 0x1a, 0x54, 0x6a, 0x5c, 0x5a, 0x9b, 0x60, 0x5c, 0xf6, 0x53, 0xb3 ], proof: [ 0xf9, 0x02, 0x11, 0xa0, 0x49, 0x1f, 0x39, 0x6d, 0x5d, 0x47, 0x68, 0xa0, 0x1e, 0xe4, 0x28, 0x2a, 0x3a, 0xb1, 0x12, 0x7f, 0x2a, 0x4d, 0xc7, 0xd4, 0x2e, 0x6c, 0x1d, 0xbb, 0x3e, 0x71, 0xad, 0x4e, 0x92, 0x99, 0xf5, 0xe7, 0xa0, 0x5b, 0x46, 0x45, 0x21, 0x9e, 0x61, 0x4b, 0x38, 0x8b, 0xa9, 0x67, 0x24, 0x52, 0xb4, 0x0f, 0x29, 0x19, 0x87, 0xb1, 0x5e, 0x35, 0xbd, 0xbd, 0x3d, 0xfe, 0xbf, 0xac, 0x9a, 0x08, 0x5a, 0xea, 0xb2, 0xa0, 0x97, 0x9e, 0xbc, 0xa2, 0xa6, 0xa0, 0xdf, 0x38, 0x9f, 0xdf, 0xef, 0x5b, 0xfa, 0x4a, 0x31, 0xf2, 0xef, 0xa8, 0xd3, 0x85, 0xbf, 0x2f, 0x43, 0xcd, 0x69, 0xc2, 0x7e, 0x61, 0x16, 0x5c, 0x36, 0x67, 0xa0, 0x1b, 0xbe, 0x04, 0x54, 0x3b, 0xb6, 0xbf, 0x80, 0x26, 0xee, 0x3e, 0xc2, 0xa3, 0xec, 0x3d, 0x61, 0x73, 0xa6, 0x0c, 0x09, 0x00, 0x08, 0xb5, 0x97, 0x79, 0xf7, 0x67, 0xe5, 0x76, 0x9d, 0x7a, 0x0a, 0xa0, 0x51, 0xd3, 0x47, 0xec, 0x61, 0xc7, 0xdd, 0xe5, 0xc4, 0x14, 0x9a, 0x94, 0x3d, 0x0a, 0xa4, 0x89, 0x54, 0x4c, 0xbe, 0xa5, 0x11, 0xed, 0x3d, 0x7f, 0x4f, 0xc6, 0xaa, 0xa5, 0x2a, 0x42, 0x0d, 0x3e, 0xa0, 0x53, 0x58, 0xbc, 0x8e, 0x1e, 0x1f, 0x20, 0xe5, 0x10, 0x88, 0x72, 0x26, 0xd6, 0x7e, 0xfe, 0xe7, 0x37, 0x69, 0xd0, 0xb1, 0x3e, 0xbb, 0x24, 0xa3, 0xe7, 0x50, 0xc2, 0x21, 0x4e, 0xf0, 0x90, 0xd5, 0xa0, 0x4d, 0xf1, 0xc2, 0x4e, 0xbf, 0x40, 0xbe, 0xfc, 0xe6, 0x0c, 0x8e, 0xb3, 0x0a, 0x31, 0x89, 0x41, 0x02, 0x88, 0x14, 0x54, 0xfc, 0xde, 0xb6, 0xf7, 0xb8, 0x3e, 0x1f, 0xb9, 0x16, 0xc9, 0x53, 0xa8, 0xa0, 0x0a, 0x85, 0xe0, 0x4f, 0x30, 0xa4, 0x97, 0x87, 0x12, 0xc5, 0x8a, 0x82, 0x5e, 0x7b, 0xd2, 0xf8, 0xa8, 0x37, 0x31, 0xab, 0x1a, 0xa3, 0xe2, 0x34, 0xa0, 0x20, 0x7e, 0x91, 0x87, 0x90, 0x50, 0x5f, 0xa0, 0x77, 0x8a, 0x45, 0x43, 0x72, 0x18, 0x48, 0x6b, 0x78, 0x49, 0xae, 0xf8, 0x90, 0xd4, 0x83, 0xdc, 0xc2, 0xde, 0xb1, 0x42, 0x3c, 0xb8, 0x1e, 0x48, 0x8b, 0x7b, 0xe2, 0x92, 0x1d, 0x50, 0x5b, 0xf4, 0xa0, 0x51, 0xdb, 0xae, 0xf3, 0xc3, 0xd3, 0xfe, 0x82, 0xbd, 0x14, 0x84, 0x95, 0x4f, 0x38, 0x50, 0x8f, 0x65, 0x1d, 0x86, 0x7f, 0x38, 0x7f, 0x71, 0xde, 0xdb, 0xfb, 0x0f, 0x73, 0x55, 0x98, 0x7e, 0xd5, 0xa0, 0x61, 0x67, 0x9f, 0x43, 0xf3, 0xdb, 0x26, 0x67, 0x3b, 0xb6, 0x87, 0xc5, 0x84, 0xf3, 0x0a, 0xe3, 0xcf, 0xf7, 0x26, 0x1e, 0x71, 0xac, 0xf0, 0x7e, 0xd1, 0xfe, 0xae, 0xca, 0xe0, 0x98, 0xfc, 0x79, 0xa0, 0x99, 0x76, 0x1e, 0xa7, 0xd9, 0x4e, 0x01, 0xb1, 0x42, 0x85, 0xb7, 0xce, 0xd7, 0xdc, 0xd1, 0x67, 0x7f, 0xbd, 0x3c, 0xe0, 0x93, 0xa6, 0x27, 0xa8, 0xe1, 0x47, 0x20, 0x74, 0xba, 0xad, 0x8b, 0xd9, 0xa0, 0xbb, 0x6d, 0x26, 0x9f, 0xc6, 0x14, 0x43, 0xaa, 0x28, 0xb1, 0x4a, 0xf0, 0x44, 0x8a, 0xaf, 0x6f, 0x1f, 0x57, 0x04, 0x77, 0xd8, 0xb4, 0xef, 0x2e, 0xb7, 0xd3, 0x15, 0x43, 0x20, 0x2c, 0xe6, 0x02, 0xa0, 0x6c, 0x41, 0xcd, 0x2d, 0x17, 0x01, 0xb0, 0x58, 0x85, 0x35, 0x91, 0xa2, 0xf3, 0x06, 0xdd, 0xcf, 0xd1, 0xe5, 0x5d, 0x3e, 0x12, 0x01, 0x1c, 0xad, 0xb1, 0x00, 0xe7, 0xc5, 0x25, 0xaa, 0xf4, 0x60, 0xa0, 0xbc, 0xf3, 0x7a, 0xba, 0xac, 0x56, 0x6b, 0xb9, 0x8e, 0x09, 0x15, 0x75, 0xaf, 0x40, 0x38, 0x04, 0xdb, 0xb2, 0x78, 0xfb, 0xfa, 0x55, 0x47, 0xde, 0x68, 0x05, 0xcb, 0xaa, 0x52, 0x9a, 0xe1, 0x37, 0xa0, 0xde, 0x99, 0x18, 0xa2, 0xa9, 0x76, 0xa2, 0xb0, 0xb3, 0xf4, 0xae, 0xff, 0x80, 0x1f, 0xc7, 0x95, 0x57, 0x42, 0x6b, 0x19, 0xc1, 0x5d, 0x41, 0x4d, 0xdf, 0x8f, 0xae, 0x84, 0x37, 0x85, 0xb0, 0xb7, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xd4, 0x94, 0x84, 0xbf, 0x95, 0xa2, 0x21, 0x10, 0xc4, 0x1b, 0xa9, 0xfa, 0xd0, 0x08, 0x7b, 0xf2, 0x75, 0x1c, 0x99, 0x18, 0x1c, 0xcb, 0x44, 0x48, 0x72, 0x95, 0xad, 0x65, 0x39, 0x99, 0x4d, 0x10, 0xa0, 0x4a, 0xef, 0x81, 0x3e, 0xb3, 0xdf, 0xf2, 0xb2, 0x57, 0x54, 0xad, 0x36, 0x6e, 0x55, 0x1b, 0xda, 0xb6, 0xb2, 0xcf, 0x5f, 0x21, 0xa1, 0x76, 0xe3, 0xcc, 0xbf, 0x6c, 0xe2, 0xeb, 0x26, 0x81, 0x18, 0xa0, 0x45, 0x5a, 0x6f, 0xe5, 0x14, 0xd0, 0x52, 0x1e, 0xf4, 0xea, 0x10, 0xc3, 0x3b, 0x55, 0x6b, 0x8f, 0x53, 0xa7, 0x15, 0x2c, 0xee, 0xe8, 0x62, 0xdc, 0x34, 0xb8, 0xcf, 0x27, 0x6e, 0x0c, 0x97, 0x49, 0xa0, 0xb3, 0xdc, 0xf6, 0xad, 0x23, 0xe9, 0xf6, 0x49, 0x38, 0x9d, 0x58, 0x4d, 0xe3, 0x6f, 0xe4, 0x7d, 0xae, 0x70, 0xb7, 0xfc, 0x73, 0x9d, 0xb2, 0x9e, 0x6a, 0x6a, 0x4f, 0x81, 0x1a, 0x3b, 0x22, 0xc3, 0xa0, 0x6f, 0x09, 0x44, 0xda, 0xce, 0x08, 0xe1, 0x0b, 0xd0, 0x64, 0x43, 0x16, 0x21, 0x39, 0x28, 0x7b, 0x56, 0xea, 0xd7, 0x4e, 0xab, 0x7c, 0x7b, 0x6c, 0x38, 0x6a, 0xf5, 0xb4, 0xde, 0x75, 0xbe, 0x16, 0xa0, 0x3c, 0x7c, 0x34, 0xae, 0x8a, 0xfa, 0x48, 0x5b, 0xa1, 0xaf, 0x86, 0x03, 0x4f, 0x2a, 0xc9, 0x2f, 0x3f, 0xb7, 0x1e, 0xcb, 0x98, 0x9d, 0xc5, 0xe1, 0xdc, 0x8a, 0xa5, 0x46, 0xa7, 0xba, 0x3f, 0x87, 0xa0, 0x7d, 0x7f, 0xd1, 0xbf, 0xd5, 0xb6, 0xa6, 0x3c, 0xaf, 0x07, 0xa0, 0x61, 0xef, 0xfc, 0x3c, 0xc2, 0xa2, 0x20, 0xd3, 0x6d, 0xfc, 0xc0, 0x49, 0x8a, 0x36, 0x90, 0xd2, 0xcc, 0x80, 0x8d, 0xd4, 0xf7, 0xa0, 0x69, 0x33, 0x9e, 0xe7, 0x38, 0xef, 0xbd, 0x6b, 0x75, 0x44, 0xf0, 0x31, 0x4f, 0x00, 0xbf, 0x87, 0x1a, 0x62, 0x99, 0x8b, 0x0c, 0x3a, 0x6a, 0x4f, 0x16, 0x13, 0x6f, 0xce, 0xa3, 0x34, 0x3a, 0x9f, 0xa0, 0x3c, 0x91, 0xdf, 0x57, 0xbc, 0x3c, 0x66, 0x11, 0x71, 0x8c, 0xc4, 0x92, 0x25, 0x7d, 0xb2, 0xfe, 0x9b, 0x64, 0x89, 0x12, 0x58, 0x56, 0x0f, 0x5c, 0xde, 0x98, 0xb0, 0x17, 0x80, 0xd1, 0xc2, 0x20, 0xa0, 0x52, 0x45, 0x11, 0xe9, 0x7f, 0xed, 0x37, 0xfd, 0x85, 0x7b, 0x5b, 0xfd, 0x82, 0x7e, 0x19, 0x0e, 0x0c, 0x1f, 0xbe, 0x94, 0xad, 0x61, 0xa1, 0xfe, 0x3e, 0x83, 0xe2, 0x2c, 0x42, 0x64, 0xe2, 0x0d, 0xa0, 0x33, 0xb5, 0x92, 0xbf, 0x8b, 0x76, 0x33, 0xfd, 0x20, 0x97, 0x81, 0xca, 0xd0, 0xd6, 0xbd, 0x7f, 0x22, 0x81, 0x3d, 0xb6, 0x07, 0xf0, 0x6c, 0xf1, 0x1f, 0x1d, 0x71, 0x7b, 0xda, 0x28, 0xf3, 0xbb, 0xa0, 0xf7, 0x74, 0xed, 0xd0, 0x41, 0x1b, 0x04, 0xdc, 0xf6, 0x4d, 0x15, 0x20, 0xd5, 0x07, 0x4f, 0xbd, 0xc8, 0x54, 0xc3, 0xda, 0x6f, 0x2d, 0x60, 0xb5, 0x7f, 0xe0, 0x3c, 0x6a, 0x6f, 0x84, 0xe8, 0x5c, 0xa0, 0x10, 0x3a, 0x3f, 0xc1, 0xdd, 0xb8, 0xfa, 0x81, 0x49, 0x3d, 0x6d, 0x4e, 0xeb, 0xa2, 0x4c, 0x20, 0x2f, 0x84, 0xa0, 0x5f, 0xb4, 0x38, 0x8f, 0x86, 0xb1, 0xf8, 0xc5, 0xe6, 0xd2, 0x8e, 0x20, 0x88, 0xa0, 0x7b, 0xcc, 0x50, 0x12, 0xbf, 0x23, 0xc2, 0x9b, 0x54, 0x32, 0x6e, 0x33, 0x9c, 0x80, 0x95, 0x79, 0x1c, 0x13, 0x05, 0xa1, 0x8f, 0x30, 0x5c, 0xfd, 0xce, 0xb3, 0xf4, 0x4d, 0x9a, 0x97, 0x5b, 0x23, 0xa0, 0xbc, 0x32, 0x5e, 0xbe, 0x8d, 0xc9, 0x7b, 0x03, 0x88, 0xb9, 0xc4, 0x8d, 0x74, 0x44, 0x08, 0x69, 0xcc, 0x53, 0xc4, 0x0e, 0x6a, 0xfc, 0x6e, 0x16, 0x82, 0xf5, 0x0b, 0xec, 0x0e, 0x40, 0x82, 0x8e, 0xa0, 0xc8, 0xab, 0x8f, 0x63, 0xcc, 0x85, 0xae, 0xaa, 0x9e, 0xdc, 0x75, 0x9a, 0x2e, 0xf6, 0x39, 0x99, 0x28, 0xb6, 0xa2, 0xca, 0x09, 0x24, 0x45, 0x6d, 0xb6, 0xfe, 0x54, 0x4d, 0xe0, 0x00, 0x95, 0xd5, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x36, 0xf2, 0x5c, 0x3d, 0xfd, 0xa3, 0x92, 0x6f, 0x33, 0x67, 0xdc, 0x03, 0xd4, 0xae, 0x66, 0x05, 0xac, 0xcd, 0xf4, 0x02, 0xeb, 0x3b, 0x3e, 0x5d, 0x1c, 0xf9, 0x2c, 0xf8, 0xcb, 0x56, 0x37, 0x22, 0xa0, 0x68, 0xcc, 0x43, 0x43, 0xdc, 0x91, 0xb2, 0x0e, 0xee, 0x03, 0x7f, 0xf9, 0xf5, 0xcf, 0xe2, 0x29, 0xb3, 0x70, 0x0f, 0x04, 0x5f, 0x68, 0x68, 0xcf, 0xf0, 0x6c, 0x1a, 0xaf, 0xb5, 0x89, 0x4d, 0xf3, 0xa0, 0xd7, 0x2d, 0x43, 0x58, 0x88, 0x53, 0xdd, 0x14, 0x02, 0x07, 0xff, 0xd6, 0x39, 0x2c, 0xd5, 0x13, 0x38, 0x46, 0x35, 0x5e, 0x5c, 0xaa, 0x95, 0x59, 0x68, 0x90, 0x7f, 0x50, 0xf8, 0x1a, 0x7d, 0xb8, 0xa0, 0x40, 0xc4, 0x24, 0x09, 0x4f, 0x06, 0x36, 0x86, 0x20, 0x08, 0x3c, 0x51, 0x36, 0xfd, 0x22, 0xcb, 0xb2, 0x21, 0x05, 0xd7, 0xfa, 0xcb, 0x45, 0x20, 0xd3, 0xfd, 0xdf, 0xcf, 0x7e, 0xf4, 0xf8, 0x39, 0xa0, 0x6b, 0xf9, 0x7a, 0x7f, 0xf1, 0x12, 0xb6, 0x3d, 0x83, 0x21, 0xde, 0xea, 0x34, 0x6c, 0x7a, 0xa4, 0xbe, 0xb8, 0x87, 0x2a, 0xeb, 0xd8, 0x2a, 0x6a, 0x13, 0xfa, 0x9e, 0x9b, 0xca, 0xc8, 0x32, 0xe2, 0xa0, 0x52, 0xa0, 0x99, 0x34, 0x90, 0x45, 0xa0, 0xa1, 0x76, 0x62, 0x91, 0x8b, 0x35, 0xed, 0x1c, 0xa0, 0x94, 0xc9, 0xa5, 0x98, 0x83, 0xbf, 0x14, 0x04, 0x4d, 0xad, 0x9c, 0xe2, 0x9f, 0xa5, 0x72, 0xc3, 0xa0, 0xcb, 0xdf, 0xed, 0x09, 0x9c, 0xec, 0x3a, 0xd2, 0xc7, 0x07, 0x2d, 0xb5, 0xc3, 0xc3, 0xc0, 0xfa, 0xef, 0x02, 0x87, 0x72, 0x99, 0xa8, 0x99, 0x56, 0x49, 0x31, 0x67, 0x94, 0x5f, 0x57, 0xb6, 0x99, 0xa0, 0xe2, 0xa0, 0xbd, 0xd8, 0xcc, 0xc6, 0xb9, 0x1b, 0x5f, 0x56, 0x55, 0xa3, 0x6e, 0x5e, 0x75, 0xb9, 0xb3, 0x20, 0x1b, 0xc1, 0x99, 0x67, 0xed, 0x3c, 0xa7, 0xc8, 0x6e, 0xb4, 0xd3, 0x10, 0xb5, 0xc5, 0xa0, 0xcc, 0x65, 0x9f, 0x71, 0xa8, 0x5a, 0xfe, 0x69, 0xb8, 0x37, 0xfa, 0x80, 0x78, 0x5e, 0x8a, 0x22, 0xab, 0x2b, 0xe2, 0x57, 0x34, 0xba, 0x8d, 0x89, 0x6a, 0xf0, 0xb8, 0xe5, 0x60, 0xde, 0x43, 0xf5, 0xa0, 0x45, 0xb0, 0x49, 0x1f, 0xc5, 0x64, 0xed, 0x37, 0x5c, 0xca, 0x2f, 0x79, 0x22, 0xe7, 0x73, 0x72, 0xd7, 0x4e, 0x2d, 0x14, 0x45, 0xda, 0x45, 0x7c, 0x11, 0x71, 0x8a, 0x97, 0x68, 0xe3, 0x0c, 0x65, 0xa0, 0xde, 0xc1, 0x9a, 0x2f, 0xde, 0xca, 0x36, 0x78, 0x9f, 0x36, 0x4b, 0xae, 0xd0, 0xed, 0x4f, 0x90, 0x35, 0xa9, 0xb0, 0xca, 0xa6, 0x33, 0x56, 0x71, 0x87, 0x00, 0x01, 0x3c, 0x2f, 0x82, 0x7a, 0x8c, 0xa0, 0xa4, 0x30, 0xc6, 0x46, 0xd5, 0xfb, 0xbe, 0x03, 0x9e, 0x14, 0xe4, 0x28, 0x99, 0x27, 0x66, 0x5a, 0xc0, 0x3d, 0x60, 0xdb, 0xdd, 0x45, 0x49, 0x50, 0x69, 0x30, 0x56, 0x39, 0xbd, 0x7a, 0xbe, 0x98, 0xa0, 0xaf, 0x0f, 0xa4, 0x67, 0x3a, 0x93, 0x38, 0x38, 0x3a, 0x34, 0x21, 0x36, 0x63, 0x66, 0x5b, 0x39, 0x95, 0xe8, 0x66, 0xdb, 0x2d, 0x56, 0xf7, 0xc4, 0x3d, 0x18, 0xf8, 0xc7, 0xa6, 0x66, 0xe1, 0x8f, 0xa0, 0x80, 0x69, 0xcd, 0xcb, 0xe6, 0x4a, 0xe5, 0x76, 0x76, 0x44, 0xbc, 0x17, 0xbd, 0x25, 0x00, 0x39, 0x09, 0x51, 0x40, 0xbb, 0xa8, 0x34, 0xef, 0xb0, 0x7d, 0xe7, 0x10, 0x60, 0x28, 0xb1, 0xaf, 0x2f, 0xa0, 0x56, 0x2c, 0x70, 0xe9, 0x97, 0xc4, 0x88, 0xf1, 0x46, 0x89, 0x65, 0x20, 0x8f, 0xa5, 0x0a, 0xc4, 0x2d, 0x7c, 0x20, 0xd7, 0x1a, 0x46, 0xb1, 0xd1, 0x74, 0x70, 0x9b, 0xf2, 0x92, 0xc2, 0xd8, 0x67, 0xa0, 0x88, 0x2c, 0xb2, 0x76, 0xfe, 0x85, 0xbc, 0x06, 0x15, 0x33, 0xfe, 0x83, 0xda, 0x77, 0x5c, 0xd0, 0x49, 0x3b, 0x7e, 0xaa, 0x7a, 0x0e, 0xf5, 0x5f, 0xc9, 0xb8, 0x73, 0x26, 0x86, 0x49, 0x82, 0xb6, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xc0, 0xca, 0x3e, 0x1e, 0x3b, 0xa0, 0x88, 0x16, 0xc3, 0xb4, 0x08, 0x9a, 0x5d, 0x2a, 0x06, 0x3e, 0x68, 0x87, 0xef, 0x2d, 0xb9, 0x1e, 0x81, 0x45, 0x58, 0x28, 0x3d, 0x34, 0xc7, 0xa8, 0x50, 0x3a, 0xa0, 0x16, 0x86, 0x2d, 0xf0, 0x21, 0xa0, 0xf1, 0x8b, 0x84, 0xba, 0x26, 0xea, 0x7d, 0x36, 0x6b, 0xc6, 0x4a, 0xa8, 0x74, 0xf2, 0xf0, 0x7b, 0x60, 0x97, 0x42, 0xea, 0xdc, 0x3e, 0x66, 0x06, 0x85, 0x66, 0xa0, 0xcb, 0xaa, 0xf7, 0x2c, 0x09, 0x43, 0xc5, 0xe9, 0x97, 0xf3, 0x18, 0x48, 0x14, 0xaa, 0x2b, 0xe2, 0xbf, 0x77, 0x05, 0x34, 0x08, 0xcd, 0x0d, 0x55, 0x09, 0x58, 0x47, 0x31, 0x37, 0xaa, 0xcb, 0x63, 0xa0, 0xd2, 0xa3, 0x7d, 0x5f, 0x4f, 0x55, 0x61, 0xd2, 0xbf, 0x30, 0x97, 0xe9, 0xf1, 0xe0, 0xf9, 0x3c, 0xa4, 0x64, 0xe7, 0x60, 0x1c, 0x2f, 0x69, 0x51, 0x0e, 0xf1, 0xdf, 0xd7, 0x5c, 0x3c, 0x05, 0xb0, 0xa0, 0xd1, 0x3f, 0x64, 0x4c, 0x81, 0xfe, 0x92, 0x45, 0x73, 0xab, 0xea, 0xc2, 0x3c, 0x7e, 0xac, 0x1b, 0x00, 0xe0, 0x9a, 0x52, 0x40, 0xec, 0x39, 0xc3, 0x61, 0x47, 0xd3, 0xd7, 0xdc, 0xad, 0x5f, 0x5a, 0xa0, 0x10, 0xbd, 0xde, 0x1e, 0x89, 0x45, 0x6e, 0xda, 0x97, 0x55, 0x5a, 0xc5, 0x97, 0x77, 0xe8, 0xc0, 0xbb, 0xbf, 0x34, 0x1c, 0xef, 0xbe, 0xc7, 0xb3, 0xd2, 0x46, 0x61, 0x4e, 0x46, 0x97, 0xd2, 0x8f, 0xa0, 0x4f, 0x12, 0xc9, 0x4e, 0xd5, 0xc9, 0x83, 0x33, 0xa8, 0x18, 0xf6, 0x2e, 0xf2, 0x40, 0x97, 0xbf, 0xe5, 0x9b, 0xdd, 0xd7, 0x72, 0x72, 0xa1, 0x11, 0xb3, 0x85, 0x0f, 0x9f, 0xf1, 0x04, 0xda, 0xb0, 0xa0, 0x00, 0x31, 0x1c, 0x6e, 0x72, 0xa0, 0x0b, 0x48, 0xc5, 0x93, 0x27, 0xfa, 0x67, 0xb7, 0x1e, 0xf6, 0x7e, 0x8a, 0xba, 0xe6, 0x13, 0xbe, 0x2e, 0x4b, 0xa7, 0xc9, 0x04, 0x5c, 0x66, 0x20, 0xa0, 0xe9, 0xa0, 0xf6, 0xd4, 0xe1, 0xcd, 0x65, 0x82, 0xae, 0xd1, 0x33, 0x4c, 0x92, 0xe8, 0x26, 0xb0, 0xd5, 0x42, 0x85, 0xa3, 0xa3, 0x1e, 0x0e, 0xa6, 0x05, 0x1e, 0x37, 0x54, 0xb5, 0xa7, 0x84, 0xf6, 0xb4, 0x5c, 0xa0, 0xba, 0x27, 0x51, 0xfd, 0x87, 0x1b, 0x2d, 0x82, 0x78, 0xa1, 0x86, 0x2f, 0xeb, 0x8b, 0x2e, 0x79, 0x7a, 0x90, 0x97, 0xc4, 0x7b, 0x0c, 0x00, 0x42, 0x2d, 0xc8, 0x05, 0x5f, 0x88, 0x56, 0x88, 0x8e, 0xa0, 0x44, 0x07, 0x15, 0x7e, 0x29, 0x5c, 0xde, 0x66, 0xaa, 0xc7, 0x87, 0x83, 0xa1, 0x59, 0xfa, 0xc3, 0xb3, 0x48, 0xa5, 0xcd, 0x37, 0x11, 0x0e, 0x69, 0x45, 0x45, 0xbc, 0xd7, 0x7c, 0xb5, 0x14, 0x2d, 0xa0, 0x58, 0xc1, 0x04, 0x34, 0x3e, 0x87, 0x4c, 0x9c, 0x69, 0xc7, 0x51, 0xfa, 0xe0, 0x74, 0x0b, 0x3b, 0x9f, 0x46, 0x6f, 0x4f, 0xf7, 0x70, 0x84, 0x5f, 0x81, 0x5f, 0xa1, 0xee, 0x52, 0x81, 0xab, 0xa3, 0xa0, 0xe7, 0xb0, 0x05, 0xd7, 0xee, 0x96, 0xe4, 0xdc, 0xc2, 0xd1, 0x5c, 0x95, 0xfb, 0xa9, 0x1f, 0xd5, 0xca, 0xca, 0x3a, 0x33, 0xe8, 0xc1, 0x05, 0xbe, 0x6f, 0xf3, 0x30, 0x2e, 0x41, 0x20, 0x37, 0x89, 0xa0, 0x1c, 0x63, 0x52, 0xfd, 0xa8, 0xf6, 0xdb, 0xc4, 0x28, 0xff, 0x43, 0x57, 0x57, 0x9a, 0xc7, 0xbc, 0xc4, 0xb9, 0x64, 0xe7, 0xe7, 0x27, 0x02, 0xeb, 0x9d, 0xd5, 0x1d, 0x9b, 0x61, 0x97, 0xed, 0xca, 0xa0, 0xbf, 0xef, 0x45, 0xb8, 0xa3, 0x65, 0x21, 0xa7, 0x70, 0x2d, 0xf2, 0xf7, 0xc5, 0x50, 0xdb, 0xb2, 0x72, 0x26, 0x29, 0xd2, 0x3f, 0x0f, 0x41, 0x06, 0x93, 0x15, 0x2b, 0x1e, 0x2f, 0xbd, 0xe1, 0x33, 0xa0, 0xce, 0x3c, 0x8e, 0xf6, 0x2b, 0xcc, 0x07, 0x56, 0xe2, 0xc7, 0x26, 0xe8, 0x3d, 0x66, 0x49, 0x30, 0x53, 0xd0, 0x52, 0xd6, 0xf1, 0x05, 0x13, 0x6b, 0x88, 0xc5, 0x97, 0x3d, 0x86, 0x29, 0x7c, 0xba, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x4e, 0xeb, 0x4e, 0xfa, 0x3b, 0xdf, 0x47, 0xba, 0xba, 0x6a, 0xa6, 0xf0, 0x46, 0x07, 0xec, 0x70, 0x7e, 0x2c, 0x1c, 0x84, 0xc1, 0x0e, 0x9d, 0x70, 0x61, 0xcd, 0x3b, 0xd0, 0x0a, 0x4c, 0xf7, 0xd8, 0xa0, 0xd3, 0xbe, 0x7e, 0x05, 0xc4, 0xbf, 0xd0, 0x09, 0x3a, 0xb8, 0xf6, 0xd2, 0x55, 0x32, 0x24, 0xc6, 0xfa, 0xd4, 0x87, 0xc4, 0x29, 0xdf, 0x69, 0x60, 0x4c, 0x24, 0x8e, 0x94, 0x1e, 0x11, 0x69, 0x6a, 0xa0, 0x80, 0x6b, 0x81, 0x88, 0x10, 0x72, 0xca, 0x1f, 0xc3, 0x42, 0xe9, 0xb4, 0x1d, 0x94, 0x4a, 0x89, 0xef, 0x26, 0x63, 0x22, 0xac, 0x02, 0xdf, 0x36, 0xac, 0xfa, 0x47, 0xb1, 0x7a, 0xd5, 0xb5, 0x2e, 0xa0, 0x99, 0x7d, 0xe3, 0xcb, 0x46, 0xb1, 0x0e, 0xd0, 0x8c, 0x02, 0x14, 0x02, 0xeb, 0x0f, 0xeb, 0x13, 0x0d, 0x5d, 0x25, 0x10, 0x51, 0x1a, 0x65, 0xff, 0xba, 0xab, 0x08, 0xf5, 0x8f, 0x6c, 0x25, 0x5b, 0xa0, 0xe9, 0xb1, 0xe8, 0xb2, 0x23, 0x4f, 0xf8, 0xf1, 0xf3, 0x8c, 0x3f, 0x00, 0xd9, 0x4f, 0xda, 0x7e, 0xb9, 0x06, 0xed, 0xef, 0xf7, 0xc2, 0x47, 0xe6, 0x3f, 0x78, 0x90, 0x12, 0x5b, 0x9c, 0x8d, 0x1f, 0xa0, 0xc9, 0x23, 0x0a, 0x1e, 0x05, 0x33, 0x7e, 0x42, 0x5f, 0xe7, 0xa0, 0xab, 0xd6, 0x01, 0x01, 0x77, 0x18, 0xd0, 0x34, 0x2a, 0x6e, 0x50, 0xc2, 0xf3, 0xfd, 0xdd, 0x7f, 0xc2, 0x27, 0x6b, 0x08, 0xad, 0xa0, 0x5d, 0xf2, 0x67, 0x62, 0xa6, 0x8c, 0xa6, 0x7f, 0xa5, 0x67, 0x7e, 0xb2, 0xa8, 0x76, 0xe0, 0xf0, 0x2e, 0x85, 0x55, 0x17, 0xd2, 0x4f, 0xf3, 0x1b, 0xce, 0xda, 0x3d, 0xe8, 0x26, 0x03, 0xea, 0x95, 0xa0, 0x33, 0x0c, 0xc8, 0xae, 0x8d, 0xfc, 0x37, 0x73, 0xad, 0x10, 0x1d, 0xce, 0x78, 0x4f, 0xce, 0x41, 0xbf, 0x43, 0xd1, 0xe1, 0x20, 0x40, 0x67, 0x35, 0x17, 0x77, 0xea, 0xae, 0x3f, 0x4a, 0xbf, 0x96, 0xa0, 0x0c, 0x5b, 0xc3, 0x84, 0x5c, 0xf8, 0x87, 0x6a, 0xb2, 0x51, 0x8a, 0xaf, 0xbd, 0x50, 0x6b, 0xd4, 0xb2, 0x7d, 0x78, 0x46, 0x44, 0x00, 0xd3, 0xd5, 0xa2, 0xae, 0xde, 0x08, 0x61, 0xa9, 0x1c, 0x97, 0xa0, 0x0e, 0xf0, 0x8a, 0x22, 0x68, 0xc4, 0xfa, 0xcb, 0x07, 0x29, 0x98, 0xbc, 0x78, 0x1e, 0xb9, 0x69, 0x62, 0xc4, 0x50, 0x57, 0xd5, 0x7a, 0x2a, 0x08, 0x85, 0x36, 0x22, 0x86, 0xb4, 0xb3, 0xf7, 0x22, 0xa0, 0xac, 0xbd, 0x68, 0xe9, 0x22, 0x23, 0xf6, 0x23, 0xf4, 0xf2, 0x3f, 0x8e, 0xf8, 0xd9, 0xca, 0x17, 0xf6, 0xb1, 0x62, 0xd5, 0xc0, 0x3a, 0x7c, 0x87, 0xbf, 0x15, 0x75, 0x1a, 0xb2, 0x3e, 0xd4, 0x9c, 0xa0, 0xfc, 0x15, 0x25, 0x2b, 0x41, 0x9d, 0xc2, 0x13, 0x36, 0x14, 0x50, 0xbf, 0x53, 0xca, 0x5d, 0xf6, 0x54, 0x5f, 0x50, 0x9d, 0xd8, 0xaf, 0xce, 0x45, 0xe6, 0xdb, 0x22, 0xa6, 0x29, 0x1b, 0x7c, 0xc1, 0xa0, 0x5e, 0x31, 0x3f, 0xfb, 0x2c, 0x5f, 0xc7, 0x25, 0xfb, 0xf4, 0x4b, 0x98, 0x9a, 0x2d, 0xca, 0x71, 0x26, 0x72, 0x5a, 0x79, 0x92, 0x62, 0x6c, 0xdd, 0x73, 0x66, 0xd2, 0x86, 0xc1, 0xc2, 0x22, 0x27, 0xa0, 0xec, 0x65, 0xfe, 0x06, 0xbd, 0x37, 0xd9, 0x7b, 0x4c, 0xfe, 0xa3, 0x7e, 0xe5, 0x3a, 0xd3, 0xac, 0x0c, 0x7c, 0xd1, 0xe9, 0x44, 0xf9, 0x25, 0xdd, 0x8c, 0xcd, 0x50, 0xd4, 0x61, 0xd1, 0x66, 0x4e, 0xa0, 0x3d, 0x81, 0x6b, 0x17, 0x95, 0xea, 0x22, 0x68, 0xe5, 0x52, 0xa0, 0xbb, 0x63, 0x4b, 0x21, 0xb9, 0x99, 0xf4, 0x0a, 0x2b, 0x0c, 0xdc, 0x4e, 0x63, 0x8b, 0x5a, 0x57, 0x0e, 0xc9, 0xc4, 0x34, 0xe2, 0xa0, 0xbd, 0xd1, 0x4a, 0xe2, 0xe1, 0x97, 0xdb, 0x99, 0xc1, 0xe5, 0xde, 0x8d, 0x88, 0xc1, 0x51, 0x68, 0xd3, 0x49, 0x34, 0x5b, 0x63, 0x33, 0xec, 0x64, 0x0e, 0xa1, 0x12, 0x3a, 0xef, 0xd5, 0xa9, 0x4f, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xdf, 0x4d, 0xbd, 0x68, 0x3f, 0x0a, 0xa4, 0xcc, 0xbb, 0xc8, 0xcd, 0x1a, 0xbd, 0xef, 0x5f, 0x3b, 0xc9, 0x5c, 0xf0, 0x03, 0x8c, 0xa6, 0x44, 0x79, 0x67, 0x0e, 0xe5, 0x76, 0x7e, 0x43, 0xf2, 0x13, 0xa0, 0x69, 0xbf, 0x5d, 0x76, 0xc3, 0x93, 0xec, 0x05, 0x96, 0xa4, 0x88, 0x8f, 0xca, 0xdf, 0x1f, 0xdb, 0x59, 0xd7, 0x72, 0xe8, 0x3f, 0xdd, 0x44, 0xb1, 0xb4, 0x13, 0xba, 0xfc, 0x95, 0x75, 0xb1, 0xc0, 0xa0, 0x4a, 0x8a, 0x26, 0xbf, 0x77, 0x8d, 0xa8, 0x76, 0x46, 0x75, 0x0c, 0x1b, 0x8a, 0x64, 0x08, 0xb0, 0x81, 0x50, 0x14, 0xcc, 0x00, 0x08, 0x60, 0x4d, 0x84, 0x33, 0xa7, 0x44, 0x6b, 0x12, 0xff, 0x3f, 0xa0, 0xa6, 0xb9, 0x2e, 0x39, 0x10, 0x90, 0x54, 0xeb, 0x58, 0x41, 0x7d, 0xa1, 0xe2, 0xcf, 0xa8, 0xe3, 0x63, 0x8c, 0xbd, 0xa8, 0x5e, 0xc3, 0x00, 0x1f, 0x4c, 0x38, 0xbc, 0x7f, 0xcb, 0xb6, 0x2b, 0x5a, 0xa0, 0xf3, 0xe6, 0x1a, 0x7a, 0x55, 0xa9, 0xcc, 0x6a, 0x66, 0xc6, 0x3a, 0xc1, 0x0f, 0xcf, 0xc2, 0x89, 0xa4, 0x50, 0xad, 0x6c, 0xb9, 0x94, 0x7d, 0xc2, 0x25, 0x58, 0xaa, 0xac, 0xf4, 0xbe, 0x6f, 0xc3, 0xa0, 0x57, 0x9b, 0xbd, 0xc0, 0xeb, 0x7e, 0xbc, 0x3a, 0x7a, 0x71, 0xea, 0x16, 0x05, 0x3a, 0x60, 0xa6, 0xdd, 0xbb, 0xd2, 0xc7, 0xb7, 0x6b, 0x3c, 0xa7, 0x11, 0x5a, 0xbb, 0x1d, 0x67, 0xc7, 0x02, 0x6a, 0xa0, 0x09, 0x74, 0xad, 0x1e, 0x76, 0xf2, 0x22, 0x68, 0x91, 0x31, 0xdf, 0x1e, 0xd2, 0x1f, 0xde, 0x16, 0x02, 0x83, 0xcb, 0x5f, 0xb4, 0xe2, 0x74, 0x11, 0xf8, 0xf5, 0x2c, 0x88, 0xcd, 0x8a, 0x01, 0x37, 0xa0, 0x3e, 0x30, 0x90, 0x67, 0x65, 0xe9, 0x4c, 0x94, 0x85, 0x03, 0x52, 0x2b, 0xf6, 0xc0, 0xdb, 0xbc, 0x85, 0x7f, 0xc6, 0xe9, 0xc4, 0x8f, 0x85, 0x09, 0xbf, 0x8d, 0x0b, 0xae, 0x71, 0xce, 0x1d, 0x9c, 0xa0, 0xa3, 0x6e, 0xe7, 0xef, 0x96, 0x51, 0x33, 0x25, 0x19, 0x19, 0x0a, 0xfa, 0xcb, 0xb9, 0xda, 0x40, 0x88, 0xd7, 0x60, 0x57, 0x91, 0x62, 0x44, 0x3e, 0x2a, 0x5d, 0xbe, 0xec, 0xc9, 0xba, 0x79, 0xcc, 0xa0, 0x99, 0xd5, 0xb7, 0x08, 0xe9, 0x51, 0xec, 0x58, 0x64, 0xbe, 0x62, 0x98, 0x9c, 0x37, 0xe2, 0xf8, 0x72, 0xb9, 0x64, 0x27, 0x4e, 0x7a, 0x14, 0xa1, 0x82, 0x30, 0xa3, 0x0b, 0x32, 0x36, 0x73, 0xf1, 0xa0, 0x9c, 0x7b, 0x68, 0x65, 0x29, 0xc2, 0x3c, 0xce, 0x73, 0x24, 0x06, 0x02, 0xae, 0x81, 0xbe, 0x2c, 0xcb, 0x53, 0xa6, 0x41, 0xc6, 0xce, 0xff, 0x72, 0x74, 0x6e, 0xd1, 0x5a, 0xd6, 0xd5, 0x47, 0x7c, 0xa0, 0x0d, 0x28, 0x9b, 0x58, 0xb4, 0x98, 0x61, 0x56, 0xa6, 0x8b, 0x45, 0x97, 0x00, 0x77, 0xf7, 0x4b, 0x23, 0xe4, 0x55, 0x41, 0xf3, 0xad, 0x48, 0x2a, 0xfa, 0xaf, 0x34, 0xeb, 0x2f, 0x53, 0x39, 0xda, 0xa0, 0x04, 0x71, 0xef, 0xdb, 0x13, 0xb0, 0xf2, 0xc2, 0x48, 0x8f, 0x81, 0xc4, 0xf7, 0xee, 0x54, 0x4b, 0x09, 0xae, 0x3a, 0xe1, 0xc6, 0xb2, 0xec, 0x5d, 0x70, 0x04, 0xd2, 0x18, 0x64, 0xb7, 0x6f, 0xb9, 0xa0, 0x2b, 0xdf, 0x4e, 0x7c, 0x91, 0x33, 0x84, 0x08, 0x3c, 0xda, 0x02, 0x97, 0x5f, 0xfb, 0x39, 0xe1, 0xe8, 0x4d, 0x8e, 0xd5, 0x45, 0x6c, 0x54, 0xe8, 0x1c, 0x76, 0xf8, 0x72, 0x4d, 0x0f, 0x94, 0xf6, 0xa0, 0xf8, 0x15, 0x2a, 0x0e, 0xd0, 0x40, 0x42, 0x95, 0x70, 0xee, 0xa5, 0xd6, 0x0a, 0x55, 0x5e, 0xab, 0xec, 0x0c, 0x51, 0xd5, 0xa5, 0x09, 0x67, 0x90, 0x07, 0x47, 0xa6, 0x11, 0x4e, 0xa6, 0x7b, 0x2a, 0xa0, 0x5f, 0x3b, 0xc0, 0x2e, 0x4e, 0x64, 0x82, 0x3f, 0x5d, 0x51, 0x33, 0xf4, 0x0c, 0xee, 0x6a, 0x8a, 0x80, 0xf6, 0x16, 0xd9, 0x69, 0x5c, 0xda, 0x69, 0x0b, 0x01, 0xaa, 0xbd, 0x64, 0xde, 0xae, 0x29, 0x80, 0xf9, 0x01, 0x91, 0x80, 0xa0, 0x56, 0x50, 0xd7, 0x45, 0x56, 0xe2, 0xc7, 0x88, 0xed, 0x8b, 0x7e, 0x78, 0x60, 0x26, 0x15, 0xed, 0x8c, 0xbb, 0xef, 0x46, 0xec, 0xa9, 0x62, 0x37, 0x84, 0xaf, 0xb0, 0x50, 0xbf, 0x81, 0x9e, 0xc3, 0xa0, 0x91, 0x36, 0x87, 0x6c, 0xbe, 0xbc, 0xc0, 0x00, 0x2b, 0x78, 0xee, 0xdb, 0x6e, 0x63, 0x3b, 0xfc, 0x5f, 0x0b, 0x89, 0xa6, 0x65, 0x31, 0x04, 0xa6, 0xc8, 0x2e, 0x35, 0x37, 0x4d, 0x56, 0xb2, 0xb4, 0xa0, 0xa5, 0xfd, 0x38, 0x67, 0x02, 0xb0, 0x10, 0xa3, 0x2b, 0x41, 0xd4, 0xf9, 0xdf, 0xc0, 0x3e, 0x88, 0xfa, 0xee, 0xa4, 0x19, 0x2c, 0x97, 0x4e, 0xef, 0x44, 0x25, 0xa4, 0x34, 0x23, 0x51, 0x7a, 0x66, 0xa0, 0xb5, 0xd9, 0x03, 0xc2, 0x3b, 0xc9, 0x6a, 0xee, 0xe0, 0xa9, 0x10, 0x56, 0x8f, 0xe9, 0xee, 0xfa, 0xba, 0xdb, 0xdd, 0x87, 0xcd, 0x74, 0xad, 0xb9, 0xce, 0x7c, 0x62, 0x7a, 0x38, 0xd8, 0xb5, 0x52, 0xa0, 0x03, 0xa5, 0x2a, 0x80, 0x2d, 0x0a, 0x9a, 0x28, 0x96, 0x31, 0xb5, 0xcf, 0xfa, 0xcd, 0xcd, 0xeb, 0x2d, 0x7c, 0x67, 0x42, 0x6f, 0x16, 0xc3, 0x4c, 0xb2, 0x11, 0x51, 0x17, 0xf1, 0x10, 0x85, 0x90, 0x80, 0xa0, 0xe2, 0xe2, 0xff, 0x41, 0x5b, 0x12, 0x85, 0x2d, 0x6e, 0x1e, 0xbe, 0xfc, 0xe8, 0x3f, 0xe0, 0xda, 0xa8, 0xef, 0x60, 0x74, 0x52, 0x51, 0xec, 0x4d, 0xb3, 0x73, 0xb4, 0xba, 0x0f, 0x2f, 0xba, 0x85, 0x80, 0x80, 0xa0, 0x29, 0x89, 0xfd, 0x59, 0x03, 0x9e, 0x3e, 0x59, 0x8b, 0xd3, 0xa3, 0x9c, 0xbe, 0x4e, 0xf8, 0xa7, 0xa4, 0x83, 0x08, 0x2e, 0x21, 0x41, 0x84, 0xe0, 0x8c, 0x97, 0xde, 0x34, 0x38, 0xc7, 0x64, 0x82, 0xa0, 0x77, 0x30, 0x6d, 0x7d, 0xcc, 0xf5, 0xd2, 0xc3, 0x40, 0x36, 0xe1, 0x8f, 0x25, 0xea, 0xc8, 0xa0, 0x6f, 0xe4, 0x81, 0xf6, 0x99, 0x34, 0x6c, 0x5f, 0x1c, 0x73, 0x25, 0x43, 0x08, 0xc6, 0x5e, 0x72, 0xa0, 0x5d, 0x59, 0x07, 0xb7, 0x6e, 0x03, 0xa4, 0xee, 0x8c, 0x4a, 0xd4, 0xae, 0xfd, 0x9a, 0x7f, 0x69, 0x4c, 0x8c, 0xa5, 0xdb, 0xa6, 0xa9, 0x9c, 0xb7, 0xed, 0x77, 0x3a, 0x49, 0x7c, 0x81, 0xaa, 0x21, 0xa0, 0xa4, 0x44, 0x1a, 0xff, 0x42, 0x9f, 0x0a, 0xf8, 0x5b, 0x4d, 0x8b, 0x84, 0xd7, 0xca, 0xa1, 0x66, 0x47, 0x0d, 0xf8, 0xb7, 0x49, 0x10, 0x8d, 0xef, 0x5c, 0x7f, 0x08, 0x48, 0x92, 0xe0, 0x18, 0x2b, 0xa0, 0x97, 0xf5, 0x4d, 0xba, 0xc4, 0x2e, 0x2f, 0x0f, 0xdb, 0xc0, 0x81, 0x0e, 0xf8, 0x5b, 0xe0, 0x3a, 0x57, 0x65, 0x3b, 0x18, 0x98, 0xe3, 0x24, 0x24, 0xce, 0x20, 0x35, 0x66, 0x66, 0x64, 0x14, 0xe8, 0xa0, 0x31, 0x09, 0xe1, 0xd7, 0x9e, 0x01, 0x6b, 0x79, 0xc7, 0x56, 0xac, 0x91, 0x76, 0x0f, 0x5a, 0x2b, 0xb8, 0x31, 0x2d, 0xe1, 0xf7, 0x49, 0x21, 0xb1, 0x24, 0xb6, 0x6d, 0xb7, 0x01, 0xf0, 0xb8, 0xe8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x51, 0x80, 0x80, 0xa0, 0x4d, 0x00, 0x98, 0x7b, 0x36, 0x07, 0xf5, 0x95, 0x38, 0xcf, 0xf9, 0xa3, 0xfa, 0x76, 0x25, 0x61, 0x86, 0x46, 0x96, 0xd3, 0x7e, 0xf0, 0x8b, 0x39, 0x63, 0x6c, 0x70, 0xf8, 0x25, 0xdb, 0x98, 0x5c, 0xa0, 0x8e, 0x97, 0x27, 0x19, 0x39, 0xbc, 0xf5, 0x9b, 0x01, 0x7c, 0x69, 0xff, 0x1c, 0x54, 0x45, 0x32, 0x35, 0xce, 0x9e, 0x6a, 0x5c, 0xc2, 0x03, 0x09, 0x66, 0x83, 0x9d, 0x11, 0xda, 0x22, 0x66, 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6d, 0x9d, 0x20, 0x50, 0xfb, 0x95, 0x31, 0x3f, 0x52, 0x8e, 0xf8, 0x30, 0xc3, 0xa9, 0x6a, 0x1d, 0x65, 0x22, 0x9e, 0x70, 0x82, 0x94, 0xc2, 0xd1, 0x6d, 0xef, 0xb1, 0x25, 0x3d, 0x96, 0xb4, 0xb8, 0x4d, 0xf8, 0x4b, 0x01, 0x87, 0x24, 0x3d, 0xc1, 0x65, 0x5a, 0x90, 0x00, 0xa0, 0xf2, 0xb1, 0x58, 0x8b, 0xe2, 0x23, 0xbb, 0xb7, 0x2b, 0x6f, 0x2f, 0x2f, 0x5d, 0x25, 0xf7, 0x42, 0x4f, 0xb0, 0x9e, 0x21, 0x23, 0x97, 0xf4, 0xd7, 0x16, 0xa6, 0xa8, 0x78, 0x5a, 0x6e, 0xda, 0x4d, 0xa0, 0x0b, 0xa5, 0xe2, 0x5e, 0x74, 0xd8, 0x1b, 0xab, 0x32, 0x71, 0x10, 0xc8, 0xd8, 0xb4, 0x43, 0x20, 0xf5, 0x0a, 0xd5, 0xc3, 0xe9, 0x1a, 0x54, 0x6a, 0x5c, 0x5a, 0x9b, 0x60, 0x5c, 0xf6, 0x53, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/state_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/state_proof_new.nr index 518f1c22..e469c336 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/state_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/state_proof_new.nr @@ -48,3 +48,5 @@ global proof_input = ProofInput { depth: 9 } }; + +global proof_input_serialized = proof_input.serialize(); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/storage_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/storage_proof.nr index af008819..7fe5f761 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/storage_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/storage_proof.nr @@ -1,7 +1,7 @@ -use crate::account_with_storage::StorageProof; +use crate::account_with_storage::LegacyStorageProof; global proofs = [ - StorageProof { + LegacyStorageProof { key: [ 0x40, 0x57, 0x87, 0xfa, 0x12, 0xa8, 0x23, 0xe0, 0xf2, 0xb7, 0x63, 0x1c, 0xc4, 0x1b, 0x3b, 0xa8, 0x82, 0x8b, 0x33, 0x21, 0xca, 0x81, 0x11, 0x11, 0xfa, 0x75, 0xcd, 0x3a, 0xa3, 0xbb, 0x5a, 0xdd ], diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/storage_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/storage_proof_new.nr index b991d0c8..b399916b 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/storage_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/bored_ape_yacht_club/storage_proof_new.nr @@ -1,4 +1,5 @@ use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; +use crate::account_with_storage::{MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_STORAGE_DEPTH_NO_LEAF_M, MAX_STORAGE_VALUE_LEN, MAX_STORAGE_LEAF_LEN}; global proofs = [ ProofInput { @@ -38,3 +39,5 @@ global proofs = [ } } ]; + +global proofs_serialized = proofs.map(|proof: ProofInput| proof.serialize()); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/account.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/account.nr index 38267ec4..10e75218 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/account.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/account.nr @@ -5,7 +5,7 @@ global address = [ ]; global rlp_encoded_left_padded_account = [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0x85, 0xf1, 0x2f, 0x77, 0x60, 0xbd, 0x7c, 0x79, 0x5a, 0xc3, 0x9c, 0x42, 0xc6, 0xba, 0xc1, 0xb0, 0x9e, 0xbe, 0xd8, 0x73, 0x31, 0xba, 0x07, 0x13, 0xe3, 0xcf, 0xea, 0x16, 0x5d, 0xee, 0x32, 0xa2, 0xa0, 0xd4, 0xe5, 0xa9, 0xdf, 0xf2, 0x2a, 0xcb, 0x67, 0x5a, 0x29, 0x1c, 0x79, 0x61, 0x6f, 0x91, 0xb1, 0x52, 0x6c, 0xe1, 0xa8, 0x4d, 0xff, 0x4b, 0xd9, 0x69, 0x5f, 0x3f, 0x39, 0xae, 0x77, 0x9f, 0x11 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0x85, 0xf1, 0x2f, 0x77, 0x60, 0xbd, 0x7c, 0x79, 0x5a, 0xc3, 0x9c, 0x42, 0xc6, 0xba, 0xc1, 0xb0, 0x9e, 0xbe, 0xd8, 0x73, 0x31, 0xba, 0x07, 0x13, 0xe3, 0xcf, 0xea, 0x16, 0x5d, 0xee, 0x32, 0xa2, 0xa0, 0xd4, 0xe5, 0xa9, 0xdf, 0xf2, 0x2a, 0xcb, 0x67, 0x5a, 0x29, 0x1c, 0x79, 0x61, 0x6f, 0x91, 0xb1, 0x52, 0x6c, 0xe1, 0xa8, 0x4d, 0xff, 0x4b, 0xd9, 0x69, 0x5f, 0x3f, 0x39, 0xae, 0x77, 0x9f, 0x11 ]; global nonce = 1; diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/state_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/state_proof.nr index c459a16f..c8f250b0 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/state_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/state_proof.nr @@ -1,11 +1,11 @@ -use crate::account::StateProof; +use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: [ 0x9c, 0x8f, 0xf3, 0x14, 0xc9, 0xbc, 0x7f, 0x6e, 0x59, 0xa9, 0xd9, 0x22, 0x5f, 0xb2, 0x29, 0x46, 0x42, 0x7e, 0xdc, 0x03 ], value: [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0x85, 0xf1, 0x2f, 0x77, 0x60, 0xbd, 0x7c, 0x79, 0x5a, 0xc3, 0x9c, 0x42, 0xc6, 0xba, 0xc1, 0xb0, 0x9e, 0xbe, 0xd8, 0x73, 0x31, 0xba, 0x07, 0x13, 0xe3, 0xcf, 0xea, 0x16, 0x5d, 0xee, 0x32, 0xa2, 0xa0, 0xd4, 0xe5, 0xa9, 0xdf, 0xf2, 0x2a, 0xcb, 0x67, 0x5a, 0x29, 0x1c, 0x79, 0x61, 0x6f, 0x91, 0xb1, 0x52, 0x6c, 0xe1, 0xa8, 0x4d, 0xff, 0x4b, 0xd9, 0x69, 0x5f, 0x3f, 0x39, 0xae, 0x77, 0x9f, 0x11 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0x85, 0xf1, 0x2f, 0x77, 0x60, 0xbd, 0x7c, 0x79, 0x5a, 0xc3, 0x9c, 0x42, 0xc6, 0xba, 0xc1, 0xb0, 0x9e, 0xbe, 0xd8, 0x73, 0x31, 0xba, 0x07, 0x13, 0xe3, 0xcf, 0xea, 0x16, 0x5d, 0xee, 0x32, 0xa2, 0xa0, 0xd4, 0xe5, 0xa9, 0xdf, 0xf2, 0x2a, 0xcb, 0x67, 0x5a, 0x29, 0x1c, 0x79, 0x61, 0x6f, 0x91, 0xb1, 0x52, 0x6c, 0xe1, 0xa8, 0x4d, 0xff, 0x4b, 0xd9, 0x69, 0x5f, 0x3f, 0x39, 0xae, 0x77, 0x9f, 0x11 ], proof: [ 0xf9, 0x02, 0x11, 0xa0, 0x49, 0x1f, 0x39, 0x6d, 0x5d, 0x47, 0x68, 0xa0, 0x1e, 0xe4, 0x28, 0x2a, 0x3a, 0xb1, 0x12, 0x7f, 0x2a, 0x4d, 0xc7, 0xd4, 0x2e, 0x6c, 0x1d, 0xbb, 0x3e, 0x71, 0xad, 0x4e, 0x92, 0x99, 0xf5, 0xe7, 0xa0, 0x5b, 0x46, 0x45, 0x21, 0x9e, 0x61, 0x4b, 0x38, 0x8b, 0xa9, 0x67, 0x24, 0x52, 0xb4, 0x0f, 0x29, 0x19, 0x87, 0xb1, 0x5e, 0x35, 0xbd, 0xbd, 0x3d, 0xfe, 0xbf, 0xac, 0x9a, 0x08, 0x5a, 0xea, 0xb2, 0xa0, 0x97, 0x9e, 0xbc, 0xa2, 0xa6, 0xa0, 0xdf, 0x38, 0x9f, 0xdf, 0xef, 0x5b, 0xfa, 0x4a, 0x31, 0xf2, 0xef, 0xa8, 0xd3, 0x85, 0xbf, 0x2f, 0x43, 0xcd, 0x69, 0xc2, 0x7e, 0x61, 0x16, 0x5c, 0x36, 0x67, 0xa0, 0x1b, 0xbe, 0x04, 0x54, 0x3b, 0xb6, 0xbf, 0x80, 0x26, 0xee, 0x3e, 0xc2, 0xa3, 0xec, 0x3d, 0x61, 0x73, 0xa6, 0x0c, 0x09, 0x00, 0x08, 0xb5, 0x97, 0x79, 0xf7, 0x67, 0xe5, 0x76, 0x9d, 0x7a, 0x0a, 0xa0, 0x51, 0xd3, 0x47, 0xec, 0x61, 0xc7, 0xdd, 0xe5, 0xc4, 0x14, 0x9a, 0x94, 0x3d, 0x0a, 0xa4, 0x89, 0x54, 0x4c, 0xbe, 0xa5, 0x11, 0xed, 0x3d, 0x7f, 0x4f, 0xc6, 0xaa, 0xa5, 0x2a, 0x42, 0x0d, 0x3e, 0xa0, 0x53, 0x58, 0xbc, 0x8e, 0x1e, 0x1f, 0x20, 0xe5, 0x10, 0x88, 0x72, 0x26, 0xd6, 0x7e, 0xfe, 0xe7, 0x37, 0x69, 0xd0, 0xb1, 0x3e, 0xbb, 0x24, 0xa3, 0xe7, 0x50, 0xc2, 0x21, 0x4e, 0xf0, 0x90, 0xd5, 0xa0, 0x4d, 0xf1, 0xc2, 0x4e, 0xbf, 0x40, 0xbe, 0xfc, 0xe6, 0x0c, 0x8e, 0xb3, 0x0a, 0x31, 0x89, 0x41, 0x02, 0x88, 0x14, 0x54, 0xfc, 0xde, 0xb6, 0xf7, 0xb8, 0x3e, 0x1f, 0xb9, 0x16, 0xc9, 0x53, 0xa8, 0xa0, 0x0a, 0x85, 0xe0, 0x4f, 0x30, 0xa4, 0x97, 0x87, 0x12, 0xc5, 0x8a, 0x82, 0x5e, 0x7b, 0xd2, 0xf8, 0xa8, 0x37, 0x31, 0xab, 0x1a, 0xa3, 0xe2, 0x34, 0xa0, 0x20, 0x7e, 0x91, 0x87, 0x90, 0x50, 0x5f, 0xa0, 0x77, 0x8a, 0x45, 0x43, 0x72, 0x18, 0x48, 0x6b, 0x78, 0x49, 0xae, 0xf8, 0x90, 0xd4, 0x83, 0xdc, 0xc2, 0xde, 0xb1, 0x42, 0x3c, 0xb8, 0x1e, 0x48, 0x8b, 0x7b, 0xe2, 0x92, 0x1d, 0x50, 0x5b, 0xf4, 0xa0, 0x51, 0xdb, 0xae, 0xf3, 0xc3, 0xd3, 0xfe, 0x82, 0xbd, 0x14, 0x84, 0x95, 0x4f, 0x38, 0x50, 0x8f, 0x65, 0x1d, 0x86, 0x7f, 0x38, 0x7f, 0x71, 0xde, 0xdb, 0xfb, 0x0f, 0x73, 0x55, 0x98, 0x7e, 0xd5, 0xa0, 0x61, 0x67, 0x9f, 0x43, 0xf3, 0xdb, 0x26, 0x67, 0x3b, 0xb6, 0x87, 0xc5, 0x84, 0xf3, 0x0a, 0xe3, 0xcf, 0xf7, 0x26, 0x1e, 0x71, 0xac, 0xf0, 0x7e, 0xd1, 0xfe, 0xae, 0xca, 0xe0, 0x98, 0xfc, 0x79, 0xa0, 0x99, 0x76, 0x1e, 0xa7, 0xd9, 0x4e, 0x01, 0xb1, 0x42, 0x85, 0xb7, 0xce, 0xd7, 0xdc, 0xd1, 0x67, 0x7f, 0xbd, 0x3c, 0xe0, 0x93, 0xa6, 0x27, 0xa8, 0xe1, 0x47, 0x20, 0x74, 0xba, 0xad, 0x8b, 0xd9, 0xa0, 0xbb, 0x6d, 0x26, 0x9f, 0xc6, 0x14, 0x43, 0xaa, 0x28, 0xb1, 0x4a, 0xf0, 0x44, 0x8a, 0xaf, 0x6f, 0x1f, 0x57, 0x04, 0x77, 0xd8, 0xb4, 0xef, 0x2e, 0xb7, 0xd3, 0x15, 0x43, 0x20, 0x2c, 0xe6, 0x02, 0xa0, 0x6c, 0x41, 0xcd, 0x2d, 0x17, 0x01, 0xb0, 0x58, 0x85, 0x35, 0x91, 0xa2, 0xf3, 0x06, 0xdd, 0xcf, 0xd1, 0xe5, 0x5d, 0x3e, 0x12, 0x01, 0x1c, 0xad, 0xb1, 0x00, 0xe7, 0xc5, 0x25, 0xaa, 0xf4, 0x60, 0xa0, 0xbc, 0xf3, 0x7a, 0xba, 0xac, 0x56, 0x6b, 0xb9, 0x8e, 0x09, 0x15, 0x75, 0xaf, 0x40, 0x38, 0x04, 0xdb, 0xb2, 0x78, 0xfb, 0xfa, 0x55, 0x47, 0xde, 0x68, 0x05, 0xcb, 0xaa, 0x52, 0x9a, 0xe1, 0x37, 0xa0, 0xde, 0x99, 0x18, 0xa2, 0xa9, 0x76, 0xa2, 0xb0, 0xb3, 0xf4, 0xae, 0xff, 0x80, 0x1f, 0xc7, 0x95, 0x57, 0x42, 0x6b, 0x19, 0xc1, 0x5d, 0x41, 0x4d, 0xdf, 0x8f, 0xae, 0x84, 0x37, 0x85, 0xb0, 0xb7, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xce, 0xa9, 0x8a, 0x5e, 0xe5, 0xd2, 0x83, 0x72, 0xe9, 0xea, 0xcb, 0x03, 0x61, 0xdf, 0x28, 0x31, 0x70, 0x5a, 0x75, 0x9e, 0x84, 0x3d, 0xd5, 0xf8, 0xb9, 0x68, 0xfd, 0x8c, 0xb3, 0x48, 0xb0, 0xb3, 0xa0, 0x63, 0x50, 0x3a, 0xdc, 0x97, 0x94, 0xa3, 0x2b, 0x9a, 0xe9, 0xe5, 0x3a, 0xcb, 0x91, 0x7a, 0x49, 0x14, 0xb2, 0x05, 0x4b, 0x09, 0x90, 0xb6, 0x64, 0xb1, 0xd9, 0x01, 0xb2, 0x07, 0xb9, 0x3b, 0x6b, 0xa0, 0xb3, 0xe7, 0xf7, 0xbe, 0x7e, 0x49, 0x54, 0x00, 0x08, 0xd1, 0x65, 0x09, 0x77, 0x37, 0x13, 0xe2, 0x7d, 0xe3, 0xdf, 0xf8, 0xe4, 0x5b, 0x95, 0x48, 0xe2, 0xf6, 0x8a, 0xd6, 0x57, 0xb4, 0x5e, 0xe3, 0xa0, 0xcd, 0xc5, 0x84, 0xe7, 0xb4, 0x9b, 0x36, 0x9d, 0xc0, 0x81, 0xa1, 0x84, 0x6d, 0x10, 0x38, 0x6d, 0x02, 0x13, 0xa6, 0x64, 0x07, 0xdb, 0x65, 0x12, 0x9a, 0x7c, 0xb5, 0xb2, 0xef, 0xc3, 0xf5, 0x9d, 0xa0, 0xf4, 0xac, 0x79, 0x58, 0xd5, 0xa7, 0x05, 0xc5, 0x6c, 0xa2, 0xb1, 0x18, 0xb2, 0x7f, 0x69, 0x52, 0xce, 0xc9, 0xec, 0x42, 0xfb, 0xae, 0x10, 0xa7, 0x27, 0xc4, 0xcc, 0x62, 0x2b, 0xf7, 0x6f, 0xa0, 0xa0, 0xeb, 0x19, 0x5c, 0x26, 0x26, 0xfb, 0x5c, 0x29, 0xcb, 0xd5, 0x40, 0x32, 0x45, 0x75, 0x19, 0x2f, 0x52, 0x64, 0xa3, 0xe0, 0xcb, 0x9f, 0xa1, 0x11, 0x68, 0xdb, 0xa1, 0xc1, 0x58, 0x6b, 0xa9, 0xaf, 0xa0, 0x18, 0xc5, 0xcb, 0x9d, 0xfd, 0x6e, 0x8e, 0x79, 0xf9, 0xa4, 0x6e, 0xa1, 0xbe, 0x47, 0xd6, 0xfe, 0xaf, 0xca, 0x93, 0x75, 0x34, 0xb8, 0xdc, 0x06, 0x99, 0xd2, 0xb6, 0x6f, 0x02, 0x0b, 0xba, 0x8f, 0xa0, 0xfb, 0xb4, 0x8a, 0x05, 0xcf, 0x10, 0x30, 0xf2, 0x67, 0x55, 0x21, 0x51, 0xeb, 0xb4, 0x61, 0x81, 0xb7, 0xe6, 0x85, 0xd0, 0x26, 0x02, 0x39, 0x19, 0xaf, 0xd6, 0xa7, 0xec, 0x77, 0x6e, 0xda, 0x38, 0xa0, 0x97, 0xbe, 0x1f, 0x03, 0x00, 0x1f, 0x68, 0x37, 0xeb, 0x42, 0xe3, 0x48, 0xcd, 0x7a, 0x84, 0x14, 0x5a, 0xd3, 0xbd, 0xf8, 0x5a, 0xf7, 0x0c, 0xe4, 0xf9, 0x29, 0x8e, 0x77, 0x3a, 0xd4, 0x0b, 0x54, 0xa0, 0x83, 0xc3, 0x78, 0xe1, 0x3f, 0x6c, 0x56, 0xdd, 0xc9, 0x95, 0x06, 0x79, 0xa7, 0x2c, 0x7c, 0xca, 0x95, 0x26, 0xdf, 0x36, 0x48, 0x95, 0x69, 0x79, 0x89, 0xb6, 0x35, 0x16, 0x9d, 0xcc, 0xf7, 0x14, 0xa0, 0x16, 0x64, 0xe9, 0xd9, 0x26, 0x93, 0x43, 0x0d, 0x97, 0x4e, 0x69, 0x82, 0xe0, 0xf4, 0xad, 0xb7, 0xef, 0x0c, 0x5f, 0x5c, 0x76, 0xef, 0xad, 0x6e, 0x23, 0x91, 0xaf, 0x81, 0xec, 0x82, 0x88, 0x78, 0xa0, 0x95, 0x4e, 0x61, 0x0c, 0x98, 0x05, 0xa2, 0xd9, 0x91, 0xab, 0x8f, 0xa9, 0x41, 0xc5, 0x95, 0x86, 0x41, 0x64, 0xd5, 0xf1, 0xad, 0x60, 0xaa, 0x36, 0xd3, 0x48, 0x4d, 0x05, 0x82, 0x67, 0x1e, 0x88, 0xa0, 0xe4, 0x63, 0x72, 0x25, 0x22, 0xf2, 0xe4, 0x5f, 0x05, 0xf9, 0x9e, 0xd0, 0x2f, 0x9f, 0x2f, 0xc2, 0x6f, 0x61, 0x13, 0x8d, 0xe9, 0x3c, 0xc3, 0x72, 0x19, 0xc7, 0x16, 0x2b, 0xab, 0xbf, 0x8d, 0x3a, 0xa0, 0x15, 0x81, 0x74, 0x46, 0x0b, 0x2d, 0x13, 0x30, 0x12, 0xdc, 0x81, 0x45, 0x4d, 0x72, 0xd8, 0xf0, 0xdc, 0xdc, 0xb0, 0x0e, 0x9e, 0x96, 0xa0, 0xd3, 0xd5, 0x67, 0x63, 0x86, 0x18, 0xcd, 0xfa, 0xf8, 0xa0, 0x45, 0xf7, 0x15, 0x31, 0x50, 0x21, 0x4a, 0xd5, 0xd3, 0xaa, 0x6a, 0x86, 0x54, 0x1e, 0xa8, 0x64, 0x8c, 0xd5, 0xd6, 0x5a, 0x21, 0x83, 0xb5, 0xa0, 0x6c, 0x6b, 0xa4, 0xbb, 0xc3, 0x1d, 0x29, 0x78, 0xa0, 0x35, 0xf4, 0xf1, 0xeb, 0x80, 0x97, 0x85, 0xc5, 0xbf, 0x7a, 0x1b, 0xbb, 0x79, 0x2c, 0xac, 0xfd, 0x8b, 0x77, 0x84, 0x75, 0xc4, 0x78, 0xcd, 0x6f, 0xd9, 0x83, 0x6b, 0xa2, 0xbb, 0x65, 0x95, 0x91, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xfd, 0x90, 0xf0, 0xce, 0x56, 0x49, 0xa3, 0x98, 0x30, 0xfd, 0x15, 0xde, 0x79, 0x16, 0xa5, 0x71, 0x18, 0xb3, 0xaa, 0x7b, 0xe0, 0x59, 0x89, 0xf9, 0x54, 0xcb, 0xc7, 0x64, 0x90, 0x20, 0x5f, 0xbd, 0xa0, 0xed, 0x7d, 0x04, 0xff, 0xfe, 0xc9, 0x3a, 0x7e, 0xbe, 0x99, 0xc9, 0x80, 0x99, 0x8a, 0x7a, 0xbf, 0xda, 0xf2, 0x69, 0xf8, 0x33, 0xa4, 0xa1, 0xca, 0xce, 0x41, 0xa0, 0x7e, 0xc3, 0x21, 0x5d, 0x32, 0xa0, 0xf5, 0xed, 0xbc, 0x7f, 0xc2, 0x31, 0xe9, 0x51, 0xbf, 0xba, 0xb1, 0x95, 0xd2, 0xac, 0x8f, 0x85, 0xfe, 0x18, 0x5c, 0x46, 0x9d, 0x12, 0xce, 0x5c, 0xb4, 0xa5, 0xb2, 0xcd, 0x3a, 0xf7, 0xf0, 0xc8, 0xa0, 0xe6, 0xac, 0x8e, 0xb0, 0x3c, 0xe8, 0x06, 0xea, 0x9e, 0x54, 0x3b, 0xd4, 0x59, 0x9f, 0x3d, 0x45, 0x8e, 0xa9, 0x20, 0xb4, 0xb0, 0x15, 0x61, 0xff, 0x35, 0xf4, 0xe0, 0x69, 0xe2, 0x93, 0x5e, 0x12, 0xa0, 0xa8, 0x96, 0x9a, 0x4a, 0x34, 0xec, 0x89, 0x69, 0x8c, 0x0e, 0x09, 0x81, 0x2b, 0x8c, 0x31, 0xba, 0x19, 0xad, 0x50, 0x8f, 0x81, 0xf6, 0x14, 0x49, 0x82, 0xba, 0xb7, 0x98, 0x1d, 0x3d, 0xaa, 0x82, 0xa0, 0x0f, 0x37, 0x28, 0x60, 0xfd, 0x47, 0xa5, 0xfd, 0x7d, 0x29, 0xe0, 0xed, 0x8b, 0x0b, 0x2c, 0x94, 0xa9, 0xb4, 0x23, 0x42, 0x63, 0xd9, 0x05, 0xe3, 0x88, 0xbc, 0xb5, 0xb0, 0xdb, 0xee, 0xd8, 0x08, 0xa0, 0x69, 0x22, 0x29, 0xa1, 0x2f, 0xd8, 0x90, 0x10, 0xe1, 0xe5, 0x62, 0xe0, 0x17, 0x30, 0x81, 0x11, 0x81, 0x2f, 0x0e, 0xd0, 0x1f, 0xa1, 0xf1, 0x1b, 0x77, 0xdd, 0x79, 0xff, 0xa8, 0xba, 0x0b, 0xd6, 0xa0, 0x27, 0xf4, 0x0a, 0x30, 0x9e, 0xf8, 0x32, 0x69, 0x9e, 0xce, 0x74, 0x61, 0x3e, 0x48, 0x69, 0x94, 0xa4, 0x29, 0x6d, 0xc5, 0xb2, 0x1a, 0x15, 0xf5, 0xca, 0xaa, 0x92, 0xb2, 0xe0, 0xf7, 0xa1, 0xdc, 0xa0, 0x59, 0xb8, 0x0a, 0xf5, 0x55, 0x2a, 0x80, 0x03, 0xde, 0xdc, 0xba, 0xe5, 0x8b, 0x83, 0x6f, 0x86, 0x96, 0xb4, 0x20, 0x8b, 0x59, 0xb8, 0xfb, 0x6e, 0xac, 0x2b, 0xe1, 0x4f, 0x04, 0x33, 0xf8, 0xd8, 0xa0, 0x25, 0x71, 0x39, 0x95, 0xc0, 0xe4, 0x79, 0xb7, 0x35, 0x8d, 0xbf, 0xc7, 0x89, 0x5d, 0xe5, 0x60, 0xee, 0xd2, 0x57, 0x27, 0xc7, 0x57, 0xa2, 0xd5, 0x99, 0xb3, 0xd2, 0x12, 0x07, 0x09, 0xe9, 0xad, 0xa0, 0xe3, 0xf2, 0x53, 0x9b, 0x96, 0x6b, 0x71, 0x1b, 0x5a, 0x8f, 0x15, 0x28, 0xc2, 0xf6, 0xd9, 0x58, 0x29, 0x7a, 0x99, 0x16, 0x3d, 0x9c, 0xb7, 0xf2, 0xf3, 0x92, 0xe4, 0xe1, 0xa8, 0x4e, 0xd6, 0x97, 0xa0, 0xe3, 0x6a, 0xee, 0x05, 0x23, 0xaf, 0x79, 0x30, 0x34, 0x7d, 0x57, 0x85, 0x0b, 0x8f, 0xc6, 0x95, 0x99, 0xa8, 0x9c, 0xad, 0x2b, 0x86, 0x27, 0xb3, 0x0a, 0x57, 0x33, 0x64, 0x18, 0x76, 0x2e, 0x0f, 0xa0, 0xbd, 0xf4, 0x23, 0xab, 0x77, 0xea, 0xb4, 0x2b, 0x72, 0xcb, 0xa4, 0x99, 0x88, 0xd8, 0x3b, 0x5b, 0x76, 0x80, 0xeb, 0xbe, 0xc0, 0x85, 0x95, 0xfc, 0x94, 0x9b, 0xaf, 0x9b, 0x29, 0x58, 0x68, 0x46, 0xa0, 0x2b, 0xdd, 0x66, 0x10, 0xdb, 0x6e, 0xcb, 0xd4, 0x37, 0x53, 0x66, 0x6c, 0xd4, 0x3e, 0x6a, 0x5c, 0x2e, 0xd1, 0xd0, 0x9b, 0xd5, 0x24, 0x78, 0x47, 0xc1, 0xaa, 0xf5, 0xfa, 0x1a, 0x89, 0x4e, 0x2f, 0xa0, 0x84, 0xcb, 0x1e, 0xcc, 0x0f, 0xca, 0xc9, 0xf4, 0xa8, 0x7d, 0x41, 0x8b, 0x38, 0x96, 0x0b, 0x0d, 0xa0, 0x1d, 0x9e, 0x14, 0x2c, 0xf5, 0x7e, 0x84, 0x77, 0xa2, 0x71, 0xf1, 0xf8, 0x5b, 0x26, 0x8c, 0xa0, 0x73, 0x5e, 0x23, 0x16, 0xa6, 0x89, 0x37, 0xf0, 0x48, 0x0c, 0x44, 0x6a, 0x6f, 0xfa, 0x8b, 0xa5, 0xd8, 0xb0, 0x91, 0xf6, 0x20, 0x55, 0xe8, 0xb7, 0x26, 0x96, 0xd7, 0xc1, 0x92, 0x94, 0x51, 0xc1, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x0c, 0x0c, 0x0f, 0x55, 0xae, 0xde, 0x69, 0x40, 0xb2, 0x64, 0xec, 0x48, 0x9b, 0x79, 0x39, 0x40, 0x16, 0x22, 0x01, 0x3f, 0xb0, 0xe7, 0x5a, 0x3b, 0x85, 0x4f, 0x87, 0x92, 0xc4, 0xc5, 0xac, 0x76, 0xa0, 0x92, 0x2a, 0xd5, 0xb6, 0xd2, 0xc2, 0x8f, 0x98, 0xc6, 0x71, 0x63, 0x67, 0xe2, 0x4a, 0x74, 0xbc, 0x75, 0xcb, 0x8d, 0xad, 0xa2, 0x84, 0x82, 0xec, 0xf7, 0xe0, 0x90, 0xb1, 0x5f, 0x9c, 0x67, 0xee, 0xa0, 0x53, 0x89, 0xb9, 0xbd, 0x7d, 0x1a, 0x74, 0x81, 0x87, 0xde, 0x16, 0xc4, 0x10, 0x12, 0x8b, 0x07, 0xe4, 0xa9, 0xa3, 0x71, 0x69, 0x92, 0x81, 0x47, 0x49, 0x10, 0xac, 0x54, 0x84, 0x8d, 0x26, 0x70, 0xa0, 0xed, 0x9a, 0x9c, 0x72, 0xbe, 0xe3, 0x7a, 0x01, 0x2a, 0x01, 0x55, 0x55, 0x03, 0x05, 0x79, 0x2d, 0x2f, 0x65, 0x28, 0x1e, 0xb6, 0x15, 0x0d, 0x9a, 0x17, 0xda, 0xc3, 0x6f, 0x13, 0x6f, 0x39, 0x7d, 0xa0, 0x79, 0x7a, 0x64, 0xb4, 0x8f, 0x76, 0x09, 0x72, 0x73, 0xe6, 0x22, 0x26, 0x02, 0x22, 0x7f, 0x98, 0x1f, 0x46, 0x3a, 0x92, 0xdb, 0x5d, 0x8b, 0xe7, 0x79, 0xf8, 0x36, 0xbf, 0x43, 0x97, 0xb9, 0x4d, 0xa0, 0xe4, 0x2f, 0xc4, 0x7d, 0x0d, 0x16, 0xdb, 0x70, 0x1c, 0xa1, 0x2d, 0xd7, 0x39, 0x5a, 0x5c, 0x50, 0x73, 0x99, 0xfc, 0x84, 0x20, 0x0b, 0xc7, 0x71, 0xc8, 0x90, 0xc1, 0x8b, 0x2c, 0x3a, 0x71, 0xf5, 0xa0, 0x19, 0x32, 0xdc, 0xe3, 0x51, 0xc8, 0x3f, 0x50, 0x61, 0xd0, 0xb1, 0x41, 0x64, 0xc2, 0xed, 0x80, 0xc5, 0xf9, 0x50, 0x5e, 0xc7, 0x7d, 0xa8, 0x53, 0x71, 0x68, 0xe7, 0xbf, 0xa6, 0x22, 0x8f, 0xaf, 0xa0, 0x49, 0xce, 0x41, 0x0c, 0xf8, 0xb3, 0x28, 0xb2, 0x66, 0x17, 0x64, 0xa7, 0xab, 0x7b, 0xfe, 0x49, 0x7c, 0x98, 0x5b, 0x3c, 0xb9, 0x3e, 0x83, 0xa5, 0x59, 0x92, 0x60, 0xab, 0x1f, 0x04, 0xa0, 0xbb, 0xa0, 0x64, 0xb1, 0xf1, 0xbd, 0x2f, 0x92, 0x3c, 0xf2, 0x5d, 0x00, 0x83, 0xef, 0x2e, 0x01, 0xc8, 0x86, 0x14, 0x54, 0x3c, 0x7b, 0x2c, 0xac, 0x9f, 0x9c, 0x61, 0x90, 0x35, 0xd7, 0x99, 0x76, 0xc5, 0x44, 0xa0, 0x15, 0xc0, 0x0d, 0xac, 0x66, 0xc5, 0xd9, 0xfc, 0xe7, 0x7b, 0x24, 0xfd, 0x85, 0x4a, 0xa0, 0xb0, 0x1b, 0xf7, 0x37, 0xf3, 0xf9, 0x2d, 0xb8, 0x0a, 0xbc, 0xc5, 0x7e, 0x8b, 0x89, 0x58, 0x70, 0x53, 0xa0, 0x08, 0x24, 0x72, 0xf9, 0xde, 0x62, 0x80, 0xe7, 0xc1, 0x2e, 0x24, 0x38, 0xce, 0xdb, 0x07, 0x72, 0xff, 0xb7, 0xed, 0x74, 0xe0, 0xcd, 0x61, 0xa3, 0x04, 0x00, 0xe9, 0xde, 0x2b, 0xf5, 0x0b, 0xdd, 0xa0, 0x0d, 0x02, 0x53, 0xe1, 0x0d, 0xac, 0x0f, 0xef, 0xf9, 0x5c, 0x58, 0x57, 0xab, 0x95, 0x4e, 0xa1, 0x9c, 0x2a, 0x5e, 0xa0, 0x40, 0x5a, 0x93, 0x15, 0x86, 0x27, 0xe0, 0x81, 0xca, 0x87, 0x92, 0x7e, 0xa0, 0x37, 0x3b, 0x17, 0xd6, 0x3f, 0x6e, 0xa0, 0x2c, 0x30, 0xc2, 0xa1, 0xbf, 0xbd, 0x65, 0xd7, 0xd0, 0xdf, 0x42, 0x24, 0x34, 0x04, 0x6d, 0x56, 0xde, 0x0f, 0xa8, 0x74, 0x8d, 0xa6, 0x16, 0xbd, 0xf8, 0xa0, 0x53, 0xc2, 0xbb, 0xca, 0x5d, 0xd4, 0xb0, 0xe2, 0x5b, 0xa8, 0xa5, 0x32, 0xba, 0x6a, 0xb2, 0xe2, 0x1b, 0xf7, 0x56, 0xb7, 0xdc, 0x0c, 0x33, 0x44, 0x60, 0xa1, 0x14, 0x2d, 0x9f, 0xb9, 0xba, 0x9e, 0xa0, 0xdf, 0x70, 0x35, 0x85, 0x57, 0x9f, 0x68, 0xf5, 0xaa, 0xfd, 0xf1, 0xc0, 0x9e, 0xbc, 0x54, 0xfb, 0x46, 0x3f, 0xb7, 0x59, 0x60, 0x66, 0x54, 0xf9, 0xa1, 0x23, 0xe9, 0x91, 0xe5, 0x3a, 0x29, 0x13, 0xa0, 0x52, 0xc7, 0x33, 0xd4, 0x12, 0x8a, 0xfd, 0x90, 0x8c, 0x0b, 0x4c, 0x94, 0x84, 0x69, 0x76, 0x2d, 0x82, 0x1f, 0xcd, 0x06, 0x66, 0x04, 0xb2, 0x50, 0x6c, 0x48, 0x81, 0xb9, 0xe3, 0x9c, 0xb7, 0xc4, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x6c, 0x27, 0x4f, 0xca, 0x11, 0x5a, 0x58, 0x59, 0x57, 0x44, 0x72, 0x44, 0xdd, 0x82, 0xc4, 0xbc, 0x0a, 0xb0, 0xd0, 0x33, 0x4f, 0x8a, 0x8a, 0x68, 0x86, 0x61, 0xd0, 0x20, 0x4e, 0x1a, 0x5e, 0xd4, 0xa0, 0xc3, 0xab, 0x4e, 0x99, 0x8a, 0xc8, 0x32, 0x79, 0x75, 0xb6, 0xf0, 0xea, 0x20, 0x8f, 0x12, 0xd9, 0x0a, 0x6f, 0xf7, 0xf8, 0xe8, 0x1f, 0x21, 0x7e, 0xbc, 0xa9, 0xf0, 0x77, 0x48, 0xe4, 0x45, 0x7e, 0xa0, 0x9a, 0x75, 0xc4, 0xee, 0xc2, 0xf2, 0xcf, 0x81, 0xf9, 0x94, 0x92, 0x4d, 0x55, 0xc6, 0x19, 0x3d, 0x14, 0xd2, 0xc9, 0x68, 0x5d, 0x6e, 0x26, 0x7f, 0x70, 0xb0, 0x11, 0xfc, 0xe9, 0x14, 0x5b, 0x8b, 0xa0, 0x74, 0xd3, 0x44, 0x72, 0x1c, 0xe1, 0x8f, 0x9f, 0xaa, 0xb2, 0xf5, 0xce, 0x30, 0xa2, 0x5a, 0x33, 0x3d, 0x99, 0x86, 0xba, 0xbc, 0x77, 0x1c, 0x45, 0xdb, 0x61, 0xb0, 0x97, 0xf7, 0x65, 0x45, 0xd3, 0xa0, 0x33, 0xe7, 0xfd, 0x9a, 0xe1, 0x58, 0xe2, 0x7c, 0x0b, 0x43, 0x4b, 0x96, 0x58, 0x39, 0x72, 0xcf, 0x72, 0x78, 0x1b, 0x81, 0x51, 0xdb, 0x7b, 0xb4, 0x58, 0x5f, 0xbe, 0x1f, 0x8a, 0xa0, 0x89, 0x86, 0xa0, 0xf4, 0x98, 0x17, 0x06, 0xb2, 0x3b, 0x88, 0x56, 0xd5, 0x26, 0x0f, 0x1a, 0x5f, 0x85, 0x16, 0x9c, 0xc0, 0xa6, 0x89, 0x5e, 0x90, 0x00, 0xd4, 0x3b, 0xae, 0x16, 0xbe, 0x74, 0x66, 0x0f, 0x19, 0x61, 0xa0, 0xbf, 0x23, 0x04, 0x68, 0xe5, 0x74, 0x06, 0xd7, 0x85, 0xa3, 0xdd, 0x85, 0x2d, 0xb0, 0xd0, 0xb1, 0xf5, 0x6b, 0xdc, 0xcd, 0xa7, 0x53, 0xf4, 0xec, 0xdb, 0x7f, 0x69, 0xe2, 0x34, 0x7e, 0x51, 0x94, 0xa0, 0x2b, 0x86, 0xc8, 0x18, 0xfd, 0xf7, 0x58, 0xf5, 0xc2, 0x1a, 0xe6, 0xe5, 0xd9, 0xdc, 0x44, 0xf1, 0x18, 0xd1, 0x61, 0xa5, 0x2a, 0x71, 0xbf, 0xe8, 0x03, 0x39, 0x77, 0x5d, 0x3d, 0x5a, 0x66, 0x89, 0xa0, 0xbd, 0xcb, 0x9f, 0x27, 0xd8, 0x61, 0xde, 0x0f, 0x3b, 0xa3, 0x15, 0x55, 0x8e, 0xba, 0x2b, 0xb4, 0x55, 0x1d, 0x7f, 0x5d, 0xd4, 0xb9, 0x50, 0x08, 0x32, 0xef, 0x9e, 0x59, 0xca, 0x29, 0x0f, 0xd5, 0xa0, 0xba, 0xab, 0x08, 0xa8, 0x72, 0xc1, 0xa1, 0xb7, 0x83, 0x07, 0x84, 0x5f, 0x45, 0x49, 0x16, 0x71, 0x9e, 0x04, 0xd9, 0xdf, 0x18, 0x39, 0xef, 0x23, 0x20, 0xcf, 0x06, 0x3b, 0x52, 0xb7, 0xb3, 0xdc, 0xa0, 0x0c, 0x6a, 0x26, 0xfe, 0x11, 0x5b, 0xc3, 0xbc, 0x3b, 0x82, 0xa3, 0x68, 0xc3, 0x4c, 0xa7, 0x1b, 0xda, 0x6f, 0x99, 0x4b, 0xb2, 0x2f, 0xfc, 0x58, 0x7f, 0xa4, 0xa5, 0xc6, 0x13, 0xa5, 0xa0, 0x29, 0xa0, 0x38, 0xbd, 0xb3, 0x5b, 0xba, 0xcf, 0x78, 0x13, 0xf9, 0xbb, 0x10, 0x93, 0x44, 0xe6, 0x43, 0xd1, 0xa5, 0xd8, 0xd3, 0x2f, 0x6f, 0xd9, 0xce, 0x53, 0xc2, 0xd0, 0x1e, 0x45, 0xfb, 0x36, 0xac, 0x8f, 0xa0, 0x98, 0xc5, 0x49, 0x18, 0x9e, 0x60, 0xcf, 0x46, 0x7c, 0xc5, 0x34, 0x5f, 0x2b, 0xc3, 0x8f, 0xdd, 0x5c, 0xa6, 0x1d, 0xc5, 0x16, 0x46, 0x14, 0x9b, 0x47, 0xbf, 0xd1, 0x55, 0x7e, 0xe9, 0x81, 0xab, 0xa0, 0xf9, 0x56, 0x43, 0x80, 0xf9, 0xe8, 0xb6, 0x1c, 0x3e, 0x33, 0x07, 0x5e, 0x4d, 0xad, 0xa4, 0xa6, 0xf8, 0xdc, 0xc4, 0x1c, 0xac, 0x60, 0xcc, 0x33, 0xd2, 0x87, 0x9f, 0xe7, 0x05, 0xe0, 0x74, 0xb3, 0xa0, 0x7f, 0x3d, 0xf6, 0xe4, 0xab, 0xe8, 0xfd, 0x6d, 0x5f, 0x91, 0x76, 0x5d, 0x81, 0x77, 0xe6, 0x08, 0xc0, 0xe8, 0x67, 0xd8, 0xff, 0x92, 0x23, 0xd9, 0x00, 0x3d, 0xf4, 0x12, 0x4f, 0x81, 0x4f, 0xfc, 0xa0, 0x7b, 0x46, 0x74, 0xab, 0x10, 0x38, 0xde, 0xe6, 0xe2, 0x0a, 0xcf, 0x6e, 0x8a, 0x46, 0x0a, 0xe0, 0xaa, 0x1d, 0x26, 0xe5, 0xa0, 0x3a, 0x7e, 0xbe, 0xe6, 0x1e, 0x53, 0xfc, 0xd2, 0x14, 0xd3, 0x03, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x2c, 0xa5, 0xef, 0x31, 0xc5, 0x09, 0xc4, 0x34, 0x17, 0xa4, 0xb4, 0x9f, 0x25, 0xc7, 0x9d, 0xdb, 0xc7, 0x53, 0x31, 0x85, 0xb6, 0xa3, 0x20, 0xfb, 0xbf, 0x71, 0x95, 0xbd, 0xaa, 0x19, 0x23, 0xde, 0xa0, 0xc0, 0x79, 0x71, 0x50, 0x95, 0x69, 0x1a, 0x47, 0x11, 0x5d, 0xf7, 0x03, 0x06, 0xc7, 0xbd, 0xea, 0x58, 0xeb, 0x81, 0x8f, 0x63, 0xdc, 0x22, 0x20, 0x9b, 0x8c, 0x2c, 0x66, 0x08, 0xa1, 0xb1, 0x81, 0xa0, 0x29, 0xd4, 0xbc, 0xb0, 0xea, 0x4b, 0x75, 0x71, 0xcd, 0xb0, 0x00, 0x56, 0xfd, 0xde, 0x73, 0x45, 0x97, 0xba, 0xc3, 0x3f, 0x92, 0x32, 0xb2, 0x83, 0x35, 0x25, 0xf5, 0xaa, 0x36, 0xc0, 0x0d, 0xb7, 0xa0, 0x35, 0x5d, 0x2f, 0x0e, 0xce, 0xc2, 0x36, 0x58, 0xf5, 0xa9, 0x41, 0x27, 0xbc, 0xea, 0x8e, 0x2b, 0xbe, 0x2e, 0xeb, 0x1b, 0xdb, 0x51, 0xd1, 0x44, 0xf6, 0xca, 0xae, 0xfb, 0xfa, 0x90, 0xc5, 0xff, 0xa0, 0x5c, 0x83, 0x50, 0x01, 0x72, 0xbc, 0x8e, 0x17, 0x28, 0xbc, 0xc7, 0xb1, 0x91, 0x8b, 0x3e, 0xb7, 0x07, 0x11, 0x89, 0x53, 0x99, 0x44, 0xde, 0x8d, 0xf3, 0x76, 0x9e, 0x9f, 0xd4, 0x88, 0x42, 0xb8, 0xa0, 0xa9, 0x8a, 0x15, 0xa8, 0x4d, 0x63, 0xa9, 0x8d, 0x65, 0x20, 0x4e, 0xf5, 0x4b, 0x1b, 0x7a, 0x4d, 0x78, 0x09, 0xdf, 0x66, 0x89, 0xfa, 0xf9, 0x8e, 0x2c, 0x25, 0x1c, 0x25, 0xdc, 0xb6, 0x7f, 0xb6, 0xa0, 0x71, 0xc7, 0x16, 0xb8, 0x43, 0x50, 0x93, 0xad, 0x01, 0xcd, 0x6c, 0x92, 0xc8, 0x15, 0xbf, 0x42, 0x48, 0x43, 0x4d, 0xe1, 0x7b, 0x3a, 0xd7, 0x99, 0x62, 0xea, 0xc5, 0x49, 0x60, 0x8f, 0x3a, 0xe5, 0xa0, 0x37, 0xb8, 0x24, 0x6f, 0x24, 0x69, 0x4b, 0x23, 0xbd, 0x5b, 0x16, 0x13, 0x09, 0x5f, 0x51, 0xd3, 0x25, 0xa2, 0x06, 0xc9, 0x9b, 0xec, 0x65, 0x5c, 0x9c, 0xca, 0x6b, 0x32, 0x9b, 0x9c, 0xc1, 0xc4, 0xa0, 0xc3, 0xe6, 0xff, 0x56, 0x6b, 0x77, 0x62, 0x2a, 0x4c, 0x13, 0x6d, 0x55, 0xd9, 0x6a, 0x85, 0xd3, 0xd1, 0xd6, 0x0f, 0xdc, 0x6e, 0x78, 0xe7, 0xb5, 0x01, 0x87, 0xa7, 0x0f, 0x0c, 0xda, 0xfe, 0x6e, 0xa0, 0x27, 0xcb, 0xb2, 0x3a, 0xfe, 0x93, 0x9d, 0xc2, 0xfd, 0xfa, 0x5d, 0xe7, 0xa6, 0xbc, 0x3c, 0x69, 0xcf, 0x92, 0xe3, 0x89, 0xdc, 0xd6, 0x02, 0x99, 0xf4, 0x77, 0x94, 0xe2, 0xe2, 0x68, 0x8c, 0xff, 0xa0, 0x50, 0x91, 0x46, 0x1e, 0x65, 0x15, 0x48, 0x93, 0xbd, 0xab, 0x1e, 0xc1, 0xa8, 0x0c, 0x60, 0x31, 0x84, 0x2b, 0x7f, 0xc4, 0x67, 0x4e, 0x28, 0x28, 0x80, 0x8d, 0xdd, 0x5b, 0x98, 0xe9, 0xcf, 0x7c, 0xa0, 0x7f, 0xe0, 0x51, 0x39, 0x7e, 0x99, 0x77, 0xfd, 0x07, 0xc3, 0x2a, 0xac, 0x0f, 0x22, 0x56, 0x3e, 0x6b, 0x92, 0x1e, 0x46, 0xe5, 0xdf, 0x1e, 0x31, 0xdd, 0x5c, 0xe4, 0x8c, 0x06, 0x96, 0x41, 0x8c, 0xa0, 0xf1, 0x4e, 0xa5, 0x4e, 0x5e, 0x42, 0xe6, 0x79, 0xa9, 0x19, 0x2c, 0xf7, 0x6c, 0xf9, 0x0c, 0x8d, 0x18, 0x5d, 0x50, 0xce, 0x02, 0xf3, 0xff, 0xf6, 0xaf, 0x1f, 0x14, 0x23, 0x54, 0x69, 0x64, 0x62, 0xa0, 0xed, 0x72, 0xaa, 0xb9, 0x3a, 0xbe, 0xc4, 0xac, 0xb3, 0x94, 0x18, 0x30, 0xc3, 0x33, 0x73, 0x4c, 0xff, 0xa7, 0x17, 0x83, 0xa9, 0x26, 0x9f, 0x4a, 0x7c, 0x84, 0x08, 0x41, 0x6d, 0x56, 0xc0, 0x74, 0xa0, 0x6c, 0xe6, 0xd5, 0xb2, 0x69, 0x38, 0x04, 0xce, 0xb2, 0x0b, 0xad, 0x1b, 0xb6, 0xa7, 0x9c, 0xbb, 0xbe, 0x3c, 0x58, 0xc8, 0x58, 0x17, 0xca, 0x36, 0xfd, 0xfb, 0xa6, 0x13, 0xd5, 0x11, 0xe5, 0x15, 0xa0, 0x7f, 0xb9, 0x37, 0xbc, 0x6f, 0xa2, 0x99, 0xc5, 0xbe, 0x14, 0x90, 0x97, 0xe4, 0x71, 0x11, 0xfc, 0xed, 0xe6, 0x3a, 0xac, 0xd1, 0x91, 0x96, 0x75, 0x7a, 0xec, 0x29, 0x08, 0xdb, 0xb7, 0x4a, 0xcc, 0x80, 0xf9, 0x01, 0x31, 0xa0, 0xb6, 0x78, 0x1c, 0xb2, 0xc8, 0x70, 0xdd, 0x5b, 0x55, 0xcd, 0xc6, 0x86, 0x2b, 0x88, 0x5f, 0x3e, 0x12, 0xf6, 0xc6, 0xe1, 0xe9, 0xc2, 0x5a, 0xd0, 0x19, 0x9a, 0xd7, 0x2a, 0xa5, 0x97, 0xf8, 0xe5, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xed, 0xc4, 0x14, 0x1e, 0xd2, 0xac, 0xa2, 0x99, 0x5f, 0xe1, 0x82, 0x1f, 0x5a, 0x95, 0x62, 0x0d, 0xa1, 0x9a, 0xa5, 0x46, 0x12, 0xc5, 0xc1, 0xb9, 0xab, 0x9d, 0x9b, 0x68, 0x81, 0x61, 0xb8, 0x18, 0x80, 0x80, 0xa0, 0xf7, 0x58, 0xce, 0x88, 0xb2, 0x83, 0x37, 0x60, 0x94, 0xd5, 0x8c, 0x78, 0x99, 0xe1, 0xe8, 0xef, 0x8d, 0xaf, 0xc4, 0x14, 0xea, 0x34, 0x47, 0x0f, 0xa0, 0x37, 0xbf, 0xa5, 0xa3, 0xeb, 0x46, 0x3d, 0xa0, 0x15, 0xdb, 0x1f, 0x59, 0xf9, 0xc3, 0xb7, 0xe4, 0x58, 0x66, 0x28, 0x3e, 0xc8, 0x56, 0x16, 0x0d, 0x80, 0xbf, 0x55, 0xc5, 0xc7, 0xeb, 0x3b, 0x2f, 0xa7, 0x73, 0x71, 0x11, 0x19, 0x22, 0x22, 0x25, 0x80, 0xa0, 0x3d, 0x29, 0x46, 0x65, 0x86, 0x83, 0xf8, 0x09, 0x3d, 0x16, 0x61, 0x8a, 0x58, 0xf9, 0xe7, 0xa5, 0x3d, 0x22, 0x67, 0xde, 0x58, 0x96, 0x18, 0xd6, 0xa2, 0xe7, 0xd5, 0x00, 0xd5, 0x46, 0x53, 0x1d, 0xa0, 0x4a, 0x76, 0x41, 0x47, 0xd3, 0xd7, 0x4b, 0x3e, 0x0c, 0x15, 0xe5, 0x46, 0xdc, 0x9d, 0xaf, 0xf2, 0xe6, 0xa7, 0x9e, 0x48, 0xb6, 0x85, 0xf4, 0xc1, 0x83, 0xda, 0xd7, 0xd0, 0x25, 0xcc, 0xb8, 0x2b, 0xa0, 0xff, 0x59, 0x95, 0xbf, 0x16, 0x43, 0xd4, 0xb6, 0x5e, 0xb3, 0x38, 0x48, 0xfb, 0xa9, 0xf6, 0xae, 0xbb, 0x39, 0x96, 0x56, 0xb6, 0x72, 0x33, 0x0b, 0x1b, 0x0c, 0x3c, 0x6c, 0xd2, 0xa1, 0x19, 0x17, 0xa0, 0x2e, 0xd8, 0xe0, 0x68, 0x1e, 0x60, 0xf7, 0x7d, 0x85, 0xbd, 0x93, 0xeb, 0xba, 0x37, 0x0b, 0xf6, 0x42, 0x0b, 0x5c, 0x36, 0xd7, 0xea, 0xe2, 0x2d, 0x84, 0xb1, 0x73, 0x8a, 0x57, 0xa6, 0x14, 0xfc, 0xa0, 0x47, 0x62, 0x8e, 0xc4, 0x36, 0xf6, 0x83, 0xa4, 0x67, 0x9c, 0x7b, 0xfd, 0x71, 0x7e, 0xae, 0x0d, 0x7c, 0x95, 0xb7, 0xc0, 0x8e, 0x49, 0xe5, 0x1d, 0xc7, 0xa9, 0x69, 0x66, 0x35, 0x52, 0x7d, 0xb6, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x66, 0x9d, 0x32, 0x36, 0x1b, 0x16, 0x9c, 0xcb, 0x6e, 0xde, 0xaf, 0x3e, 0x18, 0x4d, 0x5f, 0xdd, 0x30, 0xae, 0xaa, 0x06, 0x3e, 0x1f, 0xfe, 0x51, 0xb7, 0x60, 0xc4, 0x60, 0x99, 0xcc, 0x7b, 0xb8, 0x46, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0x85, 0xf1, 0x2f, 0x77, 0x60, 0xbd, 0x7c, 0x79, 0x5a, 0xc3, 0x9c, 0x42, 0xc6, 0xba, 0xc1, 0xb0, 0x9e, 0xbe, 0xd8, 0x73, 0x31, 0xba, 0x07, 0x13, 0xe3, 0xcf, 0xea, 0x16, 0x5d, 0xee, 0x32, 0xa2, 0xa0, 0xd4, 0xe5, 0xa9, 0xdf, 0xf2, 0x2a, 0xcb, 0x67, 0x5a, 0x29, 0x1c, 0x79, 0x61, 0x6f, 0x91, 0xb1, 0x52, 0x6c, 0xe1, 0xa8, 0x4d, 0xff, 0x4b, 0xd9, 0x69, 0x5f, 0x3f, 0x39, 0xae, 0x77, 0x9f, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/state_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/state_proof_new.nr index 698e9836..7f133340 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/state_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/state_proof_new.nr @@ -48,3 +48,5 @@ global proof_input = ProofInput { depth: 8 } }; + +global proof_input_serialized = proof_input.serialize(); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/storage_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/storage_proof.nr index 45794817..c35d5138 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/storage_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/storage_proof.nr @@ -1,7 +1,7 @@ -use crate::account_with_storage::StorageProof; +use crate::account_with_storage::LegacyStorageProof; global proofs = [ - StorageProof { + LegacyStorageProof { key: [ 0x8a, 0x8d, 0xc4, 0xe5, 0x24, 0x2e, 0xa8, 0xb1, 0xab, 0x1d, 0x60, 0x60, 0x6d, 0xae, 0x75, 0x7e, 0x6c, 0x2c, 0xca, 0x9f, 0x92, 0xa2, 0xcc, 0xed, 0x9f, 0x72, 0xc1, 0x99, 0x60, 0xbc, 0xb4, 0x58 ], diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/storage_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/storage_proof_new.nr index e31b338b..006a7f62 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/storage_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/nouns/storage_proof_new.nr @@ -1,4 +1,5 @@ use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; +use crate::account_with_storage::{MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_STORAGE_DEPTH_NO_LEAF_M, MAX_STORAGE_VALUE_LEN, MAX_STORAGE_LEAF_LEN}; global proofs = [ ProofInput { @@ -38,3 +39,5 @@ global proofs = [ } } ]; + +global proofs_serialized = proofs.map(|proof: ProofInput| proof.serialize()); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/account.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/account.nr index 053b6147..e14a75ef 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/account.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/account.nr @@ -5,7 +5,7 @@ global address = [ ]; global rlp_encoded_left_padded_account = [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05 ]; global nonce = 1; diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/state_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/state_proof.nr index 3d10deae..e057cbe2 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/state_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/state_proof.nr @@ -1,11 +1,11 @@ -use crate::account::StateProof; +use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: [ 0xa0, 0xb8, 0x69, 0x91, 0xc6, 0x21, 0x8b, 0x36, 0xc1, 0xd1, 0x9d, 0x4a, 0x2e, 0x9e, 0xb0, 0xce, 0x36, 0x06, 0xeb, 0x48 ], value: [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05 ], proof: [ 0xf9, 0x02, 0x11, 0xa0, 0x49, 0x1f, 0x39, 0x6d, 0x5d, 0x47, 0x68, 0xa0, 0x1e, 0xe4, 0x28, 0x2a, 0x3a, 0xb1, 0x12, 0x7f, 0x2a, 0x4d, 0xc7, 0xd4, 0x2e, 0x6c, 0x1d, 0xbb, 0x3e, 0x71, 0xad, 0x4e, 0x92, 0x99, 0xf5, 0xe7, 0xa0, 0x5b, 0x46, 0x45, 0x21, 0x9e, 0x61, 0x4b, 0x38, 0x8b, 0xa9, 0x67, 0x24, 0x52, 0xb4, 0x0f, 0x29, 0x19, 0x87, 0xb1, 0x5e, 0x35, 0xbd, 0xbd, 0x3d, 0xfe, 0xbf, 0xac, 0x9a, 0x08, 0x5a, 0xea, 0xb2, 0xa0, 0x97, 0x9e, 0xbc, 0xa2, 0xa6, 0xa0, 0xdf, 0x38, 0x9f, 0xdf, 0xef, 0x5b, 0xfa, 0x4a, 0x31, 0xf2, 0xef, 0xa8, 0xd3, 0x85, 0xbf, 0x2f, 0x43, 0xcd, 0x69, 0xc2, 0x7e, 0x61, 0x16, 0x5c, 0x36, 0x67, 0xa0, 0x1b, 0xbe, 0x04, 0x54, 0x3b, 0xb6, 0xbf, 0x80, 0x26, 0xee, 0x3e, 0xc2, 0xa3, 0xec, 0x3d, 0x61, 0x73, 0xa6, 0x0c, 0x09, 0x00, 0x08, 0xb5, 0x97, 0x79, 0xf7, 0x67, 0xe5, 0x76, 0x9d, 0x7a, 0x0a, 0xa0, 0x51, 0xd3, 0x47, 0xec, 0x61, 0xc7, 0xdd, 0xe5, 0xc4, 0x14, 0x9a, 0x94, 0x3d, 0x0a, 0xa4, 0x89, 0x54, 0x4c, 0xbe, 0xa5, 0x11, 0xed, 0x3d, 0x7f, 0x4f, 0xc6, 0xaa, 0xa5, 0x2a, 0x42, 0x0d, 0x3e, 0xa0, 0x53, 0x58, 0xbc, 0x8e, 0x1e, 0x1f, 0x20, 0xe5, 0x10, 0x88, 0x72, 0x26, 0xd6, 0x7e, 0xfe, 0xe7, 0x37, 0x69, 0xd0, 0xb1, 0x3e, 0xbb, 0x24, 0xa3, 0xe7, 0x50, 0xc2, 0x21, 0x4e, 0xf0, 0x90, 0xd5, 0xa0, 0x4d, 0xf1, 0xc2, 0x4e, 0xbf, 0x40, 0xbe, 0xfc, 0xe6, 0x0c, 0x8e, 0xb3, 0x0a, 0x31, 0x89, 0x41, 0x02, 0x88, 0x14, 0x54, 0xfc, 0xde, 0xb6, 0xf7, 0xb8, 0x3e, 0x1f, 0xb9, 0x16, 0xc9, 0x53, 0xa8, 0xa0, 0x0a, 0x85, 0xe0, 0x4f, 0x30, 0xa4, 0x97, 0x87, 0x12, 0xc5, 0x8a, 0x82, 0x5e, 0x7b, 0xd2, 0xf8, 0xa8, 0x37, 0x31, 0xab, 0x1a, 0xa3, 0xe2, 0x34, 0xa0, 0x20, 0x7e, 0x91, 0x87, 0x90, 0x50, 0x5f, 0xa0, 0x77, 0x8a, 0x45, 0x43, 0x72, 0x18, 0x48, 0x6b, 0x78, 0x49, 0xae, 0xf8, 0x90, 0xd4, 0x83, 0xdc, 0xc2, 0xde, 0xb1, 0x42, 0x3c, 0xb8, 0x1e, 0x48, 0x8b, 0x7b, 0xe2, 0x92, 0x1d, 0x50, 0x5b, 0xf4, 0xa0, 0x51, 0xdb, 0xae, 0xf3, 0xc3, 0xd3, 0xfe, 0x82, 0xbd, 0x14, 0x84, 0x95, 0x4f, 0x38, 0x50, 0x8f, 0x65, 0x1d, 0x86, 0x7f, 0x38, 0x7f, 0x71, 0xde, 0xdb, 0xfb, 0x0f, 0x73, 0x55, 0x98, 0x7e, 0xd5, 0xa0, 0x61, 0x67, 0x9f, 0x43, 0xf3, 0xdb, 0x26, 0x67, 0x3b, 0xb6, 0x87, 0xc5, 0x84, 0xf3, 0x0a, 0xe3, 0xcf, 0xf7, 0x26, 0x1e, 0x71, 0xac, 0xf0, 0x7e, 0xd1, 0xfe, 0xae, 0xca, 0xe0, 0x98, 0xfc, 0x79, 0xa0, 0x99, 0x76, 0x1e, 0xa7, 0xd9, 0x4e, 0x01, 0xb1, 0x42, 0x85, 0xb7, 0xce, 0xd7, 0xdc, 0xd1, 0x67, 0x7f, 0xbd, 0x3c, 0xe0, 0x93, 0xa6, 0x27, 0xa8, 0xe1, 0x47, 0x20, 0x74, 0xba, 0xad, 0x8b, 0xd9, 0xa0, 0xbb, 0x6d, 0x26, 0x9f, 0xc6, 0x14, 0x43, 0xaa, 0x28, 0xb1, 0x4a, 0xf0, 0x44, 0x8a, 0xaf, 0x6f, 0x1f, 0x57, 0x04, 0x77, 0xd8, 0xb4, 0xef, 0x2e, 0xb7, 0xd3, 0x15, 0x43, 0x20, 0x2c, 0xe6, 0x02, 0xa0, 0x6c, 0x41, 0xcd, 0x2d, 0x17, 0x01, 0xb0, 0x58, 0x85, 0x35, 0x91, 0xa2, 0xf3, 0x06, 0xdd, 0xcf, 0xd1, 0xe5, 0x5d, 0x3e, 0x12, 0x01, 0x1c, 0xad, 0xb1, 0x00, 0xe7, 0xc5, 0x25, 0xaa, 0xf4, 0x60, 0xa0, 0xbc, 0xf3, 0x7a, 0xba, 0xac, 0x56, 0x6b, 0xb9, 0x8e, 0x09, 0x15, 0x75, 0xaf, 0x40, 0x38, 0x04, 0xdb, 0xb2, 0x78, 0xfb, 0xfa, 0x55, 0x47, 0xde, 0x68, 0x05, 0xcb, 0xaa, 0x52, 0x9a, 0xe1, 0x37, 0xa0, 0xde, 0x99, 0x18, 0xa2, 0xa9, 0x76, 0xa2, 0xb0, 0xb3, 0xf4, 0xae, 0xff, 0x80, 0x1f, 0xc7, 0x95, 0x57, 0x42, 0x6b, 0x19, 0xc1, 0x5d, 0x41, 0x4d, 0xdf, 0x8f, 0xae, 0x84, 0x37, 0x85, 0xb0, 0xb7, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xd4, 0x94, 0x84, 0xbf, 0x95, 0xa2, 0x21, 0x10, 0xc4, 0x1b, 0xa9, 0xfa, 0xd0, 0x08, 0x7b, 0xf2, 0x75, 0x1c, 0x99, 0x18, 0x1c, 0xcb, 0x44, 0x48, 0x72, 0x95, 0xad, 0x65, 0x39, 0x99, 0x4d, 0x10, 0xa0, 0x4a, 0xef, 0x81, 0x3e, 0xb3, 0xdf, 0xf2, 0xb2, 0x57, 0x54, 0xad, 0x36, 0x6e, 0x55, 0x1b, 0xda, 0xb6, 0xb2, 0xcf, 0x5f, 0x21, 0xa1, 0x76, 0xe3, 0xcc, 0xbf, 0x6c, 0xe2, 0xeb, 0x26, 0x81, 0x18, 0xa0, 0x45, 0x5a, 0x6f, 0xe5, 0x14, 0xd0, 0x52, 0x1e, 0xf4, 0xea, 0x10, 0xc3, 0x3b, 0x55, 0x6b, 0x8f, 0x53, 0xa7, 0x15, 0x2c, 0xee, 0xe8, 0x62, 0xdc, 0x34, 0xb8, 0xcf, 0x27, 0x6e, 0x0c, 0x97, 0x49, 0xa0, 0xb3, 0xdc, 0xf6, 0xad, 0x23, 0xe9, 0xf6, 0x49, 0x38, 0x9d, 0x58, 0x4d, 0xe3, 0x6f, 0xe4, 0x7d, 0xae, 0x70, 0xb7, 0xfc, 0x73, 0x9d, 0xb2, 0x9e, 0x6a, 0x6a, 0x4f, 0x81, 0x1a, 0x3b, 0x22, 0xc3, 0xa0, 0x6f, 0x09, 0x44, 0xda, 0xce, 0x08, 0xe1, 0x0b, 0xd0, 0x64, 0x43, 0x16, 0x21, 0x39, 0x28, 0x7b, 0x56, 0xea, 0xd7, 0x4e, 0xab, 0x7c, 0x7b, 0x6c, 0x38, 0x6a, 0xf5, 0xb4, 0xde, 0x75, 0xbe, 0x16, 0xa0, 0x3c, 0x7c, 0x34, 0xae, 0x8a, 0xfa, 0x48, 0x5b, 0xa1, 0xaf, 0x86, 0x03, 0x4f, 0x2a, 0xc9, 0x2f, 0x3f, 0xb7, 0x1e, 0xcb, 0x98, 0x9d, 0xc5, 0xe1, 0xdc, 0x8a, 0xa5, 0x46, 0xa7, 0xba, 0x3f, 0x87, 0xa0, 0x7d, 0x7f, 0xd1, 0xbf, 0xd5, 0xb6, 0xa6, 0x3c, 0xaf, 0x07, 0xa0, 0x61, 0xef, 0xfc, 0x3c, 0xc2, 0xa2, 0x20, 0xd3, 0x6d, 0xfc, 0xc0, 0x49, 0x8a, 0x36, 0x90, 0xd2, 0xcc, 0x80, 0x8d, 0xd4, 0xf7, 0xa0, 0x69, 0x33, 0x9e, 0xe7, 0x38, 0xef, 0xbd, 0x6b, 0x75, 0x44, 0xf0, 0x31, 0x4f, 0x00, 0xbf, 0x87, 0x1a, 0x62, 0x99, 0x8b, 0x0c, 0x3a, 0x6a, 0x4f, 0x16, 0x13, 0x6f, 0xce, 0xa3, 0x34, 0x3a, 0x9f, 0xa0, 0x3c, 0x91, 0xdf, 0x57, 0xbc, 0x3c, 0x66, 0x11, 0x71, 0x8c, 0xc4, 0x92, 0x25, 0x7d, 0xb2, 0xfe, 0x9b, 0x64, 0x89, 0x12, 0x58, 0x56, 0x0f, 0x5c, 0xde, 0x98, 0xb0, 0x17, 0x80, 0xd1, 0xc2, 0x20, 0xa0, 0x52, 0x45, 0x11, 0xe9, 0x7f, 0xed, 0x37, 0xfd, 0x85, 0x7b, 0x5b, 0xfd, 0x82, 0x7e, 0x19, 0x0e, 0x0c, 0x1f, 0xbe, 0x94, 0xad, 0x61, 0xa1, 0xfe, 0x3e, 0x83, 0xe2, 0x2c, 0x42, 0x64, 0xe2, 0x0d, 0xa0, 0x33, 0xb5, 0x92, 0xbf, 0x8b, 0x76, 0x33, 0xfd, 0x20, 0x97, 0x81, 0xca, 0xd0, 0xd6, 0xbd, 0x7f, 0x22, 0x81, 0x3d, 0xb6, 0x07, 0xf0, 0x6c, 0xf1, 0x1f, 0x1d, 0x71, 0x7b, 0xda, 0x28, 0xf3, 0xbb, 0xa0, 0xf7, 0x74, 0xed, 0xd0, 0x41, 0x1b, 0x04, 0xdc, 0xf6, 0x4d, 0x15, 0x20, 0xd5, 0x07, 0x4f, 0xbd, 0xc8, 0x54, 0xc3, 0xda, 0x6f, 0x2d, 0x60, 0xb5, 0x7f, 0xe0, 0x3c, 0x6a, 0x6f, 0x84, 0xe8, 0x5c, 0xa0, 0x10, 0x3a, 0x3f, 0xc1, 0xdd, 0xb8, 0xfa, 0x81, 0x49, 0x3d, 0x6d, 0x4e, 0xeb, 0xa2, 0x4c, 0x20, 0x2f, 0x84, 0xa0, 0x5f, 0xb4, 0x38, 0x8f, 0x86, 0xb1, 0xf8, 0xc5, 0xe6, 0xd2, 0x8e, 0x20, 0x88, 0xa0, 0x7b, 0xcc, 0x50, 0x12, 0xbf, 0x23, 0xc2, 0x9b, 0x54, 0x32, 0x6e, 0x33, 0x9c, 0x80, 0x95, 0x79, 0x1c, 0x13, 0x05, 0xa1, 0x8f, 0x30, 0x5c, 0xfd, 0xce, 0xb3, 0xf4, 0x4d, 0x9a, 0x97, 0x5b, 0x23, 0xa0, 0xbc, 0x32, 0x5e, 0xbe, 0x8d, 0xc9, 0x7b, 0x03, 0x88, 0xb9, 0xc4, 0x8d, 0x74, 0x44, 0x08, 0x69, 0xcc, 0x53, 0xc4, 0x0e, 0x6a, 0xfc, 0x6e, 0x16, 0x82, 0xf5, 0x0b, 0xec, 0x0e, 0x40, 0x82, 0x8e, 0xa0, 0xc8, 0xab, 0x8f, 0x63, 0xcc, 0x85, 0xae, 0xaa, 0x9e, 0xdc, 0x75, 0x9a, 0x2e, 0xf6, 0x39, 0x99, 0x28, 0xb6, 0xa2, 0xca, 0x09, 0x24, 0x45, 0x6d, 0xb6, 0xfe, 0x54, 0x4d, 0xe0, 0x00, 0x95, 0xd5, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x99, 0x8b, 0xdb, 0x4d, 0x2f, 0xad, 0x11, 0x72, 0x3e, 0xa1, 0x7d, 0x36, 0x97, 0x48, 0x2b, 0x43, 0x60, 0x3a, 0xd7, 0x63, 0x5d, 0x95, 0x80, 0x38, 0x9c, 0x27, 0x0b, 0x00, 0xb5, 0xa1, 0x09, 0x11, 0xa0, 0x3d, 0xd6, 0xf7, 0x6d, 0x36, 0x22, 0x28, 0x39, 0xf7, 0x28, 0xc1, 0x42, 0x0e, 0x74, 0x51, 0x81, 0x6c, 0x19, 0x00, 0xd6, 0x6f, 0x0e, 0x68, 0xd0, 0x49, 0x0c, 0x7e, 0x45, 0xae, 0x29, 0x36, 0xf8, 0xa0, 0x8f, 0x4a, 0xfb, 0x17, 0xe0, 0xdb, 0xbc, 0x3a, 0x59, 0x4c, 0x50, 0xa0, 0x09, 0x36, 0x2a, 0x49, 0x3a, 0xe9, 0x0a, 0x18, 0x5b, 0x1d, 0xa6, 0x9b, 0x5d, 0x80, 0x62, 0xcf, 0xe5, 0x0b, 0x2d, 0x7d, 0xa0, 0x3e, 0xa8, 0x0f, 0x0e, 0x62, 0xbf, 0x5a, 0xd6, 0x68, 0xee, 0x94, 0xc1, 0x7f, 0x78, 0x7e, 0x3d, 0xfd, 0x37, 0xc3, 0x70, 0x7e, 0x6e, 0x24, 0xf2, 0x52, 0x80, 0x10, 0xeb, 0xea, 0xe1, 0xda, 0x5f, 0xa0, 0xde, 0x55, 0x6e, 0xea, 0xff, 0x16, 0x65, 0x79, 0xf1, 0x40, 0x1d, 0x26, 0x31, 0x25, 0x9c, 0xcc, 0x44, 0x63, 0x3d, 0x47, 0x06, 0x9a, 0x41, 0x1c, 0x5d, 0x4f, 0x4e, 0x97, 0x38, 0x44, 0x53, 0x14, 0xa0, 0x35, 0xd0, 0xb8, 0x6c, 0xea, 0xcb, 0x66, 0xd9, 0xb6, 0xef, 0x1e, 0x0c, 0xd9, 0xf6, 0x97, 0x10, 0x41, 0xeb, 0x3f, 0x76, 0x08, 0x63, 0x33, 0x30, 0x46, 0xac, 0x7e, 0x86, 0x8c, 0x1d, 0x61, 0x42, 0xa0, 0x8e, 0x90, 0xbf, 0x2b, 0xf9, 0xda, 0x51, 0xb4, 0xdd, 0x39, 0x8a, 0x19, 0xe4, 0xaf, 0xd3, 0x1d, 0x4f, 0x6b, 0x9b, 0xab, 0x6d, 0xf5, 0xce, 0x53, 0xf3, 0x61, 0x4c, 0xd9, 0x52, 0xfb, 0xa6, 0x85, 0xa0, 0x43, 0x93, 0x2b, 0x94, 0x86, 0x4c, 0x19, 0xda, 0x97, 0x26, 0xb0, 0xb1, 0xa4, 0x7d, 0x1c, 0xca, 0x5e, 0xad, 0x4a, 0x5a, 0x4f, 0x57, 0x52, 0x9c, 0x10, 0xbd, 0x50, 0x5b, 0x58, 0x13, 0x3b, 0x83, 0xa0, 0xb7, 0x62, 0xf1, 0xb1, 0x13, 0x1f, 0xde, 0xa5, 0x2a, 0x1f, 0xfb, 0x3d, 0xdc, 0x76, 0xa0, 0xfa, 0x25, 0x0b, 0xe2, 0x1f, 0x34, 0x8a, 0x76, 0x1e, 0x36, 0x0e, 0x7d, 0x94, 0xf5, 0xf6, 0xa2, 0xf6, 0xa0, 0x1b, 0x92, 0x62, 0x6b, 0x91, 0x7a, 0xc3, 0x89, 0xaa, 0x6d, 0x94, 0x55, 0x42, 0x04, 0xfd, 0x41, 0xdf, 0xcd, 0x15, 0x78, 0x4e, 0xcb, 0xdd, 0xf7, 0xce, 0xdd, 0x91, 0x0b, 0x87, 0x45, 0xb9, 0x7f, 0xa0, 0xae, 0xd8, 0x43, 0xd3, 0x15, 0x9f, 0x08, 0x96, 0x0f, 0x9e, 0xe1, 0x32, 0x3e, 0x35, 0x7c, 0xc3, 0xe0, 0x7b, 0x5c, 0x08, 0xd9, 0xde, 0x15, 0x99, 0x4c, 0xb4, 0x6e, 0x07, 0xab, 0x79, 0x35, 0xe1, 0xa0, 0x33, 0x3d, 0xbb, 0xae, 0xcf, 0x72, 0xe7, 0x82, 0x9d, 0x42, 0xdf, 0xbd, 0x7d, 0xaa, 0xef, 0x99, 0x2c, 0x86, 0x3d, 0x88, 0x21, 0x9c, 0xab, 0x2a, 0xaa, 0x36, 0x1e, 0x50, 0x15, 0x79, 0x3b, 0xf3, 0xa0, 0xb9, 0x09, 0x3f, 0x7f, 0xd9, 0x06, 0x01, 0x37, 0x61, 0x35, 0xa4, 0xc0, 0x49, 0xf0, 0xab, 0xb7, 0x86, 0x57, 0x4d, 0xa0, 0xf4, 0x90, 0x88, 0xbc, 0xc9, 0xa8, 0x65, 0x17, 0xe6, 0xca, 0x9d, 0xae, 0xa0, 0xae, 0x55, 0xeb, 0xd4, 0xbd, 0x22, 0x78, 0x3b, 0xe1, 0x87, 0x2f, 0xfd, 0xe2, 0xcb, 0x32, 0xc0, 0x33, 0x7e, 0x91, 0xdd, 0x48, 0xf1, 0xdf, 0x67, 0x88, 0x32, 0xa9, 0xed, 0x03, 0xd4, 0x20, 0x89, 0xa0, 0x51, 0x2f, 0x6f, 0xf6, 0xf3, 0x19, 0x45, 0x79, 0x59, 0xea, 0xbc, 0xbd, 0x75, 0x83, 0xa7, 0x4f, 0x91, 0xef, 0x79, 0xe6, 0xf9, 0x30, 0x9b, 0x00, 0xb3, 0xfb, 0xba, 0x47, 0xee, 0x57, 0x8c, 0xe9, 0xa0, 0x41, 0x2c, 0xc4, 0x3c, 0xc9, 0x5b, 0x0d, 0xb3, 0xfd, 0x2a, 0xd6, 0x97, 0x24, 0x65, 0xc8, 0xd1, 0x13, 0xe2, 0x2e, 0x04, 0x56, 0xc9, 0x6a, 0x1d, 0x69, 0xab, 0x27, 0x0c, 0x83, 0xfc, 0x33, 0x8c, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x74, 0xf1, 0x4a, 0xa5, 0x95, 0x3f, 0xe6, 0xff, 0xd9, 0x27, 0x06, 0x8e, 0xb1, 0x1e, 0xae, 0x2d, 0x78, 0x9b, 0xea, 0x3b, 0xf7, 0xf2, 0xf1, 0xef, 0x89, 0x8b, 0x14, 0xfb, 0xd2, 0x63, 0x64, 0x4b, 0xa0, 0x4d, 0x18, 0x58, 0xb1, 0xdc, 0xaf, 0x91, 0x52, 0xe1, 0x12, 0xb9, 0x03, 0x80, 0xeb, 0x48, 0x14, 0x0b, 0x89, 0xc9, 0x37, 0xf8, 0x7a, 0xe5, 0xe6, 0xab, 0xb7, 0x5a, 0x3b, 0x84, 0xe0, 0x54, 0xa3, 0xa0, 0x0f, 0x31, 0xb5, 0x3f, 0xfe, 0xe0, 0xec, 0x6a, 0x93, 0x3d, 0x1a, 0x42, 0x64, 0x85, 0x5c, 0xaa, 0x31, 0xa4, 0xf0, 0xd3, 0x7b, 0x12, 0xf2, 0x9f, 0x07, 0xff, 0x39, 0x11, 0x2e, 0xd7, 0x93, 0x1e, 0xa0, 0xa9, 0xd4, 0xdc, 0xab, 0x4f, 0x78, 0x54, 0x0e, 0x40, 0x81, 0x33, 0x7e, 0x7f, 0xc4, 0x98, 0xfe, 0x18, 0x08, 0xb4, 0xd7, 0xaa, 0x15, 0xa7, 0x2b, 0xcd, 0x18, 0x4e, 0x21, 0x0b, 0xef, 0x07, 0x52, 0xa0, 0x55, 0x3d, 0x60, 0xe6, 0x29, 0x3c, 0x6d, 0x76, 0xca, 0xcb, 0x26, 0x37, 0x55, 0x63, 0xd5, 0x1b, 0x2a, 0xba, 0xfe, 0x16, 0x25, 0xb4, 0xbf, 0x2f, 0x2d, 0xb7, 0xa0, 0xf6, 0x97, 0xf0, 0xc4, 0x37, 0xa0, 0xff, 0x86, 0x34, 0x9b, 0xeb, 0x03, 0xab, 0x22, 0x99, 0xf0, 0x3f, 0x4f, 0x1b, 0x92, 0xfc, 0x1a, 0x8c, 0x3c, 0xa0, 0x2c, 0xd8, 0x06, 0x3d, 0xfb, 0xe5, 0x38, 0xd2, 0x5a, 0x56, 0xb3, 0x8b, 0x03, 0xa0, 0x33, 0x74, 0x97, 0x75, 0xca, 0x26, 0x49, 0xf8, 0x53, 0xad, 0xfa, 0x8f, 0xa4, 0xf3, 0x92, 0xd4, 0x0c, 0xca, 0x60, 0xe2, 0x89, 0x76, 0x24, 0x26, 0xae, 0x26, 0x18, 0x37, 0x43, 0x6b, 0xed, 0x14, 0xa0, 0x17, 0x3d, 0x9f, 0xf4, 0xb2, 0xef, 0xaf, 0x38, 0x3e, 0x71, 0xf8, 0xe2, 0x21, 0x8a, 0x8b, 0xe5, 0x82, 0x4c, 0x45, 0x43, 0xea, 0x8b, 0x57, 0x23, 0xa0, 0x02, 0x35, 0x27, 0x47, 0xfc, 0x8f, 0xc0, 0xa0, 0x87, 0x54, 0xb9, 0x6b, 0x51, 0x84, 0xfc, 0xa1, 0xdf, 0x7c, 0xea, 0x8e, 0x47, 0xff, 0x83, 0xd2, 0x56, 0x4a, 0x71, 0xc0, 0xe9, 0x72, 0xd8, 0x60, 0x2d, 0x81, 0x2c, 0x11, 0x7c, 0x5a, 0x0f, 0xe3, 0xa0, 0xab, 0x7f, 0x46, 0xff, 0x12, 0xa6, 0x1e, 0xc1, 0x18, 0xfc, 0x0e, 0xd2, 0x33, 0x82, 0xa3, 0x39, 0xd5, 0x98, 0x90, 0x98, 0x3d, 0x9a, 0x6b, 0xb8, 0x2b, 0x46, 0xc5, 0x91, 0x19, 0xe3, 0xd4, 0x86, 0xa0, 0x86, 0x09, 0xfa, 0x34, 0xd4, 0x1f, 0x37, 0x48, 0xff, 0x8a, 0xcd, 0x56, 0xc1, 0x0b, 0xc9, 0x0f, 0x80, 0x52, 0xe2, 0x9e, 0xcf, 0x29, 0x54, 0x3b, 0x42, 0x4c, 0x57, 0xd5, 0xb3, 0x83, 0x5d, 0xf5, 0xa0, 0x43, 0xab, 0x1a, 0x36, 0xfc, 0x6f, 0x09, 0xf8, 0x99, 0xc7, 0x57, 0xa6, 0x88, 0x70, 0x7d, 0x57, 0xf7, 0xb2, 0x3d, 0x15, 0x4d, 0xc6, 0x62, 0x51, 0x03, 0x36, 0xb4, 0xfb, 0xee, 0x9c, 0x39, 0xea, 0xa0, 0x70, 0xcc, 0x0d, 0x6e, 0x4b, 0x82, 0x1b, 0xac, 0x76, 0x6d, 0x5e, 0xfb, 0x3e, 0x8c, 0xc1, 0xc9, 0x26, 0x02, 0xf6, 0x6d, 0x75, 0x76, 0x1b, 0xa6, 0xdf, 0x12, 0x7f, 0x7c, 0x5d, 0x66, 0x73, 0x39, 0xa0, 0xd9, 0xf4, 0xbd, 0xa4, 0x1e, 0x3c, 0x12, 0x53, 0x90, 0x86, 0x0e, 0xc1, 0xef, 0x2c, 0xc6, 0xd9, 0xef, 0x91, 0x7e, 0x79, 0x4b, 0xb5, 0x54, 0x38, 0x5d, 0x49, 0x68, 0x4f, 0x58, 0xa9, 0x76, 0x3a, 0xa0, 0xc2, 0xe7, 0x96, 0x37, 0x8a, 0xb8, 0x03, 0xee, 0x28, 0x27, 0x84, 0x92, 0x6b, 0x69, 0xb9, 0x85, 0x8c, 0x12, 0x6b, 0x09, 0x6b, 0xb2, 0x89, 0xb0, 0x0b, 0xe6, 0x02, 0x90, 0x27, 0x11, 0xe5, 0x1d, 0xa0, 0x29, 0x39, 0xfe, 0x17, 0x2e, 0x16, 0x59, 0xee, 0x39, 0x90, 0x3b, 0x3f, 0x56, 0xdc, 0x36, 0xd4, 0x4f, 0x26, 0x74, 0x24, 0x4f, 0x61, 0x46, 0xff, 0x59, 0xc9, 0x65, 0x5a, 0x9e, 0x2c, 0x2d, 0xe4, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x7f, 0x5b, 0x34, 0x3e, 0x1c, 0x77, 0x15, 0x8f, 0x35, 0xc7, 0xa3, 0x28, 0x94, 0x47, 0xe8, 0xa6, 0x7a, 0xce, 0xd7, 0x5b, 0x66, 0x48, 0xeb, 0x5f, 0xdb, 0x5e, 0xc4, 0x29, 0x48, 0xef, 0xa3, 0x39, 0xa0, 0xd7, 0x1a, 0xc5, 0x7d, 0x52, 0xfe, 0xbe, 0x7b, 0x9c, 0x08, 0x57, 0x2f, 0xb0, 0xdf, 0x86, 0x6d, 0x90, 0x13, 0x69, 0xc3, 0x53, 0xbc, 0x50, 0x40, 0x3d, 0x49, 0xd4, 0xb1, 0xb3, 0x20, 0xce, 0x51, 0xa0, 0x60, 0x98, 0x82, 0xd6, 0x1d, 0x4e, 0x90, 0xc9, 0xc9, 0x94, 0xda, 0x6f, 0x03, 0x9b, 0xb6, 0x79, 0xaf, 0x85, 0x2d, 0x34, 0xda, 0x92, 0xa8, 0x35, 0x8d, 0xaf, 0x51, 0xcd, 0x49, 0x2f, 0x6e, 0x40, 0xa0, 0xfc, 0xd7, 0xc1, 0xef, 0x19, 0xe6, 0x3c, 0x06, 0xb1, 0x78, 0x7b, 0xd2, 0x10, 0x9d, 0x76, 0x84, 0xc8, 0x3d, 0xf2, 0x51, 0x5a, 0x7f, 0x38, 0x17, 0xd8, 0xfb, 0xd6, 0x90, 0x14, 0xaa, 0x1b, 0xb5, 0xa0, 0x1a, 0x88, 0xce, 0x8d, 0x28, 0x6a, 0x1d, 0xfa, 0x80, 0x9c, 0x70, 0x27, 0x13, 0x99, 0x38, 0x7a, 0x3d, 0x92, 0x8a, 0xb5, 0x0a, 0x05, 0xf4, 0x10, 0x4d, 0x61, 0x92, 0x2a, 0x71, 0xf7, 0xf9, 0x9c, 0xa0, 0x86, 0x74, 0xc5, 0x46, 0xce, 0x3c, 0xce, 0x26, 0x88, 0xd3, 0xce, 0x90, 0xf5, 0xf3, 0xfd, 0xe4, 0x6a, 0x7a, 0x37, 0x4e, 0xd9, 0x09, 0xcb, 0x42, 0xd5, 0x0f, 0xf5, 0x35, 0x73, 0x20, 0x8d, 0x22, 0xa0, 0x8e, 0x6a, 0xa0, 0x2e, 0x46, 0xc8, 0x82, 0x34, 0x2e, 0x98, 0x7a, 0x3e, 0x2f, 0x0c, 0x48, 0x51, 0x2a, 0x46, 0xae, 0x57, 0x50, 0x07, 0x85, 0xf3, 0x8a, 0x05, 0x70, 0x49, 0x88, 0x46, 0x3a, 0x4f, 0xa0, 0x14, 0x73, 0xee, 0x4a, 0xf1, 0xab, 0x81, 0xe6, 0xe8, 0xcd, 0xe5, 0xf1, 0x2b, 0xa2, 0x5e, 0xef, 0xab, 0x26, 0xfd, 0x84, 0x8d, 0x8b, 0x6e, 0x9b, 0xfb, 0xc7, 0xed, 0x3e, 0x1b, 0x4f, 0x2b, 0x03, 0xa0, 0xfe, 0xe6, 0x1b, 0xe8, 0x61, 0xaf, 0xb0, 0x37, 0xb2, 0x17, 0x46, 0xdc, 0x4f, 0x8b, 0x87, 0x9d, 0x93, 0x1a, 0x56, 0x27, 0x1e, 0x63, 0xdc, 0x11, 0xe0, 0xc2, 0x76, 0xe3, 0x0f, 0xd8, 0x13, 0x88, 0xa0, 0xb4, 0x2d, 0x84, 0x11, 0x1c, 0x74, 0x37, 0x1d, 0x41, 0x46, 0x97, 0xe9, 0x66, 0xbb, 0xd8, 0x09, 0x1b, 0x0f, 0x93, 0x06, 0x04, 0x8d, 0x88, 0x3b, 0x65, 0x2a, 0x43, 0xe9, 0x36, 0xd1, 0xf8, 0xe9, 0xa0, 0x15, 0xf8, 0x81, 0x0a, 0x86, 0x2f, 0x02, 0x43, 0x79, 0x1d, 0xed, 0x94, 0x2b, 0x46, 0x6a, 0xa1, 0x47, 0x26, 0x81, 0x8e, 0x76, 0x7d, 0x0d, 0x57, 0xd1, 0x74, 0x40, 0xc8, 0x5f, 0x35, 0x94, 0xaa, 0xa0, 0xa6, 0xad, 0xaf, 0x18, 0x10, 0x85, 0xa4, 0x28, 0x5c, 0xc8, 0x3a, 0xbe, 0x8b, 0x70, 0x69, 0x03, 0x77, 0xa7, 0x49, 0xef, 0xe8, 0x7b, 0x6d, 0x99, 0xfe, 0x60, 0x38, 0x0c, 0xc2, 0x67, 0x50, 0x63, 0xa0, 0xf0, 0x82, 0x1d, 0x26, 0x51, 0xf1, 0xd0, 0x8c, 0xb4, 0x2d, 0xa7, 0x26, 0x55, 0x18, 0xfe, 0xcc, 0x03, 0xfd, 0x0f, 0x59, 0x09, 0xc1, 0x1b, 0x86, 0x22, 0x5d, 0x98, 0x14, 0x65, 0x19, 0x54, 0x1d, 0xa0, 0xd6, 0x5f, 0xcf, 0xef, 0x8c, 0x4a, 0x91, 0x59, 0xca, 0x1b, 0x86, 0xb0, 0x04, 0xbb, 0x24, 0xb6, 0x5c, 0x17, 0xa4, 0x97, 0x5f, 0xbe, 0x70, 0x16, 0x3c, 0xf3, 0xa0, 0x4d, 0x1b, 0xd4, 0xfd, 0x0e, 0xa0, 0x4a, 0x3e, 0xf4, 0x16, 0xb1, 0xff, 0x37, 0x1b, 0x04, 0x6d, 0x35, 0x28, 0x3c, 0x8d, 0xf5, 0x6f, 0x01, 0x54, 0xe3, 0x05, 0xe1, 0xe1, 0xa5, 0xaf, 0xab, 0x51, 0xf2, 0x06, 0x88, 0x5e, 0x0f, 0x5f, 0xa0, 0x73, 0xbd, 0x3a, 0xb2, 0x24, 0xb6, 0xcc, 0xd9, 0x0b, 0x8e, 0x36, 0x32, 0x20, 0xb2, 0x59, 0xf6, 0x51, 0x4c, 0x7a, 0x0a, 0xa4, 0xff, 0x63, 0xb7, 0xe1, 0x8f, 0x3d, 0x7c, 0xdc, 0x8a, 0x93, 0x31, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x3e, 0x1a, 0x3a, 0x68, 0x88, 0xbb, 0xa3, 0x4f, 0xd7, 0x4c, 0x4f, 0x96, 0xe7, 0xd7, 0x84, 0xe0, 0x8a, 0x39, 0x27, 0xc9, 0x92, 0x74, 0x76, 0x7c, 0x8b, 0x45, 0x38, 0x32, 0x43, 0xd1, 0x81, 0xe7, 0xa0, 0x5a, 0x92, 0xbb, 0x6d, 0xce, 0xe1, 0xc9, 0xc9, 0xbd, 0x2e, 0xe3, 0x54, 0x80, 0x44, 0x25, 0x13, 0x74, 0x83, 0x24, 0x75, 0xed, 0x9d, 0x9e, 0x70, 0x1e, 0x7c, 0x36, 0xcc, 0x21, 0xf0, 0x0e, 0x48, 0xa0, 0xa9, 0xc2, 0x66, 0x4e, 0x6e, 0x25, 0x05, 0x99, 0xe4, 0x37, 0xfe, 0xa6, 0x9c, 0xc9, 0x56, 0x9d, 0xc3, 0x4e, 0x78, 0x9f, 0x5f, 0x1b, 0x83, 0xf8, 0xad, 0xdc, 0x5a, 0x85, 0x80, 0x57, 0x5d, 0x4e, 0xa0, 0xd9, 0x92, 0xdb, 0x61, 0x79, 0x12, 0xf4, 0xef, 0xca, 0x1d, 0x5c, 0x6b, 0xc0, 0xe8, 0x0e, 0x40, 0xd1, 0x47, 0x98, 0x3c, 0x4b, 0x48, 0xc3, 0xe1, 0x6e, 0xef, 0x66, 0x44, 0xfd, 0x32, 0x7f, 0x80, 0xa0, 0xa8, 0x39, 0xba, 0x35, 0xf8, 0xa0, 0xdf, 0x0d, 0xb7, 0x33, 0x8b, 0xe1, 0xab, 0x40, 0x37, 0xb6, 0x8f, 0x47, 0x20, 0x0b, 0xb6, 0x31, 0x15, 0xcb, 0x87, 0xdb, 0x40, 0x57, 0x9f, 0x7a, 0xac, 0xd0, 0xa0, 0x18, 0x03, 0xb7, 0x99, 0x96, 0xb6, 0x62, 0x04, 0xa2, 0x57, 0x45, 0xc8, 0x84, 0x92, 0x70, 0xd8, 0xca, 0x18, 0x3e, 0xca, 0x2b, 0xa2, 0x59, 0x19, 0x25, 0x37, 0xd4, 0xdf, 0x81, 0x4e, 0x31, 0x04, 0xa0, 0xf5, 0xe7, 0x66, 0xcb, 0x5f, 0x8b, 0x5f, 0xce, 0xb5, 0xc1, 0x8f, 0x9b, 0x5f, 0x6c, 0xb2, 0xe9, 0xc2, 0x6a, 0x20, 0x22, 0x61, 0x1e, 0x51, 0x85, 0x8b, 0x19, 0xb7, 0x66, 0x3b, 0x8f, 0x54, 0x1f, 0xa0, 0x45, 0xc4, 0xf7, 0xdc, 0xfb, 0x76, 0xe8, 0xd7, 0xc2, 0x0d, 0x3c, 0x0a, 0xd7, 0x4f, 0xe1, 0xda, 0x1f, 0xf8, 0xcc, 0x6b, 0xfb, 0xe8, 0xa1, 0x71, 0x53, 0x91, 0x4a, 0xb4, 0xc3, 0xa0, 0x6c, 0xc3, 0xa0, 0x03, 0xb9, 0x95, 0xab, 0xc7, 0x47, 0xbd, 0x40, 0x62, 0xcc, 0xe4, 0x96, 0xe1, 0x95, 0xe2, 0xd5, 0x28, 0x60, 0x42, 0xa6, 0x3d, 0x5f, 0xdb, 0x59, 0x6f, 0x78, 0x02, 0x3f, 0x47, 0x0c, 0x7f, 0x6e, 0xa0, 0xa0, 0xdc, 0x85, 0x50, 0x40, 0x16, 0xb6, 0x83, 0x8d, 0x58, 0x22, 0x2a, 0x93, 0x98, 0xc4, 0x83, 0xd3, 0xd5, 0x75, 0xd0, 0xe3, 0xb8, 0xe4, 0x29, 0xc8, 0x71, 0xf0, 0xb9, 0xcb, 0x59, 0xf0, 0xeb, 0xa0, 0x04, 0xfc, 0x76, 0x44, 0xd8, 0xab, 0xe6, 0x9d, 0x5c, 0x75, 0x4e, 0x75, 0x4d, 0xc4, 0xbb, 0xea, 0x20, 0xba, 0xb6, 0x18, 0xd5, 0x0b, 0x57, 0xe6, 0x40, 0xa8, 0x36, 0x84, 0x67, 0x3b, 0x19, 0x79, 0xa0, 0x88, 0xfa, 0xf5, 0x3a, 0x4a, 0x0f, 0x41, 0x31, 0x02, 0x9d, 0xdd, 0xc9, 0xb8, 0x72, 0x7a, 0xaf, 0xa8, 0x0a, 0xbb, 0x6c, 0xbd, 0x6e, 0x84, 0x38, 0x30, 0x7c, 0xbf, 0x1f, 0xa7, 0xfe, 0x3e, 0x45, 0xa0, 0x94, 0x73, 0xa4, 0xd0, 0x5d, 0x18, 0x8f, 0x36, 0x1a, 0xec, 0x6a, 0x06, 0xbd, 0xa7, 0x43, 0x4a, 0x1d, 0x61, 0x35, 0x7b, 0x45, 0x4f, 0x3e, 0x2c, 0xee, 0xd0, 0xfb, 0xb3, 0x06, 0xba, 0x4c, 0x1f, 0xa0, 0xe5, 0xa2, 0x5b, 0xd1, 0xc6, 0xde, 0xdb, 0x6d, 0x7e, 0xff, 0x3a, 0xf7, 0xbf, 0x21, 0xa3, 0x23, 0x56, 0x66, 0x18, 0x0b, 0xb7, 0x90, 0x0f, 0x1d, 0x29, 0xc9, 0xfe, 0xbe, 0xab, 0x7f, 0xea, 0x75, 0xa0, 0xa8, 0x10, 0x79, 0x39, 0xd3, 0x9f, 0x83, 0xc5, 0x48, 0x23, 0xaa, 0xa4, 0xbf, 0x00, 0x30, 0xea, 0x36, 0x9d, 0x30, 0x27, 0x52, 0x54, 0x41, 0x88, 0xfa, 0x46, 0xcc, 0xa6, 0xad, 0x8a, 0xc2, 0x84, 0xa0, 0x78, 0xa6, 0x81, 0x8c, 0x13, 0xeb, 0x82, 0xb0, 0xaf, 0x88, 0x07, 0x62, 0xca, 0x82, 0xec, 0x9d, 0x6e, 0x2f, 0x7c, 0xa1, 0x3f, 0x6d, 0x26, 0x9a, 0xcd, 0x6e, 0x56, 0x5c, 0xb4, 0x93, 0x56, 0x94, 0x80, 0xf9, 0x01, 0x71, 0xa0, 0x7d, 0x33, 0x7e, 0x71, 0x7e, 0xcd, 0x4c, 0xe5, 0xf4, 0x5c, 0x4e, 0xa8, 0x99, 0x4e, 0x47, 0x6c, 0xe3, 0x8c, 0xf9, 0x37, 0xa4, 0xf2, 0x92, 0x4d, 0xc4, 0x0c, 0xfa, 0x8f, 0xe5, 0x87, 0x0f, 0xe9, 0xa0, 0x3f, 0x98, 0xe9, 0xce, 0x6a, 0xf1, 0x72, 0xec, 0x08, 0x48, 0x1a, 0x6b, 0xcf, 0xfb, 0x89, 0xa2, 0x64, 0x93, 0x3f, 0x90, 0xee, 0x28, 0x8a, 0x82, 0x14, 0x4c, 0x0e, 0xab, 0x96, 0x8e, 0x42, 0xff, 0xa0, 0xf8, 0x55, 0x9a, 0xbb, 0xbe, 0x0e, 0xba, 0x3b, 0xfe, 0xca, 0x91, 0xb5, 0x90, 0x09, 0x8c, 0x70, 0xa2, 0x4b, 0xf7, 0xc7, 0x68, 0xb1, 0x30, 0xfd, 0xe1, 0x93, 0xfb, 0x5b, 0xcc, 0x98, 0xb8, 0x82, 0x80, 0x80, 0xa0, 0x4a, 0x57, 0xac, 0x11, 0x63, 0x27, 0x7a, 0x82, 0x0b, 0xda, 0xe6, 0x49, 0xd6, 0x32, 0xf9, 0x17, 0xb3, 0x88, 0x5a, 0x80, 0x10, 0x36, 0x54, 0xd3, 0x21, 0x6f, 0x94, 0x09, 0xb7, 0x25, 0x25, 0xd3, 0xa0, 0x03, 0x18, 0x68, 0xde, 0xc2, 0x33, 0xf9, 0x86, 0xdc, 0x0a, 0xfa, 0x16, 0xd6, 0xab, 0xf7, 0x8e, 0x22, 0x39, 0x6b, 0x0f, 0xa4, 0xa7, 0x57, 0xf0, 0x68, 0x83, 0x80, 0x75, 0x6a, 0x84, 0x4b, 0xe2, 0xa0, 0xd3, 0xbe, 0xe6, 0x90, 0xd4, 0x81, 0x73, 0x44, 0x4d, 0x67, 0x9a, 0x7a, 0xb9, 0x69, 0xcd, 0x91, 0x99, 0xb8, 0x3a, 0xc3, 0xde, 0x64, 0xdb, 0x3d, 0x98, 0x7d, 0xc6, 0xaa, 0x2d, 0xdb, 0x06, 0xe7, 0x80, 0xa0, 0xcc, 0xb1, 0x02, 0x37, 0xfb, 0xb5, 0x45, 0x47, 0x87, 0x74, 0xd6, 0xe8, 0x58, 0xeb, 0x7a, 0x13, 0x27, 0x70, 0x8d, 0xe6, 0xc2, 0x05, 0xc7, 0x19, 0x5d, 0x3a, 0x5d, 0xac, 0xd5, 0x96, 0x12, 0x09, 0xa0, 0x90, 0x3e, 0x3c, 0xd4, 0x1d, 0x04, 0xb4, 0x69, 0x3e, 0x0e, 0xae, 0x15, 0x49, 0xf7, 0xfe, 0x02, 0x4e, 0xb0, 0x6b, 0x98, 0xfa, 0x1c, 0x13, 0x7c, 0xac, 0xc6, 0x6d, 0x57, 0xa7, 0xa0, 0xe2, 0x23, 0xa0, 0x7b, 0xae, 0x7d, 0x8d, 0xe8, 0x62, 0x27, 0x8d, 0x46, 0xcb, 0xa4, 0x51, 0x13, 0x00, 0x15, 0x33, 0xe9, 0xc5, 0xb6, 0x77, 0xfe, 0xc3, 0x85, 0xfb, 0xa8, 0x32, 0xaa, 0x14, 0x02, 0xb9, 0x6b, 0xf5, 0xa0, 0xc3, 0x29, 0xd6, 0x79, 0x71, 0xea, 0xd7, 0xda, 0x9f, 0x1d, 0x22, 0x29, 0x90, 0xd9, 0xaa, 0x6c, 0x0f, 0x44, 0x8b, 0xd1, 0x61, 0xc0, 0x98, 0x1e, 0xf5, 0x04, 0xb1, 0xd7, 0x29, 0x2b, 0x66, 0x61, 0x80, 0xa0, 0x15, 0x23, 0x4d, 0x9e, 0xf3, 0x9b, 0x97, 0xaf, 0x08, 0x3f, 0xb5, 0x71, 0x5d, 0xd5, 0xcc, 0x2f, 0x44, 0x54, 0xa2, 0x3c, 0xa3, 0xa4, 0xd7, 0x24, 0x19, 0xcf, 0xde, 0x3e, 0xa9, 0x18, 0x03, 0x6c, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x71, 0x80, 0xa0, 0x56, 0x8a, 0x35, 0x48, 0xf0, 0xc4, 0x68, 0xbe, 0xc6, 0x6c, 0x6d, 0x91, 0xb1, 0xd7, 0x2f, 0x84, 0xe4, 0x43, 0x73, 0xc0, 0x3c, 0x6e, 0x11, 0x8d, 0x7e, 0xdc, 0x6b, 0xa8, 0xfe, 0x9b, 0x4d, 0x0c, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xec, 0x26, 0xe1, 0x29, 0xa6, 0xfc, 0x11, 0xa5, 0xdc, 0xc7, 0x48, 0xbd, 0x22, 0xca, 0x4e, 0x41, 0xa0, 0xac, 0xe6, 0x3c, 0xbf, 0x1c, 0xb2, 0xde, 0x01, 0x8e, 0x2b, 0x95, 0x85, 0xa0, 0x6f, 0xc6, 0x80, 0xa0, 0xba, 0x74, 0x98, 0xeb, 0x55, 0xb2, 0xda, 0x21, 0x74, 0x0c, 0xc4, 0x29, 0xff, 0xe1, 0x7a, 0xed, 0xc4, 0x0e, 0xfc, 0xab, 0xe0, 0x31, 0xa0, 0x0a, 0x7c, 0x1c, 0xba, 0xea, 0x2b, 0xc2, 0x18, 0xf8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x66, 0x9d, 0x20, 0x92, 0xcd, 0x7f, 0x3f, 0x78, 0x13, 0x74, 0x97, 0xdf, 0x02, 0xf6, 0xcc, 0xb9, 0xba, 0xdd, 0xa9, 0x3d, 0x97, 0x82, 0xe0, 0xf2, 0x30, 0xc8, 0x07, 0xba, 0x72, 0x8b, 0xe0, 0xb8, 0x46, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/state_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/state_proof_new.nr index d308af1d..55c5a66b 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/state_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/state_proof_new.nr @@ -48,3 +48,5 @@ global proof_input = ProofInput { depth: 9 } }; + +global proof_input_serialized = proof_input.serialize(); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/storage_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/storage_proof.nr index 24404b8f..cee15dd1 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/storage_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/storage_proof.nr @@ -1,7 +1,7 @@ -use crate::account_with_storage::StorageProof; +use crate::account_with_storage::LegacyStorageProof; global proofs = [ - StorageProof { + LegacyStorageProof { key: [ 0x57, 0xd1, 0x8a, 0xf7, 0x93, 0xd7, 0x30, 0x0c, 0x4b, 0xa4, 0x6d, 0x19, 0x2e, 0xc7, 0xaa, 0x09, 0x50, 0x70, 0xdd, 0xe6, 0xc5, 0x2c, 0x68, 0x7c, 0x6d, 0x0d, 0x92, 0xfb, 0x85, 0x32, 0xb3, 0x05 ], diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/storage_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/storage_proof_new.nr index 0f677e5e..07c821eb 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/storage_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_circle/storage_proof_new.nr @@ -1,4 +1,5 @@ use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; +use crate::account_with_storage::{MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_STORAGE_DEPTH_NO_LEAF_M, MAX_STORAGE_VALUE_LEN, MAX_STORAGE_LEAF_LEN}; global proofs = [ ProofInput { @@ -38,3 +39,5 @@ global proofs = [ } } ]; + +global proofs_serialized = proofs.map(|proof: ProofInput| proof.serialize()); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/account.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/account.nr index 053b6147..e14a75ef 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/account.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/account.nr @@ -5,7 +5,7 @@ global address = [ ]; global rlp_encoded_left_padded_account = [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05 ]; global nonce = 1; diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/state_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/state_proof.nr index 3d10deae..e057cbe2 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/state_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/state_proof.nr @@ -1,11 +1,11 @@ -use crate::account::StateProof; +use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: [ 0xa0, 0xb8, 0x69, 0x91, 0xc6, 0x21, 0x8b, 0x36, 0xc1, 0xd1, 0x9d, 0x4a, 0x2e, 0x9e, 0xb0, 0xce, 0x36, 0x06, 0xeb, 0x48 ], value: [ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05 ], proof: [ 0xf9, 0x02, 0x11, 0xa0, 0x49, 0x1f, 0x39, 0x6d, 0x5d, 0x47, 0x68, 0xa0, 0x1e, 0xe4, 0x28, 0x2a, 0x3a, 0xb1, 0x12, 0x7f, 0x2a, 0x4d, 0xc7, 0xd4, 0x2e, 0x6c, 0x1d, 0xbb, 0x3e, 0x71, 0xad, 0x4e, 0x92, 0x99, 0xf5, 0xe7, 0xa0, 0x5b, 0x46, 0x45, 0x21, 0x9e, 0x61, 0x4b, 0x38, 0x8b, 0xa9, 0x67, 0x24, 0x52, 0xb4, 0x0f, 0x29, 0x19, 0x87, 0xb1, 0x5e, 0x35, 0xbd, 0xbd, 0x3d, 0xfe, 0xbf, 0xac, 0x9a, 0x08, 0x5a, 0xea, 0xb2, 0xa0, 0x97, 0x9e, 0xbc, 0xa2, 0xa6, 0xa0, 0xdf, 0x38, 0x9f, 0xdf, 0xef, 0x5b, 0xfa, 0x4a, 0x31, 0xf2, 0xef, 0xa8, 0xd3, 0x85, 0xbf, 0x2f, 0x43, 0xcd, 0x69, 0xc2, 0x7e, 0x61, 0x16, 0x5c, 0x36, 0x67, 0xa0, 0x1b, 0xbe, 0x04, 0x54, 0x3b, 0xb6, 0xbf, 0x80, 0x26, 0xee, 0x3e, 0xc2, 0xa3, 0xec, 0x3d, 0x61, 0x73, 0xa6, 0x0c, 0x09, 0x00, 0x08, 0xb5, 0x97, 0x79, 0xf7, 0x67, 0xe5, 0x76, 0x9d, 0x7a, 0x0a, 0xa0, 0x51, 0xd3, 0x47, 0xec, 0x61, 0xc7, 0xdd, 0xe5, 0xc4, 0x14, 0x9a, 0x94, 0x3d, 0x0a, 0xa4, 0x89, 0x54, 0x4c, 0xbe, 0xa5, 0x11, 0xed, 0x3d, 0x7f, 0x4f, 0xc6, 0xaa, 0xa5, 0x2a, 0x42, 0x0d, 0x3e, 0xa0, 0x53, 0x58, 0xbc, 0x8e, 0x1e, 0x1f, 0x20, 0xe5, 0x10, 0x88, 0x72, 0x26, 0xd6, 0x7e, 0xfe, 0xe7, 0x37, 0x69, 0xd0, 0xb1, 0x3e, 0xbb, 0x24, 0xa3, 0xe7, 0x50, 0xc2, 0x21, 0x4e, 0xf0, 0x90, 0xd5, 0xa0, 0x4d, 0xf1, 0xc2, 0x4e, 0xbf, 0x40, 0xbe, 0xfc, 0xe6, 0x0c, 0x8e, 0xb3, 0x0a, 0x31, 0x89, 0x41, 0x02, 0x88, 0x14, 0x54, 0xfc, 0xde, 0xb6, 0xf7, 0xb8, 0x3e, 0x1f, 0xb9, 0x16, 0xc9, 0x53, 0xa8, 0xa0, 0x0a, 0x85, 0xe0, 0x4f, 0x30, 0xa4, 0x97, 0x87, 0x12, 0xc5, 0x8a, 0x82, 0x5e, 0x7b, 0xd2, 0xf8, 0xa8, 0x37, 0x31, 0xab, 0x1a, 0xa3, 0xe2, 0x34, 0xa0, 0x20, 0x7e, 0x91, 0x87, 0x90, 0x50, 0x5f, 0xa0, 0x77, 0x8a, 0x45, 0x43, 0x72, 0x18, 0x48, 0x6b, 0x78, 0x49, 0xae, 0xf8, 0x90, 0xd4, 0x83, 0xdc, 0xc2, 0xde, 0xb1, 0x42, 0x3c, 0xb8, 0x1e, 0x48, 0x8b, 0x7b, 0xe2, 0x92, 0x1d, 0x50, 0x5b, 0xf4, 0xa0, 0x51, 0xdb, 0xae, 0xf3, 0xc3, 0xd3, 0xfe, 0x82, 0xbd, 0x14, 0x84, 0x95, 0x4f, 0x38, 0x50, 0x8f, 0x65, 0x1d, 0x86, 0x7f, 0x38, 0x7f, 0x71, 0xde, 0xdb, 0xfb, 0x0f, 0x73, 0x55, 0x98, 0x7e, 0xd5, 0xa0, 0x61, 0x67, 0x9f, 0x43, 0xf3, 0xdb, 0x26, 0x67, 0x3b, 0xb6, 0x87, 0xc5, 0x84, 0xf3, 0x0a, 0xe3, 0xcf, 0xf7, 0x26, 0x1e, 0x71, 0xac, 0xf0, 0x7e, 0xd1, 0xfe, 0xae, 0xca, 0xe0, 0x98, 0xfc, 0x79, 0xa0, 0x99, 0x76, 0x1e, 0xa7, 0xd9, 0x4e, 0x01, 0xb1, 0x42, 0x85, 0xb7, 0xce, 0xd7, 0xdc, 0xd1, 0x67, 0x7f, 0xbd, 0x3c, 0xe0, 0x93, 0xa6, 0x27, 0xa8, 0xe1, 0x47, 0x20, 0x74, 0xba, 0xad, 0x8b, 0xd9, 0xa0, 0xbb, 0x6d, 0x26, 0x9f, 0xc6, 0x14, 0x43, 0xaa, 0x28, 0xb1, 0x4a, 0xf0, 0x44, 0x8a, 0xaf, 0x6f, 0x1f, 0x57, 0x04, 0x77, 0xd8, 0xb4, 0xef, 0x2e, 0xb7, 0xd3, 0x15, 0x43, 0x20, 0x2c, 0xe6, 0x02, 0xa0, 0x6c, 0x41, 0xcd, 0x2d, 0x17, 0x01, 0xb0, 0x58, 0x85, 0x35, 0x91, 0xa2, 0xf3, 0x06, 0xdd, 0xcf, 0xd1, 0xe5, 0x5d, 0x3e, 0x12, 0x01, 0x1c, 0xad, 0xb1, 0x00, 0xe7, 0xc5, 0x25, 0xaa, 0xf4, 0x60, 0xa0, 0xbc, 0xf3, 0x7a, 0xba, 0xac, 0x56, 0x6b, 0xb9, 0x8e, 0x09, 0x15, 0x75, 0xaf, 0x40, 0x38, 0x04, 0xdb, 0xb2, 0x78, 0xfb, 0xfa, 0x55, 0x47, 0xde, 0x68, 0x05, 0xcb, 0xaa, 0x52, 0x9a, 0xe1, 0x37, 0xa0, 0xde, 0x99, 0x18, 0xa2, 0xa9, 0x76, 0xa2, 0xb0, 0xb3, 0xf4, 0xae, 0xff, 0x80, 0x1f, 0xc7, 0x95, 0x57, 0x42, 0x6b, 0x19, 0xc1, 0x5d, 0x41, 0x4d, 0xdf, 0x8f, 0xae, 0x84, 0x37, 0x85, 0xb0, 0xb7, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0xd4, 0x94, 0x84, 0xbf, 0x95, 0xa2, 0x21, 0x10, 0xc4, 0x1b, 0xa9, 0xfa, 0xd0, 0x08, 0x7b, 0xf2, 0x75, 0x1c, 0x99, 0x18, 0x1c, 0xcb, 0x44, 0x48, 0x72, 0x95, 0xad, 0x65, 0x39, 0x99, 0x4d, 0x10, 0xa0, 0x4a, 0xef, 0x81, 0x3e, 0xb3, 0xdf, 0xf2, 0xb2, 0x57, 0x54, 0xad, 0x36, 0x6e, 0x55, 0x1b, 0xda, 0xb6, 0xb2, 0xcf, 0x5f, 0x21, 0xa1, 0x76, 0xe3, 0xcc, 0xbf, 0x6c, 0xe2, 0xeb, 0x26, 0x81, 0x18, 0xa0, 0x45, 0x5a, 0x6f, 0xe5, 0x14, 0xd0, 0x52, 0x1e, 0xf4, 0xea, 0x10, 0xc3, 0x3b, 0x55, 0x6b, 0x8f, 0x53, 0xa7, 0x15, 0x2c, 0xee, 0xe8, 0x62, 0xdc, 0x34, 0xb8, 0xcf, 0x27, 0x6e, 0x0c, 0x97, 0x49, 0xa0, 0xb3, 0xdc, 0xf6, 0xad, 0x23, 0xe9, 0xf6, 0x49, 0x38, 0x9d, 0x58, 0x4d, 0xe3, 0x6f, 0xe4, 0x7d, 0xae, 0x70, 0xb7, 0xfc, 0x73, 0x9d, 0xb2, 0x9e, 0x6a, 0x6a, 0x4f, 0x81, 0x1a, 0x3b, 0x22, 0xc3, 0xa0, 0x6f, 0x09, 0x44, 0xda, 0xce, 0x08, 0xe1, 0x0b, 0xd0, 0x64, 0x43, 0x16, 0x21, 0x39, 0x28, 0x7b, 0x56, 0xea, 0xd7, 0x4e, 0xab, 0x7c, 0x7b, 0x6c, 0x38, 0x6a, 0xf5, 0xb4, 0xde, 0x75, 0xbe, 0x16, 0xa0, 0x3c, 0x7c, 0x34, 0xae, 0x8a, 0xfa, 0x48, 0x5b, 0xa1, 0xaf, 0x86, 0x03, 0x4f, 0x2a, 0xc9, 0x2f, 0x3f, 0xb7, 0x1e, 0xcb, 0x98, 0x9d, 0xc5, 0xe1, 0xdc, 0x8a, 0xa5, 0x46, 0xa7, 0xba, 0x3f, 0x87, 0xa0, 0x7d, 0x7f, 0xd1, 0xbf, 0xd5, 0xb6, 0xa6, 0x3c, 0xaf, 0x07, 0xa0, 0x61, 0xef, 0xfc, 0x3c, 0xc2, 0xa2, 0x20, 0xd3, 0x6d, 0xfc, 0xc0, 0x49, 0x8a, 0x36, 0x90, 0xd2, 0xcc, 0x80, 0x8d, 0xd4, 0xf7, 0xa0, 0x69, 0x33, 0x9e, 0xe7, 0x38, 0xef, 0xbd, 0x6b, 0x75, 0x44, 0xf0, 0x31, 0x4f, 0x00, 0xbf, 0x87, 0x1a, 0x62, 0x99, 0x8b, 0x0c, 0x3a, 0x6a, 0x4f, 0x16, 0x13, 0x6f, 0xce, 0xa3, 0x34, 0x3a, 0x9f, 0xa0, 0x3c, 0x91, 0xdf, 0x57, 0xbc, 0x3c, 0x66, 0x11, 0x71, 0x8c, 0xc4, 0x92, 0x25, 0x7d, 0xb2, 0xfe, 0x9b, 0x64, 0x89, 0x12, 0x58, 0x56, 0x0f, 0x5c, 0xde, 0x98, 0xb0, 0x17, 0x80, 0xd1, 0xc2, 0x20, 0xa0, 0x52, 0x45, 0x11, 0xe9, 0x7f, 0xed, 0x37, 0xfd, 0x85, 0x7b, 0x5b, 0xfd, 0x82, 0x7e, 0x19, 0x0e, 0x0c, 0x1f, 0xbe, 0x94, 0xad, 0x61, 0xa1, 0xfe, 0x3e, 0x83, 0xe2, 0x2c, 0x42, 0x64, 0xe2, 0x0d, 0xa0, 0x33, 0xb5, 0x92, 0xbf, 0x8b, 0x76, 0x33, 0xfd, 0x20, 0x97, 0x81, 0xca, 0xd0, 0xd6, 0xbd, 0x7f, 0x22, 0x81, 0x3d, 0xb6, 0x07, 0xf0, 0x6c, 0xf1, 0x1f, 0x1d, 0x71, 0x7b, 0xda, 0x28, 0xf3, 0xbb, 0xa0, 0xf7, 0x74, 0xed, 0xd0, 0x41, 0x1b, 0x04, 0xdc, 0xf6, 0x4d, 0x15, 0x20, 0xd5, 0x07, 0x4f, 0xbd, 0xc8, 0x54, 0xc3, 0xda, 0x6f, 0x2d, 0x60, 0xb5, 0x7f, 0xe0, 0x3c, 0x6a, 0x6f, 0x84, 0xe8, 0x5c, 0xa0, 0x10, 0x3a, 0x3f, 0xc1, 0xdd, 0xb8, 0xfa, 0x81, 0x49, 0x3d, 0x6d, 0x4e, 0xeb, 0xa2, 0x4c, 0x20, 0x2f, 0x84, 0xa0, 0x5f, 0xb4, 0x38, 0x8f, 0x86, 0xb1, 0xf8, 0xc5, 0xe6, 0xd2, 0x8e, 0x20, 0x88, 0xa0, 0x7b, 0xcc, 0x50, 0x12, 0xbf, 0x23, 0xc2, 0x9b, 0x54, 0x32, 0x6e, 0x33, 0x9c, 0x80, 0x95, 0x79, 0x1c, 0x13, 0x05, 0xa1, 0x8f, 0x30, 0x5c, 0xfd, 0xce, 0xb3, 0xf4, 0x4d, 0x9a, 0x97, 0x5b, 0x23, 0xa0, 0xbc, 0x32, 0x5e, 0xbe, 0x8d, 0xc9, 0x7b, 0x03, 0x88, 0xb9, 0xc4, 0x8d, 0x74, 0x44, 0x08, 0x69, 0xcc, 0x53, 0xc4, 0x0e, 0x6a, 0xfc, 0x6e, 0x16, 0x82, 0xf5, 0x0b, 0xec, 0x0e, 0x40, 0x82, 0x8e, 0xa0, 0xc8, 0xab, 0x8f, 0x63, 0xcc, 0x85, 0xae, 0xaa, 0x9e, 0xdc, 0x75, 0x9a, 0x2e, 0xf6, 0x39, 0x99, 0x28, 0xb6, 0xa2, 0xca, 0x09, 0x24, 0x45, 0x6d, 0xb6, 0xfe, 0x54, 0x4d, 0xe0, 0x00, 0x95, 0xd5, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x99, 0x8b, 0xdb, 0x4d, 0x2f, 0xad, 0x11, 0x72, 0x3e, 0xa1, 0x7d, 0x36, 0x97, 0x48, 0x2b, 0x43, 0x60, 0x3a, 0xd7, 0x63, 0x5d, 0x95, 0x80, 0x38, 0x9c, 0x27, 0x0b, 0x00, 0xb5, 0xa1, 0x09, 0x11, 0xa0, 0x3d, 0xd6, 0xf7, 0x6d, 0x36, 0x22, 0x28, 0x39, 0xf7, 0x28, 0xc1, 0x42, 0x0e, 0x74, 0x51, 0x81, 0x6c, 0x19, 0x00, 0xd6, 0x6f, 0x0e, 0x68, 0xd0, 0x49, 0x0c, 0x7e, 0x45, 0xae, 0x29, 0x36, 0xf8, 0xa0, 0x8f, 0x4a, 0xfb, 0x17, 0xe0, 0xdb, 0xbc, 0x3a, 0x59, 0x4c, 0x50, 0xa0, 0x09, 0x36, 0x2a, 0x49, 0x3a, 0xe9, 0x0a, 0x18, 0x5b, 0x1d, 0xa6, 0x9b, 0x5d, 0x80, 0x62, 0xcf, 0xe5, 0x0b, 0x2d, 0x7d, 0xa0, 0x3e, 0xa8, 0x0f, 0x0e, 0x62, 0xbf, 0x5a, 0xd6, 0x68, 0xee, 0x94, 0xc1, 0x7f, 0x78, 0x7e, 0x3d, 0xfd, 0x37, 0xc3, 0x70, 0x7e, 0x6e, 0x24, 0xf2, 0x52, 0x80, 0x10, 0xeb, 0xea, 0xe1, 0xda, 0x5f, 0xa0, 0xde, 0x55, 0x6e, 0xea, 0xff, 0x16, 0x65, 0x79, 0xf1, 0x40, 0x1d, 0x26, 0x31, 0x25, 0x9c, 0xcc, 0x44, 0x63, 0x3d, 0x47, 0x06, 0x9a, 0x41, 0x1c, 0x5d, 0x4f, 0x4e, 0x97, 0x38, 0x44, 0x53, 0x14, 0xa0, 0x35, 0xd0, 0xb8, 0x6c, 0xea, 0xcb, 0x66, 0xd9, 0xb6, 0xef, 0x1e, 0x0c, 0xd9, 0xf6, 0x97, 0x10, 0x41, 0xeb, 0x3f, 0x76, 0x08, 0x63, 0x33, 0x30, 0x46, 0xac, 0x7e, 0x86, 0x8c, 0x1d, 0x61, 0x42, 0xa0, 0x8e, 0x90, 0xbf, 0x2b, 0xf9, 0xda, 0x51, 0xb4, 0xdd, 0x39, 0x8a, 0x19, 0xe4, 0xaf, 0xd3, 0x1d, 0x4f, 0x6b, 0x9b, 0xab, 0x6d, 0xf5, 0xce, 0x53, 0xf3, 0x61, 0x4c, 0xd9, 0x52, 0xfb, 0xa6, 0x85, 0xa0, 0x43, 0x93, 0x2b, 0x94, 0x86, 0x4c, 0x19, 0xda, 0x97, 0x26, 0xb0, 0xb1, 0xa4, 0x7d, 0x1c, 0xca, 0x5e, 0xad, 0x4a, 0x5a, 0x4f, 0x57, 0x52, 0x9c, 0x10, 0xbd, 0x50, 0x5b, 0x58, 0x13, 0x3b, 0x83, 0xa0, 0xb7, 0x62, 0xf1, 0xb1, 0x13, 0x1f, 0xde, 0xa5, 0x2a, 0x1f, 0xfb, 0x3d, 0xdc, 0x76, 0xa0, 0xfa, 0x25, 0x0b, 0xe2, 0x1f, 0x34, 0x8a, 0x76, 0x1e, 0x36, 0x0e, 0x7d, 0x94, 0xf5, 0xf6, 0xa2, 0xf6, 0xa0, 0x1b, 0x92, 0x62, 0x6b, 0x91, 0x7a, 0xc3, 0x89, 0xaa, 0x6d, 0x94, 0x55, 0x42, 0x04, 0xfd, 0x41, 0xdf, 0xcd, 0x15, 0x78, 0x4e, 0xcb, 0xdd, 0xf7, 0xce, 0xdd, 0x91, 0x0b, 0x87, 0x45, 0xb9, 0x7f, 0xa0, 0xae, 0xd8, 0x43, 0xd3, 0x15, 0x9f, 0x08, 0x96, 0x0f, 0x9e, 0xe1, 0x32, 0x3e, 0x35, 0x7c, 0xc3, 0xe0, 0x7b, 0x5c, 0x08, 0xd9, 0xde, 0x15, 0x99, 0x4c, 0xb4, 0x6e, 0x07, 0xab, 0x79, 0x35, 0xe1, 0xa0, 0x33, 0x3d, 0xbb, 0xae, 0xcf, 0x72, 0xe7, 0x82, 0x9d, 0x42, 0xdf, 0xbd, 0x7d, 0xaa, 0xef, 0x99, 0x2c, 0x86, 0x3d, 0x88, 0x21, 0x9c, 0xab, 0x2a, 0xaa, 0x36, 0x1e, 0x50, 0x15, 0x79, 0x3b, 0xf3, 0xa0, 0xb9, 0x09, 0x3f, 0x7f, 0xd9, 0x06, 0x01, 0x37, 0x61, 0x35, 0xa4, 0xc0, 0x49, 0xf0, 0xab, 0xb7, 0x86, 0x57, 0x4d, 0xa0, 0xf4, 0x90, 0x88, 0xbc, 0xc9, 0xa8, 0x65, 0x17, 0xe6, 0xca, 0x9d, 0xae, 0xa0, 0xae, 0x55, 0xeb, 0xd4, 0xbd, 0x22, 0x78, 0x3b, 0xe1, 0x87, 0x2f, 0xfd, 0xe2, 0xcb, 0x32, 0xc0, 0x33, 0x7e, 0x91, 0xdd, 0x48, 0xf1, 0xdf, 0x67, 0x88, 0x32, 0xa9, 0xed, 0x03, 0xd4, 0x20, 0x89, 0xa0, 0x51, 0x2f, 0x6f, 0xf6, 0xf3, 0x19, 0x45, 0x79, 0x59, 0xea, 0xbc, 0xbd, 0x75, 0x83, 0xa7, 0x4f, 0x91, 0xef, 0x79, 0xe6, 0xf9, 0x30, 0x9b, 0x00, 0xb3, 0xfb, 0xba, 0x47, 0xee, 0x57, 0x8c, 0xe9, 0xa0, 0x41, 0x2c, 0xc4, 0x3c, 0xc9, 0x5b, 0x0d, 0xb3, 0xfd, 0x2a, 0xd6, 0x97, 0x24, 0x65, 0xc8, 0xd1, 0x13, 0xe2, 0x2e, 0x04, 0x56, 0xc9, 0x6a, 0x1d, 0x69, 0xab, 0x27, 0x0c, 0x83, 0xfc, 0x33, 0x8c, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x74, 0xf1, 0x4a, 0xa5, 0x95, 0x3f, 0xe6, 0xff, 0xd9, 0x27, 0x06, 0x8e, 0xb1, 0x1e, 0xae, 0x2d, 0x78, 0x9b, 0xea, 0x3b, 0xf7, 0xf2, 0xf1, 0xef, 0x89, 0x8b, 0x14, 0xfb, 0xd2, 0x63, 0x64, 0x4b, 0xa0, 0x4d, 0x18, 0x58, 0xb1, 0xdc, 0xaf, 0x91, 0x52, 0xe1, 0x12, 0xb9, 0x03, 0x80, 0xeb, 0x48, 0x14, 0x0b, 0x89, 0xc9, 0x37, 0xf8, 0x7a, 0xe5, 0xe6, 0xab, 0xb7, 0x5a, 0x3b, 0x84, 0xe0, 0x54, 0xa3, 0xa0, 0x0f, 0x31, 0xb5, 0x3f, 0xfe, 0xe0, 0xec, 0x6a, 0x93, 0x3d, 0x1a, 0x42, 0x64, 0x85, 0x5c, 0xaa, 0x31, 0xa4, 0xf0, 0xd3, 0x7b, 0x12, 0xf2, 0x9f, 0x07, 0xff, 0x39, 0x11, 0x2e, 0xd7, 0x93, 0x1e, 0xa0, 0xa9, 0xd4, 0xdc, 0xab, 0x4f, 0x78, 0x54, 0x0e, 0x40, 0x81, 0x33, 0x7e, 0x7f, 0xc4, 0x98, 0xfe, 0x18, 0x08, 0xb4, 0xd7, 0xaa, 0x15, 0xa7, 0x2b, 0xcd, 0x18, 0x4e, 0x21, 0x0b, 0xef, 0x07, 0x52, 0xa0, 0x55, 0x3d, 0x60, 0xe6, 0x29, 0x3c, 0x6d, 0x76, 0xca, 0xcb, 0x26, 0x37, 0x55, 0x63, 0xd5, 0x1b, 0x2a, 0xba, 0xfe, 0x16, 0x25, 0xb4, 0xbf, 0x2f, 0x2d, 0xb7, 0xa0, 0xf6, 0x97, 0xf0, 0xc4, 0x37, 0xa0, 0xff, 0x86, 0x34, 0x9b, 0xeb, 0x03, 0xab, 0x22, 0x99, 0xf0, 0x3f, 0x4f, 0x1b, 0x92, 0xfc, 0x1a, 0x8c, 0x3c, 0xa0, 0x2c, 0xd8, 0x06, 0x3d, 0xfb, 0xe5, 0x38, 0xd2, 0x5a, 0x56, 0xb3, 0x8b, 0x03, 0xa0, 0x33, 0x74, 0x97, 0x75, 0xca, 0x26, 0x49, 0xf8, 0x53, 0xad, 0xfa, 0x8f, 0xa4, 0xf3, 0x92, 0xd4, 0x0c, 0xca, 0x60, 0xe2, 0x89, 0x76, 0x24, 0x26, 0xae, 0x26, 0x18, 0x37, 0x43, 0x6b, 0xed, 0x14, 0xa0, 0x17, 0x3d, 0x9f, 0xf4, 0xb2, 0xef, 0xaf, 0x38, 0x3e, 0x71, 0xf8, 0xe2, 0x21, 0x8a, 0x8b, 0xe5, 0x82, 0x4c, 0x45, 0x43, 0xea, 0x8b, 0x57, 0x23, 0xa0, 0x02, 0x35, 0x27, 0x47, 0xfc, 0x8f, 0xc0, 0xa0, 0x87, 0x54, 0xb9, 0x6b, 0x51, 0x84, 0xfc, 0xa1, 0xdf, 0x7c, 0xea, 0x8e, 0x47, 0xff, 0x83, 0xd2, 0x56, 0x4a, 0x71, 0xc0, 0xe9, 0x72, 0xd8, 0x60, 0x2d, 0x81, 0x2c, 0x11, 0x7c, 0x5a, 0x0f, 0xe3, 0xa0, 0xab, 0x7f, 0x46, 0xff, 0x12, 0xa6, 0x1e, 0xc1, 0x18, 0xfc, 0x0e, 0xd2, 0x33, 0x82, 0xa3, 0x39, 0xd5, 0x98, 0x90, 0x98, 0x3d, 0x9a, 0x6b, 0xb8, 0x2b, 0x46, 0xc5, 0x91, 0x19, 0xe3, 0xd4, 0x86, 0xa0, 0x86, 0x09, 0xfa, 0x34, 0xd4, 0x1f, 0x37, 0x48, 0xff, 0x8a, 0xcd, 0x56, 0xc1, 0x0b, 0xc9, 0x0f, 0x80, 0x52, 0xe2, 0x9e, 0xcf, 0x29, 0x54, 0x3b, 0x42, 0x4c, 0x57, 0xd5, 0xb3, 0x83, 0x5d, 0xf5, 0xa0, 0x43, 0xab, 0x1a, 0x36, 0xfc, 0x6f, 0x09, 0xf8, 0x99, 0xc7, 0x57, 0xa6, 0x88, 0x70, 0x7d, 0x57, 0xf7, 0xb2, 0x3d, 0x15, 0x4d, 0xc6, 0x62, 0x51, 0x03, 0x36, 0xb4, 0xfb, 0xee, 0x9c, 0x39, 0xea, 0xa0, 0x70, 0xcc, 0x0d, 0x6e, 0x4b, 0x82, 0x1b, 0xac, 0x76, 0x6d, 0x5e, 0xfb, 0x3e, 0x8c, 0xc1, 0xc9, 0x26, 0x02, 0xf6, 0x6d, 0x75, 0x76, 0x1b, 0xa6, 0xdf, 0x12, 0x7f, 0x7c, 0x5d, 0x66, 0x73, 0x39, 0xa0, 0xd9, 0xf4, 0xbd, 0xa4, 0x1e, 0x3c, 0x12, 0x53, 0x90, 0x86, 0x0e, 0xc1, 0xef, 0x2c, 0xc6, 0xd9, 0xef, 0x91, 0x7e, 0x79, 0x4b, 0xb5, 0x54, 0x38, 0x5d, 0x49, 0x68, 0x4f, 0x58, 0xa9, 0x76, 0x3a, 0xa0, 0xc2, 0xe7, 0x96, 0x37, 0x8a, 0xb8, 0x03, 0xee, 0x28, 0x27, 0x84, 0x92, 0x6b, 0x69, 0xb9, 0x85, 0x8c, 0x12, 0x6b, 0x09, 0x6b, 0xb2, 0x89, 0xb0, 0x0b, 0xe6, 0x02, 0x90, 0x27, 0x11, 0xe5, 0x1d, 0xa0, 0x29, 0x39, 0xfe, 0x17, 0x2e, 0x16, 0x59, 0xee, 0x39, 0x90, 0x3b, 0x3f, 0x56, 0xdc, 0x36, 0xd4, 0x4f, 0x26, 0x74, 0x24, 0x4f, 0x61, 0x46, 0xff, 0x59, 0xc9, 0x65, 0x5a, 0x9e, 0x2c, 0x2d, 0xe4, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x7f, 0x5b, 0x34, 0x3e, 0x1c, 0x77, 0x15, 0x8f, 0x35, 0xc7, 0xa3, 0x28, 0x94, 0x47, 0xe8, 0xa6, 0x7a, 0xce, 0xd7, 0x5b, 0x66, 0x48, 0xeb, 0x5f, 0xdb, 0x5e, 0xc4, 0x29, 0x48, 0xef, 0xa3, 0x39, 0xa0, 0xd7, 0x1a, 0xc5, 0x7d, 0x52, 0xfe, 0xbe, 0x7b, 0x9c, 0x08, 0x57, 0x2f, 0xb0, 0xdf, 0x86, 0x6d, 0x90, 0x13, 0x69, 0xc3, 0x53, 0xbc, 0x50, 0x40, 0x3d, 0x49, 0xd4, 0xb1, 0xb3, 0x20, 0xce, 0x51, 0xa0, 0x60, 0x98, 0x82, 0xd6, 0x1d, 0x4e, 0x90, 0xc9, 0xc9, 0x94, 0xda, 0x6f, 0x03, 0x9b, 0xb6, 0x79, 0xaf, 0x85, 0x2d, 0x34, 0xda, 0x92, 0xa8, 0x35, 0x8d, 0xaf, 0x51, 0xcd, 0x49, 0x2f, 0x6e, 0x40, 0xa0, 0xfc, 0xd7, 0xc1, 0xef, 0x19, 0xe6, 0x3c, 0x06, 0xb1, 0x78, 0x7b, 0xd2, 0x10, 0x9d, 0x76, 0x84, 0xc8, 0x3d, 0xf2, 0x51, 0x5a, 0x7f, 0x38, 0x17, 0xd8, 0xfb, 0xd6, 0x90, 0x14, 0xaa, 0x1b, 0xb5, 0xa0, 0x1a, 0x88, 0xce, 0x8d, 0x28, 0x6a, 0x1d, 0xfa, 0x80, 0x9c, 0x70, 0x27, 0x13, 0x99, 0x38, 0x7a, 0x3d, 0x92, 0x8a, 0xb5, 0x0a, 0x05, 0xf4, 0x10, 0x4d, 0x61, 0x92, 0x2a, 0x71, 0xf7, 0xf9, 0x9c, 0xa0, 0x86, 0x74, 0xc5, 0x46, 0xce, 0x3c, 0xce, 0x26, 0x88, 0xd3, 0xce, 0x90, 0xf5, 0xf3, 0xfd, 0xe4, 0x6a, 0x7a, 0x37, 0x4e, 0xd9, 0x09, 0xcb, 0x42, 0xd5, 0x0f, 0xf5, 0x35, 0x73, 0x20, 0x8d, 0x22, 0xa0, 0x8e, 0x6a, 0xa0, 0x2e, 0x46, 0xc8, 0x82, 0x34, 0x2e, 0x98, 0x7a, 0x3e, 0x2f, 0x0c, 0x48, 0x51, 0x2a, 0x46, 0xae, 0x57, 0x50, 0x07, 0x85, 0xf3, 0x8a, 0x05, 0x70, 0x49, 0x88, 0x46, 0x3a, 0x4f, 0xa0, 0x14, 0x73, 0xee, 0x4a, 0xf1, 0xab, 0x81, 0xe6, 0xe8, 0xcd, 0xe5, 0xf1, 0x2b, 0xa2, 0x5e, 0xef, 0xab, 0x26, 0xfd, 0x84, 0x8d, 0x8b, 0x6e, 0x9b, 0xfb, 0xc7, 0xed, 0x3e, 0x1b, 0x4f, 0x2b, 0x03, 0xa0, 0xfe, 0xe6, 0x1b, 0xe8, 0x61, 0xaf, 0xb0, 0x37, 0xb2, 0x17, 0x46, 0xdc, 0x4f, 0x8b, 0x87, 0x9d, 0x93, 0x1a, 0x56, 0x27, 0x1e, 0x63, 0xdc, 0x11, 0xe0, 0xc2, 0x76, 0xe3, 0x0f, 0xd8, 0x13, 0x88, 0xa0, 0xb4, 0x2d, 0x84, 0x11, 0x1c, 0x74, 0x37, 0x1d, 0x41, 0x46, 0x97, 0xe9, 0x66, 0xbb, 0xd8, 0x09, 0x1b, 0x0f, 0x93, 0x06, 0x04, 0x8d, 0x88, 0x3b, 0x65, 0x2a, 0x43, 0xe9, 0x36, 0xd1, 0xf8, 0xe9, 0xa0, 0x15, 0xf8, 0x81, 0x0a, 0x86, 0x2f, 0x02, 0x43, 0x79, 0x1d, 0xed, 0x94, 0x2b, 0x46, 0x6a, 0xa1, 0x47, 0x26, 0x81, 0x8e, 0x76, 0x7d, 0x0d, 0x57, 0xd1, 0x74, 0x40, 0xc8, 0x5f, 0x35, 0x94, 0xaa, 0xa0, 0xa6, 0xad, 0xaf, 0x18, 0x10, 0x85, 0xa4, 0x28, 0x5c, 0xc8, 0x3a, 0xbe, 0x8b, 0x70, 0x69, 0x03, 0x77, 0xa7, 0x49, 0xef, 0xe8, 0x7b, 0x6d, 0x99, 0xfe, 0x60, 0x38, 0x0c, 0xc2, 0x67, 0x50, 0x63, 0xa0, 0xf0, 0x82, 0x1d, 0x26, 0x51, 0xf1, 0xd0, 0x8c, 0xb4, 0x2d, 0xa7, 0x26, 0x55, 0x18, 0xfe, 0xcc, 0x03, 0xfd, 0x0f, 0x59, 0x09, 0xc1, 0x1b, 0x86, 0x22, 0x5d, 0x98, 0x14, 0x65, 0x19, 0x54, 0x1d, 0xa0, 0xd6, 0x5f, 0xcf, 0xef, 0x8c, 0x4a, 0x91, 0x59, 0xca, 0x1b, 0x86, 0xb0, 0x04, 0xbb, 0x24, 0xb6, 0x5c, 0x17, 0xa4, 0x97, 0x5f, 0xbe, 0x70, 0x16, 0x3c, 0xf3, 0xa0, 0x4d, 0x1b, 0xd4, 0xfd, 0x0e, 0xa0, 0x4a, 0x3e, 0xf4, 0x16, 0xb1, 0xff, 0x37, 0x1b, 0x04, 0x6d, 0x35, 0x28, 0x3c, 0x8d, 0xf5, 0x6f, 0x01, 0x54, 0xe3, 0x05, 0xe1, 0xe1, 0xa5, 0xaf, 0xab, 0x51, 0xf2, 0x06, 0x88, 0x5e, 0x0f, 0x5f, 0xa0, 0x73, 0xbd, 0x3a, 0xb2, 0x24, 0xb6, 0xcc, 0xd9, 0x0b, 0x8e, 0x36, 0x32, 0x20, 0xb2, 0x59, 0xf6, 0x51, 0x4c, 0x7a, 0x0a, 0xa4, 0xff, 0x63, 0xb7, 0xe1, 0x8f, 0x3d, 0x7c, 0xdc, 0x8a, 0x93, 0x31, 0x80, 0xf9, 0x02, 0x11, 0xa0, 0x3e, 0x1a, 0x3a, 0x68, 0x88, 0xbb, 0xa3, 0x4f, 0xd7, 0x4c, 0x4f, 0x96, 0xe7, 0xd7, 0x84, 0xe0, 0x8a, 0x39, 0x27, 0xc9, 0x92, 0x74, 0x76, 0x7c, 0x8b, 0x45, 0x38, 0x32, 0x43, 0xd1, 0x81, 0xe7, 0xa0, 0x5a, 0x92, 0xbb, 0x6d, 0xce, 0xe1, 0xc9, 0xc9, 0xbd, 0x2e, 0xe3, 0x54, 0x80, 0x44, 0x25, 0x13, 0x74, 0x83, 0x24, 0x75, 0xed, 0x9d, 0x9e, 0x70, 0x1e, 0x7c, 0x36, 0xcc, 0x21, 0xf0, 0x0e, 0x48, 0xa0, 0xa9, 0xc2, 0x66, 0x4e, 0x6e, 0x25, 0x05, 0x99, 0xe4, 0x37, 0xfe, 0xa6, 0x9c, 0xc9, 0x56, 0x9d, 0xc3, 0x4e, 0x78, 0x9f, 0x5f, 0x1b, 0x83, 0xf8, 0xad, 0xdc, 0x5a, 0x85, 0x80, 0x57, 0x5d, 0x4e, 0xa0, 0xd9, 0x92, 0xdb, 0x61, 0x79, 0x12, 0xf4, 0xef, 0xca, 0x1d, 0x5c, 0x6b, 0xc0, 0xe8, 0x0e, 0x40, 0xd1, 0x47, 0x98, 0x3c, 0x4b, 0x48, 0xc3, 0xe1, 0x6e, 0xef, 0x66, 0x44, 0xfd, 0x32, 0x7f, 0x80, 0xa0, 0xa8, 0x39, 0xba, 0x35, 0xf8, 0xa0, 0xdf, 0x0d, 0xb7, 0x33, 0x8b, 0xe1, 0xab, 0x40, 0x37, 0xb6, 0x8f, 0x47, 0x20, 0x0b, 0xb6, 0x31, 0x15, 0xcb, 0x87, 0xdb, 0x40, 0x57, 0x9f, 0x7a, 0xac, 0xd0, 0xa0, 0x18, 0x03, 0xb7, 0x99, 0x96, 0xb6, 0x62, 0x04, 0xa2, 0x57, 0x45, 0xc8, 0x84, 0x92, 0x70, 0xd8, 0xca, 0x18, 0x3e, 0xca, 0x2b, 0xa2, 0x59, 0x19, 0x25, 0x37, 0xd4, 0xdf, 0x81, 0x4e, 0x31, 0x04, 0xa0, 0xf5, 0xe7, 0x66, 0xcb, 0x5f, 0x8b, 0x5f, 0xce, 0xb5, 0xc1, 0x8f, 0x9b, 0x5f, 0x6c, 0xb2, 0xe9, 0xc2, 0x6a, 0x20, 0x22, 0x61, 0x1e, 0x51, 0x85, 0x8b, 0x19, 0xb7, 0x66, 0x3b, 0x8f, 0x54, 0x1f, 0xa0, 0x45, 0xc4, 0xf7, 0xdc, 0xfb, 0x76, 0xe8, 0xd7, 0xc2, 0x0d, 0x3c, 0x0a, 0xd7, 0x4f, 0xe1, 0xda, 0x1f, 0xf8, 0xcc, 0x6b, 0xfb, 0xe8, 0xa1, 0x71, 0x53, 0x91, 0x4a, 0xb4, 0xc3, 0xa0, 0x6c, 0xc3, 0xa0, 0x03, 0xb9, 0x95, 0xab, 0xc7, 0x47, 0xbd, 0x40, 0x62, 0xcc, 0xe4, 0x96, 0xe1, 0x95, 0xe2, 0xd5, 0x28, 0x60, 0x42, 0xa6, 0x3d, 0x5f, 0xdb, 0x59, 0x6f, 0x78, 0x02, 0x3f, 0x47, 0x0c, 0x7f, 0x6e, 0xa0, 0xa0, 0xdc, 0x85, 0x50, 0x40, 0x16, 0xb6, 0x83, 0x8d, 0x58, 0x22, 0x2a, 0x93, 0x98, 0xc4, 0x83, 0xd3, 0xd5, 0x75, 0xd0, 0xe3, 0xb8, 0xe4, 0x29, 0xc8, 0x71, 0xf0, 0xb9, 0xcb, 0x59, 0xf0, 0xeb, 0xa0, 0x04, 0xfc, 0x76, 0x44, 0xd8, 0xab, 0xe6, 0x9d, 0x5c, 0x75, 0x4e, 0x75, 0x4d, 0xc4, 0xbb, 0xea, 0x20, 0xba, 0xb6, 0x18, 0xd5, 0x0b, 0x57, 0xe6, 0x40, 0xa8, 0x36, 0x84, 0x67, 0x3b, 0x19, 0x79, 0xa0, 0x88, 0xfa, 0xf5, 0x3a, 0x4a, 0x0f, 0x41, 0x31, 0x02, 0x9d, 0xdd, 0xc9, 0xb8, 0x72, 0x7a, 0xaf, 0xa8, 0x0a, 0xbb, 0x6c, 0xbd, 0x6e, 0x84, 0x38, 0x30, 0x7c, 0xbf, 0x1f, 0xa7, 0xfe, 0x3e, 0x45, 0xa0, 0x94, 0x73, 0xa4, 0xd0, 0x5d, 0x18, 0x8f, 0x36, 0x1a, 0xec, 0x6a, 0x06, 0xbd, 0xa7, 0x43, 0x4a, 0x1d, 0x61, 0x35, 0x7b, 0x45, 0x4f, 0x3e, 0x2c, 0xee, 0xd0, 0xfb, 0xb3, 0x06, 0xba, 0x4c, 0x1f, 0xa0, 0xe5, 0xa2, 0x5b, 0xd1, 0xc6, 0xde, 0xdb, 0x6d, 0x7e, 0xff, 0x3a, 0xf7, 0xbf, 0x21, 0xa3, 0x23, 0x56, 0x66, 0x18, 0x0b, 0xb7, 0x90, 0x0f, 0x1d, 0x29, 0xc9, 0xfe, 0xbe, 0xab, 0x7f, 0xea, 0x75, 0xa0, 0xa8, 0x10, 0x79, 0x39, 0xd3, 0x9f, 0x83, 0xc5, 0x48, 0x23, 0xaa, 0xa4, 0xbf, 0x00, 0x30, 0xea, 0x36, 0x9d, 0x30, 0x27, 0x52, 0x54, 0x41, 0x88, 0xfa, 0x46, 0xcc, 0xa6, 0xad, 0x8a, 0xc2, 0x84, 0xa0, 0x78, 0xa6, 0x81, 0x8c, 0x13, 0xeb, 0x82, 0xb0, 0xaf, 0x88, 0x07, 0x62, 0xca, 0x82, 0xec, 0x9d, 0x6e, 0x2f, 0x7c, 0xa1, 0x3f, 0x6d, 0x26, 0x9a, 0xcd, 0x6e, 0x56, 0x5c, 0xb4, 0x93, 0x56, 0x94, 0x80, 0xf9, 0x01, 0x71, 0xa0, 0x7d, 0x33, 0x7e, 0x71, 0x7e, 0xcd, 0x4c, 0xe5, 0xf4, 0x5c, 0x4e, 0xa8, 0x99, 0x4e, 0x47, 0x6c, 0xe3, 0x8c, 0xf9, 0x37, 0xa4, 0xf2, 0x92, 0x4d, 0xc4, 0x0c, 0xfa, 0x8f, 0xe5, 0x87, 0x0f, 0xe9, 0xa0, 0x3f, 0x98, 0xe9, 0xce, 0x6a, 0xf1, 0x72, 0xec, 0x08, 0x48, 0x1a, 0x6b, 0xcf, 0xfb, 0x89, 0xa2, 0x64, 0x93, 0x3f, 0x90, 0xee, 0x28, 0x8a, 0x82, 0x14, 0x4c, 0x0e, 0xab, 0x96, 0x8e, 0x42, 0xff, 0xa0, 0xf8, 0x55, 0x9a, 0xbb, 0xbe, 0x0e, 0xba, 0x3b, 0xfe, 0xca, 0x91, 0xb5, 0x90, 0x09, 0x8c, 0x70, 0xa2, 0x4b, 0xf7, 0xc7, 0x68, 0xb1, 0x30, 0xfd, 0xe1, 0x93, 0xfb, 0x5b, 0xcc, 0x98, 0xb8, 0x82, 0x80, 0x80, 0xa0, 0x4a, 0x57, 0xac, 0x11, 0x63, 0x27, 0x7a, 0x82, 0x0b, 0xda, 0xe6, 0x49, 0xd6, 0x32, 0xf9, 0x17, 0xb3, 0x88, 0x5a, 0x80, 0x10, 0x36, 0x54, 0xd3, 0x21, 0x6f, 0x94, 0x09, 0xb7, 0x25, 0x25, 0xd3, 0xa0, 0x03, 0x18, 0x68, 0xde, 0xc2, 0x33, 0xf9, 0x86, 0xdc, 0x0a, 0xfa, 0x16, 0xd6, 0xab, 0xf7, 0x8e, 0x22, 0x39, 0x6b, 0x0f, 0xa4, 0xa7, 0x57, 0xf0, 0x68, 0x83, 0x80, 0x75, 0x6a, 0x84, 0x4b, 0xe2, 0xa0, 0xd3, 0xbe, 0xe6, 0x90, 0xd4, 0x81, 0x73, 0x44, 0x4d, 0x67, 0x9a, 0x7a, 0xb9, 0x69, 0xcd, 0x91, 0x99, 0xb8, 0x3a, 0xc3, 0xde, 0x64, 0xdb, 0x3d, 0x98, 0x7d, 0xc6, 0xaa, 0x2d, 0xdb, 0x06, 0xe7, 0x80, 0xa0, 0xcc, 0xb1, 0x02, 0x37, 0xfb, 0xb5, 0x45, 0x47, 0x87, 0x74, 0xd6, 0xe8, 0x58, 0xeb, 0x7a, 0x13, 0x27, 0x70, 0x8d, 0xe6, 0xc2, 0x05, 0xc7, 0x19, 0x5d, 0x3a, 0x5d, 0xac, 0xd5, 0x96, 0x12, 0x09, 0xa0, 0x90, 0x3e, 0x3c, 0xd4, 0x1d, 0x04, 0xb4, 0x69, 0x3e, 0x0e, 0xae, 0x15, 0x49, 0xf7, 0xfe, 0x02, 0x4e, 0xb0, 0x6b, 0x98, 0xfa, 0x1c, 0x13, 0x7c, 0xac, 0xc6, 0x6d, 0x57, 0xa7, 0xa0, 0xe2, 0x23, 0xa0, 0x7b, 0xae, 0x7d, 0x8d, 0xe8, 0x62, 0x27, 0x8d, 0x46, 0xcb, 0xa4, 0x51, 0x13, 0x00, 0x15, 0x33, 0xe9, 0xc5, 0xb6, 0x77, 0xfe, 0xc3, 0x85, 0xfb, 0xa8, 0x32, 0xaa, 0x14, 0x02, 0xb9, 0x6b, 0xf5, 0xa0, 0xc3, 0x29, 0xd6, 0x79, 0x71, 0xea, 0xd7, 0xda, 0x9f, 0x1d, 0x22, 0x29, 0x90, 0xd9, 0xaa, 0x6c, 0x0f, 0x44, 0x8b, 0xd1, 0x61, 0xc0, 0x98, 0x1e, 0xf5, 0x04, 0xb1, 0xd7, 0x29, 0x2b, 0x66, 0x61, 0x80, 0xa0, 0x15, 0x23, 0x4d, 0x9e, 0xf3, 0x9b, 0x97, 0xaf, 0x08, 0x3f, 0xb5, 0x71, 0x5d, 0xd5, 0xcc, 0x2f, 0x44, 0x54, 0xa2, 0x3c, 0xa3, 0xa4, 0xd7, 0x24, 0x19, 0xcf, 0xde, 0x3e, 0xa9, 0x18, 0x03, 0x6c, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x71, 0x80, 0xa0, 0x56, 0x8a, 0x35, 0x48, 0xf0, 0xc4, 0x68, 0xbe, 0xc6, 0x6c, 0x6d, 0x91, 0xb1, 0xd7, 0x2f, 0x84, 0xe4, 0x43, 0x73, 0xc0, 0x3c, 0x6e, 0x11, 0x8d, 0x7e, 0xdc, 0x6b, 0xa8, 0xfe, 0x9b, 0x4d, 0x0c, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xec, 0x26, 0xe1, 0x29, 0xa6, 0xfc, 0x11, 0xa5, 0xdc, 0xc7, 0x48, 0xbd, 0x22, 0xca, 0x4e, 0x41, 0xa0, 0xac, 0xe6, 0x3c, 0xbf, 0x1c, 0xb2, 0xde, 0x01, 0x8e, 0x2b, 0x95, 0x85, 0xa0, 0x6f, 0xc6, 0x80, 0xa0, 0xba, 0x74, 0x98, 0xeb, 0x55, 0xb2, 0xda, 0x21, 0x74, 0x0c, 0xc4, 0x29, 0xff, 0xe1, 0x7a, 0xed, 0xc4, 0x0e, 0xfc, 0xab, 0xe0, 0x31, 0xa0, 0x0a, 0x7c, 0x1c, 0xba, 0xea, 0x2b, 0xc2, 0x18, 0xf8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x66, 0x9d, 0x20, 0x92, 0xcd, 0x7f, 0x3f, 0x78, 0x13, 0x74, 0x97, 0xdf, 0x02, 0xf6, 0xcc, 0xb9, 0xba, 0xdd, 0xa9, 0x3d, 0x97, 0x82, 0xe0, 0xf2, 0x30, 0xc8, 0x07, 0xba, 0x72, 0x8b, 0xe0, 0xb8, 0x46, 0xf8, 0x44, 0x01, 0x80, 0xa0, 0xec, 0xf9, 0x23, 0x28, 0xec, 0x4f, 0x13, 0xfc, 0xc0, 0x28, 0x18, 0xf9, 0x67, 0xa3, 0xd7, 0x7b, 0xe8, 0xa7, 0xe1, 0x11, 0xd6, 0x7c, 0xc6, 0xec, 0x10, 0x3a, 0x57, 0x96, 0x8e, 0xa2, 0x0b, 0xc5, 0xa0, 0xd8, 0x0d, 0x4b, 0x7c, 0x89, 0x0c, 0xb9, 0xd6, 0xa4, 0x89, 0x3e, 0x6b, 0x52, 0xbc, 0x34, 0xb5, 0x6b, 0x25, 0x33, 0x5c, 0xb1, 0x37, 0x16, 0xe0, 0xd1, 0xd3, 0x13, 0x83, 0xe6, 0xb4, 0x15, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/state_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/state_proof_new.nr index d308af1d..55c5a66b 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/state_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/state_proof_new.nr @@ -48,3 +48,5 @@ global proof_input = ProofInput { depth: 9 } }; + +global proof_input_serialized = proof_input.serialize(); diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/storage_proof.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/storage_proof.nr index 5b9046ae..62b6cf05 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/storage_proof.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/storage_proof.nr @@ -1,7 +1,7 @@ -use crate::account_with_storage::StorageProof; +use crate::account_with_storage::LegacyStorageProof; global proofs = [ - StorageProof { + LegacyStorageProof { key: [ 0x1f, 0x21, 0xa6, 0x2c, 0x45, 0x38, 0xba, 0xcf, 0x2a, 0xab, 0xec, 0xa4, 0x10, 0xf0, 0xfe, 0x63, 0x15, 0x18, 0x69, 0xf1, 0x72, 0xe0, 0x3c, 0x0e, 0x00, 0x35, 0x7b, 0xa2, 0x6a, 0x34, 0x1e, 0xff ], diff --git a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/storage_proof_new.nr b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/storage_proof_new.nr index d7e5d956..ca755da3 100644 --- a/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/storage_proof_new.nr +++ b/ethereum/circuits/lib/src/fixtures/mainnet/paris/usdc_uniswap/storage_proof_new.nr @@ -1,4 +1,5 @@ use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; +use crate::account_with_storage::{MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_STORAGE_DEPTH_NO_LEAF_M, MAX_STORAGE_VALUE_LEN, MAX_STORAGE_LEAF_LEN}; global proofs = [ ProofInput { @@ -38,3 +39,5 @@ global proofs = [ } } ]; + +global proofs_serialized = proofs.map(|proof: ProofInput| proof.serialize()); diff --git a/ethereum/circuits/lib/src/misc/bytes.nr b/ethereum/circuits/lib/src/misc/bytes.nr index 92f6bec5..5cfefa03 100644 --- a/ethereum/circuits/lib/src/misc/bytes.nr +++ b/ethereum/circuits/lib/src/misc/bytes.nr @@ -89,7 +89,7 @@ pub(crate) fn byte_value(in_value: [u8; N]) -> BoundedVec { for i in 0..N { let num_bytes_ind = (value_length == 0) as u64; let byte_ind = (in_value[i] != 0) as u64; - value_length = num_bytes_ind*byte_ind * (N - i) + (1 - num_bytes_ind) * value_length; + value_length = num_bytes_ind * byte_ind * (N - i) + (1 - num_bytes_ind) * value_length; } let value = left_byte_shift(in_value, N - value_length); diff --git a/ethereum/circuits/lib/src/receipt.nr b/ethereum/circuits/lib/src/receipt.nr index 0ba3aa57..a8e659d5 100644 --- a/ethereum/circuits/lib/src/receipt.nr +++ b/ethereum/circuits/lib/src/receipt.nr @@ -2,6 +2,7 @@ use crate::misc::{types::{Bytes32, Address}, option::make_option, fragment::Frag use crate::header::get_header; use crate::verifiers::{receipt::verify_receipt, tx_helpers::split::split_into_tx_type_and_rlp}; use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; +use crate::serde::Serde; use dep::std::unsafe::zeroed; global BLOOM_FILTER_LEN: u64 = 256; @@ -109,7 +110,7 @@ unconstrained pub(crate) fn get_receipt_unconstrained_M( cumulative_gas_used: receipt.cumulative_gas_used, logs_bloom: receipt.logs_bloom }; - let proof_input = ProofInput::deserialize(proof_input); + let proof_input: ProofInput = Serde::deserialize(proof_input); (tx_type, receipt, proof_input) } diff --git a/ethereum/circuits/lib/src/serde.nr b/ethereum/circuits/lib/src/serde.nr index 7a9de9c5..ac183067 100644 --- a/ethereum/circuits/lib/src/serde.nr +++ b/ethereum/circuits/lib/src/serde.nr @@ -5,6 +5,14 @@ use crate::receipt::{ MAX_PREFIXED_KEY_NIBBLE_LEN as RECEIPT_MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_LEAF_LEN_M as RECEIPT_MAX_LEAF_LEN_M, MAX_VALUE_LEN_M as RECEIPT_MAX_VALUE_LEN_M }; +use crate::account::{ + MAX_ACCOUNT_DEPTH_NO_LEAF_M, MAX_PREFIXED_KEY_NIBBLE_LEN as ACCOUNT_MAX_PREFIXED_KEY_NIBBLE_LEN, + MAX_ACCOUNT_STATE_LEN, MAX_ACCOUNT_LEAF_LEN +}; +use crate::account_with_storage::{ + MAX_PREFIXED_KEY_NIBBLE_LEN as STORAGE_MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_STORAGE_DEPTH_NO_LEAF_M, + MAX_STORAGE_VALUE_LEN, MAX_STORAGE_LEAF_LEN +}; use crate::misc::{fragment::Fragment, types::{BYTES32_LENGTH, Bytes32, ADDRESS_LENGTH, Address}, uint256::U256}; use crate::merkle_patricia_proofs::proof::{ProofInput, Proof, Node, MAX_NODE_LEN}; use dep::std::unsafe::zeroed; @@ -120,9 +128,151 @@ impl Serde for StorageWithinBlock<1> { } } +/** STATE PROOF INPUT **/ + +global STATE_NODES_LEN_M = 5320; // MAX_NODE_LEN * MAX_ACCOUNT_DEPTH_NO_LEAF_M + +pub fn serialize_state_nodes(nodes: [Node; MAX_ACCOUNT_DEPTH_NO_LEAF_M]) -> [Field; STATE_NODES_LEN_M] { + let mut data: BoundedVec = BoundedVec::new(); + for i in 0..MAX_ACCOUNT_DEPTH_NO_LEAF_M { + data.extend_from_array(nodes[i].serialize()); + } + data.storage +} + +pub fn deserialize_state_nodes(data: [Field; STATE_NODES_LEN_M]) -> [Node; MAX_ACCOUNT_DEPTH_NO_LEAF_M] { + let mut result: Fragment = Fragment::empty(); + let mut fragment = Fragment::from_array(data); + for _ in 0..MAX_ACCOUNT_DEPTH_NO_LEAF_M { + let node: Node = fragment.pop_front_array().deserialize(); + result.push_back(node); + } + result.data +} + +global STATE_PROOF_LEN_M = 5469; // STATE_NODES_LEN_M + MAX_ACCOUNT_LEAF_LEN + 1 + +impl Serde for Proof { + fn serialize(self) -> [Field; STATE_PROOF_LEN_M] { + let mut data: BoundedVec = BoundedVec::new(); + data.extend_from_array(serialize_state_nodes(self.nodes)); + data.extend_from_array(self.leaf.serialize()); + data.push(self.depth as Field); + data.storage + } + + fn deserialize(data: [Field; STATE_PROOF_LEN_M]) -> Self { + let mut fragment = Fragment::from_array(data); + let nodes: [Node; MAX_ACCOUNT_DEPTH_NO_LEAF_M] = deserialize_state_nodes(fragment.pop_front_array()); + let leaf = fragment.pop_front_array().deserialize(); + let depth = fragment.pop_front() as u64; + Proof { + nodes, + leaf, + depth, + } + } +} + +global STATE_PROOF_INPUT_LEN_M = 5645; // ACCOUNT_MAX_PREFIXED_KEY_NIBBLE_LEN + MAX_ACCOUNT_STATE_LEN + STATE_PROOF_LEN_M + +impl Serde for ProofInput { + fn serialize(self) -> [Field; STATE_PROOF_INPUT_LEN_M] { + let mut data: BoundedVec = BoundedVec::new(); + data.extend_from_array(self.key.serialize()); + data.extend_from_array(self.value.serialize()); + data.extend_from_array(self.proof.serialize()); + data.storage + } + + fn deserialize(data: [Field; STATE_PROOF_INPUT_LEN_M]) -> Self { + let mut fragment = Fragment::from_array(data); + let key = fragment.pop_front_array().deserialize(); + let value = fragment.pop_front_array().deserialize(); + let proof: Proof = Serde::deserialize(fragment.pop_front_array()); + ProofInput { + key, + value, + proof + } + } +} + +/** STORAGE PROOF INPUT **/ + +global STORAGE_NODES_LEN_M = 3192; // MAX_NODE_LEN * MAX_STORAGE_DEPTH_NO_LEAF_M + +pub fn serialize_storage_nodes(nodes: [Node; MAX_STORAGE_DEPTH_NO_LEAF_M]) -> [Field; STORAGE_NODES_LEN_M] { + let mut data: BoundedVec = BoundedVec::new(); + for i in 0..MAX_STORAGE_DEPTH_NO_LEAF_M { + data.extend_from_array(nodes[i].serialize()); + } + data.storage +} + +pub fn deserialize_storage_nodes(data: [Field; STORAGE_NODES_LEN_M]) -> [Node; MAX_STORAGE_DEPTH_NO_LEAF_M] { + let mut result: Fragment = Fragment::empty(); + let mut fragment = Fragment::from_array(data); + for _ in 0..MAX_STORAGE_DEPTH_NO_LEAF_M { + let node: Node = fragment.pop_front_array().deserialize(); + result.push_back(node); + } + result.data +} + +global STORAGE_PROOF_LEN_M = 3262; // STORAGE_NODES_LEN_M + MAX_STORAGE_LEAF_LEN + 1 + +impl Serde for Proof { + fn serialize(self) -> [Field; STORAGE_PROOF_LEN_M] { + let mut data: BoundedVec = BoundedVec::new(); + data.extend_from_array(serialize_storage_nodes(self.nodes)); + data.extend_from_array(self.leaf.serialize()); + data.push(self.depth as Field); + data.storage + } + + fn deserialize(data: [Field; STORAGE_PROOF_LEN_M]) -> Self { + let mut fragment = Fragment::from_array(data); + let nodes: [Node; MAX_STORAGE_DEPTH_NO_LEAF_M] = deserialize_storage_nodes(fragment.pop_front_array()); + let leaf = fragment.pop_front_array().deserialize(); + let depth = fragment.pop_front() as u64; + Proof { + nodes, + leaf, + depth, + } + } +} + +global STORAGE_PROOF_INPUT_LEN_M = 3360; // STORAGE_MAX_PREFIXED_KEY_NIBBLE_LEN + MAX_STORAGE_VALUE_LEN + STORAGE_PROOF_LEN_M + +impl Serde for ProofInput { + fn serialize(self) -> [Field; STORAGE_PROOF_INPUT_LEN_M] { + let mut data: BoundedVec = BoundedVec::new(); + data.extend_from_array(self.key.serialize()); + data.extend_from_array(self.value.serialize()); + data.extend_from_array(self.proof.serialize()); + data.storage + } + + fn deserialize(data: [Field; STORAGE_PROOF_INPUT_LEN_M]) -> Self { + let mut fragment = Fragment::from_array(data); + let key = fragment.pop_front_array().deserialize(); + let value = fragment.pop_front_array().deserialize(); + let proof: Proof = Serde::deserialize(fragment.pop_front_array()); + ProofInput { + key, + value, + proof + } + } +} + +/** RECEIPT/TX PROOF INPUT **/ + global RECEIPT_NODES_LEN = MAX_NODE_LEN * RECEIPT_MAX_DEPTH_NO_LEAF; -pub fn serialize_nodes(nodes: [Node; RECEIPT_MAX_DEPTH_NO_LEAF]) -> [Field; RECEIPT_NODES_LEN] { +pub fn serialize_receipt_nodes(nodes: [Node; RECEIPT_MAX_DEPTH_NO_LEAF]) -> [Field; RECEIPT_NODES_LEN] { let mut data: BoundedVec = BoundedVec::new(); for i in 0..RECEIPT_MAX_DEPTH_NO_LEAF { data.extend_from_array(nodes[i].serialize()); @@ -130,7 +280,7 @@ pub fn serialize_nodes(nodes: [Node; RECEIPT_MAX_DEPTH_NO_LEAF]) -> [Field; RECE data.storage } -pub fn deserialize_nodes(data: [Field; RECEIPT_NODES_LEN]) -> [Node; RECEIPT_MAX_DEPTH_NO_LEAF] { +pub fn deserialize_receipt_nodes(data: [Field; RECEIPT_NODES_LEN]) -> [Node; RECEIPT_MAX_DEPTH_NO_LEAF] { let mut result: Fragment = Fragment::empty(); let mut fragment = Fragment::from_array(data); for _ in 0..RECEIPT_MAX_DEPTH_NO_LEAF { @@ -140,12 +290,12 @@ pub fn deserialize_nodes(data: [Field; RECEIPT_NODES_LEN]) -> [Node; RECEIPT_MAX result.data } -global RECEIPT_PROOF_LEN_M = RECEIPT_MAX_DEPTH_NO_LEAF * MAX_NODE_LEN + RECEIPT_MAX_LEAF_LEN_M + 1; +global RECEIPT_PROOF_LEN_M = RECEIPT_NODES_LEN + RECEIPT_MAX_LEAF_LEN_M + 1; impl Serde for Proof { fn serialize(self) -> [Field; RECEIPT_PROOF_LEN_M] { let mut data: BoundedVec = BoundedVec::new(); - data.extend_from_array(serialize_nodes(self.nodes)); + data.extend_from_array(serialize_receipt_nodes(self.nodes)); data.extend_from_array(self.leaf.serialize()); data.push(self.depth as Field); data.storage @@ -153,7 +303,7 @@ impl Serde for Proof Self { let mut fragment = Fragment::from_array(data); - let nodes: [Node; RECEIPT_MAX_DEPTH_NO_LEAF] = deserialize_nodes(fragment.pop_front_array()); + let nodes: [Node; RECEIPT_MAX_DEPTH_NO_LEAF] = deserialize_receipt_nodes(fragment.pop_front_array()); let leaf = fragment.pop_front_array().deserialize(); let depth = fragment.pop_front() as u64; Proof { @@ -180,7 +330,7 @@ impl Serde for ProofInput = Serde::deserialize(fragment.pop_front_array()); ProofInput { key, value, diff --git a/ethereum/circuits/lib/src/serde_test.nr b/ethereum/circuits/lib/src/serde_test.nr index 5660ebb4..bfbeac57 100644 --- a/ethereum/circuits/lib/src/serde_test.nr +++ b/ethereum/circuits/lib/src/serde_test.nr @@ -133,12 +133,12 @@ mod nodes { use crate::fixtures::mainnet::cancun::small_block::receipt_proof_new::proof_input; use crate::merkle_patricia_proofs::proof::MAX_NODE_LEN; use crate::misc::arrays::sub_array_equals; - use crate::serde::{deserialize_nodes, serialize_nodes}; + use crate::serde::{deserialize_receipt_nodes, serialize_receipt_nodes}; #[test] fn simple() { let nodes = proof_input.proof.nodes; - let serialized = serialize_nodes(nodes); + let serialized = serialize_receipt_nodes(nodes); assert(sub_array_equals(nodes[0].serialize(), serialized, 0)); assert( @@ -148,13 +148,14 @@ mod nodes { MAX_NODE_LEN * (nodes.len() - 1) - 1 ) ); - assert_eq(deserialize_nodes(serialized), nodes); + assert_eq(deserialize_receipt_nodes(serialized), nodes); } } mod proof { use crate::fixtures::mainnet::cancun::small_block::receipt_proof_new::proof_input; - use crate::serde::{serialize_nodes, RECEIPT_NODES_LEN, RECEIPT_MAX_LEAF_LEN_M}; + use crate::receipt::MAX_DEPTH_NO_LEAF as RECEIPT_MAX_DEPTH_NO_LEAF; + use crate::serde::{Serde, serialize_receipt_nodes, RECEIPT_MAX_LEAF_LEN_M, RECEIPT_NODES_LEN}; use crate::merkle_patricia_proofs::proof::Proof; use crate::misc::arrays::sub_array_equals; @@ -163,16 +164,19 @@ mod proof { let proof = proof_input.proof; let serialized = proof.serialize(); - assert(sub_array_equals(serialize_nodes(proof.nodes), serialized, 0)); + assert(sub_array_equals(serialize_receipt_nodes(proof.nodes), serialized, 0)); assert(sub_array_equals(proof.leaf.serialize(), serialized, RECEIPT_NODES_LEN)); assert_eq(serialized[RECEIPT_NODES_LEN + RECEIPT_MAX_LEAF_LEN_M], proof.depth as Field); - assert_eq(Proof::deserialize(serialized), proof); + + let deserialized: Proof = Serde::deserialize(serialized); + assert_eq(deserialized, proof); } } mod proof_input { use crate::fixtures::mainnet::cancun::small_block::receipt_proof_new::proof_input; - use crate::serde::{RECEIPT_MAX_PREFIXED_KEY_NIBBLE_LEN, RECEIPT_MAX_VALUE_LEN_M}; + use crate::receipt::{MAX_DEPTH_NO_LEAF as RECEIPT_MAX_DEPTH_NO_LEAF, MAX_LEAF_LEN_M as RECEIPT_MAX_LEAF_LEN_M}; + use crate::serde::{Serde, RECEIPT_MAX_PREFIXED_KEY_NIBBLE_LEN, RECEIPT_MAX_VALUE_LEN_M}; use crate::misc::arrays::sub_array_equals; use crate::merkle_patricia_proofs::proof::ProofInput; @@ -195,6 +199,8 @@ mod proof_input { RECEIPT_MAX_PREFIXED_KEY_NIBBLE_LEN + RECEIPT_MAX_VALUE_LEN_M ) ); - assert_eq(ProofInput::deserialize(serialized), proof_input); + + let deserialized: ProofInput = Serde::deserialize(serialized); + assert_eq(deserialized, proof_input); } } diff --git a/ethereum/circuits/lib/src/transaction.nr b/ethereum/circuits/lib/src/transaction.nr index 70c27f18..78f90fd9 100644 --- a/ethereum/circuits/lib/src/transaction.nr +++ b/ethereum/circuits/lib/src/transaction.nr @@ -3,7 +3,7 @@ use dep::std::unsafe::zeroed; use crate::header::get_header; use crate::verifiers::transaction::verify_tx; use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; -use crate::serde::TX_PROOF_INPUT_LEN_M; +use crate::serde::{TX_PROOF_INPUT_LEN_M, Serde}; global MAX_KEY_LEN = 3; global MAX_DEPTH_NO_LEAF = 6; @@ -137,7 +137,7 @@ unconstrained fn get_transaction_unconstrained_M( ) -> (TxType, TxPartial, ProofInput) { let (tx_type, transaction, proof_input): (TxType, ForeignCallTransaction, ProofInputSerialized) = get_transaction_oracle(chain_id, block_number, tx_idx); let transaction: TxPartial = transaction.into(); - let proof_input = ProofInput::deserialize(proof_input); + let proof_input: ProofInput = Serde::deserialize(proof_input); (tx_type, transaction, proof_input) } diff --git a/ethereum/circuits/lib/src/verifiers/account.nr b/ethereum/circuits/lib/src/verifiers/account.nr index 47537f68..d5f5a1e8 100644 --- a/ethereum/circuits/lib/src/verifiers/account.nr +++ b/ethereum/circuits/lib/src/verifiers/account.nr @@ -1,19 +1,19 @@ -use dep::proof::{const::{MAX_ACCOUNT_STATE_LENGTH, HASH_LENGTH}, trie_proof::TrieProof}; - -use crate::account::{Account, StateProof}; -use crate::misc::{types::Address, bytes::right_pad, fragment::Fragment}; +use crate::account::{Account, MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_ACCOUNT_STATE_LEN, MAX_ACCOUNT_LEAF_LEN}; +use crate::misc::{types::{Address, ADDRESS_LENGTH}, bytes::right_pad, fragment::Fragment}; use crate::rlp::decode::decode_list_of_small_strings; use crate::rlp::types::RlpList; - +use crate::merkle_patricia_proofs::proof::{ProofInput, verify_merkle_proof}; use crate::HASH_LEN; +use dep::std::hash::keccak256; + global ACCOUNT_FIELDS_COUNT = 4; global NONCE_INDEX = 0; global BALANCE_INDEX = 1; global STORAGE_ROOT_INDEX = 2; global CODE_HASH_INDEX = 3; -pub(crate) fn assert_account_equals(account_rlp_left_padded: [u8; MAX_ACCOUNT_STATE_LENGTH], account: Account) { +pub(crate) fn assert_account_equals(account_rlp_left_padded: [u8; MAX_ACCOUNT_STATE_LEN], account: Account) { let account_rlp_right_padded = right_pad(account_rlp_left_padded).storage; let account_rlp_list: RlpList = decode_list_of_small_strings(Fragment::from_array(account_rlp_right_padded)); assert(account_rlp_list.len == ACCOUNT_FIELDS_COUNT, "Invalid number of fields in account RLP"); @@ -26,27 +26,24 @@ pub(crate) fn assert_account_equals(account_rlp_left_padded: [u8; MAX_ACCOUNT_ST account_rlp_list.get(CODE_HASH_INDEX).assert_eq_bytes32("Code hash", account_rlp, account.code_hash); } -fn assert_address_equals(address1: Address, address2: Address) { - assert_eq(address1, address2, "Address mismatch"); -} - -fn assert_account_proof(account_state_proof: StateProof, state_root: [u8; HASH_LENGTH]) { - let trie_proof = TrieProof { - key: account_state_proof.key, - proof: account_state_proof.proof, - depth: account_state_proof.depth, - value: account_state_proof.value - }; - assert(trie_proof.verify_state_root(state_root), "TrieProof: Invalid state root"); +fn assert_address_equals(address_hash: [u8; MAX_PREFIXED_KEY_NIBBLE_LEN], address: Address) { + let address_hash_fragment = Fragment::new(MAX_PREFIXED_KEY_NIBBLE_LEN - HASH_LEN, HASH_LEN, address_hash); + let other_address_hash_fragment = Fragment::from_array(keccak256(address, ADDRESS_LENGTH as u32)); + assert(address_hash_fragment.eq(other_address_hash_fragment), "Address mismatch"); } -pub fn verify_account( +pub fn verify_account( address: Address, account: Account, - state_proof: StateProof, - state_root: [u8; HASH_LENGTH] + state_proof_input: ProofInput, + state_root: [u8; HASH_LEN] ) { - assert_address_equals(state_proof.key, address); - assert_account_equals(state_proof.value, account); - assert_account_proof(state_proof, state_root); + assert_address_equals(state_proof_input.key, address); + assert_account_equals(state_proof_input.value, account); + verify_merkle_proof( + state_proof_input.key, + state_proof_input.value, + state_root, + state_proof_input.proof + ); } diff --git a/ethereum/circuits/lib/src/verifiers/account_test.nr b/ethereum/circuits/lib/src/verifiers/account_test.nr index c1d0fda5..88bb67e6 100644 --- a/ethereum/circuits/lib/src/verifiers/account_test.nr +++ b/ethereum/circuits/lib/src/verifiers/account_test.nr @@ -1,9 +1,9 @@ -use crate::account_with_storage::{Account, MAX_ACCOUNT_STATE_LENGTH, verify_account}; +use crate::{account::MAX_ACCOUNT_STATE_LEN, account_with_storage::{Account, verify_account}}; use crate::fixtures::{ mainnet::london::{ crypto_punks::{ - account::{rlp_encoded_left_padded_account, account, balance, storage_root, code_hash, nonce}, - header::state_root, state_proof::state_proof + account::{rlp_encoded_left_padded_account, account, address, balance, storage_root, code_hash, nonce}, + header::state_root, state_proof_new::proof_input as state_proof_input } } }; @@ -19,15 +19,15 @@ global RLP_SHORT_STRING_TYPE = 0x80; #[test(should_fail_with = "Expected a list")] fn test_account_rlp_invalid_type() { - let mut rlp_empty_string_encoding = [0; MAX_ACCOUNT_STATE_LENGTH]; - rlp_empty_string_encoding[MAX_ACCOUNT_STATE_LENGTH - 1] = RLP_SHORT_STRING_TYPE; + let mut rlp_empty_string_encoding = [0; MAX_ACCOUNT_STATE_LEN]; + rlp_empty_string_encoding[MAX_ACCOUNT_STATE_LEN - 1] = RLP_SHORT_STRING_TYPE; assert_account_equals(rlp_empty_string_encoding, account) } #[test(should_fail_with = "Invalid number of fields in account RLP")] fn test_account_rlp_invalid_field_count() { let rlp_encoded_left_padded_account_with_invalid_field_count = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 1, 138, 3, 19, 87, 10, 132, 191, 55, 142, 253, 37, 160, 174, 39, 146, 36, 68, 17, 188, 174, 73, 185, 205, 154, 11, 220, 28, 74, 108, 243, 47, 20, 123, 67, 32, 44, 140, 179, 89, 7, 118, 89, 174, 202 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 1, 138, 3, 19, 87, 10, 132, 191, 55, 142, 253, 37, 160, 174, 39, 146, 36, 68, 17, 188, 174, 73, 185, 205, 154, 11, 220, 28, 74, 108, 243, 47, 20, 123, 67, 32, 44, 140, 179, 89, 7, 118, 89, 174, 202 ]; assert_account_equals( rlp_encoded_left_padded_account_with_invalid_field_count, @@ -79,20 +79,20 @@ fn test_assert_account_equals_code_hash_with_wrong_value() { #[test] fn test_verify_account() { - let _ = verify_account(state_proof.key, account, state_proof, state_root); + let _ = verify_account(address, account, state_proof_input, state_root); } #[test(should_fail_with="Address mismatch")] fn test_verify_account_wrong_address() { - let mut wrong_address = state_proof.key; + let mut wrong_address = address; wrong_address[0] += 1; - let _ = verify_account(wrong_address, account, state_proof, state_root); + let _ = verify_account(wrong_address, account, state_proof_input, state_root); } // TODO: Add correct assertion message when noir-trie-proofs is updated #[test(should_fail)] fn test_verify_account_wrong_state_proof() { - let mut wrong_proof = state_proof; - wrong_proof.proof[0] += 1; - let _ = verify_account(state_proof.key, account, wrong_proof, state_root); + let mut wrong_proof = state_proof_input; + wrong_proof.proof.nodes[0][0] -= 1; + let _ = verify_account(address, account, wrong_proof, state_root); } diff --git a/ethereum/circuits/lib/src/verifiers/storage.nr b/ethereum/circuits/lib/src/verifiers/storage.nr index 10a481cd..8316c14b 100644 --- a/ethereum/circuits/lib/src/verifiers/storage.nr +++ b/ethereum/circuits/lib/src/verifiers/storage.nr @@ -1,17 +1,20 @@ -use dep::proof::trie_proof::TrieProof; - use crate::misc::types::Bytes32; -use crate::account_with_storage::StorageProof; - -pub fn verify_storage_value(storage_root: Bytes32, proof: StorageProof) { - let trie_proof = TrieProof { key: proof.key, value: proof.value, proof: proof.proof, depth: proof.depth }; - - // Method verify_storage_root asserts on failure or returns true; it doesn't return false. Validating return for safety. - assert(trie_proof.verify_storage_root(storage_root), "TrieProof: Invalid storage root"); -} +use crate::account::MAX_PREFIXED_KEY_NIBBLE_LEN; +use crate::account_with_storage::{MAX_STORAGE_VALUE_LEN, MAX_STORAGE_LEAF_LEN, LegacyStorageProof}; +use crate::merkle_patricia_proofs::proof::{ProofInput, verify_merkle_proof}; -pub fn verify_storage_values(storage_root: Bytes32, proofs: [StorageProof; N]) { +pub fn verify_storage_values( + proof_inputs: [ProofInput; N], + storage_root: Bytes32 +) { for i in 0..N { - verify_storage_value(storage_root, proofs[i]); + // verify_storage_value(storage_root, proofs[i]); + let proof_input = proof_inputs[i]; + verify_merkle_proof( + proof_input.key, + proof_input.value, + storage_root, + proof_input.proof + ); } } diff --git a/ethereum/circuits/lib/src/verifiers/storage_test.nr b/ethereum/circuits/lib/src/verifiers/storage_test.nr index 5c3c8559..454fb7c0 100644 --- a/ethereum/circuits/lib/src/verifiers/storage_test.nr +++ b/ethereum/circuits/lib/src/verifiers/storage_test.nr @@ -1,9 +1,9 @@ -use crate::fixtures::mainnet::paris::usdc_circle::{storage_proof::proofs, account::storage_root}; -use crate::verifiers::storage::{verify_storage_value, verify_storage_values}; +use crate::fixtures::mainnet::paris::usdc_circle::{storage_proof_new::proofs, account::storage_root}; +use crate::verifiers::storage::verify_storage_values; #[test] fn test_verify_storage_values() { - let _ = verify_storage_values(storage_root, proofs); + let _ = verify_storage_values(proofs, storage_root); } #[test(should_fail)] @@ -11,50 +11,5 @@ fn test_verify_storage_values_invalid_storage_root() { let mut root = storage_root; root[0] += 1; - let _ = verify_storage_values(root, proofs); -} - -#[test] -fn test_verify_storage_value() { - let _ = verify_storage_value(storage_root, proofs[0]); -} - -#[test(should_fail)] -fn test_verify_storage_value_invalid_storage_root() { - let mut root = storage_root; - root[0] += 1; - - let _ = verify_storage_value(root, proofs[0]); -} - -#[test(should_fail)] -fn test_verify_storage_value_invalid_proof() { - let mut proof = proofs[0]; - proof.proof[0] += 1; - - let _ = verify_storage_value(storage_root, proof); -} - -#[test(should_fail)] -fn test_verify_storage_value_invalid_depth() { - let mut proof = proofs[0]; - proof.depth += 1; - - let _ = verify_storage_value(storage_root, proof); -} - -#[test(should_fail)] -fn test_verify_storage_value_invalid_key() { - let mut proof = proofs[0]; - proof.key[0] += 1; - - let _ = verify_storage_value(storage_root, proof); -} - -#[test(should_fail)] -fn test_verify_storage_value_invalid_value() { - let mut proof = proofs[0]; - proof.value[0] += 1; - - let _ = verify_storage_value(storage_root, proof); + let _ = verify_storage_values(proofs, root); } diff --git a/ethereum/oracles/src/script/noir_fixtures/new_proof.ts b/ethereum/oracles/src/script/noir_fixtures/new_proof.ts index 94d59996..0ccba3c5 100644 --- a/ethereum/oracles/src/script/noir_fixtures/new_proof.ts +++ b/ethereum/oracles/src/script/noir_fixtures/new_proof.ts @@ -19,6 +19,8 @@ export function createNewTopLevelProofFixture(proof: Proof, config: ProofConfig) return `use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; global proof_input = ${createNewProofInputFixture(proof, config)}; + +global proof_input_serialized = proof_input.serialize(); `; } diff --git a/ethereum/oracles/src/script/noir_fixtures/new_receipt_proof.ts b/ethereum/oracles/src/script/noir_fixtures/new_receipt_proof.ts index 936cdfba..ef7652a7 100644 --- a/ethereum/oracles/src/script/noir_fixtures/new_receipt_proof.ts +++ b/ethereum/oracles/src/script/noir_fixtures/new_receipt_proof.ts @@ -3,7 +3,5 @@ import { receiptProofConfigM } from '../../noir/oracles/rpc/common/proofConfig/r import { createNewTopLevelProofFixture } from './new_proof.js'; export function createNewReceiptProofFixture(proof: Proof): string { - return `${createNewTopLevelProofFixture(proof, receiptProofConfigM)} -global proof_input_serialized = proof_input.serialize(); -`; + return createNewTopLevelProofFixture(proof, receiptProofConfigM); } diff --git a/ethereum/oracles/src/script/noir_fixtures/new_storage_proof.ts b/ethereum/oracles/src/script/noir_fixtures/new_storage_proof.ts index b052a35a..0d1afe6a 100644 --- a/ethereum/oracles/src/script/noir_fixtures/new_storage_proof.ts +++ b/ethereum/oracles/src/script/noir_fixtures/new_storage_proof.ts @@ -13,8 +13,11 @@ interface StorageProof { export function createNewStorageProofFixture(storageProofs: StorageProof[]): string { const storageProofsNoir = storageProofs.map(createSingleStorageProofFixture); return `use crate::merkle_patricia_proofs::proof::{Proof, ProofInput}; +use crate::account_with_storage::{MAX_PREFIXED_KEY_NIBBLE_LEN, MAX_STORAGE_DEPTH_NO_LEAF_M, MAX_STORAGE_VALUE_LEN, MAX_STORAGE_LEAF_LEN}; global proofs = ${joinArrayVertical(storageProofsNoir)}; + +global proofs_serialized = proofs.map(|proof: ProofInput| proof.serialize()); `; } diff --git a/ethereum/oracles/src/script/noir_fixtures/new_transaction_proof.ts b/ethereum/oracles/src/script/noir_fixtures/new_transaction_proof.ts index bf415974..8711b594 100644 --- a/ethereum/oracles/src/script/noir_fixtures/new_transaction_proof.ts +++ b/ethereum/oracles/src/script/noir_fixtures/new_transaction_proof.ts @@ -3,7 +3,5 @@ import { txProofConfigM } from '../../noir/oracles/rpc/common/proofConfig/tx.js' import { createNewTopLevelProofFixture } from './new_proof.js'; export function createNewTransactionProofFixture(proof: Proof): string { - return `${createNewTopLevelProofFixture(proof, txProofConfigM)} -global proof_input_serialized = proof_input.serialize(); -`; + return createNewTopLevelProofFixture(proof, txProofConfigM); } diff --git a/ethereum/oracles/src/script/noir_fixtures/state_proof.ts b/ethereum/oracles/src/script/noir_fixtures/state_proof.ts index 4ab347c6..be43f177 100644 --- a/ethereum/oracles/src/script/noir_fixtures/state_proof.ts +++ b/ethereum/oracles/src/script/noir_fixtures/state_proof.ts @@ -9,9 +9,9 @@ export function createStateProofFixture(stateProof: GetProofReturnType): string const value = encodeValue(stateProof.accountProof); const proof = encodeProof(stateProof.accountProof, accountProofConfig.maxProofLen); const depth = stateProof.accountProof.length; - const stateProofFixture = `use crate::account::StateProof; + const stateProofFixture = `use crate::account::LegacyStateProof; -global state_proof = StateProof { +global state_proof = LegacyStateProof { key: ${indentBlock(joinArray(key), 1)}, value: ${indentBlock(joinArray(value), 1)}, proof: ${indentBlock(joinArray(proof), 1)}, diff --git a/ethereum/oracles/src/script/noir_fixtures/storage_proof.ts b/ethereum/oracles/src/script/noir_fixtures/storage_proof.ts index 92e49873..71a733b8 100644 --- a/ethereum/oracles/src/script/noir_fixtures/storage_proof.ts +++ b/ethereum/oracles/src/script/noir_fixtures/storage_proof.ts @@ -11,7 +11,7 @@ interface StorageProof { export function createStorageProofFixture(storageProofs: StorageProof[]): string { const storageProofsNoir = storageProofs.map(createSingleStorageProofFixture); - return `use crate::account_with_storage::StorageProof; + return `use crate::account_with_storage::LegacyStorageProof; global proofs = ${joinArray(storageProofsNoir)}; `; @@ -22,7 +22,7 @@ function createSingleStorageProofFixture(storageProof: StorageProof): string { const value = encodeBytes32(storageProof.value); const proof = encodeProof(storageProof.proof, storageProofConfig.maxProofLen); const depth = storageProof.proof.length; - const storageProofFixture = `StorageProof { + const storageProofFixture = `LegacyStorageProof { key: ${indentBlock(joinArray(key), 1)}, value: ${indentBlock(joinArray(value), 1)}, proof: ${indentBlock(joinArray(proof), 1)}, diff --git a/vlayer/ethereum/circuits/lib/src/token_int_test.nr b/vlayer/ethereum/circuits/lib/src/token_int_test.nr index f104c69e..60bac131 100644 --- a/vlayer/ethereum/circuits/lib/src/token_int_test.nr +++ b/vlayer/ethereum/circuits/lib/src/token_int_test.nr @@ -4,15 +4,15 @@ mod test_ERC20Token { use dep::ethereum::fixtures::mainnet::{ paris::usdc_circle::header::{block_header_partial as paris_block_header_partial, block_header_rlp as paris_block_header_rlp}, paris::usdc_circle::header::{hash, number, state_root, transactions_root, receipts_root}, - paris::usdc_circle::account::account, paris::usdc_circle::state_proof::state_proof, - paris::usdc_circle::storage_proof::proofs + paris::usdc_circle::account::account, paris::usdc_circle::state_proof_new::proof_input_serialized as state_proof_input_serialized, + paris::usdc_circle::storage_proof_new::proofs_serialized }; use crate::chain_id::MAINNET; #[test] fn success() { let _ = OracleMock::mock("get_header").returns((paris_block_header_partial, paris_block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let usdc_token = ERC20Token { address: [ diff --git a/vlayer/examples/circuits/is_ape_owner/src/main_test.nr b/vlayer/examples/circuits/is_ape_owner/src/main_test.nr index e0c39337..bed5e6c8 100644 --- a/vlayer/examples/circuits/is_ape_owner/src/main_test.nr +++ b/vlayer/examples/circuits/is_ape_owner/src/main_test.nr @@ -3,7 +3,7 @@ mod is_ape_owner_main { use dep::ethereum::{ fixtures::mainnet::paris::bored_ape_yacht_club::{ header::{block_header_partial as paris_block_header_partial, block_header_rlp as paris_block_header_rlp}, - account::account, state_proof::state_proof, storage_proof::proofs + account::account, state_proof_new::proof_input_serialized as state_proof_input_serialized, storage_proof_new::proofs_serialized }, misc::arrays::alter_array }; @@ -17,7 +17,7 @@ mod is_ape_owner_main { #[test] fn success() { let _ = OracleMock::mock("get_header").returns((paris_block_header_partial, paris_block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let token_id = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7 @@ -28,7 +28,7 @@ mod is_ape_owner_main { #[test(should_fail_with = "Owner is not the same as the wallet address")] fn invalid_wallet() { let _ = OracleMock::mock("get_header").returns((paris_block_header_partial, paris_block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let token_id = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7 diff --git a/vlayer/examples/circuits/is_crypto_punk_owner/src/main_test.nr b/vlayer/examples/circuits/is_crypto_punk_owner/src/main_test.nr index 827998cc..ff01ac5a 100644 --- a/vlayer/examples/circuits/is_crypto_punk_owner/src/main_test.nr +++ b/vlayer/examples/circuits/is_crypto_punk_owner/src/main_test.nr @@ -3,7 +3,7 @@ mod is_crypto_punk_owner_main { use dep::ethereum::{ fixtures::mainnet::london::crypto_punks::{ header::{block_header_partial as london_block_header_partial, block_header_rlp as london_block_header_rlp}, - account::account, state_proof::state_proof, storage_proof::proofs + account::account, state_proof_new::proof_input_serialized as state_proof_input_serialized, storage_proof_new::proofs_serialized }, misc::arrays::alter_array }; @@ -17,7 +17,7 @@ mod is_crypto_punk_owner_main { #[test] fn success() { let _ = OracleMock::mock("get_header").returns((london_block_header_partial, london_block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let token_id = 9; main(CRYPTO_PUNK_OWNER_WALLER_ADDRESS, token_id, BLOCK_NUMBER); } @@ -25,7 +25,7 @@ mod is_crypto_punk_owner_main { #[test(should_fail_with = "Owner is not the same as the wallet address")] fn invalid_wallet() { let _ = OracleMock::mock("get_header").returns((london_block_header_partial, london_block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let token_id = 9; main( diff --git a/vlayer/examples/circuits/is_dao_worthy/src/main_test.nr b/vlayer/examples/circuits/is_dao_worthy/src/main_test.nr index 6cc5d9ab..dd4cd3c3 100644 --- a/vlayer/examples/circuits/is_dao_worthy/src/main_test.nr +++ b/vlayer/examples/circuits/is_dao_worthy/src/main_test.nr @@ -2,15 +2,15 @@ mod is_dao_worthy_main { use dep::std::test::OracleMock; use dep::ethereum::fixtures::mainnet::{ paris::usdc_circle::header::{block_header_partial as paris_block_header_partial, block_header_rlp as paris_block_header_rlp}, - paris::usdc_circle::account::account, paris::usdc_circle::state_proof::state_proof, - paris::usdc_circle::storage_proof::proofs + paris::usdc_circle::account::account, paris::usdc_circle::state_proof_new::proof_input_serialized as state_proof_input_serialized, + paris::usdc_circle::storage_proof_new::proofs_serialized }; use crate::main; #[test] fn success_greater_then() { let _ = OracleMock::mock("get_header").returns((paris_block_header_partial, paris_block_header_rlp)); - let _ = OracleMock::mock("get_proof").returns((account, state_proof, proofs[0])); + let _ = OracleMock::mock("get_proof").returns((account, state_proof_input_serialized, proofs_serialized[0])); let block_number = 19_000_000; let circle_address = [ From 4cf97fb213ae7e5609f55a71ef80c2e446cd55f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Mon, 27 May 2024 12:54:21 +0200 Subject: [PATCH 05/11] Update account & proof oracles tests --- ethereum/circuits/lib/src/transaction.nr | 2 - .../circuits/lib/src/transaction_int_test.nr | 30 +- .../accountOracle.int.test.ts.snap | 187 +++ .../receiptOracle.int.test.ts.snap | 1006 +++++++++++++++++ .../oracles/rpc/accountOracle.int.test.ts | 18 +- .../src/noir/oracles/rpc/accountOracle.ts | 1 - .../oracles/rpc/accountOracle/encode.test.ts | 36 +- .../noir/oracles/rpc/accountOracle/encode.ts | 4 +- .../noir/oracles/rpc/proofOracle.int.test.ts | 19 +- .../oracles/rpc/receiptOracle.int.test.ts | 10 + .../server/__snapshots__/app.test.ts.snap | 686 +++-------- .../circuits/lib/src/token_int_test.nr | 3 +- .../circuits/is_ape_owner/src/main_test.nr | 3 +- .../is_crypto_punk_owner/src/main_test.nr | 3 +- .../circuits/is_dao_worthy/src/main_test.nr | 3 +- 15 files changed, 1404 insertions(+), 607 deletions(-) create mode 100644 ethereum/oracles/src/noir/oracles/rpc/__snapshots__/accountOracle.int.test.ts.snap create mode 100644 ethereum/oracles/src/noir/oracles/rpc/__snapshots__/receiptOracle.int.test.ts.snap diff --git a/ethereum/circuits/lib/src/transaction.nr b/ethereum/circuits/lib/src/transaction.nr index 78f90fd9..f4ef75ee 100644 --- a/ethereum/circuits/lib/src/transaction.nr +++ b/ethereum/circuits/lib/src/transaction.nr @@ -98,8 +98,6 @@ impl From for TxPartial { type ProofInputSerialized = [Field; LEN]; -type ProofInputSerialized = [Field; LEN]; - struct TransactionWithinBlock { transaction: TxPartial, block_hash: Bytes32 diff --git a/ethereum/circuits/lib/src/transaction_int_test.nr b/ethereum/circuits/lib/src/transaction_int_test.nr index fa7d1d4c..38144041 100644 --- a/ethereum/circuits/lib/src/transaction_int_test.nr +++ b/ethereum/circuits/lib/src/transaction_int_test.nr @@ -27,11 +27,7 @@ fn get_transaction_success() { let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp)); let _ = OracleMock::mock("get_transaction").returns((tx_type, foreign_call_transaction, proof_input_serialized)); - let transaction_within_block: TransactionWithinBlock = get_transaction( - ETHEREUM_MAINNET_ID, - number, - tx_idx - ); + let transaction_within_block: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, number, tx_idx); assert_eq(transaction_within_block.block_hash, block_header_partial.hash); assert_eq(transaction_within_block.transaction, foreign_call_transaction.into()); @@ -43,11 +39,7 @@ fn get_transaction_wrong_block_number() { let _ = OracleMock::mock("get_transaction").returns((tx_type, foreign_call_transaction, proof_input_serialized)); let wrong_number = number + 1; - let _: TransactionWithinBlock = get_transaction( - ETHEREUM_MAINNET_ID, - wrong_number, - tx_idx - ); + let _: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, wrong_number, tx_idx); } #[test(should_fail_with = "Key does not match rlp-encoded transaction index")] @@ -56,11 +48,7 @@ fn get_transaction_wrong_tx_idx() { let _ = OracleMock::mock("get_transaction").returns((tx_type, foreign_call_transaction, proof_input_serialized)); let wrong_tx_idx = tx_idx + 1; - let _: TransactionWithinBlock = get_transaction( - ETHEREUM_MAINNET_ID, - number, - wrong_tx_idx - ); + let _: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, number, wrong_tx_idx); } #[test(should_fail_with = "Invalid node hash")] @@ -68,11 +56,7 @@ fn get_transaction_wrong_transaction() { let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp)); let _ = OracleMock::mock("get_transaction").returns((another_tx_type, another_foreign_call_transaction, another_proof_input_serialized)); - let _: TransactionWithinBlock = get_transaction( - ETHEREUM_MAINNET_ID, - number, - another_tx_idx - ); + let _: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, number, another_tx_idx); } #[test(should_fail_with = "Invalid node hash")] @@ -80,9 +64,5 @@ fn get_transaction_wrong_header() { let _ = OracleMock::mock("get_header").returns((another_block_header_partial, another_block_header_rlp)); let _ = OracleMock::mock("get_transaction").returns((tx_type, foreign_call_transaction, proof_input_serialized)); - let _: TransactionWithinBlock = get_transaction( - ETHEREUM_MAINNET_ID, - another_number, - tx_idx - ); + let _: TransactionWithinBlock = get_transaction(ETHEREUM_MAINNET_ID, another_number, tx_idx); } diff --git a/ethereum/oracles/src/noir/oracles/rpc/__snapshots__/accountOracle.int.test.ts.snap b/ethereum/oracles/src/noir/oracles/rpc/__snapshots__/accountOracle.int.test.ts.snap new file mode 100644 index 00000000..89e6a698 --- /dev/null +++ b/ethereum/oracles/src/noir/oracles/rpc/__snapshots__/accountOracle.int.test.ts.snap @@ -0,0 +1,187 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`accountOracle > getAccountOracle 1`] = ` +[ + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x06", + "0xe1", + "0x20", + "0xc2", + "0xc3", + "0x54", + "0x7c", + "0x60", + "0xee", + "0x47", + "0xf7", + "0x12", + "0xd3", + "0x2e", + "0x5a", + "0xcf", + "0x38", + "0xb3", + "0x5d", + "0x1c", + "0xc6", + "0x2e", + "0x23", + "0xb0", + "0x55", + "0xa6", + "0x9b", + "0xb8", + "0x82", + "0x84", + "0xc2", + "0x81", +] +`; + +exports[`accountOracle > getAccountOracle 2`] = ` +[ + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0xf8", + "0x50", + "0x82", + "0x02", + "0xcb", + "0x8a", + "0x01", + "0x9c", + "0x54", + "0xc1", + "0xcc", + "0x8b", + "0x1a", + "0xd5", + "0x99", + "0x4d", + "0xa0", + "0x56", + "0xe8", + "0x1f", + "0x17", + "0x1b", + "0xcc", + "0x55", + "0xa6", + "0xff", + "0x83", + "0x45", + "0xe6", + "0x92", + "0xc0", + "0xf8", + "0x6e", + "0x5b", + "0x48", + "0xe0", + "0x1b", + "0x99", + "0x6c", + "0xad", + "0xc0", + "0x01", + "0x62", + "0x2f", + "0xb5", + "0xe3", + "0x63", + "0xb4", + "0x21", + "0xa0", + "0xc5", + "0xd2", + "0x46", + "0x01", + "0x86", + "0xf7", + "0x23", + "0x3c", + "0x92", + "0x7e", + "0x7d", + "0xb2", + "0xdc", + "0xc7", + "0x03", + "0xc0", + "0xe5", + "0x00", + "0xb6", + "0x53", + "0xca", + "0x82", + "0x27", + "0x3b", + "0x7b", + "0xfa", + "0xd8", + "0x04", + "0x5d", + "0x85", + "0xa4", + "0x70", +] +`; diff --git a/ethereum/oracles/src/noir/oracles/rpc/__snapshots__/receiptOracle.int.test.ts.snap b/ethereum/oracles/src/noir/oracles/rpc/__snapshots__/receiptOracle.int.test.ts.snap new file mode 100644 index 00000000..5b93f559 --- /dev/null +++ b/ethereum/oracles/src/noir/oracles/rpc/__snapshots__/receiptOracle.int.test.ts.snap @@ -0,0 +1,1006 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`getReceiptOracle > success 1`] = ` +[ + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x02", + "0xf9", + "0x01", + "0xa7", + "0x01", + "0x83", + "0x0a", + "0x17", + "0xe1", + "0xb9", + "0x01", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x10", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x10", + "0x40", + "0x00", + "0x00", + "0x08", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x01", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x10", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x02", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x02", + "0x00", + "0x00", + "0x00", + "0x40", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x04", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x10", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x02", + "0x00", + "0x00", + "0x00", + "0xf8", + "0x9d", + "0xf8", + "0x9b", + "0x94", + "0x51", + "0x49", + "0x10", + "0x77", + "0x1a", + "0xf9", + "0xca", + "0x65", + "0x6a", + "0xf8", + "0x40", + "0xdf", + "0xf8", + "0x3e", + "0x82", + "0x64", + "0xec", + "0xf9", + "0x86", + "0xca", + "0xf8", + "0x63", + "0xa0", + "0xdd", + "0xf2", + "0x52", + "0xad", + "0x1b", + "0xe2", + "0xc8", + "0x9b", + "0x69", + "0xc2", + "0xb0", + "0x68", + "0xfc", + "0x37", + "0x8d", + "0xaa", + "0x95", + "0x2b", + "0xa7", + "0xf1", + "0x63", + "0xc4", + "0xa1", + "0x16", + "0x28", + "0xf5", + "0x5a", + "0x4d", + "0xf5", + "0x23", + "0xb3", + "0xef", + "0xa0", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0xfa", + "0x4d", + "0x81", + "0x48", + "0x7e", + "0xce", + "0x32", + "0xe9", + "0x5a", + "0xe2", + "0xbe", + "0xe5", + "0xfc", + "0x86", + "0x0f", + "0x18", + "0x9f", + "0xe1", + "0x63", + "0xd8", + "0xa0", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x12", + "0x5f", + "0x66", + "0x02", + "0x39", + "0x70", + "0x7c", + "0x9d", + "0xe3", + "0x46", + "0x2d", + "0x3f", + "0xa6", + "0x33", + "0xf2", + "0x72", + "0x3a", + "0xd0", + "0xb8", + "0x84", + "0xa0", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x3f", + "0x44", + "0x12", + "0x7f", + "0xb4", + "0x3f", + "0xa1", + "0x00", + "0x00", +] +`; diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts index 8234948f..6f945bc5 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest'; import { OFFSETS, getAccountOracle } from './accountOracle.js'; -import { createMockMultiChainClient } from '../../../ethereum/mockClient.js'; +import { createMockMultiChainClient } from '../../ethereum/mockClient.js'; +import { accountProofConfig } from './common/proofConfig/account.js'; describe('accountOracle', () => { it('getAccountOracle', async () => { @@ -23,7 +24,18 @@ describe('accountOracle', () => { ]); expect(account[OFFSETS.NONCE]).toStrictEqual('0x02cb'); expect(account[OFFSETS.BALANCE]).toStrictEqual('0x019c54c1cc8b1ad5994d'); - expect(account[OFFSETS.PROOF_KEY]).toStrictEqual(vitalikAccountAddressInNoirFormat); - expect(account[OFFSETS.PROOF_DEPTH]).toStrictEqual('0x09'); + + const proofInputKeyPart = account[OFFSETS.PROOF_INPUT].slice(0, accountProofConfig.maxPrefixedKeyNibbleLen); + expect(proofInputKeyPart).toMatchSnapshot(); + const proofInputValuePart = account[OFFSETS.PROOF_INPUT].slice( + accountProofConfig.maxPrefixedKeyNibbleLen, + accountProofConfig.maxPrefixedKeyNibbleLen + accountProofConfig.maxValueLen + ); + expect(proofInputValuePart).toMatchSnapshot(); + const proofInputDepthPart = account[OFFSETS.PROOF_INPUT].slice( + account[OFFSETS.PROOF_INPUT].length - 1, + account[OFFSETS.PROOF_INPUT].length + ); + expect(proofInputDepthPart).toStrictEqual(['0x09']); }); }); diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.ts index 98f10ac9..76e9d544 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.ts @@ -34,7 +34,6 @@ export async function getAccountOracle( }); const encodedAccount = encodeAccount(accountProof); const encodedProof = encodeStateProof(accountProof); - console.log(encodedProof.length); return [...encodedAccount, encodedProof]; } diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.test.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.test.ts index 316938d9..0220a6e4 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.test.ts @@ -1,10 +1,8 @@ import { describe, expect, it } from 'vitest'; import { loadProofFixture } from '../../../../historyAPIFixtures.js'; import accountAsFields from './fixtures/accountAsFields.json'; -import stateProofAsFields from './fixtures/stateProofAsFields.json'; -import storageProofAsFields from './fixtures/storageProofAsFields.json'; import { ForeignCallOutput } from '@noir-lang/noir_js'; -import { encodeAccount, encodeStateProof, encodeStorageProof, getValue } from './encode.js'; +import { encodeAccount, getValue } from './encode.js'; import { Hex } from 'viem'; describe('AccountOracle encode', () => { @@ -14,23 +12,6 @@ describe('AccountOracle encode', () => { expect(encodeAccount(proofFixture)).toStrictEqual(serializeAccount(accountAsFields)); }); }); - - describe('encodeStateProof', () => { - it('encode state proof', async () => { - const proofFixture = await loadProofFixture('mainnet', 'paris', 'usdc_circle'); - expect(encodeStateProof(proofFixture)).toStrictEqual(serializeStateProof(stateProofAsFields)); - }); - }); - - describe('encodeStorageProof', () => { - it('encode storage proof', async () => { - const proofFixture = await loadProofFixture('mainnet', 'paris', 'usdc_circle'); - const usdcCircleStorageKey = '0x57d18af793d7300c4ba46d192ec7aa095070dde6c52c687c6d0d92fb8532b305'; - expect(encodeStorageProof(usdcCircleStorageKey, proofFixture.storageProof[0])).toStrictEqual( - serializeStorageProof(storageProofAsFields) - ); - }); - }); }); describe('getValue', () => { @@ -51,21 +32,6 @@ interface AccountAsFields { storageRoot: string[]; } -interface ProofAsFields { - key: string[]; - value: string[]; - proof: string[]; - depth: string; -} - function serializeAccount(account: AccountAsFields): ForeignCallOutput[] { return [account.nonce, account.balance, account.storageRoot, account.codeHash]; } - -function serializeStateProof(stateProof: ProofAsFields): ForeignCallOutput[] { - return [stateProof.key, stateProof.value, stateProof.proof, stateProof.depth]; -} - -function serializeStorageProof(storageProof: ProofAsFields): ForeignCallOutput[] { - return [storageProof.key, storageProof.value, storageProof.proof, storageProof.depth]; -} diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts index 0569cfa2..8ab040f0 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts @@ -19,7 +19,7 @@ export function encodeAccount(ethProof: GetProofReturnType): ForeignCallOutput[] return [nonce, balance, storageRoot, codeHash]; } -export function encodeStateProof(ethProof: GetProofReturnType): ForeignCallOutput[] { +export function encodeStateProof(ethProof: GetProofReturnType): ForeignCallOutput { const key = padArray( encodeHex(keccak256(ethProof.address)), accountProofConfig.maxPrefixedKeyNibbleLen, @@ -54,7 +54,7 @@ export function encodeValue(proof: Hex[]): string[] { type StorageProof = GetProofReturnType['storageProof'][number]; -export function encodeStorageProof(storageKey: Hex, storageProof: StorageProof): ForeignCallOutput[] { +export function encodeStorageProof(storageKey: Hex, storageProof: StorageProof): ForeignCallOutput { const key = padArray( encodeHex(keccak256(storageKey)), storageProofConfig.maxPrefixedKeyNibbleLen, diff --git a/ethereum/oracles/src/noir/oracles/rpc/proofOracle.int.test.ts b/ethereum/oracles/src/noir/oracles/rpc/proofOracle.int.test.ts index 8f474863..46e1493f 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/proofOracle.int.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/proofOracle.int.test.ts @@ -8,9 +8,8 @@ describe( const OFFSETS = { NONCE: 0, BALANCE: 1, - ADDRESS: 4, - STATE_PROOF_DEPTH: 7, - STORAGE_PROOF_DEPTH: 11 + STATE_PROOF_INPUT: 4, + STORAGE_PROOF_INPUT: 5 }; it('getAccountOracle', async () => { // prettier-ignore @@ -41,9 +40,17 @@ describe( ]); expect(stateAndStorageProof[OFFSETS.NONCE]).toStrictEqual('0x01'); expect(stateAndStorageProof[OFFSETS.BALANCE]).toStrictEqual('0x'); - expect(stateAndStorageProof[OFFSETS.ADDRESS]).toStrictEqual(usdcAccountAddressInNoirFormat); - expect(stateAndStorageProof[OFFSETS.STATE_PROOF_DEPTH]).toStrictEqual('0x09'); - expect(stateAndStorageProof[OFFSETS.STORAGE_PROOF_DEPTH]).toStrictEqual('0x07'); + + const stateProofInputDepthPart = stateAndStorageProof[OFFSETS.STATE_PROOF_INPUT].slice( + stateAndStorageProof[OFFSETS.STATE_PROOF_INPUT].length - 1, + stateAndStorageProof[OFFSETS.STATE_PROOF_INPUT].length + ); + expect(stateProofInputDepthPart).toStrictEqual(['0x09']); + const storageProofInputDepthPart = stateAndStorageProof[OFFSETS.STORAGE_PROOF_INPUT].slice( + stateAndStorageProof[OFFSETS.STORAGE_PROOF_INPUT].length - 1, + stateAndStorageProof[OFFSETS.STORAGE_PROOF_INPUT].length + ); + expect(storageProofInputDepthPart).toStrictEqual(['0x07']); }); }, { diff --git a/ethereum/oracles/src/noir/oracles/rpc/receiptOracle.int.test.ts b/ethereum/oracles/src/noir/oracles/rpc/receiptOracle.int.test.ts index b74658ff..8fc923cf 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/receiptOracle.int.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/receiptOracle.int.test.ts @@ -72,6 +72,16 @@ describe('getReceiptOracle', () => { ); const paddedKey = padArray(['0x08'], receiptProofConfigM.maxPrefixedKeyNibbleLen, ZERO_PAD_VALUE, 'left'); expect(proofInputKeyPart).toStrictEqual(paddedKey); + const proofInputValuePart = receiptWithProof[OFFSETS.PROOF_INPUT].slice( + receiptProofConfigM.maxPrefixedKeyNibbleLen, + receiptProofConfigM.maxPrefixedKeyNibbleLen + receiptProofConfigM.maxValueLen + ); + expect(proofInputValuePart).toMatchSnapshot(); + const proofInputDepthPart = receiptWithProof[OFFSETS.PROOF_INPUT].slice( + receiptWithProof[OFFSETS.PROOF_INPUT].length - 1, + receiptWithProof[OFFSETS.PROOF_INPUT].length + ); + expect(proofInputDepthPart).toStrictEqual(['0x03']); }); it('transaction not found', async () => { diff --git a/ethereum/oracles/src/noir/oracles/server/__snapshots__/app.test.ts.snap b/ethereum/oracles/src/noir/oracles/server/__snapshots__/app.test.ts.snap index bb69635d..f00cb0b3 100644 --- a/ethereum/oracles/src/noir/oracles/server/__snapshots__/app.test.ts.snap +++ b/ethereum/oracles/src/noir/oracles/server/__snapshots__/app.test.ts.snap @@ -86,30 +86,6 @@ exports[`Oracle Server > should handle get_account request 1`] = ` }, { "Array": [ - "0xb4", - "0x7e", - "0x3c", - "0xd8", - "0x37", - "0xdd", - "0xf8", - "0xe4", - "0xc5", - "0x7f", - "0x05", - "0xd7", - "0x0a", - "0xb8", - "0x65", - "0xde", - "0x6e", - "0x19", - "0x3b", - "0xbb", - ], - }, - { - "Array": [ "0x00", "0x00", "0x00", @@ -144,6 +120,48 @@ exports[`Oracle Server > should handle get_account request 1`] = ` "0x00", "0x00", "0x00", + "0x28", + "0xa2", + "0x1f", + "0xaf", + "0x8c", + "0x7f", + "0xab", + "0x57", + "0x47", + "0x1a", + "0x2a", + "0x41", + "0x38", + "0x7f", + "0x9b", + "0x0d", + "0x0e", + "0xab", + "0x22", + "0x94", + "0x57", + "0xc5", + "0x02", + "0x4b", + "0xd6", + "0xcf", + "0xb7", + "0x2d", + "0xd7", + "0xbb", + "0xa2", + "0xfe", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", + "0x00", "0x00", "0x00", "0x00", @@ -244,10 +262,6 @@ exports[`Oracle Server > should handle get_account request 1`] = ` "0x9d", "0x6f", "0x0b", - ], - }, - { - "Array": [ "0xf9", "0x02", "0x11", @@ -3972,504 +3986,6 @@ exports[`Oracle Server > should handle get_account request 1`] = ` "0x00", "0x00", "0x00", - "0xf8", - "0x70", - "0x9d", - "0x3f", - "0x8c", - "0x7f", - "0xab", - "0x57", - "0x47", - "0x1a", - "0x2a", - "0x41", - "0x38", - "0x7f", - "0x9b", - "0x0d", - "0x0e", - "0xab", - "0x22", - "0x94", - "0x57", - "0xc5", - "0x02", - "0x4b", - "0xd6", - "0xcf", - "0xb7", - "0x2d", - "0xd7", - "0xbb", - "0xa2", - "0xfe", - "0xb8", - "0x50", - "0xf8", - "0x4e", - "0x01", - "0x8a", - "0x03", - "0x13", - "0x57", - "0x0a", - "0x84", - "0xbf", - "0x37", - "0x8e", - "0xfd", - "0x25", - "0xa0", - "0xae", - "0x27", - "0x92", - "0x24", - "0x44", - "0x17", - "0xbc", - "0x17", - "0x49", - "0xb9", - "0xcd", - "0x9a", - "0x0b", - "0xdc", - "0x1c", - "0x4a", - "0x6c", - "0xf3", - "0x2f", - "0x14", - "0x7b", - "0x37", - "0x20", - "0x2c", - "0x8c", - "0xb3", - "0x59", - "0x07", - "0x77", - "0x65", - "0x9a", - "0xec", - "0xa0", - "0xe2", - "0xe7", - "0xa7", - "0x52", - "0x4a", - "0x98", - "0xce", - "0x62", - "0x9e", - "0xe4", - "0x06", - "0xc1", - "0x5c", - "0x51", - "0xa6", - "0x83", - "0xe4", - "0x16", - "0x7f", - "0x0b", - "0x74", - "0xea", - "0x23", - "0x05", - "0x66", - "0xdd", - "0xec", - "0xe7", - "0xae", - "0x9d", - "0x6f", - "0x0b", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", - "0x00", "0x00", "0x00", "0x00", @@ -6066,6 +5582,120 @@ exports[`Oracle Server > should handle get_account request 1`] = ` "0x00", "0x00", "0x00", + "0xf8", + "0x70", + "0x9d", + "0x3f", + "0x8c", + "0x7f", + "0xab", + "0x57", + "0x47", + "0x1a", + "0x2a", + "0x41", + "0x38", + "0x7f", + "0x9b", + "0x0d", + "0x0e", + "0xab", + "0x22", + "0x94", + "0x57", + "0xc5", + "0x02", + "0x4b", + "0xd6", + "0xcf", + "0xb7", + "0x2d", + "0xd7", + "0xbb", + "0xa2", + "0xfe", + "0xb8", + "0x50", + "0xf8", + "0x4e", + "0x01", + "0x8a", + "0x03", + "0x13", + "0x57", + "0x0a", + "0x84", + "0xbf", + "0x37", + "0x8e", + "0xfd", + "0x25", + "0xa0", + "0xae", + "0x27", + "0x92", + "0x24", + "0x44", + "0x17", + "0xbc", + "0x17", + "0x49", + "0xb9", + "0xcd", + "0x9a", + "0x0b", + "0xdc", + "0x1c", + "0x4a", + "0x6c", + "0xf3", + "0x2f", + "0x14", + "0x7b", + "0x37", + "0x20", + "0x2c", + "0x8c", + "0xb3", + "0x59", + "0x07", + "0x77", + "0x65", + "0x9a", + "0xec", + "0xa0", + "0xe2", + "0xe7", + "0xa7", + "0x52", + "0x4a", + "0x98", + "0xce", + "0x62", + "0x9e", + "0xe4", + "0x06", + "0xc1", + "0x5c", + "0x51", + "0xa6", + "0x83", + "0xe4", + "0x16", + "0x7f", + "0x0b", + "0x74", + "0xea", + "0x23", + "0x05", + "0x66", + "0xdd", + "0xec", + "0xe7", + "0xae", + "0x9d", + "0x6f", + "0x0b", "0x00", "0x00", "0x00", @@ -6100,11 +5730,9 @@ exports[`Oracle Server > should handle get_account request 1`] = ` "0x00", "0x00", "0x00", + "0x08", ], }, - { - "Single": "0x08", - }, ], }, } diff --git a/vlayer/ethereum/circuits/lib/src/token_int_test.nr b/vlayer/ethereum/circuits/lib/src/token_int_test.nr index 60bac131..dbdef260 100644 --- a/vlayer/ethereum/circuits/lib/src/token_int_test.nr +++ b/vlayer/ethereum/circuits/lib/src/token_int_test.nr @@ -4,7 +4,8 @@ mod test_ERC20Token { use dep::ethereum::fixtures::mainnet::{ paris::usdc_circle::header::{block_header_partial as paris_block_header_partial, block_header_rlp as paris_block_header_rlp}, paris::usdc_circle::header::{hash, number, state_root, transactions_root, receipts_root}, - paris::usdc_circle::account::account, paris::usdc_circle::state_proof_new::proof_input_serialized as state_proof_input_serialized, + paris::usdc_circle::account::account, + paris::usdc_circle::state_proof_new::proof_input_serialized as state_proof_input_serialized, paris::usdc_circle::storage_proof_new::proofs_serialized }; use crate::chain_id::MAINNET; diff --git a/vlayer/examples/circuits/is_ape_owner/src/main_test.nr b/vlayer/examples/circuits/is_ape_owner/src/main_test.nr index bed5e6c8..c4c42c4f 100644 --- a/vlayer/examples/circuits/is_ape_owner/src/main_test.nr +++ b/vlayer/examples/circuits/is_ape_owner/src/main_test.nr @@ -3,7 +3,8 @@ mod is_ape_owner_main { use dep::ethereum::{ fixtures::mainnet::paris::bored_ape_yacht_club::{ header::{block_header_partial as paris_block_header_partial, block_header_rlp as paris_block_header_rlp}, - account::account, state_proof_new::proof_input_serialized as state_proof_input_serialized, storage_proof_new::proofs_serialized + account::account, state_proof_new::proof_input_serialized as state_proof_input_serialized, + storage_proof_new::proofs_serialized }, misc::arrays::alter_array }; diff --git a/vlayer/examples/circuits/is_crypto_punk_owner/src/main_test.nr b/vlayer/examples/circuits/is_crypto_punk_owner/src/main_test.nr index ff01ac5a..b194a0b5 100644 --- a/vlayer/examples/circuits/is_crypto_punk_owner/src/main_test.nr +++ b/vlayer/examples/circuits/is_crypto_punk_owner/src/main_test.nr @@ -3,7 +3,8 @@ mod is_crypto_punk_owner_main { use dep::ethereum::{ fixtures::mainnet::london::crypto_punks::{ header::{block_header_partial as london_block_header_partial, block_header_rlp as london_block_header_rlp}, - account::account, state_proof_new::proof_input_serialized as state_proof_input_serialized, storage_proof_new::proofs_serialized + account::account, state_proof_new::proof_input_serialized as state_proof_input_serialized, + storage_proof_new::proofs_serialized }, misc::arrays::alter_array }; diff --git a/vlayer/examples/circuits/is_dao_worthy/src/main_test.nr b/vlayer/examples/circuits/is_dao_worthy/src/main_test.nr index dd4cd3c3..0fa1e52e 100644 --- a/vlayer/examples/circuits/is_dao_worthy/src/main_test.nr +++ b/vlayer/examples/circuits/is_dao_worthy/src/main_test.nr @@ -2,7 +2,8 @@ mod is_dao_worthy_main { use dep::std::test::OracleMock; use dep::ethereum::fixtures::mainnet::{ paris::usdc_circle::header::{block_header_partial as paris_block_header_partial, block_header_rlp as paris_block_header_rlp}, - paris::usdc_circle::account::account, paris::usdc_circle::state_proof_new::proof_input_serialized as state_proof_input_serialized, + paris::usdc_circle::account::account, + paris::usdc_circle::state_proof_new::proof_input_serialized as state_proof_input_serialized, paris::usdc_circle::storage_proof_new::proofs_serialized }; use crate::main; From c3e1caa8b2889dfca21b6a0c8a1fb368de27914f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Mon, 27 May 2024 13:17:43 +0200 Subject: [PATCH 06/11] Remove ethereum_history_api/circuits --- .../circuits/get_transaction/src/main.nr | 18 ---- .../lib/src/verifiers/transaction_test.nr | 87 ------------------- 2 files changed, 105 deletions(-) delete mode 100644 ethereum_history_api/circuits/get_transaction/src/main.nr delete mode 100644 ethereum_history_api/circuits/lib/src/verifiers/transaction_test.nr diff --git a/ethereum_history_api/circuits/get_transaction/src/main.nr b/ethereum_history_api/circuits/get_transaction/src/main.nr deleted file mode 100644 index 9f04367e..00000000 --- a/ethereum_history_api/circuits/get_transaction/src/main.nr +++ /dev/null @@ -1,18 +0,0 @@ -use dep::ethereum_history_api::transaction::{ - get_transaction, TransactionWithinBlock -}; - -global MAX_DATA_LEN_M = 1000; - -fn main( - chain_id: pub Field, - block_number: pub u64, - tx_idx: pub Field -) -> pub TransactionWithinBlock { - let transaction_within_block: TransactionWithinBlock = get_transaction( - chain_id, - block_number, - tx_idx - ); - transaction_within_block -} diff --git a/ethereum_history_api/circuits/lib/src/verifiers/transaction_test.nr b/ethereum_history_api/circuits/lib/src/verifiers/transaction_test.nr deleted file mode 100644 index ebaa0c0e..00000000 --- a/ethereum_history_api/circuits/lib/src/verifiers/transaction_test.nr +++ /dev/null @@ -1,87 +0,0 @@ -mod assert_tx_equals { - use crate::misc::fragment::Fragment; - use crate::verifiers::transaction::assert_tx_equals; - use crate::fixtures::mainnet::{ - cancun::small_block::transaction::{transaction, encoded_tx, tx_type}, - homestead::fork::transaction::{transaction as legacy_transaction, encoded_tx as legacy_encoded_tx, tx_type as legacy_tx_type} - }; - - #[test] - fn success() { - assert_tx_equals(tx_type, Fragment::from_array(encoded_tx), transaction); - } - - #[test] - fn legacy_tx() { - assert_tx_equals( - legacy_tx_type, - Fragment::from_array(legacy_encoded_tx), - legacy_transaction - ); - } - - #[test(should_fail_with="Invalid tx type")] - fn wrong_tx_type() { - let wrong_tx_type = tx_type + 1; - assert_tx_equals(wrong_tx_type, Fragment::from_array(encoded_tx), transaction); - } -} - -mod verify_tx { - use crate::verifiers::transaction::verify_tx; - use crate::misc::arrays::alter_array; - use crate::fixtures::mainnet::{ - cancun::small_block::{ - transaction::{transaction, encoded_tx, tx_type, tx_idx}, transaction_proof_new::proof_input, - header::transactions_root - }, - homestead::fork::{ - transaction::{ - transaction as legacy_transaction, encoded_tx as legacy_encoded_tx, tx_type as legacy_tx_type, - tx_idx as legacy_tx_idx - }, - transaction_proof_new::proof_input as legacy_proof_input, header::transactions_root as legacy_transactions_root - } - }; - - #[test] - fn success() { - verify_tx(tx_idx, tx_type, transaction, proof_input, transactions_root); - } - - #[test] - fn legacy_tx() { - verify_tx( - legacy_tx_idx, - legacy_tx_type, - legacy_transaction, - legacy_proof_input, - legacy_transactions_root - ); - } - - #[test(should_fail_with="Invalid tx type")] - fn wrong_tx_type() { - let wrong_tx_type = 1; - verify_tx(tx_idx, wrong_tx_type, transaction, proof_input, transactions_root); - } - - #[test(should_fail_with="Key does not match rlp-encoded transaction index")] - fn wrong_tx_idx() { - let mut wrong_tx_idx = tx_idx + 1; - verify_tx(wrong_tx_idx, tx_type, transaction, proof_input, transactions_root); - } - - #[test(should_fail_with="Nonce: Invalid RLP value")] - fn wrong_tx() { - let mut wrong_tx = transaction; - wrong_tx.nonce += 1; - verify_tx(tx_idx, tx_type, wrong_tx, proof_input, transactions_root); - } - - #[test(should_fail_with="Internal node hash does not match the hash extracted from the preceding node")] - fn wrong_tx_root() { - let mut wrong_tx_root = alter_array(transactions_root); - verify_tx(tx_idx, tx_type, transaction, proof_input, wrong_tx_root); - } -} From 9df67bee8bea27dfc14a58fcfb9816d56c23933c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Tue, 28 May 2024 11:37:31 +0200 Subject: [PATCH 07/11] Remove type annotations where not necessary --- ethereum/circuits/lib/src/receipt.nr | 2 +- ethereum/circuits/lib/src/serde.nr | 6 +++--- ethereum/circuits/lib/src/serde_test.nr | 4 ++-- ethereum/circuits/lib/src/transaction.nr | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ethereum/circuits/lib/src/receipt.nr b/ethereum/circuits/lib/src/receipt.nr index a8e659d5..ff1adafa 100644 --- a/ethereum/circuits/lib/src/receipt.nr +++ b/ethereum/circuits/lib/src/receipt.nr @@ -110,7 +110,7 @@ unconstrained pub(crate) fn get_receipt_unconstrained_M( cumulative_gas_used: receipt.cumulative_gas_used, logs_bloom: receipt.logs_bloom }; - let proof_input: ProofInput = Serde::deserialize(proof_input); + let proof_input = Serde::deserialize(proof_input); (tx_type, receipt, proof_input) } diff --git a/ethereum/circuits/lib/src/serde.nr b/ethereum/circuits/lib/src/serde.nr index ac183067..0f833767 100644 --- a/ethereum/circuits/lib/src/serde.nr +++ b/ethereum/circuits/lib/src/serde.nr @@ -189,7 +189,7 @@ impl Serde for ProofInput = Serde::deserialize(fragment.pop_front_array()); + let proof = Serde::deserialize(fragment.pop_front_array()); ProofInput { key, value, @@ -259,7 +259,7 @@ impl Serde for ProofInput = Serde::deserialize(fragment.pop_front_array()); + let proof = Serde::deserialize(fragment.pop_front_array()); ProofInput { key, value, @@ -330,7 +330,7 @@ impl Serde for ProofInput = Serde::deserialize(fragment.pop_front_array()); + let proof = Serde::deserialize(fragment.pop_front_array()); ProofInput { key, value, diff --git a/ethereum/circuits/lib/src/serde_test.nr b/ethereum/circuits/lib/src/serde_test.nr index bfbeac57..49c7b27b 100644 --- a/ethereum/circuits/lib/src/serde_test.nr +++ b/ethereum/circuits/lib/src/serde_test.nr @@ -168,7 +168,7 @@ mod proof { assert(sub_array_equals(proof.leaf.serialize(), serialized, RECEIPT_NODES_LEN)); assert_eq(serialized[RECEIPT_NODES_LEN + RECEIPT_MAX_LEAF_LEN_M], proof.depth as Field); - let deserialized: Proof = Serde::deserialize(serialized); + let deserialized = Serde::deserialize(serialized); assert_eq(deserialized, proof); } } @@ -200,7 +200,7 @@ mod proof_input { ) ); - let deserialized: ProofInput = Serde::deserialize(serialized); + let deserialized = Serde::deserialize(serialized); assert_eq(deserialized, proof_input); } } diff --git a/ethereum/circuits/lib/src/transaction.nr b/ethereum/circuits/lib/src/transaction.nr index f4ef75ee..ff564594 100644 --- a/ethereum/circuits/lib/src/transaction.nr +++ b/ethereum/circuits/lib/src/transaction.nr @@ -135,7 +135,7 @@ unconstrained fn get_transaction_unconstrained_M( ) -> (TxType, TxPartial, ProofInput) { let (tx_type, transaction, proof_input): (TxType, ForeignCallTransaction, ProofInputSerialized) = get_transaction_oracle(chain_id, block_number, tx_idx); let transaction: TxPartial = transaction.into(); - let proof_input: ProofInput = Serde::deserialize(proof_input); + let proof_input = Serde::deserialize(proof_input); (tx_type, transaction, proof_input) } From 2e25847dc269e3524fb497ce02f1b10e4456d9b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Tue, 28 May 2024 11:38:00 +0200 Subject: [PATCH 08/11] Remove slicing where unnecessary --- .../noir/oracles/rpc/accountOracle.int.test.ts | 7 ++----- .../src/noir/oracles/rpc/proofOracle.int.test.ts | 16 ++++++---------- .../noir/oracles/rpc/receiptOracle.int.test.ts | 7 ++----- .../oracles/rpc/transactionOracle.int.test.ts | 7 ++----- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts index 6f945bc5..4233ce2e 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts @@ -32,10 +32,7 @@ describe('accountOracle', () => { accountProofConfig.maxPrefixedKeyNibbleLen + accountProofConfig.maxValueLen ); expect(proofInputValuePart).toMatchSnapshot(); - const proofInputDepthPart = account[OFFSETS.PROOF_INPUT].slice( - account[OFFSETS.PROOF_INPUT].length - 1, - account[OFFSETS.PROOF_INPUT].length - ); - expect(proofInputDepthPart).toStrictEqual(['0x09']); + const proofInputDepthPart = account[OFFSETS.PROOF_INPUT][account[OFFSETS.PROOF_INPUT].length - 1]; + expect(proofInputDepthPart).toStrictEqual('0x09'); }); }); diff --git a/ethereum/oracles/src/noir/oracles/rpc/proofOracle.int.test.ts b/ethereum/oracles/src/noir/oracles/rpc/proofOracle.int.test.ts index 46e1493f..35001ba0 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/proofOracle.int.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/proofOracle.int.test.ts @@ -41,16 +41,12 @@ describe( expect(stateAndStorageProof[OFFSETS.NONCE]).toStrictEqual('0x01'); expect(stateAndStorageProof[OFFSETS.BALANCE]).toStrictEqual('0x'); - const stateProofInputDepthPart = stateAndStorageProof[OFFSETS.STATE_PROOF_INPUT].slice( - stateAndStorageProof[OFFSETS.STATE_PROOF_INPUT].length - 1, - stateAndStorageProof[OFFSETS.STATE_PROOF_INPUT].length - ); - expect(stateProofInputDepthPart).toStrictEqual(['0x09']); - const storageProofInputDepthPart = stateAndStorageProof[OFFSETS.STORAGE_PROOF_INPUT].slice( - stateAndStorageProof[OFFSETS.STORAGE_PROOF_INPUT].length - 1, - stateAndStorageProof[OFFSETS.STORAGE_PROOF_INPUT].length - ); - expect(storageProofInputDepthPart).toStrictEqual(['0x07']); + const stateProofInputDepthPart = + stateAndStorageProof[OFFSETS.STATE_PROOF_INPUT][stateAndStorageProof[OFFSETS.STATE_PROOF_INPUT].length - 1]; + expect(stateProofInputDepthPart).toStrictEqual('0x09'); + const storageProofInputDepthPart = + stateAndStorageProof[OFFSETS.STORAGE_PROOF_INPUT][stateAndStorageProof[OFFSETS.STORAGE_PROOF_INPUT].length - 1]; + expect(storageProofInputDepthPart).toStrictEqual('0x07'); }); }, { diff --git a/ethereum/oracles/src/noir/oracles/rpc/receiptOracle.int.test.ts b/ethereum/oracles/src/noir/oracles/rpc/receiptOracle.int.test.ts index 8fc923cf..a53452e1 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/receiptOracle.int.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/receiptOracle.int.test.ts @@ -77,11 +77,8 @@ describe('getReceiptOracle', () => { receiptProofConfigM.maxPrefixedKeyNibbleLen + receiptProofConfigM.maxValueLen ); expect(proofInputValuePart).toMatchSnapshot(); - const proofInputDepthPart = receiptWithProof[OFFSETS.PROOF_INPUT].slice( - receiptWithProof[OFFSETS.PROOF_INPUT].length - 1, - receiptWithProof[OFFSETS.PROOF_INPUT].length - ); - expect(proofInputDepthPart).toStrictEqual(['0x03']); + const proofInputDepthPart = receiptWithProof[OFFSETS.PROOF_INPUT][receiptWithProof[OFFSETS.PROOF_INPUT].length - 1]; + expect(proofInputDepthPart).toStrictEqual('0x03'); }); it('transaction not found', async () => { diff --git a/ethereum/oracles/src/noir/oracles/rpc/transactionOracle.int.test.ts b/ethereum/oracles/src/noir/oracles/rpc/transactionOracle.int.test.ts index 8648b098..540d1c65 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/transactionOracle.int.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/transactionOracle.int.test.ts @@ -68,10 +68,7 @@ describe('getTransactionOracle', () => { txProofConfigM.maxPrefixedKeyNibbleLen + txProofConfigM.maxValueLen ); expect(proofInputValuePart).toMatchSnapshot(); - const proofInputDepthPart = txWithProof[OFFSETS.PROOF_INPUT].slice( - txWithProof[OFFSETS.PROOF_INPUT].length - 1, - txWithProof[OFFSETS.PROOF_INPUT].length - ); - expect(proofInputDepthPart).toStrictEqual(['0x03']); + const proofInputDepthPart = txWithProof[OFFSETS.PROOF_INPUT][txWithProof[OFFSETS.PROOF_INPUT].length - 1]; + expect(proofInputDepthPart).toStrictEqual('0x03'); }); }); From d891a36d13ca3f8e98c9600afa8166c43b2c292b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Tue, 28 May 2024 11:38:22 +0200 Subject: [PATCH 09/11] Refactor get_storage_value --- .../circuits/lib/src/account_with_storage.nr | 28 ++++++++++++------- .../circuits/lib/src/verifiers/storage.nr | 1 - 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/ethereum/circuits/lib/src/account_with_storage.nr b/ethereum/circuits/lib/src/account_with_storage.nr index 309b2249..476389b5 100644 --- a/ethereum/circuits/lib/src/account_with_storage.nr +++ b/ethereum/circuits/lib/src/account_with_storage.nr @@ -75,17 +75,25 @@ fn assert_storage_key_equals( ); } +fn get_fragment(left_padded_value: [u8; N]) -> Fragment { + let value_len = right_pad(left_padded_value).len(); + let value_offset = N - value_len; + Fragment::new(value_offset, value_len, left_padded_value) +} + fn get_storage_value(rlp_encoded_value: [u8; MAX_STORAGE_VALUE_LEN]) -> [u8; MAX_STORAGE_VALUE_LEN] { - let mut storage_value = rlp_encoded_value; - let rlp_value_len = right_pad(rlp_encoded_value).len(); - let left_pad_len = MAX_STORAGE_VALUE_LEN - rlp_value_len; - let rlp_fragment = decode_string(Fragment::new(left_pad_len, rlp_value_len, rlp_encoded_value)); - if rlp_fragment.offset > 0 { - assert_eq(rlp_fragment.offset, 1, "Expected RLP header to be maximum 1 byte long"); - storage_value[left_pad_len] = 0; + let mut storage_value = get_fragment(rlp_encoded_value); + let rlp_fragment = decode_string(storage_value); + let rlp_header_len = rlp_fragment.offset; + + // Storage value is maximum 32 bytes long, so its RLP-encoding's header is maximum 1 byte long. + assert(rlp_header_len <= 1, "Expected RLP header to be maximum 1 byte long"); + if rlp_fragment.offset == 1 { + let rlp_header_position = storage_value.offset; + storage_value.data[rlp_header_position] = 0; } - storage_value + storage_value.data } pub fn get_account_with_storage( @@ -120,8 +128,8 @@ unconstrained fn get_proof_unconstrained( storage_key: Bytes32 ) -> StateAndStorageProofInput { let (account, state_proof_input, storage_proof_input) = get_proof_oracle(chain_id, block_no, address, storage_key); - let state_proof_input: ProofInput = Serde::deserialize(state_proof_input); - let storage_proof_input: ProofInput = Serde::deserialize(storage_proof_input); + let state_proof_input = Serde::deserialize(state_proof_input); + let storage_proof_input = Serde::deserialize(storage_proof_input); StateAndStorageProofInput { account, state_proof_input, storage_proof_input } } diff --git a/ethereum/circuits/lib/src/verifiers/storage.nr b/ethereum/circuits/lib/src/verifiers/storage.nr index 8316c14b..e1227a46 100644 --- a/ethereum/circuits/lib/src/verifiers/storage.nr +++ b/ethereum/circuits/lib/src/verifiers/storage.nr @@ -8,7 +8,6 @@ pub fn verify_storage_values( storage_root: Bytes32 ) { for i in 0..N { - // verify_storage_value(storage_root, proofs[i]); let proof_input = proof_inputs[i]; verify_merkle_proof( proof_input.key, From 756774b219890200e2e665c61e6aed81e0b5af93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Tue, 28 May 2024 12:42:57 +0200 Subject: [PATCH 10/11] Add a comment explaining decreasing by 1 instead of increasing --- ethereum/circuits/lib/src/verifiers/account_test.nr | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ethereum/circuits/lib/src/verifiers/account_test.nr b/ethereum/circuits/lib/src/verifiers/account_test.nr index 88bb67e6..d222e10b 100644 --- a/ethereum/circuits/lib/src/verifiers/account_test.nr +++ b/ethereum/circuits/lib/src/verifiers/account_test.nr @@ -89,10 +89,12 @@ fn test_verify_account_wrong_address() { let _ = verify_account(wrong_address, account, state_proof_input, state_root); } -// TODO: Add correct assertion message when noir-trie-proofs is updated -#[test(should_fail)] +#[test(should_fail_with="Invalid node hash")] fn test_verify_account_wrong_state_proof() { let mut wrong_proof = state_proof_input; + // The value must be decreased and not increased by 1. If it is increased by 1, length of length + // in rlp header would increase, which would cause out of bounds error when decoding, which would + // cause compiler panic (as of Nargo 0.30.0). wrong_proof.proof.nodes[0][0] -= 1; let _ = verify_account(address, account, wrong_proof, state_root); } From 221bc0a1563fd237fecf029716c29c8cca8efa65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Izabela=20O=C5=BCd=C5=BCe=C5=84ska?= Date: Tue, 28 May 2024 12:47:24 +0200 Subject: [PATCH 11/11] Remove unnecessary type annotation --- ethereum/circuits/lib/src/account.nr | 2 +- .../src/noir/oracles/rpc/accountOracle.int.test.ts | 2 +- .../src/noir/oracles/rpc/accountOracle/encode.ts | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ethereum/circuits/lib/src/account.nr b/ethereum/circuits/lib/src/account.nr index d22af125..aa7c5583 100644 --- a/ethereum/circuits/lib/src/account.nr +++ b/ethereum/circuits/lib/src/account.nr @@ -53,7 +53,7 @@ unconstrained fn get_account_oracle( unconstrained fn get_account_unconstrained_M(chain_id: Field, block_no: u64, address: Address) -> AccountWithStateProofM { let (account, proof_input) = get_account_oracle(chain_id, block_no, address); - let proof_input: ProofInput = Serde::deserialize(proof_input); + let proof_input = Serde::deserialize(proof_input); (account, proof_input) } diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts index 4233ce2e..06f5f5e0 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle.int.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { OFFSETS, getAccountOracle } from './accountOracle.js'; -import { createMockMultiChainClient } from '../../ethereum/mockClient.js'; +import { createMockMultiChainClient } from '../../../ethereum/mockClient.js'; import { accountProofConfig } from './common/proofConfig/account.js'; describe('accountOracle', () => { diff --git a/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts b/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts index 8ab040f0..0012efe9 100644 --- a/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts +++ b/ethereum/oracles/src/noir/oracles/rpc/accountOracle/encode.ts @@ -1,12 +1,12 @@ import { ForeignCallOutput } from '@noir-lang/noir_js'; import { GetProofReturnType, Hex, fromRlp, isHex, keccak256, toRlp } from 'viem'; -import { encodeField, encodeHex, encodeProof } from '../common/encode.js'; -import { padArray } from '../../../util/array.js'; -import { MAX_TRIE_NODE_LEN, ZERO_PAD_VALUE } from '../common/const.js'; -import { assert } from '../../../util/assert.js'; +import { encodeField, encodeHex, encodeProof } from '../../common/encode.js'; +import { padArray } from '../../../../util/array.js'; +import { MAX_TRIE_NODE_LEN, ZERO_PAD_VALUE } from '../../common/const.js'; +import { assert } from '../../../../util/assert.js'; import { accountProofConfig } from '../common/proofConfig/account.js'; import { storageProofConfig } from '../common/proofConfig/storage.js'; -import { toHexString } from '../../../ethereum/blockHeader.js'; +import { toHexString } from '../../../../ethereum/blockHeader.js'; const RLP_VALUE_INDEX = 1;