@aztec/end-to-end 0.0.1-commit.d431d1c → 0.0.1-commit.d6f2b3f94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dest/bench/client_flows/client_flows_benchmark.d.ts +1 -1
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.js +28 -13
  4. package/dest/bench/client_flows/config.d.ts +2 -2
  5. package/dest/bench/client_flows/config.d.ts.map +1 -1
  6. package/dest/bench/client_flows/config.js +18 -0
  7. package/dest/bench/utils.d.ts +5 -4
  8. package/dest/bench/utils.d.ts.map +1 -1
  9. package/dest/bench/utils.js +9 -7
  10. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +1 -1
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +7 -8
  13. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +1 -1
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +3 -2
  16. package/dest/e2e_epochs/epochs_test.d.ts +7 -1
  17. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  18. package/dest/e2e_epochs/epochs_test.js +38 -10
  19. package/dest/e2e_fees/bridging_race.notest.js +1 -1
  20. package/dest/e2e_fees/fees_test.d.ts +1 -1
  21. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  22. package/dest/e2e_fees/fees_test.js +6 -6
  23. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  24. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  25. package/dest/e2e_l1_publisher/write_json.js +1 -7
  26. package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
  27. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  28. package/dest/e2e_nested_contract/nested_contract_test.js +2 -2
  29. package/dest/e2e_p2p/p2p_network.d.ts +1 -1
  30. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  31. package/dest/e2e_p2p/p2p_network.js +6 -2
  32. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  33. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  34. package/dest/e2e_p2p/reqresp/utils.js +153 -0
  35. package/dest/e2e_p2p/shared.d.ts +6 -6
  36. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  37. package/dest/e2e_p2p/shared.js +12 -16
  38. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  39. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  40. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  41. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  42. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  43. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  44. package/dest/e2e_token_contract/token_contract_test.d.ts +1 -1
  45. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  46. package/dest/e2e_token_contract/token_contract_test.js +3 -3
  47. package/dest/fixtures/e2e_prover_test.d.ts +1 -1
  48. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  49. package/dest/fixtures/e2e_prover_test.js +8 -5
  50. package/dest/fixtures/ha_setup.d.ts +71 -0
  51. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  52. package/dest/fixtures/ha_setup.js +114 -0
  53. package/dest/fixtures/index.d.ts +2 -1
  54. package/dest/fixtures/index.d.ts.map +1 -1
  55. package/dest/fixtures/index.js +1 -0
  56. package/dest/fixtures/setup.d.ts +17 -15
  57. package/dest/fixtures/setup.d.ts.map +1 -1
  58. package/dest/fixtures/setup.js +38 -92
  59. package/dest/fixtures/setup_p2p_test.d.ts +12 -8
  60. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  61. package/dest/fixtures/setup_p2p_test.js +29 -21
  62. package/dest/fixtures/token_utils.d.ts +1 -1
  63. package/dest/fixtures/token_utils.d.ts.map +1 -1
  64. package/dest/fixtures/token_utils.js +7 -4
  65. package/dest/shared/cross_chain_test_harness.d.ts +3 -4
  66. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  67. package/dest/shared/cross_chain_test_harness.js +11 -11
  68. package/dest/shared/gas_portal_test_harness.js +1 -1
  69. package/dest/shared/submit-transactions.d.ts +3 -3
  70. package/dest/shared/submit-transactions.d.ts.map +1 -1
  71. package/dest/shared/submit-transactions.js +9 -11
  72. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  73. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  74. package/dest/shared/uniswap_l1_l2.js +20 -18
  75. package/dest/simulators/lending_simulator.js +2 -2
  76. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  77. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  78. package/dest/spartan/setup_test_wallets.js +61 -34
  79. package/dest/spartan/tx_metrics.d.ts +38 -2
  80. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  81. package/dest/spartan/tx_metrics.js +178 -4
  82. package/dest/spartan/utils/bot.d.ts +27 -0
  83. package/dest/spartan/utils/bot.d.ts.map +1 -0
  84. package/dest/spartan/utils/bot.js +141 -0
  85. package/dest/spartan/utils/chaos.d.ts +79 -0
  86. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  87. package/dest/spartan/utils/chaos.js +142 -0
  88. package/dest/spartan/utils/clients.d.ts +39 -0
  89. package/dest/spartan/utils/clients.d.ts.map +1 -0
  90. package/dest/spartan/utils/clients.js +90 -0
  91. package/dest/spartan/utils/config.d.ts +39 -0
  92. package/dest/spartan/utils/config.d.ts.map +1 -0
  93. package/dest/spartan/utils/config.js +21 -0
  94. package/dest/spartan/utils/health.d.ts +63 -0
  95. package/dest/spartan/utils/health.d.ts.map +1 -0
  96. package/dest/spartan/utils/health.js +202 -0
  97. package/dest/spartan/utils/helm.d.ts +15 -0
  98. package/dest/spartan/utils/helm.d.ts.map +1 -0
  99. package/dest/spartan/utils/helm.js +47 -0
  100. package/dest/spartan/utils/index.d.ts +9 -0
  101. package/dest/spartan/utils/index.d.ts.map +1 -0
  102. package/dest/spartan/utils/index.js +18 -0
  103. package/dest/spartan/utils/k8s.d.ts +126 -0
  104. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  105. package/dest/spartan/utils/k8s.js +375 -0
  106. package/dest/spartan/utils/nodes.d.ts +41 -0
  107. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  108. package/dest/spartan/utils/nodes.js +461 -0
  109. package/dest/spartan/utils/scripts.d.ts +30 -0
  110. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  111. package/dest/spartan/utils/scripts.js +81 -0
  112. package/dest/spartan/utils.d.ts +2 -260
  113. package/dest/spartan/utils.d.ts.map +1 -1
  114. package/dest/spartan/utils.js +1 -942
  115. package/package.json +42 -39
  116. package/src/bench/client_flows/client_flows_benchmark.ts +16 -29
  117. package/src/bench/client_flows/config.ts +9 -1
  118. package/src/bench/utils.ts +10 -8
  119. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +10 -13
  120. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +6 -7
  121. package/src/e2e_deploy_contract/deploy_test.ts +2 -2
  122. package/src/e2e_epochs/epochs_test.ts +71 -35
  123. package/src/e2e_fees/bridging_race.notest.ts +1 -4
  124. package/src/e2e_fees/fees_test.ts +16 -20
  125. package/src/e2e_l1_publisher/write_json.ts +3 -8
  126. package/src/e2e_nested_contract/nested_contract_test.ts +3 -5
  127. package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
  128. package/src/e2e_p2p/p2p_network.ts +19 -13
  129. package/src/e2e_p2p/reqresp/utils.ts +207 -0
  130. package/src/e2e_p2p/shared.ts +21 -22
  131. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  132. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  133. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  134. package/src/e2e_token_contract/token_contract_test.ts +4 -6
  135. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  136. package/src/fixtures/e2e_prover_test.ts +7 -12
  137. package/src/fixtures/ha_setup.ts +184 -0
  138. package/src/fixtures/index.ts +1 -0
  139. package/src/fixtures/setup.ts +47 -125
  140. package/src/fixtures/setup_p2p_test.ts +31 -27
  141. package/src/fixtures/token_utils.ts +6 -5
  142. package/src/shared/cross_chain_test_harness.ts +13 -27
  143. package/src/shared/gas_portal_test_harness.ts +1 -1
  144. package/src/shared/submit-transactions.ts +9 -15
  145. package/src/shared/uniswap_l1_l2.ts +20 -29
  146. package/src/simulators/lending_simulator.ts +2 -2
  147. package/src/spartan/setup_test_wallets.ts +72 -24
  148. package/src/spartan/tx_metrics.ts +152 -7
  149. package/src/spartan/utils/bot.ts +185 -0
  150. package/src/spartan/utils/chaos.ts +253 -0
  151. package/src/spartan/utils/clients.ts +100 -0
  152. package/src/spartan/utils/config.ts +27 -0
  153. package/src/spartan/utils/health.ts +255 -0
  154. package/src/spartan/utils/helm.ts +84 -0
  155. package/src/spartan/utils/index.ts +64 -0
  156. package/src/spartan/utils/k8s.ts +527 -0
  157. package/src/spartan/utils/nodes.ts +538 -0
  158. package/src/spartan/utils/scripts.ts +99 -0
  159. package/src/spartan/utils.ts +1 -1246
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Fetches a ERC20 balance storage proof from the Ethereum mainnet and saves it to a Prover.toml compatible JSON.
3
+ * The JSON can be converted to toml for use with nargo, or used directly as a JSON file when used in
4
+ * Aztec contracts. This script is not using any Aztec library code, so it's easily portable.
5
+ */
6
+ import fs from 'fs';
7
+ import { dirname, join } from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ import { createPublicClient, encodeAbiParameters, fromRlp, hexToBytes, http, keccak256 } from 'viem';
10
+ import { mainnet } from 'viem/chains';
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+
14
+ const RPC_URL = process.env.RPC_URL;
15
+ const ERC20_CONTRACT = (process.env.ERC20_CONTRACT || '0xdAC17F958D2ee523a2206206994597C13D831ec7') as `0x${string}`;
16
+ const HOLDER = (process.env.HOLDER || '0x23878914EFE38d27C4D67Ab83ed1b93A74D4086a') as `0x${string}`;
17
+ const SLOT = BigInt(process.env.SLOT || '2');
18
+ const BLOCK_TAG = process.env.BLOCK_NUMBER ? BigInt(process.env.BLOCK_NUMBER) : 'latest';
19
+ const MAX_ACCOUNT_PATH = 15;
20
+ const MAX_STORAGE_PATH = 10;
21
+
22
+ function padTo(arr: number[], len: number) {
23
+ return [...arr, ...Array(len - arr.length).fill(0)].slice(0, len);
24
+ }
25
+
26
+ function toBytes(hex: `0x${string}`) {
27
+ return Array.from(hexToBytes(hex));
28
+ }
29
+
30
+ function bytesToU64s(bytes: number[]) {
31
+ const paddedBytes = padTo(bytes, 32);
32
+ return Array.from({ length: 4 }, (_, i) => {
33
+ let val = 0n;
34
+ for (let j = 0; j < 8; j++) {
35
+ val += BigInt(paddedBytes[i * 8 + j]) << BigInt(j * 8);
36
+ }
37
+ return val.toString();
38
+ });
39
+ }
40
+
41
+ function toBytesAndLen(val: bigint | number) {
42
+ if (val === 0n || val === 0) {
43
+ return { bytes: [0], length: 0 };
44
+ }
45
+ let hex = val.toString(16);
46
+ if (hex.length % 2) {
47
+ hex = '0' + hex;
48
+ }
49
+ const bytes = toBytes(`0x${hex}`);
50
+ return { bytes, length: bytes.length };
51
+ }
52
+
53
+ function parseNode(rlp: `0x${string}`) {
54
+ // Should be safe when working with branches and extensions without embedded children.
55
+ const decoded = fromRlp(rlp) as `0x${string}`[];
56
+ const node = {
57
+ rows: Array(16)
58
+ .fill(0)
59
+ .map(() => Array(32).fill(0)),
60
+ row_exist: Array(16).fill(false),
61
+ node_type: 0,
62
+ };
63
+
64
+ if (decoded.length === 17) {
65
+ for (let i = 0; i < 16; i++) {
66
+ if (decoded[i] !== '0x') {
67
+ node.row_exist[i] = true;
68
+ node.rows[i] = padTo(toBytes(decoded[i]), 32);
69
+ }
70
+ }
71
+ } else if (decoded.length === 2) {
72
+ const keyBytes = toBytes(decoded[0]);
73
+ const prefix = keyBytes[0];
74
+ if (prefix >> 4 >= 2) {
75
+ throw new Error('Unsupported: leaf node in proof path');
76
+ }
77
+ node.node_type = 1;
78
+ // Extension header format expected by the noir code: check out storage_proof types.nr.
79
+ node.rows[0][0] = prefix >> 4;
80
+ node.rows[0][8] = prefix & 0x0f;
81
+ node.rows[0][16] = keyBytes.length - 1;
82
+
83
+ for (let i = 1; i < keyBytes.length && i < 32; i++) {
84
+ node.rows[1][i - 1] = keyBytes[i];
85
+ }
86
+ node.rows[2] = padTo(toBytes(decoded[1]), 32);
87
+ node.row_exist[0] = node.row_exist[1] = node.row_exist[2] = true;
88
+ }
89
+ return node;
90
+ }
91
+
92
+ function parseProof(proof: `0x${string}`[], maxLen: number) {
93
+ const nodes = proof.slice(0, -1).slice(0, maxLen).map(parseNode);
94
+ while (nodes.length < maxLen) {
95
+ nodes.push({
96
+ rows: Array(16)
97
+ .fill(0)
98
+ .map(() => Array(32).fill(0)),
99
+ row_exist: Array(16).fill(false),
100
+ node_type: 0,
101
+ });
102
+ }
103
+ return nodes;
104
+ }
105
+
106
+ function nodeToLibFormat(node: { rows: number[][]; row_exist: boolean[]; node_type: number }) {
107
+ return {
108
+ rows: node.rows.map(bytesToU64s),
109
+ row_exist: node.row_exist,
110
+ node_type: String(node.node_type),
111
+ };
112
+ }
113
+
114
+ async function main() {
115
+ if (!RPC_URL) {
116
+ throw new Error('RPC_URL is not set');
117
+ }
118
+ const storageKey = keccak256(encodeAbiParameters([{ type: 'address' }, { type: 'uint256' }], [HOLDER, SLOT]));
119
+ console.log(`Fetching storage proof for ${ERC20_CONTRACT}, holder ${HOLDER}, slot ${SLOT}`);
120
+ console.log(`Storage key: ${storageKey}`);
121
+
122
+ const client = createPublicClient({
123
+ chain: mainnet,
124
+ transport: http(RPC_URL),
125
+ });
126
+
127
+ const [blockNumber, proof, block] = await Promise.all([
128
+ client.getBlockNumber(),
129
+ client.getProof({
130
+ address: ERC20_CONTRACT,
131
+ storageKeys: [storageKey],
132
+ blockNumber: BLOCK_TAG === 'latest' ? undefined : BLOCK_TAG,
133
+ }),
134
+ client.getBlock({
135
+ blockNumber: BLOCK_TAG === 'latest' ? undefined : BLOCK_TAG,
136
+ }),
137
+ ]);
138
+
139
+ const storageProof = proof.storageProof[0];
140
+ console.log(
141
+ `Block: ${blockNumber}, Account nodes: ${proof.accountProof.length}, Storage nodes: ${storageProof.proof.length}`,
142
+ );
143
+ console.log(`Value: ${storageProof.value}`);
144
+
145
+ // The -1 is because the last node in the proof is the leaf, which is excluded from path verification.
146
+ const accountPathLen = proof.accountProof.length - 1;
147
+ const storagePathLen = storageProof.proof.length - 1;
148
+ if (accountPathLen > MAX_ACCOUNT_PATH) {
149
+ throw new Error(
150
+ `Account proof path length ${accountPathLen} exceeds MAX_ACCOUNT_PATH ${MAX_ACCOUNT_PATH}. Increase the limit.`,
151
+ );
152
+ }
153
+ if (storagePathLen > MAX_STORAGE_PATH) {
154
+ throw new Error(
155
+ `Storage proof path length ${storagePathLen} exceeds MAX_STORAGE_PATH ${MAX_STORAGE_PATH}. Increase the limit.`,
156
+ );
157
+ }
158
+
159
+ const nonce = toBytesAndLen(proof.nonce);
160
+ const balance = toBytesAndLen(proof.balance);
161
+ const slotValue = toBytesAndLen(storageProof.value);
162
+
163
+ const data = {
164
+ account_nodes: parseProof(proof.accountProof, MAX_ACCOUNT_PATH).map(nodeToLibFormat),
165
+ account_node_length: String(accountPathLen),
166
+ storage_nodes: parseProof(storageProof.proof, MAX_STORAGE_PATH).map(nodeToLibFormat),
167
+ storage_node_length: String(storagePathLen),
168
+ account: {
169
+ nonce: padTo(nonce.bytes, 8).map(String),
170
+ nonce_length: String(nonce.length),
171
+ balance: padTo(balance.bytes, 32).map(String),
172
+ balance_length: String(balance.length),
173
+ address: toBytes(ERC20_CONTRACT).map(String),
174
+ storage_hash: bytesToU64s(toBytes(proof.storageHash)),
175
+ code_hash: bytesToU64s(toBytes(proof.codeHash)),
176
+ },
177
+ slot: {
178
+ value: padTo(slotValue.bytes, 32).map(String),
179
+ value_length: String(slotValue.length),
180
+ },
181
+ slot_key: toBytes(storageKey).map(String),
182
+ root: bytesToU64s(toBytes(block.stateRoot)),
183
+ block_number: String(blockNumber),
184
+ };
185
+
186
+ fs.writeFileSync(join(__dirname, 'storage_proof.json'), JSON.stringify(data, null, 2));
187
+ console.log('storage_proof.json generated');
188
+ }
189
+
190
+ main().catch(console.error);
@@ -0,0 +1,173 @@
1
+ import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { EthAddress } from '@aztec/foundation/eth-address';
5
+ import { Capsule } from '@aztec/stdlib/tx';
6
+
7
+ import { readFileSync } from 'fs';
8
+ import { dirname, join } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const FIXTURE_PATH = join(__dirname, './storage_proof.json');
13
+
14
+ // Constants matching the Noir contract
15
+ const ACCOUNT_CAPSULE_KEY_SEPARATOR = 100;
16
+ const ACCOUNT_PROOF_CAPSULE_KEY_SEPARATOR = 101;
17
+ const STORAGE_PROOF_CAPSULE_KEY_SEPARATOR = 102;
18
+ const STORAGE_PROOF_NODE_CAPSULE_KEY_SEPARATOR = 103;
19
+ const MAX_ACCOUNT_PROOF_LENGTH = 15;
20
+ /** Node: rows [[u64;4];16] (64) + row_exist [bool;16] (16) + node_type u8 (1) = 81 fields */
21
+ const NODE_FIELD_COUNT = 81;
22
+
23
+ // --- JSON fixture types ---
24
+
25
+ type JsonNode = { rows: string[][]; row_exist: boolean[]; node_type: string };
26
+
27
+ type JsonAccount = {
28
+ nonce: string[];
29
+ balance: string[];
30
+ address: string[];
31
+ nonce_length: string;
32
+ balance_length: string;
33
+ storage_hash: string[];
34
+ code_hash: string[];
35
+ };
36
+
37
+ type StorageProofJSON = {
38
+ root: string[];
39
+ slot_key: string[];
40
+ account_node_length: string;
41
+ storage_node_length: string;
42
+ account_nodes: JsonNode[];
43
+ storage_nodes: JsonNode[];
44
+ account: JsonAccount;
45
+ slot: { value: string[]; value_length: string };
46
+ };
47
+
48
+ // --- Serialization helpers (Noir struct Serialize layout) ---
49
+
50
+ function serializeNode(node: JsonNode): Fr[] {
51
+ const fields: Fr[] = [];
52
+ for (const row of node.rows) {
53
+ for (const val of row) {
54
+ fields.push(new Fr(BigInt(val)));
55
+ }
56
+ }
57
+ for (const exists of node.row_exist) {
58
+ fields.push(new Fr(exists ? 1n : 0n));
59
+ }
60
+ fields.push(new Fr(BigInt(node.node_type)));
61
+ return fields;
62
+ }
63
+
64
+ /** Account: nonce [u8;8] + balance [u8;32] + address [u8;20] + nonce_length u8 + balance_length u8 + storage_hash [u64;4] + code_hash [u64;4] = 70 fields */
65
+ function serializeAccount(account: JsonAccount): Fr[] {
66
+ const fields: Fr[] = [];
67
+ for (const v of account.nonce) {
68
+ fields.push(new Fr(BigInt(v)));
69
+ }
70
+ for (const v of account.balance) {
71
+ fields.push(new Fr(BigInt(v)));
72
+ }
73
+ for (const v of account.address) {
74
+ fields.push(new Fr(BigInt(v)));
75
+ }
76
+ fields.push(new Fr(BigInt(account.nonce_length)));
77
+ fields.push(new Fr(BigInt(account.balance_length)));
78
+ for (const v of account.storage_hash) {
79
+ fields.push(new Fr(BigInt(v)));
80
+ }
81
+ for (const v of account.code_hash) {
82
+ fields.push(new Fr(BigInt(v)));
83
+ }
84
+ return fields;
85
+ }
86
+
87
+ function zeroNode(): Fr[] {
88
+ return Array(NODE_FIELD_COUNT).fill(Fr.ZERO);
89
+ }
90
+
91
+ // --- Public API ---
92
+
93
+ /** Parsed + typed fixture data ready for use as contract function arguments. */
94
+ export type StorageProofArgs = {
95
+ ethAddress: EthAddress;
96
+ slotKey: number[];
97
+ slotContents: { value: number[]; value_length: number };
98
+ root: bigint[];
99
+ };
100
+
101
+ /** Loads the storage proof fixture from disk and returns the contract args. */
102
+ export function loadStorageProofArgs(): StorageProofArgs {
103
+ const fixture: StorageProofJSON = JSON.parse(readFileSync(FIXTURE_PATH, 'utf8'));
104
+ const addressBytes = Buffer.from(fixture.account.address.map(v => Number(v)));
105
+ return {
106
+ ethAddress: EthAddress.fromString('0x' + addressBytes.toString('hex')),
107
+ slotKey: fixture.slot_key.map(v => Number(v)),
108
+ slotContents: {
109
+ value: fixture.slot.value.map(v => Number(v)),
110
+ // eslint-disable-next-line camelcase
111
+ value_length: Number(fixture.slot.value_length),
112
+ },
113
+ root: fixture.root.map(v => BigInt(v)),
114
+ };
115
+ }
116
+
117
+ /** Builds all the capsules the StorageProofTest contract expects during private execution. */
118
+ export async function buildStorageProofCapsules(contractAddress: AztecAddress): Promise<Capsule[]> {
119
+ const fixture: StorageProofJSON = JSON.parse(readFileSync(FIXTURE_PATH, 'utf8'));
120
+
121
+ const root = fixture.root.map(v => BigInt(v));
122
+ const slotKey = fixture.slot_key.map(v => Number(v));
123
+ const accountNodeLength = Number(fixture.account_node_length);
124
+ const storageNodeLength = Number(fixture.storage_node_length);
125
+ const ethAddress = EthAddress.fromBuffer(Buffer.from(fixture.account.address.map(v => Number(v))));
126
+
127
+ // Compute capsule keys (must match the Noir contract's poseidon2_hash computations)
128
+ const addressCapsuleKey = await poseidon2Hash([
129
+ new Fr(ACCOUNT_CAPSULE_KEY_SEPARATOR),
130
+ ...root.map(v => new Fr(v)),
131
+ ethAddress.toField(),
132
+ ]);
133
+
134
+ const accountProofCapsuleKey = await poseidon2Hash([new Fr(ACCOUNT_PROOF_CAPSULE_KEY_SEPARATOR), addressCapsuleKey]);
135
+
136
+ const storageProofCapsuleKey = await poseidon2Hash([
137
+ new Fr(STORAGE_PROOF_CAPSULE_KEY_SEPARATOR),
138
+ addressCapsuleKey,
139
+ ...slotKey.map(v => new Fr(v)),
140
+ ]);
141
+
142
+ // Build capsule data
143
+
144
+ // 1. Account data
145
+ const accountData = serializeAccount(fixture.account);
146
+
147
+ // 2. Account proof nodes padded to MAX_ACCOUNT_PROOF_LENGTH
148
+ const accountProofData: Fr[] = [new Fr(accountNodeLength)];
149
+ for (let i = 0; i < MAX_ACCOUNT_PROOF_LENGTH; i++) {
150
+ accountProofData.push(...(i < fixture.account_nodes.length ? serializeNode(fixture.account_nodes[i]) : zeroNode()));
151
+ }
152
+
153
+ // 3. Storage proof length (u32)
154
+ const storageProofLengthData = [new Fr(storageNodeLength)];
155
+
156
+ const capsules: Capsule[] = [
157
+ new Capsule(contractAddress, addressCapsuleKey, accountData),
158
+ new Capsule(contractAddress, accountProofCapsuleKey, accountProofData),
159
+ new Capsule(contractAddress, storageProofCapsuleKey, storageProofLengthData),
160
+ ];
161
+
162
+ // 4. Individual storage node capsules for private recursion.
163
+ for (let i = 0; i < storageNodeLength; i++) {
164
+ const nodeCapsuleKey = await poseidon2Hash([
165
+ new Fr(STORAGE_PROOF_NODE_CAPSULE_KEY_SEPARATOR),
166
+ storageProofCapsuleKey,
167
+ new Fr(i),
168
+ ]);
169
+ capsules.push(new Capsule(contractAddress, nodeCapsuleKey, serializeNode(fixture.storage_nodes[i])));
170
+ }
171
+
172
+ return capsules;
173
+ }
@@ -70,7 +70,7 @@ export class TokenContractTest {
70
70
  initialFundedAccounts: this.context.initialFundedAccounts,
71
71
  });
72
72
 
73
- this.node = this.context.aztecNodeService!;
73
+ this.node = this.context.aztecNodeService;
74
74
  this.wallet = this.context.wallet;
75
75
  [this.adminAddress, this.account1Address, this.account2Address] = deployedAccounts.map(acc => acc.address);
76
76
 
@@ -85,13 +85,11 @@ export class TokenContractTest {
85
85
  TokenContractTest.TOKEN_NAME,
86
86
  TokenContractTest.TOKEN_SYMBOL,
87
87
  TokenContractTest.TOKEN_DECIMALS,
88
- )
89
- .send({ from: this.adminAddress })
90
- .deployed();
88
+ ).send({ from: this.adminAddress });
91
89
  this.logger.verbose(`Token deployed to ${this.asset.address}`);
92
90
 
93
91
  this.logger.verbose(`Deploying bad account...`);
94
- this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({ from: this.adminAddress }).deployed();
92
+ this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({ from: this.adminAddress });
95
93
  this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
96
94
 
97
95
  this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
@@ -130,7 +128,7 @@ export class TokenContractTest {
130
128
  const amount = 10000n;
131
129
 
132
130
  this.logger.verbose(`Minting ${amount} publicly...`);
133
- await asset.methods.mint_to_public(adminAddress, amount).send({ from: adminAddress }).wait();
131
+ await asset.methods.mint_to_public(adminAddress, amount).send({ from: adminAddress });
134
132
  tokenSim.mintPublic(adminAddress, amount);
135
133
 
136
134
  const publicBalance = await asset.methods.balance_of_public(adminAddress).simulate({ from: adminAddress });
@@ -1 +1 @@
1
- {"proof":"0x00004d6006f32a63ab1a10c44b40a14c94fd4e693830a91920a63778c91df75b67c3a2590000000000000000000000000000000000000000000000000000000000000001221894f21cae5e98d0c7a1a2658eaf169b0688cf8348dc7be4d5a944d568bd4600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb00087e2b1632207a64d2be3430a622118411f15477dcf399a057660b8e566041001c2aa1e8a9c646939d1d0d3a1b789e2eb024aa538a4c7864db736646faf6cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e586311f1581539435ce58c90ec4a9d291746a8b33999d1654faffb07f382db2efd3fd6b542f09e9f76c84337f46370f67729ce54c815d35866b4cb2a2672030000000000000000000000000000000000000000000000000000000000000000003f1c36600e57c2c3556b97fe6d9919a7c418380b539dcf74182dacf5baea2e16743433c1b3d551429cfbc09ab7899d4e14d2b5786a3243e29bc9c6c0d76bf100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf1e314549c5109330000000000000000000000000000000000000000000000078ab65cae0766dac4000000000000000000000000000000000000000000000006d9729dd2114d251600000000000000000000000000000000000000000000000000025bb48088e2d6000000000000000000000000000000000000000000000004112c333273480d9d00000000000000000000000000000000000000000000000e79ddc992614451e3000000000000000000000000000000000000000000000005d880c4e49e3909410000000000000000000000000000000000000000000000000001adc707a50e7500000000000000000000000000000000000000000000000591960a3c52d5a331000000000000000000000000000000000000000000000005d69c43aaa65acc860000000000000000000000000000000000000000000000011ce4d0df71d9b0da00000000000000000000000000000000000000000000000000007c4b84e96f1200000000000000000000000000000000000000000000000e796d0a9ec64b048d00000000000000000000000000000000000000000000000a9f1811bacc20b1ef0000000000000000000000000000000000000000000000081959aa974bf5661900000000000000000000000000000000000000000000000000014ac071abce30000000000000000000000000000000ca9d55b6e986c398073827360972cbdd6900000000000000000000000000000000001099819f900ee75e8a6ab54c59fa4000000000000000000000000000000081180a8b96072c3f4246e9a036d07f3507000000000000000000000000000000000027d2cbe77a3e0edefc570e90c90b9f000000000000000000000000000000d6ee6d7b1ba024766d6f835521249b7ae4000000000000000000000000000000000016a0da7d14c7230116a9948f6550ca00000000000000000000000000000019227c5f9b9bc32f21583696973ff92ffe00000000000000000000000000000000002e72b67d18384e0ea627c38592ab76000000000000000000000000000000f4ec1a574da16cc52af9cfe52a0a88ac0800000000000000000000000000000000002dd342a68d2d19b030ec0b82734484000000000000000000000000000000f24ff72c85a62ed5b9cdb3ab52878e5d6600000000000000000000000000000000000f7afb370a128f12d63e3649ae47790000000000000000000000000000004b35876712ed72f6999ccf4346aea9dc8800000000000000000000000000000000000b9c4ede9e05409f4df0b886e12a1e000000000000000000000000000000f4338b85257350c3bbafb99d2c1464cb8100000000000000000000000000000000002efbe244cd2cfd9aa0c8f71e50c96200000000000000000000000000000054f2bc452d87e94668fa54fdb54790c9b0000000000000000000000000000000000025980f026372c596860eda2a791d9b00000000000000000000000000000047dd57b3275e8f09905f26b7bc44e48bba0000000000000000000000000000000000010988e60c8f065cf95a1c9a292364000000000000000000000000000000c9119a149e8374416e40f7586311a3861f00000000000000000000000000000000002ad3d93fb74b1be165a915ad72a3380000000000000000000000000000000148b87898085b1b8b915c1878b2a188d000000000000000000000000000000000002a91ee00ef56a5964ff759ca2990ec00000000000000000000000000000091163f22963ea9894fdc40b2516296029f00000000000000000000000000000000001db9fdde7620ad93d46e0fad2cdd1f0000000000000000000000000000005ce65ed82881f4f78356cbe6d94699849c000000000000000000000000000000000014250c7cd0c960952568293d732d20000000000000000000000000000000cde964c7dbc45d7bea0e22c409d3f4bf960000000000000000000000000000000000016cfaf8940e476cdc1852d5a9172d000000000000000000000000000000ca8d4a2f2ec921c4b8f591c2c27dbdd8ae000000000000000000000000000000000027d9c460264941701fcd49bca2b2f61db5f435f1c9b1b0f491d38cf071b8cc67cb453563b2b60c99daaf55a85360d412ae5a3cef67ee78c3be7229910f9f90c068a3131606ba84aa07463e47ac9f2d2fa7f383cb9bda2055d025ba59925a45d09bbc3abf2a607ca649a641fbf19225033120e4db3ca51d56e3ac61527718a0a5f9d106973575780d8803c89bd9e7be0fa40d87661532cbf29108288ae6a1ceae9eb3fea4d2c7a767f4196a8d4117c52bd771c13a22a6986d53dc0734cc775e2b47c6538d0dd5f82ca62ea90010607802774fe2ae0ded6cc0fb00f591b98a8a17e9a1b0592973bcef46339b184bf1660220da8db31103b2f88257f3a6a49c41ed8895a8c759621d5994e7b71b3959c72c4290a83a957c5d7ec3305efc4137c921bc019382bb97aa434a5b206e60258a2c6283d5e2fa72db956e03a261af9807fb352d8394e8a3f8f497604c586cc43808ba9508f19dcd2c88ebdf68f7faf36d5a4ec4b5355c318734e8273a864d923c0d122ead90fb432d9beda2e8ba40fd5132ba52aa3def71f2893378e49b0c65eb0b88e36f6e25b4d27c975fa867555b51cbfd9412744819e753db95c7fa1087dd0965cf48bc50a9e96cbc1b1ce8b2ca27132029dc01101c7e1a13cac34ce8fe0128c1d28e4d69f5057c8eb4de3cd1406dbdb46f45881b41481faf3942ad75aa5612ce5af105c235ef077fae32c577a820333addc7d22ee9917dfe1823b8ff645023a789b1287e074fc0d44e1ddf5c64dd272a6ab61cdab64b9c22e95a0beeaee52b960f0eb444467e546c409a7def039a1ffe2323c7609b807d184b0207cecef406f5e7a413f18d01a6c9cd20fddcee991b2e66c646d2133bb4f296ba1465fb042e3308b159399371602a4600934b56b48c93e145ef89b8ce32e0c4319420852a260fc934bb5b2ddc0e0487fe59a88b074f579df8bc93218b7a750e7656885a450e7e8e3acc01c991025dfa5c3a0c733c02b51b4596ed1b6cca3da27a5aab6f81059fca6c74e504744b8e4f4fcf34be13c1c641e0fa69cec87fe2e61d3828f5ca2c3dd4e23ab8365dff18bf503ff9298b0f7cc5f79640672faa67f6c15a82dd6019b949fb94e03235adfec37cddf6e0c2db7803662f70f700a4134f05db1b7f331aabb24920355a935d257979d043b6f419fb652bb0ac3354a5cad5c22ce0b029083005d775aec13fe5215f2998092ce9d9c6b59e876900ba4a218b02112eabdc30339b7d9b74c357275ee52c2e92e9f840fee659f063205ee913b8771108cd7205061a27fa68b0a5d11ee01390ecf9db47180fd044e5b8e68f20876cb59d884a0634bce681ce910d3839decccbb99548e4b2c48ab58008138387a88edbd3bf541217acce5c99b311743f0a885ab4fc5be60dbd12e3691c9fcded433f2f23cfb02b5baaade2dc7bea9687c53ae5cf93f89ddac6bd8a898b1933a87ad4bb9a16ce069c746023a2d0aa491466b442061961118dcd93432104a203dd855a6a75268d06ef585e2f552d811ca934b2a17e7ce192d56bccdd8262e621a8cc0be364cbd4119113909bcef03f3d310d79c12987f7e2b9a5dd5e76438542e66c6ffb48a32f0baca42f56b4d0387f8ae9548347a56c0b7fed358db3e8a6b2267f0f4186b6a305bab73106ea0559c0c38c8b8f91b56ff8826107e411a14512aa75d9dfea89e51233560d096fb5ede83cb4925de73194869a980b0e3e4f362125d5ff962c13e60b7b5445901eb8aad7c273af9ad2154914b6d87791dee5348803b5f07b63cacc0fe976fd85339a6192505b8b1bf27e0a3947b87e57b803e091afe80a04b88f370722c07c87b4163022c8a45916f0232d73770f3186094533fa2cef9cd818384c0ddd0c4b7802230ae60738f44ac6dfaa3389a3fbbb103c5948ee0262c45f1c4619b30f1fe28037be4f630cc577705107bf585c8183c4b74fe16b9ab6f8c6dba016585ba8ce2bf3e24c49f75fedfc588b10b3d46d4b400c49335b6cee47ca48ed1aeb8bdfd317556091d058b2d82713ddfc91adae10e46be3d90c02bd11c8761e10118eace939f78fb4b27a698ec4e0660bcc540a7c6f921152185a748d5932ea10622bbbc32f885edec3a69cee3773be88a2d58199243b961efb6d4f85468f5d1d3b7315511da9a1138808b18e684baffb1ca91f77901e9928b5e31492e037600e15f1818fcf0970b973bbf36363a463c156abb1d417f1b9e674720beb55647c1bc7e1ef4a8fed5d330baef509cace450e5a5284728d158b39729aa5c09017f21ae28c00e7d7c53ff73e934226723e2f54ff4d20335249473988d3c769e0866720b787e351441001b269c93c71a16a4308f079e8506fbffb3e8fcdbd279dc03003b0e7b77b29093846aeb08ac57b63e9e6ca5da9ff9a92da45ad62a2851dce1617d2a88bb172e575a8fa2ea2b2a73947d8e0bd1e5258fe80b1f23427df5bfd1d0c22f8ca454458f49c05d75a7e015a7adaac6b6a680f2a1f847b8f163a64714b156ee53bd2b5bc153cbac4b9b180b5eda314f86176b9c3f848aff8967e1be2460e45a56ef2c2e5d2a6a432d6b68f99ee6d5bb23934cee0752286dc5e3bebf0b51fd1057ecbe5cdb0777521739a2327d621a2dbb14cf95d64fe5781595e63dead24cf5131c82145bd4d92ed504e9a60893596cdf437fa87481fbe335d33320fe42a330d852b76c0aa33dcb22045d4124e63869a825b672655be11f1539e7fd7ec1d925673b23327ac733382033d7526b09e7816787b77f4025dd8ff9560cd39b607474d881e61d07160c81c07df3d19c9ef9279ed9b9a87fd1b302f2785e6d030135a68128b627337aae616fb0c44ac0904a728e56f32b48a05c43fbca7193b3c0cbaee34a10be73cb5efb067e0a6f639fea08c4cfd9054de1dbcf775f97690502d6c3802b5407c5bb25ef4c51c82dd15622eff5c0dc883975d210126340293c608be656b21422672140c9e218cd85d7a06d0a212266afda817112a23263c790319fdfc82e8ddc9bba8ac8fc18ebb4b74655ce6a87e4fba40888f391e4483a22f17cb0e241ad558f67f921a28be36647e025291b8c3563c0d4195eec985b4b7f31cebd69fd1277c3b71f6a95c2a95745799bac4bfc84d2d8180a3352d6e7c5ec11e9470e104ed350bf8adabf8a5fb98e720f31d8d43b89260c2edb61fd9200a002b069ac3f27375d0a7a99c30137298490a133441e1659a869a6a1738969f55650ae5e20015818c4abd45165534290130c85af0656687023c6771d9b8e96507c02b0afa988c0a3329876aa1cfadbb760660dea99f70828bfe29c5272b7b128f220708fedb4747e814da49a8223d67d398335cd60746db92f3bc2fb4dee71aeb362bc028e3a57b7c3b084aa1a3d7d091fc348d7e6c66ad39307b7bb150b023d76a017cbd7259a19175f3d12a4049dbb68cd9bcc1d90e247fe3e7575b9be5548ecb1303e4899b05ed3fe96c6daa0159a41e5caf66600d0fe9776113d4ec10e32a4a1f17c4577e3e940b49c068b65f30d171a3ed813ec34c3c6a891f76c3aada0b851003e6d72ee3374d19ddd79b82631d45934204c3707e2c53f6249252b1efb95e1b944e13ea3442a2b425c64caa62e80d5a8770526dff7473d4f980773b3087040fb1e72eca5d56620add7fb2772dc91481d845d7e69c2cac5d11bfe8476cddaa119a19be2f7d19a0d6cf00dde3cc7727b829497629abc11ca4c2e173169b12bc284478c0b48994489cb12d0313b8bb5fbc3f397e6433fd13e6f20a9945a128441a52d9e2b37bdb97aefff765a8757deec39f6da1e2c5221d6e3eebfafd98f1471356c5e502404156f8ffca15d9020bc4c34a9f37b35a8759ee0dd42cc5f01eeb00fd87fc66bfc33b91e0f1462a6df820f8d06e5286d8f2b6a8f2f28cdf3b869e2347e75edb5dade6a2341fd6119ce9b236e2f8b103c95112de486515b7ef021625dd028a3009bcb2001879d0656d3f538b2181096e10afaa8741f69ae7149a9620e4005c11c98c438e7d9a9d13eda86a81031e59d5297df58ab48c33a22fc0e00e44373fb8eb35fb90540370844e2368e67f5f51f296af41afb124c5790c307f19a15d5e07a6d8615b623e0e0938b71797048cd0124124983b6ee83f476917c80aa5d7e6ff05d2e6a0871beaddb9e6cedcf9c291fe353896accd666121822ea2184f582f6ac8ec7dd9219b915ec779ee54f5d3cd398680fc81412943f8a9285f09eed8558d9a143946f77d90e49643e4088cd905eafbc32c117491ac81bd7d8703789147fc529acf0d61b7a43545a58a776d881fd9b88b39424b5ffb2c29bd6003bef49bdf90fd9119c2d3b1dbfa1f21464f9429a7977716873c9f4ce112777b1a9dc0f03761819893c52014c0e734b1bb58eb4e8c4817b727fa3766e6b5da8f0e45d6ef3bbed7662348782f6a74fe492711a610751aac932e014c32a3da7c312c73dbe8d0e04868315b24722c96b397eb20f4f071c40c58db960ff6acad6a552673df936d8d40e23a027a917fa2779fc7edb284a155773c725cd73955ea7abc2cc4889333eaa6809996e123959a3a3f8d83c96759ce9e3f7c6c09730bbdd98c1aa07c0680a3d9e6dd843d24e7fe49ec9d21a62d54bff6f64a9ee5e08fb11c3a2f8ad777f36bf832803321bc86f1f4a4f72a2eb1fb41913a6cc6dccdbdc340760ffdaff52d1f1245c0d8334d72f5cf99bdac2be88f755d6c37a8214f12bf49e7153b7e75165d3d6920173724eb228e37c3d3e869772d7e982b350e29c07bfa6311e701c78009064faa24e89582b68e68440c660c810f11d316d670f4aa66e05314c04145895b8d875b1b4dccbe89457ebd946fe0523dbe7ddf5fae64aaea32bb0a84ad33f4b8005c00eb2535d0a9ccb8af87ca7f42a78503ab8a07acd630363f2e1a87cb164e41fcf1be838f39a66288ea938fe72275a6db9cfd23b5a51ffd0a1d8ab5b1ceade4fed78376d97a2ae58b1c68c4a53350511df91ff5710ee2fa4e1649055bb19084952ada33df6ea0c8e0f1e549a2f1e6fbf1988fdf00184c98be1431b48ee04df9088e873dd33ef27eb0256512d25f8c0435cf698d52271f82872ec03f71561862b3435535f6e71f1b075d9d544d45ecc11695b695deb45d750026c294d56366e281ab66f2dd3994a5ac3a14ce157aa5d566db035b00aebc0f801e232803cca81f368079508e3a55a9e8c0914d719f7dcab5c4540d050097c61f2e0137a33b9d4e9c67c0b93a22a3b77bed25dac563925b1077627300712f42751b034ec5b3d57085922c3e7e7359bf4694070e43519adb125ea0fa5b964b20a512d95dd6694bd85101318c90fe2e1267efa53c6496c9e076368292c53c4ee56b19c683ea9f5b1fc87532eccdb8fad939f3687f42694b6af100fa1cbc6c27c8102ae94ca0d7c16c9e8ac6ccb18453be033acbf503e4811e59513b058c4ee7defe1b405e22adf7095fc5c8d4eefbb0f50989d6888e6fc9feeea9cf4e198f320a0b0812e27e24b7d3da6e853fdab5c92f85cfd8dd411c6d6c89fb3edb60e4fc3c670c8fc09cedbf16e9c156ef9bdf4f3af22f9901aa20dda1848c8aac42e59984b4031093542cecf7d2c3a039af76683801b33641e348ed611ac1013d83185c118926cd7af617c3ff1f9fdd3837eed0139bfe0d0432bea5f34a65a36a0a873846b028aa1680748beeffe1a802c1659cc25c9acf2f91fe6bb8dadd4436a80b9370e914d13105c4dbeb1bd584ce3987ae2ff62b245d26b2529874d1f49fd9449e6ad61a8993ef077f2bd170851e3eb51ba4639d81ff2fd9196e8d062227d1c1c344e412d030082a057b6dfd0d5036fd87155a2d759bfdc47245d2e55c553ee876dbc509aeaef065e60c37b09b8989af2f54c604047063bc040e07fad0677c2517f56b1b703eec763782336c9a5863ca6e1f2f52346b4586d2447d552f4f8a68cee8d4257b0fe89f35d6b5cf9d1aecfd13e5295f726f06b75a2ed43a0db405b3f1529f2beb899ac04e4b50cf45a7b68765ef92ab03785519983349f9d884ff92583e0120d9a298acd1dd9ee8234b9c35d6978ff9a282f826c41be47e647e48235ba2ee300fa16102f76dde521ddc19d186b73c27ff9b3b341d1d8ccb71664c02b74a4421d22b2ae4d624350dc2cfadb8202659a381c7d458ed1926d8cde3f3bafdc4022dcba972fbff1cbd43002e205287081e346aa39eb981df15dd01008bffe8375a0f7f302db96bbc960c5f1b44186a28c22f3efd2464fb058313bcd623d68cf3ee1424dbf0dd7f14784dc6874ce573e88dec8bf168a30d724f389436c4a1bbf2141a6307ee84eb712e53b73a93361b7ed19949e68884fb50f7782a172716c134e2030140bf394b092573ecfcc9771fe2320b4b4f1e7462af1a510ec78d9317fd51281ab64c26c0b69ff6dda6ec0528186ad0faea1e1f835a8a03d55265c99647d21dc60b01daa3c3a826a71e7a81d424ed4ef70548004185d1c394a6a4c91c75e520a1665d716cc07e8db3490df6f48695e59fd24df7936adf11fd6c76f3b93fc61af47d4f13c560bcd9f66e0be39f31fe9e01f103bda296ca7a24a1369197a2ad04e2eac8c21f92e029ac27cb43e84940b5c07e9612329c5fd30fbb79dbddd0a226da1b0cddcb5ebe352dfef7e8214a5340477d4b63f597bb991de61ace715c7503c9c99ae748d77219ef2c7afcaf2db0a0ce84f0888f8f92834caf45fa72acf81bd0a24d39f36eddbe02a9ff88b0ab7252df0c39b70805c199bc2d72855b069f13f9e8f0990780814ff0852b103ccd7bea5e80e118bbf517223edf1058498f070ffd27cf08f39ba10af54803457db4066b029146c7399e1ef16e54ff7e494e1b02d84c168f6c2a12450279dbc4544c0dbeb745c86fc87632dfe85ca8fc439d7a3053a9b1c63c64bb32940ae3a3cdba614ddd6ff98b102f6fb680684257b655452b3082fc1456ddb5eb551a5652fc46bb553ca9bfe5fd72c710a0413c4b7e5b200b37ee615524093473b99318f268a2ccef91d09ca66aa77bfa32bbc9149076dd272834a4848f29eb304a652567b5f6ee9a2d42a6c431669f71ba6bf58a2a982c1e28c5cd23179ce6f559c5f5132bd2b698b3161724d96335077f67dd22fee9951b852b6f5169f1194c61a9c526f2fbf8f59e3f9d58ccf91a655ab60edaccfa32042fea7b8a4c37f7afa5dad12747f6de96fc9327c4cf0abb75ac2322aa90d87b13816f3db7113c9114f403bc0fe5573ae876d9930e8ea7af5e48125cd50b371d2565e4cdfb5923b279a6dd8230e58e3b5afa585fee6674d6e5716db5a2464abf23163d7a16ca25c7ebbd95f03498337faf402c703b4c0867a3d39cc707d4dece2281551441763c2b90e0cd7fd734a34bccce474462352281c5830502f5e247050b1d1c46d7897740af413cb9c46018f2eeec615c65ab5a7965ec4b35391daacf0413d252d650f28c2efbbe4aac18145370a218b8a1d79e24ae8906fcabcbc530207e7de442ddd569c4763e77a97d200ae2be108367ac43d3d366bc0c36982e38228b2be51f841a9cfdb98c9f42cab2e34ee55afb8ed45b9430eb848967ae9cb2049aba7b95ae916910b49ccc9787901a2ec6f851f8a0ab7021fa43fbeffc93cc06facafaefd92b11704a252d5ad6e16f17ae8a9b1998a561789934b901b4159e03b0fbb480bdfb6f663959c4b29562d01e8a775b9c44b9e1a62d2ba4a2d85685066b847dcb0f8dcc4496b10041d5bc6234e0ecf76497a0193e7e7aa2609b300616b10c3692f12f4b265f2639d408d25dac1acee6c59600a0f01b98fbd5dc463b040214f30d7b358346351c2825f8104f1546f13387059c8b39f07a9c1863194d2b73c577664b978c19b6bcd65e64afd4927e78ec1d8626ecef2116052ace280816fc1b1cc186d0f276153d9038b7b2b3bc077f9c8a3ce84fba4484b000a8d47d19f9e5328cb52ddab8b88ef9abf4e9f84e7fd97df6740733a16d85a98cd4569624b3f2e5ff7f8d254e5ef53286e60c710b446acac2704137a72f156720f855cc0255a3365ce594033b07eef0c3033ce98118f564819ef65801f53bc1e0a34a0e21abc7411fc71c396e42edae13f5f807f7a2f79b8c85f804be41070f664a2c571c164582c928f7991d0b22e25d1f3319f1b60a61f7515b50b5889d9f4bb860b5145a3e6522506fa7aa34c7f87ee7656ee848185591f8f5f483af0ad1485186d31d613ef216c8789674a42073931c81ccabd884b77ba1479cbfa6aa3f3ed1b9a420f7ce535d19d4da400fe4c32c981e2087aa0c29d1f0142ff5a9c153ddca84062e79406b8426c4f97924950b9ef82f6a097abce445a09f7f869030148c9f7a72195870a9eeea8aa29aa93ec2921103c5bd3432207786381afb0ee572f2ceccf0021d5a2ce58679660f61d0d2619a3449489dcdc282f178223ed4f4636cbdfcc2118d31fba11378eb82c9ff5bc03bd69f198fbf63a5f6befb633be1a9e8e2bbdb133751ac604cce3cec313b48633719e9dd0b8a7916771a4b945c48996d13909c2fb952d39ac4adb75ecc2a4cf5db2178ad83ac95355ed862621304fb3d86fac62c61cca81abb5b628bd37472ba4bf4dbb3b2667eaf3b476ad980d87561512d9a10317c74dd2157b5e6181f1ef7c73438b3a4d394c401ce9215d3d03e4d3fe9e8105e648c5c684be8cc1c57c6e7bc70e29a47dd1bb5663d9b49b0b8ff3e7456be1113c8c8eb409d034d5688d6d148d416a0fa3945dc3860f23ff1ee6f4d8ac219118a28944db7061c51457c09bf97c8871a6ba6fc71849ec5baa7420709bc53b21aedfedc384f01d9c01e0091ff2736074143cb080baafff845ddefff7700808e274a56bf03d38c256536603878e346d0f47ed7002e7da6347b63a996f4fff76b2e000b11d6acde02c82d54c02c6093f099b481dce32022d817f21968a9dfd4a623822000dc618333f1929e149b18176c476ae4962042cb735a78a9b38eb30dc629a45947e5259217eec6266b3245b6589abff779e7b07d875fa903304ee96a1c16f5ccb122445362c13a16d2396e55666509342b9a9007337c0f22ab153a07920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001402f7659df3ce4b0bfa819b34f29c0f800d94162e03d2a4be37a2198f936ed70db4e58202eab407bdba483e989c8111922c71128e041a66da0d33f4835259d402d89783ff57170ab96b3aff910be4d2b64533b63d1c40433ed765c8a94cc6332e5f83b76282da1f46f08356349ad2582f792eb17a2673e895da46e01c2c8f350aab4e3cb5da218e9e596ba882ef9d62d950553b7f4f7ec360802011f5e85ff91bf63aafcdd53c44fe2db368a87455f21216924ef69539245eedfe6c6d32fb261564f88acfb671f82dec451fc8d19fa8a83ceb159999bd06396dba6a273bd093099f70a592e3cd931487dc21b8579419924a55b1eb48acd718d81d2188f854a22d2382f46605ffa664d0bbd3db337760273af98b957ad443d4304a08548aecaa1a4d6ed4e7169cd76a91b9fc30a006c4d32de3b2191fd868422affb2b6425a0e1d408d02105c088eec9cafab13a5c8581e09c0d7b46230ac8ce3eb78a18e0a9e300e2e5755002c308852d2d7a63bb4fcbb44b465bdedbfa618948505cc4b7ba23038d231dc8a11bfd7c078c21684edcb89b585bbe94ff795bbf76ad19642ab2d04c59ae6995141156908b56567f1aa2ff9fde626abda743706f3732c97460da423232162662b2d1ada17aa317cc8eaa705a07664c549b68f68837509f545c4f21f89a1cf2e9bf58f4c3826abd7e36442159374b0b9fbf1f068455ee46d5fab89217b00e1d5b92e9eb8e080ebde50fb3b142f2c7ad82359e56e7cfc08ecd802ab089aa2a8f458d4c5d20d5b4af86d7e93679d733ba41771d2c600b9841c012732215d655092a96f71ea81cf619fdbad73841d58444ee320316dc33a9a6247cc7f00636ddb0f5195c8cf49d66df0d2fa81e71bd0697589d7d16e9d66736e4ab21a1862ca3242544f5944ecfae168e77553b865263a1b5c4015284476549d4341ff0f0a9ff123dc5981de4646f53305305acddbf6879e0cb5e1913a2db655b2c3fb0e471d707375a93f30c500c1e6d84c2482e67f8781e2e7a970a7a5b819c179602dd80ef283ff3b9c6ecc7644d3995492acd0c6b34ce7a042b67ce44de924a5cf2895daf8f1953387d27048afad60b6625707aedfa2280a4dcf7800605534119f0a403b2e983004fdfc563ea25be5a8fbeec9a7977866e39376defe79a02c600816a39dd8f7151193c9acaf5ff453f9fb0f1287a54b886b3a73d22e7a8f350a7423abe64976b74963111ac5d96927dcd77d9c42e226815ef093e7aee71910f2410a4871f6f2f3fbc119cd73de82053a670e2d8271532c74dfc10b6f21e27f6d1623029782b7b3325589642a9b62b5646228f7761dddbfecdbe601dfe68dfdb4b100c68140a2e0c1f8547a8907d10c97228ef4ed84d836ec90895a8041c3b2f18323202006853989462ddd65da3e0fc9f341af8c027f49dfc3b6f450401c3bc61f05651b24f3cbfcb90076d8b52a653d214e5defa2a91106a01dd8b97701e7dad4166e196a20a4d78ee1d4fd6b759ebe21dc4749546367c3c8cc5ede0d04684b6101c3691c0bbaff670529eeccda5bd603065f4badb3b420f7ac3cd6df3cae9ce81427a4594869cc7ef87a05bd16d9fec0755be22d8379ec4455e3673e5e6e296110b58c1fbf16379a111301021f14f72bdb1d6823cfe3c3b0845ef2ecb4e14d1010af6857f22c5a75427ce225894454333b6cc21cbb530b73b62577773d55dd3d110f67b79bff7bf6bc29e6ea7d626e555374bc721c310bb584b06b0489ccc6f50060dcca1e966da7b611ee59a6aab337543b38f5523da01b751fabfcfcfde70a0000000000000000000000000000006e99400a2e669210b323b13e4a559562340000000000000000000000000000000000113587ff735be1bd07037d32afa6c20000000000000000000000000000006d61fb1ba9632b8cbc76132b5b2a4f5dbf0000000000000000000000000000000000264a56b9aaebc291ff766c2368d7b20000000000000000000000000000007fb5b38f675b9dd9adf1119e77bf6d1b2500000000000000000000000000000000001b5f6eecfd877030f4b801591720c400000000000000000000000000000044a28ec206f26f99a7fe98bdfb82bd225d000000000000000000000000000000000002dff7548595122ed0e4f353f5ad32000000000000000000000000000000bbc30b9415db001f70fdd8987beb1c3e9c00000000000000000000000000000000002d8652e9ad4e0a4c2ca8eda205c27c00000000000000000000000000000087b1b7f5e9abe2f8dc781bdac7fff1aa1100000000000000000000000000000000000d95630725a26fe91e15b78056b1500000000000000000000000000000009350c0aecfa2f72e376bf403ec8721f86d00000000000000000000000000000000000c6d69390ac401c6fc8096c173b49f000000000000000000000000000000b9a4dea2978f80a7fd5c8e51be6532ad97000000000000000000000000000000000015ac99e0063363eba179d9bddf370500000000000000000000000000000029692467d705f2920dcf22b32f79fd3be80000000000000000000000000000000000079354a1a7faf934f32b3869c64d6b000000000000000000000000000000f2617d01e89a14e588bd8f6a599b8f9e8f00000000000000000000000000000000002026b9dc6c9c2ea6c9b6d97ad5e7cf00000000000000000000000000000073167a42c43fb98d38ff8f48623b8027d400000000000000000000000000000000000d68131afcb0dd20f4972cf543772b000000000000000000000000000000afaf580c7bf00931cd0c4102f8aaa7fcbb00000000000000000000000000000000000c7217eaf7d8bb18f8748c77bdb31e0000000000000000000000000000000ed9d41f73191606c11301a7b542dcfea400000000000000000000000000000000001fd2713b9e5b9e5117fe3732873c9400000000000000000000000000000091750a4e48f1feefffe3c4cc8dfa11b384000000000000000000000000000000000020c1023a70b1d27bca3d24b06d5579000000000000000000000000000000d74a7d51338e01a28b236c60ff8fbbf394000000000000000000000000000000000004e1232c30bfcce815402234f0713f0000000000000000000000000000006bde145ebdd90ca2a689e65943777fd80600000000000000000000000000000000002df07a18ed3fe8b2c070a57c944bbc000000000000000000000000000000d5b24ca3dc8e1f9d29e2a17ade852f1b7b000000000000000000000000000000000026360c3bda49bc3f5f5093c2a1c5d5000000000000000000000000000000dba886e62edf0787e22c73d9fa6ade05830000000000000000000000000000000000178848e705cb1df7f400459540a5e700000000000000000000000000000025170aa9b693320182c04029c5e7e4121900000000000000000000000000000000000bd42d893c4e1c614c357437d6bc74000000000000000000000000000000c4ecd919483c1a2ab845f12dc62077900b000000000000000000000000000000000022f1c6248535576a0717d01d4bf1ea000000000000000000000000000000965739e421592c66c4afb6565d07df6a5900000000000000000000000000000000000c66b846cea6387827a86b53f06a69000000000000000000000000000000460c41dff84a6bce3104c5f6c492c66f7c0000000000000000000000000000000000064f261a0890bd5ef9598cf92611d7000000000000000000000000000000de718a32a28cfaa98d7295000e72c06fc6000000000000000000000000000000000009015a08cdef623230553bbef5b9ac000000000000000000000000000000b7858366c56a0c3da72210cb7b47ebd3ad000000000000000000000000000000000012c80e071fb1aff3b4afc0d80c0902000000000000000000000000000000b32fcd0ca6d0c4e2a35634876ae6b4bcfc00000000000000000000000000000000002295aec998986d3260001b2652da8500000000000000000000000000000073ea51d2509a870718aa82b7f00e974ad2000000000000000000000000000000000023324c74a3b371c2f5e5b31ccfbce80000000000000000000000000000000e2b8a28a33389a4c09c8af5d4e7422ea700000000000000000000000000000000000041d2e62390a06022c514c42745300000000000000000000000000000002b5f6ed66337998236038a6fff1fc69502000000000000000000000000000000000023d1351f04cd9ef7abe1048ddf6c3e000000000000000000000000000000ce251683e0567843df829e63031f4350df00000000000000000000000000000000002ec340753bd9e99424e8910d75ab02000000000000000000000000000000d35ee5cb042d4aec737803c5dea2630c1b00000000000000000000000000000000000daac357d6549124e57d6eedc0b98c000000000000000000000000000000b0309944ea7e471a09fd971bfb9c36c7e7000000000000000000000000000000000007a368b4c1f6e35c0a480af8414da900000000000000000000000000000021f1225266bea5ab62e97d6c3e2fd7048000000000000000000000000000000000000a9599125c1c84e9f03acd8fcf7a1f0000000000000000000000000000004f93b5557f54eeb37238973013387e6efc00000000000000000000000000000000002a543ca44d941e21b40b2aeaffd067000000000000000000000000000000a3ffd818a85aff4e9590b851012624dcd200000000000000000000000000000000000db87fb229661e5b4f3c1491b7036a00000000000000000000000000000087c95c65ed8c8c03b7ff4c8b83dab94254000000000000000000000000000000000004670b0675c3aa38c1e2fd7d32b6ea000000000000000000000000000000a602a4b43bf305b4c888b9a3ba01964ac3000000000000000000000000000000000012ab08c2a76a1a8f30626d315d20da0000000000000000000000000000005fb41fc6841b45666f000ec89dc579a2e800000000000000000000000000000000002d975efc23a624beb991500f03d4da0000000000000000000000000000004b7702c931ece3321f98d33e85c557ef13000000000000000000000000000000000007bac1ea635e4f038b3a994679d54d0000000000000000000000000000000d079e5da08c9dcb4de83eb932d9c9903c00000000000000000000000000000000000682058115f71bc5f523d1d22e30a600000000000000000000000000000054fd9150dcee9f00d909983a171c0a599500000000000000000000000000000000002d48075b83ac71ac534ae7d2aa536f000000000000000000000000000000ed5a96f25e597e90a24fb0c975b83a94a80000000000000000000000000000000000286dd35274d7ceddfadc89056807f8000000000000000000000000000000c00e574323056ecdbb5d95b5a47edd2aba00000000000000000000000000000000001608e6ba98f975d660532fe37b3a4e000000000000000000000000000000544f7a22b7c1d9abbde125f75aefd6aaa5000000000000000000000000000000000020ea76d9fa9beca8380bb22786eb610000000000000000000000000000007ccab9b2d3cf3fde1b40b5f4b8f805b8a10000000000000000000000000000000000209c01f19dc726d266498735ce39ff0000000000000000000000000000006623a5a32ef26f9cba849c2a3b5d83f4d0000000000000000000000000000000000008b8b0ca5a59ef76e1cf60c225e528000000000000000000000000000000b56ec3076bdb7efb74026f41615800a0d600000000000000000000000000000000001423b8dea35a8c0a50385d1b3fd90a0000000000000000000000000000002d1e81446b8c8b2f0ffc3e938cb93b9abc0000000000000000000000000000000000128e448ffc3b1d09bb6783e8058d6d0000000000000000000000000000007dd79fa7035ce3f454326310495ee858a7000000000000000000000000000000000000efb75639b2a3995e71dd437a87fe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002f6e89e0c65369b14dcc2c500f1653e2ba0053cde393ff12a24aa7de7199043904f6e693ca4adb84f584bba58973a656fea999d21d2efed64d68ef99bdce42e8224cb7be17d12a3223468b5ad8b342779c65f128f23a4a871ff9ea0dac5f94ac19511f9f9e02b4e6cad2370327ba5cfd9f56a1eb61ecf26002ceaec5956a3e0c07cf7141c8ab2e596ab54faebe21f755ba27fd7827a62aa79077e68dffc9a5db202e77fc3a7b1ee01c71e10b4364e1d2f60b3914f243ce8cd2f618fc654680af1d043d652ea6e0f94a1ff8184d1801b34e194007dbcae2e2cc17bc7a07112d2c24cae6f901fd2ac5aa4b4d5f57a80f4ca19132fdb8394094abb6b644bc1eeaf60623ffd184eb42d69422fe3c8e7e0a5484104237c6d958ceeedf99115ebb23560a4ee4d99bd2cc2d9849764fb6559e84ab8c1d0e7b95035151f352b79276cf9e0b5c1b63ce6c1617492d76d8e142dda684bcb496c4cdde8690daddb45be1dbd127bb04a18858b34bacc49be594a39529f480c2aff0b8b67833e7953543f9a4a0057a24f76635c33bebfbc2781a62109d5210a5b13481ad512ddf9c36489be1c00d8989acb1cf7a2e02d624709d64b4aaecb354be0042c31be8c1a0711005482f27a30debe3a61beec341ea0be8357862e8eef1611d25a3aa5ef24d10e086e55d20781cb4cc82d176856102ed95e23228a3fcc1018c82af19eaff112f49ff2781177c7fab42b6ce9d966bc00cd97599627593135e2303cc474f901e61b9b89027069fc33f61a60b3e3bf3ae214db2fe8b94eccde58ffa6439c880bdd8d36f88d2241abbfe0d66f0d9293cd917e89d821159777eaaf33b161f1a486086ff4731dc16ea174843bc9db2c00b4d44221a51d99201bc6f9bbea6cc0c76750f9ea7adb117f445ef3bdbaeec5f74bdcc560dfb38070d574c5a36868d7e259599d32b44a015d26a96cf4ecf6b87753b90cfde8f7126bf21a2644bd8f4ef3c0496eb9b2fdc200267b60b708a173e0d9cf60d568bb809f330e66d07fcee343a558487037afb041f2f05543014ce39617d817df11c8bc033dca9b7879ff2e94653c5f4b979081c1ad70b66e6e75726d2a35d17bd4f1c63a0da3cf0ce7868061f4a6f0071dda90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006433fe684a939fe75a79663e5496d1680000000000000000000000000000000000000ba38b32961bbbd1dfb4742ae9ed5e000000000000000000000000000000638380b39c287b4e608ce046004a50e60600000000000000000000000000000000002b3900dc5cf28d0d8c086719f213ed0000000000000000000000000000005a49a0137d2c4bb49fb4aa0728b8989e97000000000000000000000000000000000027ebfae78d513cdef72f79f46392d3000000000000000000000000000000ca4f7981894ec601389fbb86e8c0941d7f00000000000000000000000000000000000604b2124e61269498e2e20f005a19000000b3","publicInputs":"0x06f32a63ab1a10c44b40a14c94fd4e693830a91920a63778c91df75b67c3a25900000001221894f21cae5e98d0c7a1a2658eaf169b0688cf8348dc7be4d5a944d568bd46000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb00087e2b1632207a64d2be3430a622118411f15477dcf399a057660b8e566041001c2aa1e8a9c646939d1d0d3a1b789e2eb024aa538a4c7864db736646faf6cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e586311f1581539435ce58c90ec4a9d291746a8b33999d1654faffb07f382db2efd3fd6b542f09e9f76c84337f46370f67729ce54c815d35866b4cb2a2672030000000000000000000000000000000000000000000000000000000000000000003f1c36600e57c2c3556b97fe6d9919a7c418380b539dcf74182dacf5baea2e16743433c1b3d551429cfbc09ab7899d4e14d2b5786a3243e29bc9c6c0d76bf10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
1
+ {"proof":"0x00003d400e9377f31c9fae99dde2e4871dcb0cce39b05422ab9787bbfd4cba8a933dae4708e7c96b4698e59641872c2fd712cd256c21879bf01a30cf7c9d47fd9a442ff700f10d3a401a22634ebb4b0b17410cd138fd388872486b6280d552d6317c255d0091fc2154c269945e9eecd8b7c3fda287b1ef154566ab838724c08bbf33ee18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bd79b7d8802c5315bbb1a505e518bbcaf90b55712598012ee082d7bc35eb1914211f9f02fc6efdb6bc76de80a2aab9a29f329d43a3122216e950bbb1fb61ff0000000000000000000000000000000000000000000000000000000000000000003579b12574fbd88785a68732b8a32ee511f990b5c1c9c3fd7d04ee396a49201c7047c96fd8059cb38b8b9ec2c489ab0b43a5f6d87e98b2aeccfcb934e04218000000000000000000000000000000000048541ec67b8bf434f83294c24840210000000000000000000000000000000000d69c5331f509ffffd6c8dda6db188a00000000000000000000000000000000000000000000000000000000000015f700b744e31ec5e4fc15972b9742216130d34aa7561a3786919f9a51392cd3bee50000000000000000000000000000002c1ecbf77c26d216c112fba848bcb2c4f800000000000000000000000000000020c760bd04161502098f63698d9ba7b431000000000000000000000000000000000007a878a5a74bbfbc8aa5421449ac49000000000000000000000000000000508927ca412e0cafcc3c89a51c63dc24f000000000000000000000000000000000001b67963f214889736da01cd0ca7556000000000000000000000000000000103d28cbc4586970511fcc4b3cf298a8fd000000000000000000000000000000000000adbbd2d009e8870e2d94112c6872000000000000000000000000000000b45608814b5a0241a025e28c147045383b000000000000000000000000000000000011685f37114cfd736e0fc3e34674be0699ec8e9a73b778bbdd5de6fa1ca511e8b99b9ae2b6e9c6524bf0c1713f43182b7218f998805a5a4d8bd657879fa4b4f21a52d49401db1e5bf5674f589530ff26257c11d8a49533f257b2c9ee759f1a6e7c8fb2d5d08b6662f4e1ed093dd12714cdeb4eabfe4b2ac26a8a28deb3d785ec24e5cdca9cedda6f3bc143632cff830a445136602c7b4e7f7a78c241e39bf3d7d90d6d8ad9ada81b99196bcfd05539184eb0345769dc700af0ca18f10040c60ac0554403e16f1cf9f5a5f896f14b25193782db7b347fe2cd790ec1909d637cd360611d4ac4098134b48c576ba9d68115282242fa373432e29e5434049fcf9a19e6f6d19713297e90ac2ea20c3248852274438d5e01f4cc60bfcfd214d48dc18f59bdb6a7ed3f5f4ad6ef326dfd1db51e997e94591c00c715af82249a35d5420f1aaa2bb1372e6eba18c7a6224d8b5b09f0f84a9b289d7d234c5488180abda3a1483c5634e54ead3929851eb79065910dc0833e225df0123ad879b253cef6202dcdb20d422fc37b461d374045f1f7990b4db61e77f87b0d9d1f367ee39667bd1e877dee16c53432433b4d7d18146ddf2c25666f1e280676972766b8636f95a3ef986f58c971ea2f744afcd9988da3cc2be98d51cd7d8aa0d0b3a023ee206ed6627896daf1d183d01d587ecda86656642b839935cd650e0f5f8df25039ee7f29319e9191b6a0e70446e5c3cf53e144c82588c7d9bd6203aec02f4e5711341fbaa939046e2d44d3948452cbf89c4b1b7e0adb869923cf9c7af820f75f704d38a27efae3da4c749cfcbf8f299b53b4e4831f1d91a33855f41f0e5e114620ee6ad6955da95ed9e4eef79daf413874e18186014d91a87323b06bce37bdfd44ffc79a539ce07f902694c425644f9a37fa35590faa12c254a54b646509470021d3b92530e11001cf8aecc30e436f1a63e6ee85058d0a960a924aace891becc2e52718adf236e0be5ef68ba0695e11d3f186cc41274763f77059b68da443f40996e1d91b95e95202745b83d6ac5d0fcd9ae2f5c19250db6f54a75e47d77ec740bc951bc271af12edcfadd33a757b0fcea78869f2e122f454bd36a5c56a3ef73ec4f4c9998bd4bfd8184491395fc2c5346d544bc25c3905bca666d4a2c1d0d379b6d7f4d9aa395a1f1407e5a5217eedd1eef82d52e32e534e4a0f21b887f46fcfa6a4bbe3c2987303a94a9980225401bd23cc80413410882205388c2d79684fe5693eeebf3bc04a89d295c3b1b7f4abb6b5bdf8d22d74d75e6f69b6ed60e47321ac97f859491f87aeeac49cddb3ca2d3aec764d40e598ac4cac95a719f4c7873c4217cafe2e876176d649f7319ff42ab88760dba083271bddf8b640fca6e6857e47ec200a49f6205fe75fc6d06fa74e0a51287360023dc676c2eed3382629813b3c51b85df18e1845cd0432bdf66b87d0ac27106116240cab809eebe7175f817bc0b79fd76257e291479c11451d84850635e2a092c27bd286fc0bae4781f4530502915e570e57ac51ee7df8bbcd21bba6147842a0ce99562ab83174d4e07e54a92591f9bbaf06422d78e1ec75f7e45ebbf1fb42618ab6085eaf16f536819f68c65b14bf20472fe27d16024c6149bf2da1855d9fc10940cc96cd664ce67651869b84cd2d371c9ab52150b7ed59a834657e899e4491486ec771e817f587a36075c64a0c9371f882e3f49a669647edd3ba7cbdaec81040ea16925367e964a6b75eb74dc5576906fe92b1728a3f0fcbdddce19cb9edc230108abefeef4f6d499dddc59a3984abcbde6d5709f1a1746c48fdf01672ac40924da1b8be3c47de980fb1c5683bb728d3d6ee723c925f9724068d4bfa92d820ebea9e02cbfc9473a6c4516178868d9378cc3fcfff516f7b5629ec611110edd1bd1d79ad9d9f3824be59057b3aaae9a674cccdf3109ccc0c34f83d5b4e4cdc02cfb206b8170940c464d1f3b4b98d18af1f720b8fafed28c380f33cf038af3d905a407e07add2fc266600b074fbff0090e8a2d592b2f0f388340c90bd3c0e39b16c57ee4cda0cb074e00d5817ee90a826d7cd414d3f070c3536b83fc303478ac04dd659cdcb733fcd9e64e637b180b1567b9e7cb876a2f523ace11053ff358e124a61a2885e122f8ce8154d4d3bff621c36846aff5fc5aec1432f46add3265762b4592ed0ddb9512bf84161b6bf7db330a082c7b4aa67d9e3732d61ecfd6fd0003dbe75863bf09956720deccb3e80beae4f72474ce31092bfaea71fb1236726b2cb49ae432272a726ba173c729bdaee9675e806ab2c71c825f0864301d94edc21ad4c3f588bba6d8163199e1ba07ca8d1b1906d58c2be4502a87600e33686a29292f1c96b5627def75b112043a5bb8686fa16d8bbb84109f45ed75aac4486d7903c4de51999f3ce858f608c35731292679714096e8bdcd83c1f2df7b712a2a131b1c89bc39bebbf5bd80e97f2a9b18420ce8efd74548b21dbed1444f33279284007b5e9a73c13e93e362c59933d8264afc7248cffaba04604c8c7a2415bb41a607b48fab2c54ba06523614518b3151e858c0b2ae4e5f37b8ee1269601cd91d2c2e8809894f4f82f7b62b4faa9eea6b1889fa489c6bad784301cf1a8c853719a7245f8bbb35b22d52dae58e1823dd84fade2f80fcc85a1074927000220f2dceba2e3f7783fb3c345bbce22fd91e184800b6ccf17be5d3a6351d8424c85c74ab0d27e3552b0b581156e7873c8414559eb91efcbf9d2f7474db63b46d463211deec07df4f35527fb747b5869afeec7d447a94202d89d4780cb5c50a87888a4b2788221a8276c9ab85d916570caaadd6fbf7557ab7d4add7804aa9fb4d99b4d11325046533a911065cd8388072d92c89c41da66f01ea9e34f963dfd7c3fa6f84f4af2a2877d84da25600e927e2af354e4cfb591ba344b2bc46aa24f7594df324583f043b3d29ee24b50bb8c36fa60d97ba1141ed41180da2569066d042ea48d2874206ae06b77ccbecef094ac9a0c9be376d84368b6f523d77b189681a440c4aedb82b9823c8c547de3ecd467131cba71aa3d9872dd7a9a77a1ab100f90f05be53292d522ef53e3c632ff6b810991c613956c5bfeb50d69018051b527a160f0a3d27263e6495672c492478ab016ef4cd1682eb4adbaba99ef704b673aa6c5dfe3f4b18425a24d9792f2305cd15c266b04083811d573867e4461a7d14b94b0cf704330d09f9942e7186ab27042c8151df8f37ba9a3bed280b6b76ebd72c5e16e98f042d7bc0d57c500c3db09f3ccff4dac7356cbfee06e8869bce52c9fdb3723e4bc1277453b84f1217b983c72154bbc3455a9854672a2738b58fd3a46464e571e2b7262af046b7c3261e3e8a8831eb52cfa6a99e0c17f575761142477fac1656a0f223dadbae44e0e801d95577c03cba5acdc5fd6e59af810591182245bbdc32440e18f7c8dc36cb1be72b2b741b41f05325c559b70ae4b9ace3e7f0a4330d59287514d1456c6e778b766789feabf0a183eca32111ab6a2dce2e83b93874920207ca0b06c64f3bf75ef56ebf01835b9ef00139941579c16e578dbe268a63d3bcf0812387721eda56090a977d9e4707d84bf66073b6a8fc915dfd01c12ca5e0c56edd0327ffccfa44949ae0ae4b6853c67c769451c96b94ad3ffa178efcecfafe670307b021b05c5e6bfacf5df9c2ce6635e8db5befd55eed838d2e7d05765bfd1141169f05924dc6c41de61d14f90905eddc6a54e90679abb1f42c767e43bac3b9b8065b1b56c304828fc10a977c90df75ca587973e919305c887614499d109825851538b947b43af0ed72baf393f3ce5031e5de6af73981c00afd1512a11aaa6f7c0e07f20dbcdd2e268c6ff8c4d6f2a4eec1eea1c9b7fc5dff3e75e5b4d3258acf297b054921b294603110563121c0d50af0d085de1c78df84dbd5f01303ea62fc22af8747483294d8115fd09f002fcc72cb58499c8f1b194717652a9dfd6c71341868734c348bdf0a0ab08e5e866c3bcc9e278c95f9d00a458e65ff55e07dddaa019e744da835b6127f7054d382230be8fc7f89a053c884bb3b6143203592a17f21909ff4fe6617b9beba1fba5cc2f8ff6b0bce5a070a51ac28a4156c635b8c1b271d4be75ec8cd02039ce597999b96ec8b8e36f9ff1e18f83ec7505331b5776c0e4b4b2a029f6bb84fc1277c36c146918dec888855b43e061910e42d730086cf0e5af2cb6918c2b4471485a0de4d53731e06f8d81e685c85419de7afb45522821907bfb687d1da33e1704b51d6bc67d077b3a25f3edde5943820f3efabfae44612ef247b70fea286bced9c477e592069be2ba7a49368ede906c0367ff6b5214a0f0d66049786e2ee4c5b51fde39f77b35a2f8581cc7b4d96ff4562c40a56c0c8000c1eb2fc0e5da2f67ca87293ef6ffa3c0080ef8158b520f89e4e2f507554801208783cfff00c7cab07501e979c6a3e0a3553bdef7a3b463eec5cf8026a426f15871a5f7599b5eaa9e84ef5a5284df3eda1e0dfbb777ab201fd6a5295d98da3111703498f07fec739b78acc1e1b0a6e0eb76d5f31f1fd14a4fb027e55cf278111cd3f7dd91c00356a8f98c541c9cea6c3467106c88f218a7a6376bbbca224ce16b2845047463ef36b98da107ac94aa9b8eb5c3732597e5ecbaca5e05cd9e18e0b5812f1071645a557029d041f93cb9d057480219d0e82a6245a4bf4ce8593111f3659ff037004cfbe87a9754649cb4cc0f3cf9f05881fcd69f3c75e8c0acbe42f373904ef71ecb2b7c02dbb386f7923e2ddf754d1ee3d27ef1c8500e25c961c0ff87517c4c05de2c196e8b24a434a6c8286e63effc325f8bd963f93d88359d50c204691898ab0f00fb626f0f71d1d898267955db03f87ccca49e1337843415a1969f5adad63d6a8d2f4e1fe8843e556d37ff43d382d5e267c8db28ca5a595cb09121c2dae0bd9ea815c69e39faae7569d6ae03ec58f3e8aece4d49206e68ef909fb0b50e936a8c88638a75ace4433133cbce54f5056b2ab23d808db5854a9cf202ded53ee1687ab24edc213b288ed884d89cfee04be3efc6b26b3d06eaafc0d0adba000eccd425588a3632dc1c97e26ca7def9dce81c9dcfdeb4b65620c960d0f83bfd097ea530aac89211ad72e39ba34329f8f217b802a8e6a8f64d6d27c7b1a039f774702805d5aa3c2d84b19b93dc4e8d469f2e6a3eecc79b621d1edb68f17dbb0e45b1ffdbf9df4ccc8259b21ab9c760efc7ef1ab616d8da0d989aa3fc72a16be9ffacb859daa38488634fa9d4b0604b01d03dfbf30a5cb72af04100c38069a8cfeaad5bc140d6c803726bb17edbca02af27549c44dfa8871c74ca961ff21fd2bcf8e825cc442d9765aae9e0b79e081fc93063f57432c802488e092e7c82b9df4f327eaae53b3d0231514e53bd7c52f49022da263e2016b81e011b156561aa2d83cda53b8a5f87d508528eea834a9daf0eac85bc0a84e08c14810a1678c0a93c5995307d1a3f462fdaf4f2e5475d87ead64cd91c82a9ae977d0897dfd662c2dfb2e706a028eb84191b726be1c766a7a671e9343446053d0c86f898e3cae185ef31c01be2fb557520b4289fc78ebbf12548a7471bedbfb5c9944047852ef2d4c5daef476acfb5c1af30a8a3abd9eeb0664a434e8d65a5273329b345552eb205a4d448a2689ef502183c621d98b0fb8428adcb4982d5c75d22e30b05d98bd2f38e46d86dd2c7f62d80fbe86e3149d194f4eee81a20b59e6f11760d498896a14329fa617e03c199f7e471ea94145506e1db70f1fb2a85cb0b4ce8a1ad38e0c10c02abd4c6353a7e3ea2b6f3fed1c12623ad65dc7dd7d730781f41eb5d11edf1d2fa63ee46519dd66b2e96f9c88cb9084aa8c3dd7ece065152d351a54a2c2912e8de903a041f43d23be3f2c2b4502e3e660611c8f9b857ab858c7270049654f0d67ff1c085217610bcb763d7bf73bf1baf4a617673478026fd065918a89d4e70c45fc0218284bff53dddea0799529a94926f7834c75f436f00fd94b62ba70372758a41f284de03e3296dffd413a97000b6a5a008fd3b6e7d96ae92f6b72271205c0e8fe7206c91169d01c835ce1806e93e1d50c557e79611515bb4764b048ac0cbed627f7477c9714ffddf10e111bd84a575e84947795749768e5c1409c797b1d14d02c5505e6ee018d5356138d038892df51e322f21030c23044bcee42fa481eadd4ccf1b366f2bf2fe28ed599c1390ee8d70a9ac01f4427facaf20263cb3b14bd8e9e952b63150cedb8055e125f4c1fb9c8bd94b872ba03f3c1fbd8b0098c266ee4639bd77440695c683801bb8c31f138743c013b9af62ddc0f5dfbd44cc4249baaf31439a9266acc8b58dc5e71df82e5a2f6342aca826c3d1149126dd17f2c80ad4a9044c53368f8be739b4720e57a20d916beca4fc108fc8bcaa7ea44f203bd375fa9fbabf0151abc9618b483612510be21bd9c21c6fc12d96ba8a8c1ce1fbb8c17b4a1ac58ff6658de732f1758dc15b2b7a31b00bb62c3611fe4e9339913bf3d24585152182362543e8c6c43ea612bef561f74712916058bdd04d2b00c2e9f83496c1b8f619ba45b815d125e4c7a0aa511773c4dc160f1e5c8a3374d431726350549ebf5ec689c067e22d0dd1fae036366adefd8a4b6a2c7716e22349222c053b604079ca5ef8c508e4d721d10efe91550cc4445843eb4a5dcb90016211d47afc8e67f836d94e5937a0849ffdb2cbdba195ee9364874069f4b5daf5897161238f003e4491e230a1f0129954d289581406844c07414a93edf8a315bde81229e125532ecad256c0a4442eebeeac9d9df974c1b3390bd962a2f45ffeff20b1a12dc312045a0c88b753e7ab83a69717c784d106ebbf11a69b28350529f2fcb1e2bd41936ee62a3818aa6132a46e9fd77205bec42ff67837613c7a0a9bea32a1b77f3daed6667a3ed301c23c51daba6d46a7e3751edc0d7a382df14a7df32f204eb5e93f6be2d72dfe37b14c53f8f8042f3a30b860beeeced2a170f53669cdd1a2b1ec92f11e8d1cd748b519c1b1b2cef3a9c91e317b1c38aaac13d34d9d05205bbb2208ffe72123d8320eab02240796ab7e2d06412b4e5af931034bc8bb01c1a71b26b8bda5b87bd7aa013446c1c23f7451452a8016c2b8e4bfb0f9faa6eec290c62fe4d90c40f02f01d6bf539625d82190e6776ae06e2c872e2b242aabf0226ec72c1c7d76e703a32f615c4e973348ae33e63894f083727afa5455a7d502d10518f3d7a43666b7546e8176bfc1db5efe3c0a496491d40b8b744a3a8725b802938d0367dc732ead28bba9dab15c54c888ac40aee292666ffdf96569103eab2137bf6ebbe8355d8f1c029985ff2203d0ff38e26798566f99d0523910d98d5b12c15c3e959e17a00f31e7d548064c6cdca173e9c5f67eadf88d016df117cc042025789706988de620c4cea99a876eb973072f6f7bb9c30526086a195095cce2f2c8b813e8a9a7ed46cda28e042371299168ddb20501dc0d2f21cbe220acd7e740c259a0988693f4bc3f5d61695af031ac2d7aeea44f0d745421f690fc16462ad01550fcb32fe66b322bd05057a341606fafdff8724be8bc3c695194eb0a297462c90d7da9787d90e65789a55dd787b13de116954687e2393ea9525d83ef6f683207e734d1bac28191f1686be43e5b61fc7d54cc0d8b8c45d1ebeb55dc16bfa7d2cbf70607c72923536d96c00c98af67758dfc9a2982e15ef3802bc15f1ffe4522a0cab43855afd582636b1a5aea834b4278bfbef5e8395e4be46b5662ab68c961364f0b64dc3dd230961e54b88e5389be1f311e5aca1aab86d8a87b32fc1d21c2dc97fcbf3de1d88bebae6a85d78f99c9d53cdb5a613c8e0cfefc7cb80df81c71daf67d8d9e4a53af35e9f9904f16a48cbaf7ebf69612f7efc8f41c6a504f36328c6341d4b5203059e587fbf82b9746492c43bbdbab09aca2ce8a5e241279f382d1cc04fd9d02b377970b337e2fc3f1b8c6cebfe8de29ef0ece75aecf13ca49e2d3584d9c52ff5aee44c660a59b2398ddf7a675a9b00861787b8feeb65bc78a7040b3115d22690bced8b90dc39c97cbbbfb8b5dd8add816837f4a5083cfaaeae1adc76a812c17097fc41b4a549d01c506f9490b0282f40ac00b363b35ffd332b207096db9f96557b5197f53bbc5d5040fc16a4320f33c1e34135cd9a7d8bdbc5093d26d0785ba088ad45a15c116aefb0f688c556c0092d72740ca86821f4431c1ee6c14f2e68083e6b5bf82de1eb4864ad85f766bebf44445f2204e55149827a1b098d208de54b8ec69c274c1b69cff0f677546bb79080210d117a7e05ae90c81a7d3287e8148cc12e8ed65c3f7d3bb3b8d8e932c25785cb5bec5376092420e11450f06f141830d99612cc6ae4d7b96050e1934edf04925f41df0f76b4cd47c508f8b6dcde10a89e1a557eb5374c7b6e3b6451e1404a2560128bc53257db6eec298f94836d89bf40949a69bdbc11554404bdfdef27deaa3d3714cd9798b29ccc01ca2bed61e9fe56547bfd8c87f37db742a07aabac019858c8a06ea11e12c9131d90b726515d46394a1b4c015793da8d9344f11de96b3fd35b34941e4a9d40c718d928f13f77ef3d22d9f3e6afb8b41a9734f3ebe8cf66f8d797d864145c3b880477c6a2c7ab46f51b3246bebb784504df7ff1eb6ec42a5b156aa8e65268f9f103d46339e5177f62e05c78dd3f7286d6863b1fc919e4e144355d58cb01fecc1d038c56a2e7615f2b1a5feb5d405138db8a12be915fd6065b9d602f17f7858d1e258da568871c2a8c14a163ff17b1143c8a22110513d4876e5e6c25979daa932301d94c4432ad23baa49d82b073aad73e48dcbf03755aa9f3e3b811667cd671cb01a3f2ad1b18dbc050b0b105fdb6faca96bc6e511cdd8dbfc1b09c2a483c33d60afce13fa5aaa8987dabfb8795ba80356c5fc51f058e4a0a0028c924f33b0a962a06f4001c441752b5fa6590d6a7760d22422e4e9fb32a02eb3c11af4eeb03532cd40487a916688df596547536bd08dbe365c1d2d86aebf35376bffa695309b52ed644166a82655e3f41966705d2351e32cfbdd3f75890d61934425b082cf8d7259bb608460bafeb9a295ebad2a85a1d28ddddb253fd4b23d02cbb912e38f426160a6a6dc88e9b4dc69e2a293264839f052d963b90a601fa7249248b61daca8000455a332bd9e5107f19e6ceb1006724902023a2966a3aaf64d432a5a20bce7f18c5579b21b6a64aac66aea0a500a2bd207b6c798183ff26b1ff384aadedca442a5f1004f4f69a17aa1f9c9ac6e34f0295e85089b314bf653c536b7174edb85d2c5d91528db6fe1b43d9a737ac321eef999614822ef38ae50c217d1a9185e45f1670be84527ba3c29a608bdfc9e5b279fabe640535ae25629a2db4a9a915d4f40b6039d17c824eb45edd38a90b570300423616763c0645ff5f99db0e6ee3e2b511bdf39e9c98e8a28a64591c0d6250a2566e78458d58cf79469b0d352afa528e1a3a1392cce8b9d63a013e1dfb815c270c79c9b90bb5fd42ca5093f52a34d2312296a41cc8d3310c3a69318f3a411603e82e7c406edda9dbc34d8b75e2993d932f1eb6d9f99a257a5ddf7186dd583c666d77b777a83f93791eb2433ceba693ec1dfb1f3e3cdd8bb07406e3b73034e62131cda6b867d2156da7c6ac0800a706fc0f231614d6aadd0706f8626ec6ae55a2199e2054d5f0b60ba9f0d3d8d1f4321c01d230315dc3d1df854b48aee2d32e5ddb67fc802e3be04e7f7469a56a5eee9b1087156c9e9a3e6fb53b796e1cda852484a9be2feb6683574fa78df46ef8776f0e6e99717c65d20d5404787c2ec9bfc52a4d03fdba960c48692d958a418f41d8141aca0aec1192be1385c0c30fdf5a6dff09bd250c52c4c13c6ea90e71b12fbb2a6e95b2f7b93fc95bc36734ffb360c103f8c5ac3e8adb2ab30ad570f91f6f9402771216c2d337d43b8c2652e45a67a51f4c9f606a2c8dfe45f916a0580cbff82896e5984c60f1f80e1ced60caabc8643132ee0a5ac4ba542d4ee19eff209e982d2486eabe185740d268717367e53e98a8c7f0e0526d306b0e821768b2e5d178179780d04a0215bd26f15e633cdf4b86d2fb1df61e0ffde65ab11e4619572e9d2a2543b32483929802d79a058573eccd79410252a96f313a7ae3b2c6dda40c2c1c2fbfcc4a38ed43a4108cf249034b762005185af1d120ed77cf3f94758ef5a11a2dd0de58a406e8836278a2053c4c837c4857e541eadec36cf79f6e38aa0d07082f119ce1eea9ca2e7022b0b8323426537bd73da0fb83b609d982b9f20a4fc722c2c0c6c83e72cb831eaafc280fe68c51075f203abf7ab8433d0b52018706dc091c9b5f22d646c49a72b4b1e769dff2f3d522b52eecd504e31942983edb95f515b781b238005301429ffaa0a0d52a5d438636e9ae83a245a7901c7c24e93d02075b789b30c74d6d540262b575236ab870ee46da4f11cb8a20c018f073ee984f1b8738e6dc8d536273babb636d16bb5b9fe8dc6640b266f6c8e984e55375c50e24817a202855c381f84c7064027635ae6086429d770416ba44c16c88fcb19e771a32a97750d211903db3d6802176a779a857db4b456dc7331446514d0d6425d224be843527ce474adcc4e889a8962e8d05985fc6bbf3f1b19c22321a9e90b26620a774b51b01d13e10a5eb96b2558a26d5bc5cada7fa2bdfefddd9489fa0af0709c778beb3d6d301bd50589682d9178f67d2632fe890671621d89322cee1924e1fdfc71784da8c6c4f724f09256806569432e480d37c99e9d1ed25ab52502fcc0e35f6a9dbb605f88e6192f5d96b9dee102e53b7ed82a7202d6c463e6ced7ba92de20e08c12f50d74165648476a77e13280d136480403e52fea651c06ad038f801124779a8d300e84ba8df96b919663570b829201811fdc1aabf113ba4625be11a10d4f50b58db3372a9e363ac2f01470f4e0b28a7f095f754fe7b3bac8d9a6b120ecbfd8a73d545ec7b14d02957141abe566e8c85ac5a4d8ba9212f56fd03252a735dd56ad8c9162b0836c622ac24fc43b6f3170ccd7c7f1b4a0c8f69cd4c290c6d8023a593353ee9fac160c67b97bd8bb55de03e6a6b112adcdda9776802c01bd551704c39fbcb3e656c2b3a3e860ae5d37b270d14a2cdc43b645edf79cfe61ec266d9362a2352a80f107a9059317776373cdf881e37c3497c58872bbe287129d9c748be5f12ded57c182bbe59c21e308fdbd98fad0e60a77028c368f99b7b271589f3440e847c26f1ad1f31fa4a88c8e017ec0f109d28f4a66d4b0b70b2120f5353885e305b9f5fdea03bda07cb41af86278088ad8580324c42161f9bbb8b2be8349dbd3ff84589cc40d845b8b70a59e8d5589169fbd70fc86c94beadab350916204dc21311fca71ba54ccd07af6261c37c6c7a93852c6eca8cf07db5e47d1d6d6248a673502d81a9a96eadf16d44628b6ae546cdfc9886860c6a2f235b80069caf741ee0662e34df18e1811fa69ddc2f34e35c475caf70afc5d5c46ad85a1c5f9701b834b718d1fcdf0bb944cf0a1f8c87a907ce8db93225d927d954d8fc02766f32559fbb9edb5886a5b93fdbdacefc4ca26c39c705018b40714de49c7e200f7f58af357a32b611ae5d86d6e9836d91c1dc720bf387ca7445220808b76022f97b2fc1f6e737e2e8e4c3f2770df76e03d904d39a682ad90bfe98f0c7409b16a18ecfd33b01dcaaf628754d474e889c2f28de3e70b30ae54fcd13ed5282101c6fd4831bff73d6df4c87d13a2b07336aa35c9283bc75ca26b020abe04ddea110c40cca49acb11e7a50175e575a5ef267cf61e80a02151a06a3e46ddb13d1c10c1ce60f867dc5480e5e49367ee40e69c3eab581b9070ed2e1e40e80b484b61b0ef9f202f25fb72960a27b3414d6fe18cf6d31012bd2f633fb717004d7b79a6514293a58847738207ded44e769618b7371a7b50907a09dac283678a2673e7bcd135a8646330253b9fd8703f8e2f1e4d64a3ba66a7a6385cda1814ea9705d5dff22c13d9f55a21c856241815a018e5e706104d6e9530553e5a65d05ed16b680ce044760906a7cc4604be48e5447abaf5764ac714d43034629ff58a5e4292e4bbd23a49980187443234436d952d1054b264cf9586a277355c23d7c71068cd4bb631faeade616bf02726022d579156a6481d3b286c562e847211cc63117c08a340f0fde81cd08437b9ba305d7f7488238809307dee66fb9132863ac3e370d7ea72d0d371a1b88045e329e4ee8323a5b85c354f00bcb13662bb9ebfac84e8dca49b42bdadfec551a36fcdbb9b11dd029aea9e7fe1ee187b9b9e89208d761102f112d19b6730c95993c90f652cfc1d8bb7a816c7985753d5058ff63d3b9aa9a65efa01fc8939306f65301e8ad16722d958805d143abdaf90c8e10e24647fede5634b125212e0c484fa9674d763a2dd84e671353fe66f87c503d4308e8273af0b10f43180f0c9f4edcea7d2857ff2c15c5f0a5d278fd807ef5600ea0a1b69e522ecc2f2c1d11766bb2286cefdd04cf441af312757115225506bdc6316ab0547b141fb10db30f6e095d563fbc409f66b76d0f26b451b23e2e3bf2bdb998ede5e0aa30350c50edac6b7529e79ef1a3a4e784dfddc5333b083d290c1919a2f0f2e664c3e511afa0aa0b8b3f3bb30f66d03d1c272f664a6134c79ea0b9acf75b33ddd038a10cf843591e37f14c8c04255979c4e08a1406c01df66d1575e363ad5492456d3b2922bd40315e5a8b7edccd8803c7d2d31145d7f2d8bab6cf5d8fe1f38644b369278a848560375950e1d0bd5cfba937f03671d9eed4d99c2a5b613501fbb04a530607827691bc91580acf1228907a855f1aa244a738c5633bccfbcc410623dafc069198b44606d2a8dc69830ceed167632e8f136799e79aecad35e5b0c805ea83282b3652d61785200b9c169545687c9ca301780e513d7afe169215c41e045918296be71b8e2271d3e54c1c4b3db2a0447ebe6d0e37d7d3776af27c35118932d007db2b45b3c560f0dcff6d5e1569310e54b2dcfbdd7117f09cfa35e9439d68ad277ea8b4cb1f1eb5271c664f7f7d27bbc15ffc5a9194ad55cdc30ae419e315b01e37667834fa0baf3d033cbeb7d7204a0f04c03b0f351dd1feaf6ed49df47a4903a4b9e17dd27778f0aff49086208464db6b78874b32cab136cffd60979c50502fa57797831c5136c27ae69be080da9efe9df6d0afaca48e1de834f16c7456271263b43ad6f1eeab3d75626145812253a75806332cd9b0790e99bcb5e4843302075f87195c78428d3ea392bf24e4639ba2cb1643ced5040b17c1b227bbd6b413120d0b272595116f38587e9df49f1d342b788757082a9485a97cbef9ca26ab580983c253e0d52de1f00ccf63046e8d3b1e3ed40a70140dfa299676a5a6d2cf950fda0f1e8bc7449b43964330a12c91e99b72ce209c9ca528b81c42a778600f10005efe1f326e58dafc772444d3962c053b5e4f3c8a289b63be2283d6cc93bf35102330b5a7fc8d59451827083e69fd364af6d8ee50cbbf31f24a8756405bcd662bdc1ac271185b2bc86631d87b3aab001ef194e5a878632da81e34260f3dad980a49dc8b0d96ea1b4ba9cb8f573d0a5b9563e89c182c3b0599d9cde17b1467812dba30e53d9447966b0ed052e41919e162a387388cbcb7f3d42c51a0c5c1589e1074191916f74cdf7f13bb6802c9618a55e680bc95f217ada81684c80032941504a994da8fcffee759954829909f3b84d61fdedd401517dee91f44fb445999e510ee18cf73395d5a7a684f936c5df468956be601522f7df7a0e4ef191965539f18ba22384591d8aaa66137ab8ee8ce9b9ec460dcd5d60a9df35684d2754ea0af2de1d6e93d82e925e3e7eda0669733baef40a7a796b1f494d69331d50496176d22f850fd98251395ababe1b7d6042b0f5f3c475a900c4d159abea2d4bdc1c8dc2ea40b1edef39a072d0c901ce56907c6ec6ba9ed5dd8e153678877ec2b8c9d3b2d1d3861b9a2ecb0098c3b177975ed073b2789f458c65297cc72fdffd19460fb17cb67c34d9256672c1bf28cab608970dc5ca41001d6b119e2241dc4d90202622276a6b90305d06af3f29d56e411c4f7d9507832f06dd191d1e8e4963499c13e0034d3ad17be5d5f4930b569ba9875b91d343ac570a64d36fedbbfe7918a870b2b98a2c73560bfcc6913944b0701063866044df0b730eb7c52b8f4fb25a185ac1d8d48b6e33f143d63752130692119d1409db72fbe09af10251e749c84e12bca2d81e52a908d35a1b456792c45f86544ff14a606ebe06eeb5fa977e14cd6997b0ca71c84c1dcd05cee2274812f3b93e199c782c8a6157b2be948ede5344a0929021e18b887d39ff7ac266dd99111fdae54a93dc41677399ad9e25c984f9292f704793a97f93ce1003bd5449020e25538230a2c499b026c0c276b43b304064f1f1cb3011f626800e40ccee3c8749278736105a07751960194922c31dbb40efa23177c1f26d68e6709bce0ac8a66c9e51e543bc0a2b1be23d0af0d9690701ca66c07b15c4e7eb21c79e2dcea5b14ad638a5bdce05bc629ece747f691a63d32878b000000a7","publicInputs":"0x0e9377f31c9fae99dde2e4871dcb0cce39b05422ab9787bbfd4cba8a933dae4708e7c96b4698e59641872c2fd712cd256c21879bf01a30cf7c9d47fd9a442ff700f10d3a401a22634ebb4b0b17410cd138fd388872486b6280d552d6317c255d0091fc2154c269945e9eecd8b7c3fda287b1ef154566ab838724c08bbf33ee18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bd79b7d8802c5315bbb1a505e518bbcaf90b55712598012ee082d7bc35eb1914211f9f02fc6efdb6bc76de80a2aab9a29f329d43a3122216e950bbb1fb61ff0000000000000000000000000000000000000000000000000000000000000000003579b12574fbd88785a68732b8a32ee511f990b5c1c9c3fd7d04ee396a49201c7047c96fd8059cb38b8b9ec2c489ab0b43a5f6d87e98b2aeccfcb934e0421815f7d69c5331f509ffffd6c8dda6db188a48541ec67b8bf434f83294c24840211744e31ec5e4fc15972b9742216130d34aa7561a3786919f9a51392cd3bee52c1ecbf77c26d216c112fba848bcb2c4f8120c8f940e8406acd6e22914cf6cd4f2dabd81cb628905b2a2cee3ba1343d6803ba297fa9197a8e5c682ee348599d784"}