From 04d50de60d2065443eb499cb0b5053a485c0b173 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 14:00:11 -0400 Subject: [PATCH 01/68] chore(deps): bump oven-sh/setup-bun from 1 to 2 (#2457) Bumps [oven-sh/setup-bun](https://github.com/oven-sh/setup-bun) from 1 to 2. - [Release notes](https://github.com/oven-sh/setup-bun/releases) - [Commits](https://github.com/oven-sh/setup-bun/compare/v1...v2) --- updated-dependencies: - dependency-name: oven-sh/setup-bun dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/test-rpc-providers.yml | 2 +- .github/workflows/verify.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-rpc-providers.yml b/.github/workflows/test-rpc-providers.yml index d7ec1b25e0..b1cdec9066 100644 --- a/.github/workflows/test-rpc-providers.yml +++ b/.github/workflows/test-rpc-providers.yml @@ -74,7 +74,7 @@ jobs: - name: Set up Bun if: ${{ matrix.runtime == 'bun' }} - uses: oven-sh/setup-bun@v1 + uses: oven-sh/setup-bun@v2 with: bun-version: 1.0.30 diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 7590ff0378..2dd59f2fee 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -171,7 +171,7 @@ jobs: - name: Set up Bun if: ${{ matrix.runtime == 'bun' }} - uses: oven-sh/setup-bun@v1 + uses: oven-sh/setup-bun@v2 with: bun-version: 1.0.30 From 3fce1c36414dfb4cd1b8df3f913fe1cc8abba7db Mon Sep 17 00:00:00 2001 From: Aaron DeRuvo Date: Wed, 3 Jul 2024 00:56:29 +0300 Subject: [PATCH 02/68] feat(celo): add OP formatting, serializing and parsing to celo (#2335) * add support for serializing op deposit transactions when on celo chains * allow parsing of deposit transactions in celo * upgrade formatters and types to incorporate OP fields with Celo * add formatter test and explain why we should change some logic that will result in failing tests * celo no longer excludes these fields, randomness on blocks will not exist on cel2 * fix build errors * update tests to reflect change in structure of celo blocks * only format gateway if it exists * keep it consistent with current void value * does this fix wagmi issue? * add randomness back but make it optional * have types reflex that these properties do not exist on every block * add changesets * chore: tweaks * chore: tweaks * chore: tweaks * chore: tweak * Delete .changeset/nervous-radios-deliver.md * Update mean-taxis-laugh.md --------- Co-authored-by: jxom --- .changeset/mean-taxis-laugh.md | 5 ++ src/celo/formatters.test-d.ts | 83 +++++++++---------- src/celo/formatters.test.ts | 77 ++++++++++++++++++ src/celo/formatters.ts | 46 +++++------ src/celo/index.ts | 2 - src/celo/parsers.test.ts | 14 ++++ src/celo/parsers.ts | 8 +- src/celo/serializers.test.ts | 19 +++++ src/celo/serializers.ts | 8 +- src/celo/types.ts | 128 +++++++++++++++++------------- src/chains/index.ts | 4 - src/op-stack/formatters.test-d.ts | 16 +--- src/op-stack/formatters.test.ts | 10 ++- src/op-stack/formatters.ts | 28 ++----- src/op-stack/types/transaction.ts | 6 +- src/types/utils.ts | 11 --- src/utils/formatters/formatter.ts | 6 +- src/zksync/formatters.test-d.ts | 32 ++------ src/zksync/formatters.test.ts | 6 ++ src/zksync/formatters.ts | 24 ++---- src/zksync/index.ts | 2 - src/zksync/types/block.ts | 47 +++++------ src/zksync/types/transaction.ts | 4 + 23 files changed, 334 insertions(+), 252 deletions(-) create mode 100644 .changeset/mean-taxis-laugh.md diff --git a/.changeset/mean-taxis-laugh.md b/.changeset/mean-taxis-laugh.md new file mode 100644 index 0000000000..006b7dbe78 --- /dev/null +++ b/.changeset/mean-taxis-laugh.md @@ -0,0 +1,5 @@ +--- +"viem": minor +--- + +Added support for serializing and parsing OP deposit transactions on Celo. diff --git a/src/celo/formatters.test-d.ts b/src/celo/formatters.test-d.ts index 5e6a861cce..7c666c2975 100644 --- a/src/celo/formatters.test-d.ts +++ b/src/celo/formatters.test-d.ts @@ -1,5 +1,6 @@ import { describe, expectTypeOf, test } from 'vitest' +import type { Address } from 'abitype' import { getBlock } from '../actions/public/getBlock.js' import { getTransaction } from '../actions/public/getTransaction.js' import { prepareTransactionRequest } from '../actions/wallet/prepareTransactionRequest.js' @@ -10,52 +11,43 @@ import { createPublicClient } from '../clients/createPublicClient.js' import { createWalletClient } from '../clients/createWalletClient.js' import { http } from '../clients/transports/http.js' import type { Hash } from '../types/misc.js' -import type { RpcBlock } from '../types/rpc.js' -import type { TransactionRequest } from '../types/transaction.js' -import type { Assign, ExactPartial } from '../types/utils.js' import { formatters } from './formatters.js' -import type { - CeloBlockOverrides, - CeloRpcTransaction, - CeloTransactionRequest, -} from './types.js' +import type { CeloRpcBlock, CeloTransactionRequest } from './types.js' describe('block', () => { - expectTypeOf(formatters.block.format).parameter(0).toEqualTypeOf< - Assign< - ExactPartial, - CeloBlockOverrides & { - transactions: readonly `0x${string}`[] | readonly CeloRpcTransaction[] - } - > - >() + expectTypeOf(formatters.block.format) + .parameter(0) + .toEqualTypeOf() expectTypeOf< ReturnType['difficulty'] - >().toEqualTypeOf() + >().toEqualTypeOf() expectTypeOf< ReturnType['gasLimit'] - >().toEqualTypeOf() + >().toEqualTypeOf() expectTypeOf< ReturnType['mixHash'] - >().toEqualTypeOf() + >().toEqualTypeOf() expectTypeOf< ReturnType['nonce'] - >().toEqualTypeOf() + >().toEqualTypeOf() expectTypeOf< ReturnType['uncles'] - >().toEqualTypeOf() + >().toEqualTypeOf() expectTypeOf< ReturnType['randomness'] - >().toEqualTypeOf<{ - committed: `0x${string}` - revealed: `0x${string}` - }>() + >().toEqualTypeOf< + | { + committed: `0x${string}` + revealed: `0x${string}` + } + | undefined + >() }) describe('transaction', () => { expectTypeOf< ReturnType['feeCurrency'] - >().toEqualTypeOf<`0x${string}` | null>() + >().toEqualTypeOf
() expectTypeOf< ReturnType['gatewayFee'] >().toEqualTypeOf() @@ -67,9 +59,7 @@ describe('transaction', () => { describe('transactionRequest', () => { expectTypeOf(formatters.transactionRequest.format) .parameter(0) - .toEqualTypeOf< - Assign, CeloTransactionRequest> - >() + .toEqualTypeOf() expectTypeOf< ReturnType['feeCurrency'] >().toEqualTypeOf<`0x${string}` | undefined>() @@ -85,15 +75,18 @@ describe('smoke', () => { blockNumber: 16645775n, }) - expectTypeOf(block.difficulty).toEqualTypeOf() - expectTypeOf(block.gasLimit).toEqualTypeOf() - expectTypeOf(block.mixHash).toEqualTypeOf() - expectTypeOf(block.nonce).toEqualTypeOf() - expectTypeOf(block.uncles).toEqualTypeOf() - expectTypeOf(block.randomness).toEqualTypeOf<{ - committed: `0x${string}` - revealed: `0x${string}` - }>() + expectTypeOf(block.randomness).toEqualTypeOf< + | { + committed: `0x${string}` + revealed: `0x${string}` + } + | undefined + >() + expectTypeOf(block.difficulty).toEqualTypeOf() + expectTypeOf(block.gasLimit).toEqualTypeOf() + expectTypeOf(block.mixHash).toEqualTypeOf() + expectTypeOf(block.nonce).toEqualTypeOf() + expectTypeOf(block.uncles).toEqualTypeOf() expectTypeOf(block.transactions).toEqualTypeOf() const block_includeTransactions = await getBlock(client, { @@ -102,7 +95,7 @@ describe('smoke', () => { }) expectTypeOf( block_includeTransactions.transactions[0].feeCurrency, - ).toEqualTypeOf<`0x${string}` | null>() + ).toEqualTypeOf
() expectTypeOf( block_includeTransactions.transactions[0].gatewayFee, ).toEqualTypeOf() @@ -137,7 +130,9 @@ describe('smoke', () => { index: 0, }) - expectTypeOf(transaction.feeCurrency).toEqualTypeOf<`0x${string}` | null>() + expectTypeOf(transaction.feeCurrency).toEqualTypeOf< + Address | null | undefined + >() expectTypeOf(transaction.gatewayFee).toEqualTypeOf< bigint | null | undefined >() @@ -145,7 +140,13 @@ describe('smoke', () => { `0x${string}` | null | undefined >() expectTypeOf(transaction.type).toEqualTypeOf< - 'legacy' | 'eip2930' | 'eip1559' | 'eip4844' | 'cip42' | 'cip64' + | 'legacy' + | 'eip2930' + | 'eip1559' + | 'eip4844' + | 'cip42' + | 'cip64' + | 'deposit' >() }) diff --git a/src/celo/formatters.test.ts b/src/celo/formatters.test.ts index d7f5f2389c..14061f1ae1 100644 --- a/src/celo/formatters.test.ts +++ b/src/celo/formatters.test.ts @@ -13,6 +13,13 @@ describe('block', () => { expect( block.format({ baseFeePerGas: '0x0', + blobGasUsed: '0x0', + difficulty: '0x0', + excessBlobGas: '0x0', + gasLimit: '0x0', + nonce: '0x1', + sealFields: ['0x0'], + sha3Uncles: '0x0', extraData: '0xd983010700846765746889676f312e31372e3133856c696e7578000000000000f8ccc0c080b84169807e4d7934803decfde330167e444ec323431e1ff4cd70f40f2e79f24ce91f60340b99f97e3562ee57389e2c72343a74379e0b8b7ca5237ec141e84278bb3e00f8418e3e8af95497b7f6ffe7d3c4cbfbbdb06b26f6f3e913ca2cb7dff23532eaf3eb9f3b06ae75498c88353d279cf58fb0570736e2aa20cf53381722b6485f0f3c8180f8418e3fffffffffffffffffffffffffffb0005d23be939b9f8135e6b1ff283baff985c1b6ccacf2b6aa7fbd8939c4b6178b1d242b574a614b6347182a3b3195258080', gasUsed: '0x1', @@ -46,12 +53,15 @@ describe('block', () => { { "baseFeePerGas": 0n, "blobGasUsed": undefined, + "difficulty": undefined, "excessBlobGas": undefined, "extraData": "0xd983010700846765746889676f312e31372e3133856c696e7578000000000000f8ccc0c080b84169807e4d7934803decfde330167e444ec323431e1ff4cd70f40f2e79f24ce91f60340b99f97e3562ee57389e2c72343a74379e0b8b7ca5237ec141e84278bb3e00f8418e3e8af95497b7f6ffe7d3c4cbfbbdb06b26f6f3e913ca2cb7dff23532eaf3eb9f3b06ae75498c88353d279cf58fb0570736e2aa20cf53381722b6485f0f3c8180f8418e3fffffffffffffffffffffffffffb0005d23be939b9f8135e6b1ff283baff985c1b6ccacf2b6aa7fbd8939c4b6178b1d242b574a614b6347182a3b3195258080", + "gasLimit": undefined, "gasUsed": 1n, "hash": "0xac8c9bc3b84e103dc321bbe83b670e425ff68bfc9a333a4f1b1b204ad11c583d", "logsBloom": "0x02004000004200000000000000800020000000000000400002040000002020000000802000000000000180000001000020800000000000000000000000000000000000000022000260000008000800000000000000000000000000000000000000000008000410002100000140000800000044c00200000000400010000800008800000080000000000010000040000000000000000000000000000000800020028000000100000000000000000000002002881000000000000800020000040020900402020000180000000000000040000800000011020090002000400000200010002000001000000000000080000000000000000000000000000004000000", "miner": "0xe267d978037b89db06c6a5fcf82fad8297e290ff", + "nonce": null, "number": 2n, "parentHash": "0xf6e57c99be5a81167bcb7bdf8d55572235384182c71635857ace2c04d25294ed", "randomness": { @@ -73,6 +83,13 @@ describe('block', () => { expect( block.format({ baseFeePerGas: '0x0', + blobGasUsed: '0x0', + difficulty: '0x0', + excessBlobGas: '0x0', + gasLimit: '0x0', + nonce: '0x1', + sealFields: ['0x0'], + sha3Uncles: '0x0', extraData: '0xd983010700846765746889676f312e31372e3133856c696e7578000000000000f8ccc0c080b84169807e4d7934803decfde330167e444ec323431e1ff4cd70f40f2e79f24ce91f60340b99f97e3562ee57389e2c72343a74379e0b8b7ca5237ec141e84278bb3e00f8418e3e8af95497b7f6ffe7d3c4cbfbbdb06b26f6f3e913ca2cb7dff23532eaf3eb9f3b06ae75498c88353d279cf58fb0570736e2aa20cf53381722b6485f0f3c8180f8418e3fffffffffffffffffffffffffffb0005d23be939b9f8135e6b1ff283baff985c1b6ccacf2b6aa7fbd8939c4b6178b1d242b574a614b6347182a3b3195258080', gasUsed: '0x1', @@ -155,12 +172,15 @@ describe('block', () => { { "baseFeePerGas": 0n, "blobGasUsed": undefined, + "difficulty": undefined, "excessBlobGas": undefined, "extraData": "0xd983010700846765746889676f312e31372e3133856c696e7578000000000000f8ccc0c080b84169807e4d7934803decfde330167e444ec323431e1ff4cd70f40f2e79f24ce91f60340b99f97e3562ee57389e2c72343a74379e0b8b7ca5237ec141e84278bb3e00f8418e3e8af95497b7f6ffe7d3c4cbfbbdb06b26f6f3e913ca2cb7dff23532eaf3eb9f3b06ae75498c88353d279cf58fb0570736e2aa20cf53381722b6485f0f3c8180f8418e3fffffffffffffffffffffffffffb0005d23be939b9f8135e6b1ff283baff985c1b6ccacf2b6aa7fbd8939c4b6178b1d242b574a614b6347182a3b3195258080", + "gasLimit": undefined, "gasUsed": 1n, "hash": "0xac8c9bc3b84e103dc321bbe83b670e425ff68bfc9a333a4f1b1b204ad11c583d", "logsBloom": "0x02004000004200000000000000800020000000000000400002040000002020000000802000000000000180000001000020800000000000000000000000000000000000000022000260000008000800000000000000000000000000000000000000000008000410002100000140000800000044c00200000000400010000800008800000080000000000010000040000000000000000000000000000000800020028000000100000000000000000000002002881000000000000800020000040020900402020000180000000000000040000800000011020090002000400000200010002000001000000000000080000000000000000000000000000004000000", "miner": "0xe267d978037b89db06c6a5fcf82fad8297e290ff", + "nonce": null, "number": 2n, "parentHash": "0xf6e57c99be5a81167bcb7bdf8d55572235384182c71635857ace2c04d25294ed", "randomness": { @@ -272,12 +292,15 @@ describe('block', () => { { "baseFeePerGas": null, "blobGasUsed": undefined, + "difficulty": 0n, "epochSnarkData": null, "excessBlobGas": undefined, + "gasLimit": 20000000n, "gasUsed": 5045322n, "hash": "0xac8c9bc3b84e103dc321bbe83b670e425ff68bfc9a333a4f1b1b204ad11c583d", "logsBloom": "0x02004000004200000000000000800020000000000000400002040000002020000000802000000000000180000001000020800000000000000000000000000000000000000022000260000008000800000000000000000000000000000000000000000008000410002100000140000800000044c00200000000400010000800008800000080000000000010000040000000000000000000000000000000800020028000000100000000000000000000002002881000000000000800020000040020900402020000180000000000000040000800000011020090002000400000200010002000001000000000000080000000000000000000000000000004000000", "miner": "0xe267d978037b89db06c6a5fcf82fad8297e290ff", + "nonce": null, "number": 16645775n, "parentHash": "0xf6e57c99be5a81167bcb7bdf8d55572235384182c71635857ace2c04d25294ed", "randomness": { @@ -524,6 +547,60 @@ describe('transaction', () => { "yParity": 1, } `) + + expect( + transaction.format({ + blockHash: + '0xd981071322be9757dc3b5479a84d61b4f1f5dd2d44ecb66463be6cfc8246f574', + blockNumber: '0x1', + from: '0xacd03d601e5bb1b275bb94076ff46ed9d753435a', + gas: '0x69', + hash: '0x64241d12d64bb6106a9e818d83d4c9f5d49ebef3c6180e58979bf5894461f822', + input: '0x', + maxFeePerGas: '0x1', + maxPriorityFeePerGas: '0x2', + nonce: '0x3', + r: '0xf5272819865bb23110822bedd12b4f14a9b89ca113e280d40ec06c83d126090e', + s: '0xaaa4249c6b174d714cd6d1eaf1a15a9549769addfcc6d846524f1f8ce38178a', + sourceHash: '0x', + mint: '0x12f', + isSystemTx: false, + to: '0xeb610a69341aace81ed810ed42428249512378cd', + transactionIndex: '0x4', + type: '0x7e', + v: '0x1', + value: '0x69', + yParity: '0x1', + }), + ).toMatchInlineSnapshot(` + { + "accessList": [], + "blockHash": "0xd981071322be9757dc3b5479a84d61b4f1f5dd2d44ecb66463be6cfc8246f574", + "blockNumber": 1n, + "chainId": 1, + "from": "0xacd03d601e5bb1b275bb94076ff46ed9d753435a", + "gas": 105n, + "gasPrice": undefined, + "hash": "0x64241d12d64bb6106a9e818d83d4c9f5d49ebef3c6180e58979bf5894461f822", + "input": "0x", + "isSystemTx": false, + "maxFeePerBlobGas": undefined, + "maxFeePerGas": 1n, + "maxPriorityFeePerGas": 2n, + "mint": 303n, + "nonce": 3, + "r": "0xf5272819865bb23110822bedd12b4f14a9b89ca113e280d40ec06c83d126090e", + "s": "0xaaa4249c6b174d714cd6d1eaf1a15a9549769addfcc6d846524f1f8ce38178a", + "sourceHash": "0x", + "to": "0xeb610a69341aace81ed810ed42428249512378cd", + "transactionIndex": 4, + "type": "deposit", + "typeHex": "0x7e", + "v": 1n, + "value": 105n, + "yParity": 1, + } + `) }) test('action', async () => { diff --git a/src/celo/formatters.ts b/src/celo/formatters.ts index ad1e3a9cab..7bf1d6e114 100644 --- a/src/celo/formatters.ts +++ b/src/celo/formatters.ts @@ -1,5 +1,4 @@ import type { ChainFormatters } from '../types/chain.js' -import type { Hash } from '../types/misc.js' import type { RpcTransaction } from '../types/rpc.js' import { hexToBigInt } from '../utils/encoding/fromHex.js' import { defineBlock } from '../utils/formatters/block.js' @@ -9,7 +8,8 @@ import { } from '../utils/formatters/transaction.js' import { defineTransactionRequest } from '../utils/formatters/transactionRequest.js' import type { - CeloBlockOverrides, + CeloBlock, + CeloRpcBlock, CeloRpcTransaction, CeloRpcTransactionRequest, CeloTransaction, @@ -19,37 +19,37 @@ import { isCIP64 } from './utils.js' export const formatters = { block: /*#__PURE__*/ defineBlock({ - exclude: ['difficulty', 'gasLimit', 'mixHash', 'nonce', 'uncles'], - format( - args: CeloBlockOverrides & { - transactions: readonly Hash[] | readonly CeloRpcTransaction[] - }, - ): CeloBlockOverrides & { - transactions: readonly Hash[] | readonly CeloTransaction[] - } { + format(args: CeloRpcBlock): CeloBlock { const transactions = args.transactions?.map((transaction) => { if (typeof transaction === 'string') return transaction + const formatted = formatTransaction(transaction as RpcTransaction) return { - ...formatTransaction(transaction as RpcTransaction), - feeCurrency: transaction.feeCurrency, - ...(transaction.type !== '0x7b' + ...formatted, + ...(transaction.gatewayFee ? { - gatewayFee: transaction.gatewayFee - ? hexToBigInt(transaction.gatewayFee) - : null, - gatewayFeeRecipient: transaction.gatewayFeeRecipient || null, + gatewayFee: hexToBigInt(transaction.gatewayFee), + gatewayFeeRecipient: transaction.gatewayFeeRecipient, } : {}), + feeCurrency: transaction.feeCurrency, } - }) as readonly Hash[] | readonly CeloTransaction[] + }) return { - randomness: args.randomness, transactions, - } + ...(args.randomness ? { randomness: args.randomness } : {}), + } as CeloBlock }, }), transaction: /*#__PURE__*/ defineTransaction({ format(args: CeloRpcTransaction): CeloTransaction { + if (args.type === '0x7e') + return { + isSystemTx: args.isSystemTx, + mint: args.mint ? hexToBigInt(args.mint) : undefined, + sourceHash: args.sourceHash, + type: 'deposit', + } as CeloTransaction + const transaction = { feeCurrency: args.feeCurrency } as CeloTransaction if (args.type === '0x7b') transaction.type = 'cip64' @@ -65,13 +65,11 @@ export const formatters = { return transaction }, }), - transactionRequest: /*#__PURE__*/ defineTransactionRequest({ format(args: CeloTransactionRequest): CeloRpcTransactionRequest { - const request = { - feeCurrency: args.feeCurrency, - } as CeloRpcTransactionRequest + const request = {} as CeloRpcTransactionRequest + if (args.feeCurrency) request.feeCurrency = args.feeCurrency if (isCIP64(args)) request.type = '0x7b' return request diff --git a/src/celo/index.ts b/src/celo/index.ts index db67a64a90..23a5675261 100644 --- a/src/celo/index.ts +++ b/src/celo/index.ts @@ -10,9 +10,7 @@ export { export type { CeloBlock, - CeloBlockOverrides, CeloRpcBlock, - CeloRpcBlockOverrides, CeloRpcTransaction, CeloRpcTransactionRequest, CeloTransaction, diff --git a/src/celo/parsers.test.ts b/src/celo/parsers.test.ts index cce55a6436..0b55ca73a2 100644 --- a/src/celo/parsers.test.ts +++ b/src/celo/parsers.test.ts @@ -371,3 +371,17 @@ describe('should throw an error for invalid cip64 transactions', () => { `) }) }) + +describe('should be able to parse op-stack transactions', () => { + test('parsing an op deposit transaction', () => { + const parsed = parseTransaction( + '0x7ef83ca018040f35752170c3339ddcd850f185c9cc46bdef4d6e1f2ab323f4d3d710431994977f82a600a1414e583f7f13623f1ac5d58b1c0b808080808080', + ) + expect(parsed).toEqual({ + from: '0x977f82a600a1414e583f7f13623f1ac5d58b1c0b', + sourceHash: + '0x18040f35752170c3339ddcd850f185c9cc46bdef4d6e1f2ab323f4d3d7104319', + type: 'deposit', + }) + }) +}) diff --git a/src/celo/parsers.ts b/src/celo/parsers.ts index a94b8ab4fb..561b5630b1 100644 --- a/src/celo/parsers.ts +++ b/src/celo/parsers.ts @@ -1,3 +1,4 @@ +import type { OpStackTransactionSerialized } from '../chains/index.js' import { InvalidSerializedTransactionError } from '../errors/transaction.js' import type { Hex } from '../types/misc.js' import type { ExactPartial } from '../types/utils.js' @@ -9,7 +10,6 @@ import type { GetSerializedTransactionType } from '../utils/transaction/getSeria import { type ParseTransactionReturnType as ParseTransactionReturnType_, parseAccessList, - parseTransaction as parseTransaction_, toTransactionArray, } from '../utils/transaction/parseTransaction.js' import { @@ -25,6 +25,8 @@ import type { TransactionSerializedCIP64, } from './types.js' +import { parseTransaction as parseTransaction_op } from '../op-stack/parsers.js' + export type ParseTransactionReturnType< TSerialized extends CeloTransactionSerialized = CeloTransactionSerialized, TType extends CeloTransactionType = GetSerializedTransactionType, @@ -47,8 +49,8 @@ export function parseTransaction( serializedTransaction as TransactionSerializedCIP64, ) as ParseTransactionReturnType - return parseTransaction_( - serializedTransaction, + return parseTransaction_op( + serializedTransaction as OpStackTransactionSerialized, ) as ParseTransactionReturnType } diff --git a/src/celo/serializers.test.ts b/src/celo/serializers.test.ts index 16a6d9df9c..7ec8bcad28 100644 --- a/src/celo/serializers.test.ts +++ b/src/celo/serializers.test.ts @@ -18,6 +18,8 @@ import type { TransactionSerializableCIP64, } from './types.js' +import type { TransactionSerializableDeposit } from '../op-stack/types/transaction.js' + const commonBaseTx = { to: accounts[0].address, chainId: 42220, @@ -344,3 +346,20 @@ describe('not cip42', () => { }) }) }) + +describe('op-stack based transactions', () => { + test('serializes deposit transactions', () => { + const opDepositTransaction = { + from: '0x977f82a600a1414e583f7f13623f1ac5d58b1c0b', + sourceHash: + '0x18040f35752170c3339ddcd850f185c9cc46bdef4d6e1f2ab323f4d3d7104319', + type: 'deposit', + } as const satisfies TransactionSerializableDeposit + + const serialized = serializeTransaction(opDepositTransaction) + expect(serialized.startsWith('0x7e')).toBe(true) + expect(serialized).toEqual( + '0x7ef83ca018040f35752170c3339ddcd850f185c9cc46bdef4d6e1f2ab323f4d3d710431994977f82a600a1414e583f7f13623f1ac5d58b1c0b808080808080', + ) + }) +}) diff --git a/src/celo/serializers.ts b/src/celo/serializers.ts index b126d0c325..3c1cb0fce7 100644 --- a/src/celo/serializers.ts +++ b/src/celo/serializers.ts @@ -2,6 +2,7 @@ import { InvalidAddressError } from '../errors/address.js' import { BaseError } from '../errors/base.js' import { InvalidChainIdError } from '../errors/chain.js' import { FeeCapTooHighError, TipAboveFeeCapError } from '../errors/node.js' +import { serializeTransaction as serializeTransaction_op } from '../op-stack/serializers.js' import type { ChainSerializers } from '../types/chain.js' import type { Signature } from '../types/misc.js' import { isAddress } from '../utils/address/isAddress.js' @@ -9,10 +10,7 @@ import { concatHex } from '../utils/data/concat.js' import { toHex } from '../utils/encoding/toHex.js' import { toRlp } from '../utils/encoding/toRlp.js' import { serializeAccessList } from '../utils/transaction/serializeAccessList.js' -import { - serializeTransaction as serializeTransaction_, - toYParitySignatureArray, -} from '../utils/transaction/serializeTransaction.js' +import { toYParitySignatureArray } from '../utils/transaction/serializeTransaction.js' import type { CeloTransactionSerializable, TransactionSerializableCIP42, @@ -27,7 +25,7 @@ export function serializeTransaction( ) { if (isCIP64(transaction)) return serializeTransactionCIP64(transaction, signature) - return serializeTransaction_(transaction, signature) + return serializeTransaction_op(transaction, signature) } export const serializers = { diff --git a/src/celo/types.ts b/src/celo/types.ts index 3f869dcabc..7202d3fa09 100644 --- a/src/celo/types.ts +++ b/src/celo/types.ts @@ -21,75 +21,90 @@ import type { Transaction as core_Transaction, TransactionRequest as core_TransactionRequest, } from '../types/transaction.js' -import type { ExactPartial, NeverBy, OneOf } from '../types/utils.js' - -type CeloBlockExclude = - | 'difficulty' - | 'gasLimit' - | 'mixHash' - | 'nonce' - | 'uncles' - -export type CeloBlockOverrides = { - randomness: { - committed: Hex - revealed: Hex - } -} +import type { Assign, ExactPartial, OneOf } from '../types/utils.js' + +import type { + OpStackDepositTransaction, + OpStackRpcTransaction, + TransactionSerializableDeposit, + TransactionSerializedDeposit, +} from '../op-stack/types/transaction.js' export type CeloBlock< includeTransactions extends boolean = boolean, blockTag extends BlockTag = BlockTag, -> = NeverBy< +> = Assign< Block< bigint, includeTransactions, blockTag, CeloTransaction >, - CeloBlockExclude -> & - CeloBlockOverrides - -export type CeloRpcBlockOverrides = { - randomness: { - committed: Hex - revealed: Hex + { + difficulty?: bigint | undefined + gasLimit?: bigint | undefined + mixHash?: undefined + nonce?: bigint | null + randomness?: + | { + committed: Hex + revealed: Hex + } + | undefined + uncles?: undefined } -} +> + export type CeloRpcBlock< blockTag extends BlockTag = BlockTag, includeTransactions extends boolean = boolean, -> = NeverBy< +> = Assign< RpcBlock< blockTag, includeTransactions, RpcTransaction >, - CeloBlockExclude -> & - CeloRpcBlockOverrides + { + difficulty?: Hex | undefined + mixHash?: undefined + nonce?: Hex | null + gasLimit?: Hex | undefined + randomness?: + | { + committed: Hex + revealed: Hex + } + | undefined + uncles?: undefined + } +> -export type CeloRpcTransaction = +export type CeloRpcTransaction = OneOf< | RpcTransaction | RpcTransactionCIP42 | RpcTransactionCIP64 + | OpStackRpcTransaction +> -export type CeloRpcTransactionRequest = - | RpcTransactionRequest - | RpcTransactionRequestCIP64 +export type CeloRpcTransactionRequest = OneOf< + RpcTransactionRequest | RpcTransactionRequestCIP64 +> -export type CeloTransaction = +export type CeloTransaction = OneOf< | Transaction | TransactionCIP42 | TransactionCIP64 + | OpStackDepositTransaction +> -export type CeloTransactionRequest = - | TransactionRequest - | TransactionRequestCIP64 +export type CeloTransactionRequest = OneOf< + TransactionRequest | TransactionRequestCIP64 +> export type CeloTransactionSerializable = OneOf< - TransactionSerializable | TransactionSerializableCIP64 + | TransactionSerializable + | TransactionSerializableCIP64 + | TransactionSerializableDeposit > export type CeloTransactionSerialized< @@ -98,6 +113,7 @@ export type CeloTransactionSerialized< | TransactionSerialized | TransactionSerializedCIP42 | TransactionSerializedCIP64 + | TransactionSerializedDeposit export type CeloTransactionType = TransactionType | 'cip42' | 'cip64' @@ -116,6 +132,8 @@ export type RpcTransactionCIP42 = Omit< TransactionBase, 'typeHex' > & { + accessList: AccessList + chainId: Index feeCurrency: Address | null gatewayFee: Hex | null gatewayFeeRecipient: Address | null @@ -126,9 +144,9 @@ export type RpcTransactionCIP64 = Omit< TransactionBase, 'typeHex' > & { + accessList: AccessList + chainId: Index feeCurrency: Address | null - gatewayFee?: undefined - gatewayFeeRecipient?: undefined type: '0x7b' } & FeeValuesEIP1559 @@ -147,25 +165,27 @@ type Transaction = core_Transaction< isPending > & { feeCurrency: Address | null - gatewayFee?: undefined - gatewayFeeRecipient?: undefined } export type TransactionCIP42 = - TransactionBase & { - feeCurrency: Address | null - gatewayFee: bigint | null - gatewayFeeRecipient: Address | null - type: 'cip42' - } & FeeValuesEIP1559 + TransactionBase & + FeeValuesEIP1559 & { + accessList: AccessList + chainId: number + feeCurrency: Address | null + gatewayFee: bigint | null + gatewayFeeRecipient: Address | null + type: 'cip42' + } export type TransactionCIP64 = - TransactionBase & { - feeCurrency: Address | null - gatewayFee?: undefined - gatewayFeeRecipient?: undefined - type: 'cip64' - } & FeeValuesEIP1559 + TransactionBase & + FeeValuesEIP1559 & { + accessList: AccessList + chainId: number + feeCurrency: Address | null + type: 'cip64' + } type TransactionRequest = core_TransactionRequest & { feeCurrency?: Address | undefined diff --git a/src/chains/index.ts b/src/chains/index.ts index 4acf8b8481..aa964f3934 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -316,9 +316,7 @@ export type { } from '../types/utils.js' export type { CeloBlock, - CeloBlockOverrides, CeloRpcBlock, - CeloRpcBlockOverrides, CeloRpcTransaction, CeloRpcTransactionRequest, CeloTransaction, @@ -368,9 +366,7 @@ export type { } from '../op-stack/types/transaction.js' export type { ZkSyncBlock, - ZkSyncBlockOverrides, ZkSyncRpcBlock, - ZkSyncRpcBlockOverrides, } from '../zksync/types/block.js' export type { ChainEIP712 } from '../zksync/types/chain.js' export type { ZkSyncEip712Meta } from '../zksync/types/eip712.js' diff --git a/src/op-stack/formatters.test-d.ts b/src/op-stack/formatters.test-d.ts index 29878432d7..ebc95f1ece 100644 --- a/src/op-stack/formatters.test-d.ts +++ b/src/op-stack/formatters.test-d.ts @@ -7,21 +7,13 @@ import { optimism } from '../chains/index.js' import { createPublicClient } from '../clients/createPublicClient.js' import { http } from '../clients/transports/http.js' import type { Hash } from '../types/misc.js' -import type { RpcBlock } from '../types/rpc.js' -import type { Assign, ExactPartial } from '../types/utils.js' import { formatters } from './formatters.js' -import type { OpStackRpcBlockOverrides } from './types/block.js' -import type { OpStackRpcTransaction } from './types/transaction.js' +import type { OpStackRpcBlock } from './types/block.js' describe('block', () => { - expectTypeOf(formatters.block.format).parameter(0).toEqualTypeOf< - Assign< - ExactPartial, - OpStackRpcBlockOverrides & { - transactions: `0x${string}`[] | OpStackRpcTransaction[] - } - > - >() + expectTypeOf(formatters.block.format) + .parameter(0) + .toEqualTypeOf() }) describe('transaction', () => { diff --git a/src/op-stack/formatters.test.ts b/src/op-stack/formatters.test.ts index f582879f20..826be0bbf6 100644 --- a/src/op-stack/formatters.test.ts +++ b/src/op-stack/formatters.test.ts @@ -17,7 +17,11 @@ describe('block', () => { expect( block.format({ baseFeePerGas: '0x1', + blobGasUsed: '0x0', + excessBlobGas: '0x0', + sealFields: ['0x0'], difficulty: '0x0', + extraData: '0x', gasLimit: '0x420', gasUsed: '0x69', hash: '0x40b65fabd4bdda5bb716b1a39e761d76a968d5cc54d887d05b47ac6c2c298846', @@ -177,6 +181,10 @@ describe('block', () => { block.format({ baseFeePerGas: '0x1', difficulty: '0x0', + blobGasUsed: '0x0', + excessBlobGas: '0x0', + sealFields: ['0x0'], + extraData: '0x0', gasLimit: '0x420', gasUsed: '0x69', hash: '0x40b65fabd4bdda5bb716b1a39e761d76a968d5cc54d887d05b47ac6c2c298846', @@ -389,11 +397,9 @@ describe('transaction (deposit)', () => { expect( transaction.format({ - accessList: [], blockHash: '0xd981071322be9757dc3b5479a84d61b4f1f5dd2d44ecb66463be6cfc8246f574', blockNumber: '0x1', - chainId: '0x1', from: '0xacd03d601e5bb1b275bb94076ff46ed9d753435a', gas: '0x69', hash: '0x64241d12d64bb6106a9e818d83d4c9f5d49ebef3c6180e58979bf5894461f822', diff --git a/src/op-stack/formatters.ts b/src/op-stack/formatters.ts index 18bd9c7932..051783d3f2 100644 --- a/src/op-stack/formatters.ts +++ b/src/op-stack/formatters.ts @@ -1,5 +1,4 @@ import type { ChainFormatters } from '../types/chain.js' -import type { Hash } from '../types/misc.js' import type { RpcTransaction } from '../types/rpc.js' import { hexToBigInt } from '../utils/encoding/fromHex.js' import { defineBlock } from '../utils/formatters/block.js' @@ -8,26 +7,17 @@ import { formatTransaction, } from '../utils/formatters/transaction.js' import { defineTransactionReceipt } from '../utils/formatters/transactionReceipt.js' -import type { - OpStackBlockOverrides, - OpStackRpcBlockOverrides, -} from './types/block.js' +import type { OpStackBlock, OpStackRpcBlock } from './types/block.js' import type { OpStackRpcTransaction, - OpStackRpcTransactionReceiptOverrides, + OpStackRpcTransactionReceipt, OpStackTransaction, - OpStackTransactionReceiptOverrides, + OpStackTransactionReceipt, } from './types/transaction.js' export const formatters = { block: /*#__PURE__*/ defineBlock({ - format( - args: OpStackRpcBlockOverrides & { - transactions: Hash[] | OpStackRpcTransaction[] - }, - ): OpStackBlockOverrides & { - transactions: Hash[] | OpStackTransaction[] - } { + format(args: OpStackRpcBlock): OpStackBlock { const transactions = args.transactions?.map((transaction) => { if (typeof transaction === 'string') return transaction const formatted = formatTransaction( @@ -42,11 +32,11 @@ export const formatters = { formatted.type = 'deposit' } return formatted - }) as Hash[] | OpStackTransaction[] + }) return { transactions, stateRoot: args.stateRoot, - } + } as OpStackBlock }, }), transaction: /*#__PURE__*/ defineTransaction({ @@ -62,15 +52,13 @@ export const formatters = { }, }), transactionReceipt: /*#__PURE__*/ defineTransactionReceipt({ - format( - args: OpStackRpcTransactionReceiptOverrides, - ): OpStackTransactionReceiptOverrides { + format(args: OpStackRpcTransactionReceipt): OpStackTransactionReceipt { return { l1GasPrice: args.l1GasPrice ? hexToBigInt(args.l1GasPrice) : null, l1GasUsed: args.l1GasUsed ? hexToBigInt(args.l1GasUsed) : null, l1Fee: args.l1Fee ? hexToBigInt(args.l1Fee) : null, l1FeeScalar: args.l1FeeScalar ? Number(args.l1FeeScalar) : null, - } + } as OpStackTransactionReceipt }, }), } as const satisfies ChainFormatters diff --git a/src/op-stack/types/transaction.ts b/src/op-stack/types/transaction.ts index 6dbe4fef9a..898333fa01 100644 --- a/src/op-stack/types/transaction.ts +++ b/src/op-stack/types/transaction.ts @@ -32,9 +32,9 @@ export type OpStackRpcDepositTransaction = sourceHash: Hex type: '0x7e' } -export type OpStackRpcTransaction = - | RpcTransaction - | OpStackRpcDepositTransaction +export type OpStackRpcTransaction = OneOf< + RpcTransaction | OpStackRpcDepositTransaction +> export type OpStackRpcTransactionReceiptOverrides = { l1GasPrice: Hex | null diff --git a/src/types/utils.ts b/src/types/utils.ts index 70efdb7462..18d3d1dc97 100644 --- a/src/types/utils.ts +++ b/src/types/utils.ts @@ -139,17 +139,6 @@ type Assign_ = { : K]: K extends keyof U ? U[K] : T[K] } -/** - * @description Make properties K of type T never. - * - * @example - * NeverBy<{ a: string, b: boolean, c: number }, 'a' | 'c'> - * => { a: never, b: boolean, c: never } - */ -export type NeverBy = { - [U in keyof T]: U extends K ? never : T[U] -} - // TODO: Remove when peer dep `typescript@>=4.5` (NoInfer is native) export type NoInfer = [type][type extends any ? 0 : never] diff --git a/src/utils/formatters/formatter.ts b/src/utils/formatters/formatter.ts index fcd4ab4fe7..3f830a6a55 100644 --- a/src/utils/formatters/formatter.ts +++ b/src/utils/formatters/formatter.ts @@ -1,5 +1,5 @@ import type { ErrorType } from '../../errors/utils.js' -import type { Assign, Prettify } from '../../types/utils.js' +import type { Prettify } from '../../types/utils.js' export type DefineFormatterErrorType = ErrorType @@ -20,7 +20,7 @@ export function defineFormatter( }) => { return { exclude, - format: (args: Assign) => { + format: (args: TOverrideParameters) => { const formatted = format(args as any) if (exclude) { for (const key of exclude) { @@ -30,7 +30,7 @@ export function defineFormatter( return { ...formatted, ...overrides(args), - } as Prettify> & { + } as Prettify & { [_key in TExclude[number]]: never } }, diff --git a/src/zksync/formatters.test-d.ts b/src/zksync/formatters.test-d.ts index 8e2a5eae15..fc296227e1 100644 --- a/src/zksync/formatters.test-d.ts +++ b/src/zksync/formatters.test-d.ts @@ -14,30 +14,19 @@ import { createWalletClient } from '../clients/createWalletClient.js' import { http } from '../clients/transports/http.js' import type { Log } from '../types/log.js' import type { Hash } from '../types/misc.js' -import type { RpcBlock, RpcTransactionReceipt } from '../types/rpc.js' -import type { TransactionRequest } from '../types/transaction.js' -import type { Assign, ExactPartial } from '../types/utils.js' import { formatters } from './formatters.js' +import type { ZkSyncRpcBlock } from './types/block.js' import type { ZkSyncEip712Meta } from './types/eip712.js' import type { ZkSyncL2ToL1Log, ZkSyncLog } from './types/log.js' import type { - ZkSyncRpcTransaction, - ZkSyncRpcTransactionReceiptOverrides, + ZkSyncRpcTransactionReceipt, ZkSyncTransactionRequest, } from './types/transaction.js' describe('block', () => { - expectTypeOf(formatters.block.format).parameter(0).toEqualTypeOf< - Assign< - ExactPartial, - { - l1BatchNumber: `0x${string}` | null - l1BatchTimestamp: `0x${string}` | null - } & { - transactions: `0x${string}`[] | ZkSyncRpcTransaction[] - } - > - >() + expectTypeOf(formatters.block.format) + .parameter(0) + .toEqualTypeOf() expectTypeOf['l1BatchNumber']>() .toEqualTypeOf expectTypeOf['l1BatchTimestamp']>() @@ -47,12 +36,7 @@ describe('block', () => { describe('transactionReceipt', () => { expectTypeOf(formatters.transactionReceipt.format) .parameter(0) - .toEqualTypeOf< - Assign< - ExactPartial, - ZkSyncRpcTransactionReceiptOverrides - > - >() + .toEqualTypeOf() expectTypeOf< ReturnType['l1BatchNumber'] @@ -116,9 +100,7 @@ describe('transactionReceipt', () => { describe('transactionRequest', () => { expectTypeOf(formatters.transactionRequest.format) .parameter(0) - .toEqualTypeOf< - Assign, ZkSyncTransactionRequest> - >() + .toEqualTypeOf() expectTypeOf< ReturnType['eip712Meta'] >().toEqualTypeOf() diff --git a/src/zksync/formatters.test.ts b/src/zksync/formatters.test.ts index 302502e329..f4aa149a98 100644 --- a/src/zksync/formatters.test.ts +++ b/src/zksync/formatters.test.ts @@ -13,6 +13,8 @@ describe('block', () => { expect( block.format({ + blobGasUsed: '0x0', + excessBlobGas: '0x0', hash: '0x288c26fa1cc1814b638f3010f20d17fc5d1a2667fb5aa1dd6354ad889fa335b4', parentHash: '0xb1f996bdcc7c1f1893b016bd47150a846ac1e11f443d23df4cbc7c36fa1d4ae1', @@ -82,6 +84,8 @@ describe('block', () => { expect( block.format({ + blobGasUsed: '0x0', + excessBlobGas: '0x0', hash: '0xfd73aaef0e91fcd6c171056b235a2b0f17650dcbe17038d17f76bbf3980c4da2', parentHash: '0x4adced86c99c6a0db3288bcb1c99ab984f2c51ecf5b9efa243ca029b86ce1476', @@ -199,6 +203,8 @@ describe('block', () => { expect( block.format({ + blobGasUsed: '0x0', + excessBlobGas: '0x0', hash: '0x288c26fa1cc1814b638f3010f20d17fc5d1a2667fb5aa1dd6354ad889fa335b4', parentHash: '0xb1f996bdcc7c1f1893b016bd47150a846ac1e11f443d23df4cbc7c36fa1d4ae1', diff --git a/src/zksync/formatters.ts b/src/zksync/formatters.ts index d6d37d30ec..65a0d63d6c 100644 --- a/src/zksync/formatters.ts +++ b/src/zksync/formatters.ts @@ -1,5 +1,4 @@ import type { ChainFormatters } from '../types/chain.js' -import type { Hash } from '../types/misc.js' import { hexToBigInt, hexToNumber } from '../utils/encoding/fromHex.js' import { hexToBytes } from '../utils/encoding/toBytes.js' import { toHex } from '../utils/encoding/toHex.js' @@ -9,14 +8,11 @@ import { defineTransaction } from '../utils/formatters/transaction.js' import { defineTransactionReceipt } from '../utils/formatters/transactionReceipt.js' import { defineTransactionRequest } from '../utils/formatters/transactionRequest.js' import { gasPerPubdataDefault } from './constants/number.js' -import type { - ZkSyncBlockOverrides, - ZkSyncRpcBlockOverrides, -} from './types/block.js' +import type { ZkSyncBlock, ZkSyncRpcBlock } from './types/block.js' import type { ZkSyncL2ToL1Log, ZkSyncLog } from './types/log.js' import type { ZkSyncRpcTransaction, - ZkSyncRpcTransactionReceiptOverrides, + ZkSyncRpcTransactionReceipt, ZkSyncRpcTransactionRequest, ZkSyncTransaction, ZkSyncTransactionReceipt, @@ -25,13 +21,7 @@ import type { export const formatters = { block: /*#__PURE__*/ defineBlock({ - format( - args: ZkSyncRpcBlockOverrides & { - transactions: Hash[] | ZkSyncRpcTransaction[] - }, - ): ZkSyncBlockOverrides & { - transactions: Hash[] | ZkSyncTransaction[] - } { + format(args: ZkSyncRpcBlock): ZkSyncBlock { const transactions = args.transactions?.map((transaction) => { if (typeof transaction === 'string') return transaction const formatted = formatters.transaction?.format( @@ -40,7 +30,7 @@ export const formatters = { if (formatted.typeHex === '0x71') formatted.type = 'eip712' else if (formatted.typeHex === '0xff') formatted.type = 'priority' return formatted - }) as Hash[] | ZkSyncTransaction[] + }) return { l1BatchNumber: args.l1BatchNumber ? hexToBigInt(args.l1BatchNumber) @@ -49,7 +39,7 @@ export const formatters = { ? hexToBigInt(args.l1BatchTimestamp) : null, transactions, - } + } as ZkSyncBlock }, }), transaction: /*#__PURE__*/ defineTransaction({ @@ -69,9 +59,7 @@ export const formatters = { }, }), transactionReceipt: /*#__PURE__*/ defineTransactionReceipt({ - format( - args: ZkSyncRpcTransactionReceiptOverrides, - ): ZkSyncTransactionReceipt { + format(args: ZkSyncRpcTransactionReceipt): ZkSyncTransactionReceipt { return { l1BatchNumber: args.l1BatchNumber ? hexToBigInt(args.l1BatchNumber) diff --git a/src/zksync/index.ts b/src/zksync/index.ts index f921661a69..c8fda5edfa 100644 --- a/src/zksync/index.ts +++ b/src/zksync/index.ts @@ -124,9 +124,7 @@ export { serializeTransaction } from './serializers.js' export type { ZkSyncBlock, - ZkSyncBlockOverrides, ZkSyncRpcBlock, - ZkSyncRpcBlockOverrides, } from './types/block.js' export type { ChainEIP712 } from './types/chain.js' export type { diff --git a/src/zksync/types/block.ts b/src/zksync/types/block.ts index 7f6f4baf51..1f8d28c116 100644 --- a/src/zksync/types/block.ts +++ b/src/zksync/types/block.ts @@ -2,6 +2,7 @@ import type { Address } from 'abitype' import type { Block, BlockTag } from '../../types/block.js' import type { Hash, Hex } from '../../types/misc.js' import type { RpcBlock } from '../../types/rpc.js' +import type { Assign } from '../../types/utils.js' import type { ZkSyncRpcTransaction, ZkSyncTransaction } from './transaction.js' export type ZkSyncBatchDetails = Omit< @@ -12,21 +13,21 @@ export type ZkSyncBatchDetails = Omit< l2FairGasPrice: number } -export type ZkSyncBlockOverrides = { - l1BatchNumber: bigint | null - l1BatchTimestamp: bigint | null -} - export type ZkSyncBlock< TIncludeTransactions extends boolean = boolean, TBlockTag extends BlockTag = BlockTag, -> = Block< - bigint, - TIncludeTransactions, - TBlockTag, - ZkSyncTransaction -> & - ZkSyncBlockOverrides +> = Assign< + Block< + bigint, + TIncludeTransactions, + TBlockTag, + ZkSyncTransaction + >, + { + l1BatchNumber: bigint | null + l1BatchTimestamp: bigint | null + } +> export type ZkSyncBlockDetails = { number: number @@ -50,20 +51,20 @@ export type ZkSyncBlockDetails = { protocolVersion?: string } -export type ZkSyncRpcBlockOverrides = { - l1BatchNumber: Hex | null - l1BatchTimestamp: Hex | null -} - export type ZkSyncRpcBlock< TBlockTag extends BlockTag = BlockTag, TIncludeTransactions extends boolean = boolean, -> = RpcBlock< - TBlockTag, - TIncludeTransactions, - ZkSyncRpcTransaction -> & - ZkSyncRpcBlockOverrides +> = Assign< + RpcBlock< + TBlockTag, + TIncludeTransactions, + ZkSyncRpcTransaction + >, + { + l1BatchNumber: Hex | null + l1BatchTimestamp: Hex | null + } +> export type ZkSyncNumberParameter = { number: number diff --git a/src/zksync/types/transaction.ts b/src/zksync/types/transaction.ts index 93e293062b..90a19e5975 100644 --- a/src/zksync/types/transaction.ts +++ b/src/zksync/types/transaction.ts @@ -4,6 +4,7 @@ import type { Hash, Hex } from '../../types/misc.js' import type { Index, Quantity, + RpcTransactionReceipt, RpcTransactionRequest as RpcTransactionRequest_, } from '../../types/rpc.js' import type { @@ -174,6 +175,9 @@ export type ZkSyncRpcTransactionReceiptOverrides = { root: Hex } +export type ZkSyncRpcTransactionReceipt = Omit & + ZkSyncRpcTransactionReceiptOverrides + export type ZkSyncTransactionReceiptOverrides = { l1BatchNumber: bigint | null l1BatchTxIndex: bigint | null From 861d962507cef076ceffa479ba74cd2fade0308c Mon Sep 17 00:00:00 2001 From: Jerray <7lemonsoul@gmail.com> Date: Wed, 3 Jul 2024 05:59:17 +0800 Subject: [PATCH 03/68] fix: chain details for btr mainnet and testnet (#2447) feat: add multicall3 and fix native currency, block explorers for btr mainnet and testnet --- .changeset/silent-penguins-own.md | 5 +++++ src/chains/definitions/btr.ts | 12 +++++++++--- src/chains/definitions/btrTestnet.ts | 16 +++++++++++----- 3 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 .changeset/silent-penguins-own.md diff --git a/.changeset/silent-penguins-own.md b/.changeset/silent-penguins-own.md new file mode 100644 index 0000000000..a71006e52d --- /dev/null +++ b/.changeset/silent-penguins-own.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added multicall3 and fixed native currency, block explorers for btr mainnet and testnet. diff --git a/src/chains/definitions/btr.ts b/src/chains/definitions/btr.ts index 30559c4f57..c3f1bebb9b 100644 --- a/src/chains/definitions/btr.ts +++ b/src/chains/definitions/btr.ts @@ -4,8 +4,8 @@ export const btr = /*#__PURE__*/ defineChain({ id: 200901, name: 'Bitlayer', nativeCurrency: { - name: 'Ether', - symbol: 'ETH', + name: 'Bitcoin', + symbol: 'BTC', decimals: 18, }, rpcUrls: { @@ -20,9 +20,15 @@ export const btr = /*#__PURE__*/ defineChain({ }, blockExplorers: { default: { - name: 'btrscan', + name: 'Bitlayer(BTR) Scan', url: 'https://www.btrscan.com', apiUrl: 'https://www.btrscan.com/apis', }, }, + contracts: { + multicall3: { + address: '0x5b256fe9e993902ece49d138a5b1162cbb529474', + blockCreated: 2421963, + }, + }, }) diff --git a/src/chains/definitions/btrTestnet.ts b/src/chains/definitions/btrTestnet.ts index ac6a567beb..9108752767 100644 --- a/src/chains/definitions/btrTestnet.ts +++ b/src/chains/definitions/btrTestnet.ts @@ -4,8 +4,8 @@ export const btrTestnet = /*#__PURE__*/ defineChain({ id: 200810, name: 'Bitlayer Testnet', nativeCurrency: { - name: 'Ether', - symbol: 'ETH', + name: 'Bitcoin', + symbol: 'BTC', decimals: 18, }, rpcUrls: { @@ -19,9 +19,15 @@ export const btrTestnet = /*#__PURE__*/ defineChain({ }, blockExplorers: { default: { - name: 'btrscan', - url: 'https://testnet-scan.bitlayer.org', - apiUrl: 'https://testnet-scan.bitlayer.org/apis', + name: 'Bitlayer(BTR) Scan', + url: 'https://testnet.btrscan.com/', + apiUrl: 'https://testnet.btrscan.com/apis', + }, + }, + contracts: { + multicall3: { + address: '0x5b256fe9e993902ece49d138a5b1162cbb529474', + blockCreated: 4135671, }, }, testnet: true, From 448ee61e581f7503b92ff2c37fb88f388355afc9 Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 3 Jul 2024 08:02:39 +1000 Subject: [PATCH 04/68] chore: tweak btr --- .changeset/silent-penguins-own.md | 2 +- biome.json | 1 + src/chains/definitions/btr.ts | 7 ------- src/chains/definitions/btrTestnet.ts | 9 +-------- 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/.changeset/silent-penguins-own.md b/.changeset/silent-penguins-own.md index a71006e52d..2ffbc3237d 100644 --- a/.changeset/silent-penguins-own.md +++ b/.changeset/silent-penguins-own.md @@ -2,4 +2,4 @@ "viem": patch --- -Added multicall3 and fixed native currency, block explorers for btr mainnet and testnet. +Tweaked native currency property for `btr` and `btrTestnet` chains. diff --git a/biome.json b/biome.json index 7d954c023f..2aca0c550a 100644 --- a/biome.json +++ b/biome.json @@ -21,6 +21,7 @@ "generated.ts", "vectors/*.json", "vectors/**/*.test.ts", + "wagmi", "site/dist" ] }, diff --git a/src/chains/definitions/btr.ts b/src/chains/definitions/btr.ts index c3f1bebb9b..1da7a4d474 100644 --- a/src/chains/definitions/btr.ts +++ b/src/chains/definitions/btr.ts @@ -22,13 +22,6 @@ export const btr = /*#__PURE__*/ defineChain({ default: { name: 'Bitlayer(BTR) Scan', url: 'https://www.btrscan.com', - apiUrl: 'https://www.btrscan.com/apis', - }, - }, - contracts: { - multicall3: { - address: '0x5b256fe9e993902ece49d138a5b1162cbb529474', - blockCreated: 2421963, }, }, }) diff --git a/src/chains/definitions/btrTestnet.ts b/src/chains/definitions/btrTestnet.ts index 9108752767..f95b9275b1 100644 --- a/src/chains/definitions/btrTestnet.ts +++ b/src/chains/definitions/btrTestnet.ts @@ -20,14 +20,7 @@ export const btrTestnet = /*#__PURE__*/ defineChain({ blockExplorers: { default: { name: 'Bitlayer(BTR) Scan', - url: 'https://testnet.btrscan.com/', - apiUrl: 'https://testnet.btrscan.com/apis', - }, - }, - contracts: { - multicall3: { - address: '0x5b256fe9e993902ece49d138a5b1162cbb529474', - blockCreated: 4135671, + url: 'https://testnet.btrscan.com', }, }, testnet: true, From 25bb83507c8f3b4516168a1611818c501649d4fe Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 3 Jul 2024 08:16:44 +1000 Subject: [PATCH 05/68] tests: update snapshots --- src/actions/public/getBlock.test.ts | 3 +++ src/celo/formatters.test.ts | 31 ++++++++++++++++++----------- src/op-stack/formatters.test.ts | 19 ++++++++++++------ src/zksync/formatters.test.ts | 12 +++++------ 4 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/actions/public/getBlock.test.ts b/src/actions/public/getBlock.test.ts index c11b46e9f0..14631db152 100644 --- a/src/actions/public/getBlock.test.ts +++ b/src/actions/public/getBlock.test.ts @@ -86,12 +86,15 @@ test('chain w/ custom block type', async () => { { "baseFeePerGas": null, "blobGasUsed": undefined, + "difficulty": 0n, "epochSnarkData": null, "excessBlobGas": undefined, + "gasLimit": 20000000n, "gasUsed": 5045322n, "hash": "0xac8c9bc3b84e103dc321bbe83b670e425ff68bfc9a333a4f1b1b204ad11c583d", "logsBloom": "0x02004000004200000000000000800020000000000000400002040000002020000000802000000000000180000001000020800000000000000000000000000000000000000022000260000008000800000000000000000000000000000000000000000008000410002100000140000800000044c00200000000400010000800008800000080000000000010000040000000000000000000000000000000800020028000000100000000000000000000002002881000000000000800020000040020900402020000180000000000000040000800000011020090002000400000200010002000001000000000000080000000000000000000000000000004000000", "miner": "0xe267d978037b89db06c6a5fcf82fad8297e290ff", + "nonce": null, "number": 16645775n, "parentHash": "0xf6e57c99be5a81167bcb7bdf8d55572235384182c71635857ace2c04d25294ed", "randomness": { diff --git a/src/celo/formatters.test.ts b/src/celo/formatters.test.ts index 14061f1ae1..4511f9bedf 100644 --- a/src/celo/formatters.test.ts +++ b/src/celo/formatters.test.ts @@ -52,16 +52,16 @@ describe('block', () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": 0n, - "blobGasUsed": undefined, - "difficulty": undefined, - "excessBlobGas": undefined, + "blobGasUsed": 0n, + "difficulty": 0n, + "excessBlobGas": 0n, "extraData": "0xd983010700846765746889676f312e31372e3133856c696e7578000000000000f8ccc0c080b84169807e4d7934803decfde330167e444ec323431e1ff4cd70f40f2e79f24ce91f60340b99f97e3562ee57389e2c72343a74379e0b8b7ca5237ec141e84278bb3e00f8418e3e8af95497b7f6ffe7d3c4cbfbbdb06b26f6f3e913ca2cb7dff23532eaf3eb9f3b06ae75498c88353d279cf58fb0570736e2aa20cf53381722b6485f0f3c8180f8418e3fffffffffffffffffffffffffffb0005d23be939b9f8135e6b1ff283baff985c1b6ccacf2b6aa7fbd8939c4b6178b1d242b574a614b6347182a3b3195258080", - "gasLimit": undefined, + "gasLimit": 0n, "gasUsed": 1n, "hash": "0xac8c9bc3b84e103dc321bbe83b670e425ff68bfc9a333a4f1b1b204ad11c583d", "logsBloom": "0x02004000004200000000000000800020000000000000400002040000002020000000802000000000000180000001000020800000000000000000000000000000000000000022000260000008000800000000000000000000000000000000000000000008000410002100000140000800000044c00200000000400010000800008800000080000000000010000040000000000000000000000000000000800020028000000100000000000000000000002002881000000000000800020000040020900402020000180000000000000040000800000011020090002000400000200010002000001000000000000080000000000000000000000000000004000000", "miner": "0xe267d978037b89db06c6a5fcf82fad8297e290ff", - "nonce": null, + "nonce": "0x1", "number": 2n, "parentHash": "0xf6e57c99be5a81167bcb7bdf8d55572235384182c71635857ace2c04d25294ed", "randomness": { @@ -69,6 +69,10 @@ describe('block', () => { "revealed": "0xe10b5f01b0376fdc9151f66992f8c1b990083acabc14ec1b04f6a53ad804db88", }, "receiptsRoot": "0xca8aabc507534e45c982aa43e38118fc6f9cf222800e3d703a6e299a2e661f2a", + "sealFields": [ + "0x0", + ], + "sha3Uncles": "0x0", "size": 3n, "stateRoot": "0x051c8e40ed3d8afabbad5321a4bb6b9d686a8a62d9b696b3e5a5c769c3623d48", "timestamp": 4n, @@ -171,16 +175,16 @@ describe('block', () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": 0n, - "blobGasUsed": undefined, - "difficulty": undefined, - "excessBlobGas": undefined, + "blobGasUsed": 0n, + "difficulty": 0n, + "excessBlobGas": 0n, "extraData": "0xd983010700846765746889676f312e31372e3133856c696e7578000000000000f8ccc0c080b84169807e4d7934803decfde330167e444ec323431e1ff4cd70f40f2e79f24ce91f60340b99f97e3562ee57389e2c72343a74379e0b8b7ca5237ec141e84278bb3e00f8418e3e8af95497b7f6ffe7d3c4cbfbbdb06b26f6f3e913ca2cb7dff23532eaf3eb9f3b06ae75498c88353d279cf58fb0570736e2aa20cf53381722b6485f0f3c8180f8418e3fffffffffffffffffffffffffffb0005d23be939b9f8135e6b1ff283baff985c1b6ccacf2b6aa7fbd8939c4b6178b1d242b574a614b6347182a3b3195258080", - "gasLimit": undefined, + "gasLimit": 0n, "gasUsed": 1n, "hash": "0xac8c9bc3b84e103dc321bbe83b670e425ff68bfc9a333a4f1b1b204ad11c583d", "logsBloom": "0x02004000004200000000000000800020000000000000400002040000002020000000802000000000000180000001000020800000000000000000000000000000000000000022000260000008000800000000000000000000000000000000000000000008000410002100000140000800000044c00200000000400010000800008800000080000000000010000040000000000000000000000000000000800020028000000100000000000000000000002002881000000000000800020000040020900402020000180000000000000040000800000011020090002000400000200010002000001000000000000080000000000000000000000000000004000000", "miner": "0xe267d978037b89db06c6a5fcf82fad8297e290ff", - "nonce": null, + "nonce": "0x1", "number": 2n, "parentHash": "0xf6e57c99be5a81167bcb7bdf8d55572235384182c71635857ace2c04d25294ed", "randomness": { @@ -188,6 +192,10 @@ describe('block', () => { "revealed": "0xe10b5f01b0376fdc9151f66992f8c1b990083acabc14ec1b04f6a53ad804db88", }, "receiptsRoot": "0xca8aabc507534e45c982aa43e38118fc6f9cf222800e3d703a6e299a2e661f2a", + "sealFields": [ + "0x0", + ], + "sha3Uncles": "0x0", "size": 3n, "stateRoot": "0x051c8e40ed3d8afabbad5321a4bb6b9d686a8a62d9b696b3e5a5c769c3623d48", "timestamp": 4n, @@ -574,10 +582,9 @@ describe('transaction', () => { }), ).toMatchInlineSnapshot(` { - "accessList": [], "blockHash": "0xd981071322be9757dc3b5479a84d61b4f1f5dd2d44ecb66463be6cfc8246f574", "blockNumber": 1n, - "chainId": 1, + "chainId": undefined, "from": "0xacd03d601e5bb1b275bb94076ff46ed9d753435a", "gas": 105n, "gasPrice": undefined, diff --git a/src/op-stack/formatters.test.ts b/src/op-stack/formatters.test.ts index 826be0bbf6..8b56664d5e 100644 --- a/src/op-stack/formatters.test.ts +++ b/src/op-stack/formatters.test.ts @@ -100,9 +100,10 @@ describe('block', () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": 1n, - "blobGasUsed": undefined, + "blobGasUsed": 0n, "difficulty": 0n, - "excessBlobGas": undefined, + "excessBlobGas": 0n, + "extraData": "0x", "gasLimit": 1056n, "gasUsed": 105n, "hash": "0x40b65fabd4bdda5bb716b1a39e761d76a968d5cc54d887d05b47ac6c2c298846", @@ -113,6 +114,9 @@ describe('block', () => { "number": 431136n, "parentHash": "0x15274362f5bf7aa966ec2eb95c972fd85f2917da803ab178bced6a53479752b6", "receiptsRoot": "0x4cfa86d92cf2d52d2bca8b901592a5a0444be409793f0a4c2af006c0c7aafbde", + "sealFields": [ + "0x0", + ], "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "size": 431136n, "stateRoot": "0x95676f3a28d2c8a0bf64db60e910dc47275d37f5a3c3d7353b6f571c25fcd746", @@ -214,9 +218,10 @@ describe('block', () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": 1n, - "blobGasUsed": undefined, + "blobGasUsed": 0n, "difficulty": 0n, - "excessBlobGas": undefined, + "excessBlobGas": 0n, + "extraData": "0x0", "gasLimit": 1056n, "gasUsed": 105n, "hash": "0x40b65fabd4bdda5bb716b1a39e761d76a968d5cc54d887d05b47ac6c2c298846", @@ -227,6 +232,9 @@ describe('block', () => { "number": 431136n, "parentHash": "0x15274362f5bf7aa966ec2eb95c972fd85f2917da803ab178bced6a53479752b6", "receiptsRoot": "0x4cfa86d92cf2d52d2bca8b901592a5a0444be409793f0a4c2af006c0c7aafbde", + "sealFields": [ + "0x0", + ], "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "size": 431136n, "stateRoot": "0x95676f3a28d2c8a0bf64db60e910dc47275d37f5a3c3d7353b6f571c25fcd746", @@ -419,10 +427,9 @@ describe('transaction (deposit)', () => { }), ).toMatchInlineSnapshot(` { - "accessList": [], "blockHash": "0xd981071322be9757dc3b5479a84d61b4f1f5dd2d44ecb66463be6cfc8246f574", "blockNumber": 1n, - "chainId": 1, + "chainId": undefined, "from": "0xacd03d601e5bb1b275bb94076ff46ed9d753435a", "gas": 105n, "gasPrice": undefined, diff --git a/src/zksync/formatters.test.ts b/src/zksync/formatters.test.ts index f4aa149a98..7fd46bdedd 100644 --- a/src/zksync/formatters.test.ts +++ b/src/zksync/formatters.test.ts @@ -52,9 +52,9 @@ describe('block', () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": 250000000n, - "blobGasUsed": undefined, + "blobGasUsed": 0n, "difficulty": 0n, - "excessBlobGas": undefined, + "excessBlobGas": 0n, "extraData": "0x", "gasLimit": 4294967295n, "gasUsed": 2152203n, @@ -147,9 +147,9 @@ describe('block', () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": 250000000n, - "blobGasUsed": undefined, + "blobGasUsed": 0n, "difficulty": 0n, - "excessBlobGas": undefined, + "excessBlobGas": 0n, "extraData": "0x", "gasLimit": 4294967295n, "gasUsed": 3248087n, @@ -242,9 +242,9 @@ describe('block', () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": 250000000n, - "blobGasUsed": undefined, + "blobGasUsed": 0n, "difficulty": 0n, - "excessBlobGas": undefined, + "excessBlobGas": 0n, "extraData": "0x", "gasLimit": 4294967295n, "gasUsed": 2152203n, From 76092d851177edeeb6e801976fb9fc1afee94ee9 Mon Sep 17 00:00:00 2001 From: bt <99624770+besated@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:26:19 -0700 Subject: [PATCH 06/68] feat: add Sei Testnet (#2459) * Add sei testnet * Add changeset * Update seiTestnet.ts * Update gentle-walls-knock.md --------- Co-authored-by: jxom --- .changeset/gentle-walls-knock.md | 5 +++++ src/chains/definitions/seiTestnet.ts | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 .changeset/gentle-walls-knock.md create mode 100644 src/chains/definitions/seiTestnet.ts diff --git a/.changeset/gentle-walls-knock.md b/.changeset/gentle-walls-knock.md new file mode 100644 index 0000000000..d5c79c5ab1 --- /dev/null +++ b/.changeset/gentle-walls-knock.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added Sei testnet chain. diff --git a/src/chains/definitions/seiTestnet.ts b/src/chains/definitions/seiTestnet.ts new file mode 100644 index 0000000000..f0477866bc --- /dev/null +++ b/src/chains/definitions/seiTestnet.ts @@ -0,0 +1,20 @@ +import { defineChain } from '../../utils/chain/defineChain.js' + +export const seiTestnet = /*#__PURE__*/ defineChain({ + id: 1328, + name: 'Sei Testnet', + nativeCurrency: { name: 'Sei', symbol: 'SEI', decimals: 18 }, + rpcUrls: { + default: { + http: ['https://evm-rpc-testnet.sei-apis.com'], + webSocket: ['wss://evm-ws-testnet.sei-apis.com'] + }, + }, + blockExplorers: { + default: { + name: 'Seitrace', + url: 'https://seitrace.com', + }, + }, + testnet: true, +}) From d69793fda04049341d76ada335e54b8aa5a31b52 Mon Sep 17 00:00:00 2001 From: jxom Date: Tue, 2 Jul 2024 22:27:21 +0000 Subject: [PATCH 07/68] chore: format --- src/chains/definitions/seiTestnet.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chains/definitions/seiTestnet.ts b/src/chains/definitions/seiTestnet.ts index f0477866bc..2490e62e62 100644 --- a/src/chains/definitions/seiTestnet.ts +++ b/src/chains/definitions/seiTestnet.ts @@ -6,8 +6,8 @@ export const seiTestnet = /*#__PURE__*/ defineChain({ nativeCurrency: { name: 'Sei', symbol: 'SEI', decimals: 18 }, rpcUrls: { default: { - http: ['https://evm-rpc-testnet.sei-apis.com'], - webSocket: ['wss://evm-ws-testnet.sei-apis.com'] + http: ['https://evm-rpc-testnet.sei-apis.com'], + webSocket: ['wss://evm-ws-testnet.sei-apis.com'], }, }, blockExplorers: { From 512d34434b0918a05c089adad24a3106f25bb2ed Mon Sep 17 00:00:00 2001 From: Anton Dosta Date: Tue, 2 Jul 2024 15:29:59 -0700 Subject: [PATCH 08/68] fix(chains): add testnet flag to the Taiko Hekla network (#2458) --- src/chains/definitions/taikoHekla.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chains/definitions/taikoHekla.ts b/src/chains/definitions/taikoHekla.ts index 8d4ae57376..da97453157 100644 --- a/src/chains/definitions/taikoHekla.ts +++ b/src/chains/definitions/taikoHekla.ts @@ -15,4 +15,5 @@ export const taikoHekla = /*#__PURE__*/ defineChain({ url: 'https://hekla.taikoscan.network', }, }, + testnet: true, }) From 32a71ab2434a7cb53a59f6a5cc901a68ee78f362 Mon Sep 17 00:00:00 2001 From: zhangkai Date: Wed, 3 Jul 2024 06:31:18 +0800 Subject: [PATCH 09/68] feat(chains): update X Layer testnet RPC (#2465) * upgrade X Layer testnet's RPC * Create hot-bikes-double.md --------- Co-authored-by: jxom --- .changeset/hot-bikes-double.md | 5 +++++ src/chains/definitions/xLayerTestnet.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/hot-bikes-double.md diff --git a/.changeset/hot-bikes-double.md b/.changeset/hot-bikes-double.md new file mode 100644 index 0000000000..d510cbac6e --- /dev/null +++ b/.changeset/hot-bikes-double.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Updated `xLayerTestnet` RPC URL. diff --git a/src/chains/definitions/xLayerTestnet.ts b/src/chains/definitions/xLayerTestnet.ts index 11a577b33b..165cf76ed9 100644 --- a/src/chains/definitions/xLayerTestnet.ts +++ b/src/chains/definitions/xLayerTestnet.ts @@ -9,12 +9,12 @@ export const xLayerTestnet = /*#__PURE__*/ defineChain({ symbol: 'OKB', }, rpcUrls: { - default: { http: ['https://x1testrpc.okx.com'] }, + default: { http: ['https://xlayertestrpc.okx.com'] }, }, blockExplorers: { default: { name: 'OKLink', - url: 'https://www.oklink.com/x1-test', + url: 'https://www.oklink.com/xlayer-test', }, }, contracts: { From 77fede243acce6ed27cd2a0e74de325560a2e358 Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 3 Jul 2024 08:40:47 +1000 Subject: [PATCH 10/68] chore: add export --- src/chains/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chains/index.ts b/src/chains/index.ts index aa964f3934..e87b7c8b5f 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -229,6 +229,7 @@ export { scroll } from './definitions/scroll.js' export { scrollSepolia } from './definitions/scrollSepolia.js' export { sei } from './definitions/sei.js' export { seiDevnet } from './definitions/seiDevnet.js' +export { seiTestnet } from './definitions/seiTestnet.js' export { sepolia } from './definitions/sepolia.js' export { shimmer } from './definitions/shimmer.js' export { shimmerTestnet } from './definitions/shimmerTestnet.js' From 69bc4a1584f0378c974a9ac96e1f28a61f139ee2 Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 3 Jul 2024 08:48:39 +1000 Subject: [PATCH 11/68] ci: skip wagmi (temp) --- .github/workflows/verify.yml | 66 ++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 2dd59f2fee..30f068c619 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -210,37 +210,37 @@ jobs: shell: bash run: pnpm vectors - wagmi: - name: Wagmi - needs: [build, types] - runs-on: ubuntu-latest - timeout-minutes: 10 - strategy: - matrix: - typescript-version: ['5.4.5', '5.5.2'] - - steps: - - name: Clone repository - uses: actions/checkout@v4 - with: - submodules: 'recursive' - - - name: Install dependencies - uses: ./.github/actions/install-dependencies - - - name: Setup wagmi - uses: ./.github/actions/setup-wagmi - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - run: pnpm add -D -w typescript@${{ matrix.typescript-version }} - working-directory: ./wagmi - - - name: Check types - run: pnpm typecheck - working-directory: ./wagmi - - - name: Check build - run: pnpm build - working-directory: ./wagmi + # wagmi: + # name: Wagmi + # needs: [build, types] + # runs-on: ubuntu-latest + # timeout-minutes: 10 + # strategy: + # matrix: + # typescript-version: ['5.4.5', '5.5.2'] + + # steps: + # - name: Clone repository + # uses: actions/checkout@v4 + # with: + # submodules: 'recursive' + + # - name: Install dependencies + # uses: ./.github/actions/install-dependencies + + # - name: Setup wagmi + # uses: ./.github/actions/setup-wagmi + # env: + # GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # - run: pnpm add -D -w typescript@${{ matrix.typescript-version }} + # working-directory: ./wagmi + + # - name: Check types + # run: pnpm typecheck + # working-directory: ./wagmi + + # - name: Check build + # run: pnpm build + # working-directory: ./wagmi From 86fe26e8be1dd93f69ff5e883e20e275eecdd0c3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 09:10:46 +1000 Subject: [PATCH 12/68] chore: version package (#2468) Co-authored-by: github-actions[bot] --- .changeset/gentle-walls-knock.md | 5 --- .changeset/hot-bikes-double.md | 5 --- .changeset/mean-taxis-laugh.md | 5 --- .changeset/silent-penguins-own.md | 5 --- pnpm-lock.yaml | 71 +++++++++++++++++-------------- src/CHANGELOG.md | 14 ++++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 9 files changed, 56 insertions(+), 55 deletions(-) delete mode 100644 .changeset/gentle-walls-knock.md delete mode 100644 .changeset/hot-bikes-double.md delete mode 100644 .changeset/mean-taxis-laugh.md delete mode 100644 .changeset/silent-penguins-own.md diff --git a/.changeset/gentle-walls-knock.md b/.changeset/gentle-walls-knock.md deleted file mode 100644 index d5c79c5ab1..0000000000 --- a/.changeset/gentle-walls-knock.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added Sei testnet chain. diff --git a/.changeset/hot-bikes-double.md b/.changeset/hot-bikes-double.md deleted file mode 100644 index d510cbac6e..0000000000 --- a/.changeset/hot-bikes-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Updated `xLayerTestnet` RPC URL. diff --git a/.changeset/mean-taxis-laugh.md b/.changeset/mean-taxis-laugh.md deleted file mode 100644 index 006b7dbe78..0000000000 --- a/.changeset/mean-taxis-laugh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": minor ---- - -Added support for serializing and parsing OP deposit transactions on Celo. diff --git a/.changeset/silent-penguins-own.md b/.changeset/silent-penguins-own.md deleted file mode 100644 index 2ffbc3237d..0000000000 --- a/.changeset/silent-penguins-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Tweaked native currency property for `btr` and `btrTestnet` chains. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cca809e833..f05dfed1fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,7 +125,7 @@ importers: dependencies: typescript: specifier: latest - version: 5.5.2 + version: 5.5.3 viem: specifier: file:../../src/ version: link:../../src @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.4(typescript@5.4.2)(zod@3.22.4) + version: 2.16.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -507,7 +507,7 @@ importers: version: link:../src vocs: specifier: 1.0.0-alpha.52 - version: 1.0.0-alpha.52(@types/node@20.14.0)(@types/react-dom@18.0.10)(@types/react@18.0.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.18.0)(terser@5.31.0)(typescript@5.5.2) + version: 1.0.0-alpha.52(@types/node@20.14.0)(@types/react-dom@18.0.10)(@types/react@18.0.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.18.0)(terser@5.31.0)(typescript@5.5.3) src: dependencies: @@ -528,7 +528,7 @@ importers: version: 1.3.0 abitype: specifier: 1.0.5 - version: 1.0.5(typescript@5.5.2)(zod@3.22.4) + version: 1.0.5(typescript@5.5.3)(zod@3.22.4) isows: specifier: 1.0.4 version: 1.0.4(ws@8.17.1) @@ -5802,6 +5802,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + ua-parser-js@1.0.38: resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} @@ -6002,8 +6007,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.16.4: - resolution: {integrity: sha512-5Dk8BUCUymVJRETeU4rNHhTIj+VtBEWBKU0veJ7URtLPltO8wY0/OaUQeN77OeMhmy/l1z0Gbrm9CEURgE06Iw==} + viem@2.16.5: + resolution: {integrity: sha512-QDESALYDyLSP+pIr7adH3QPZ+3is16aOVMXXZE0X1GVbgL7PDMZQ8xIF1X/B1hgyqkBl2HhMpUaq6ksUdBV/YA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -7784,10 +7789,10 @@ snapshots: dependencies: shiki: 1.6.2 - '@shikijs/twoslash@1.6.2(typescript@5.5.2)': + '@shikijs/twoslash@1.6.2(typescript@5.5.3)': dependencies: '@shikijs/core': 1.6.2 - twoslash: 0.2.6(typescript@5.5.2) + twoslash: 0.2.6(typescript@5.5.3) transitivePeerDependencies: - supports-color - typescript @@ -8645,9 +8650,9 @@ snapshots: typescript: 5.4.5 zod: 3.22.4 - abitype@1.0.5(typescript@5.5.2)(zod@3.22.4): + abitype@1.0.5(typescript@5.5.3)(zod@3.22.4): optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 zod: 3.22.4 accepts@1.3.8: @@ -12446,11 +12451,11 @@ snapshots: twoslash-protocol@0.2.6: {} - twoslash@0.2.6(typescript@5.5.2): + twoslash@0.2.6(typescript@5.5.3): dependencies: '@typescript/vfs': 1.5.0 twoslash-protocol: 0.2.6 - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -12502,6 +12507,8 @@ snapshots: typescript@5.5.2: {} + typescript@5.5.3: {} + ua-parser-js@1.0.38: {} ufo@1.5.3: {} @@ -12705,7 +12712,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.16.4(typescript@5.4.2)(zod@3.22.4): + viem@2.16.5(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 @@ -12840,7 +12847,7 @@ snapshots: vlq@0.2.3: {} - vocs@1.0.0-alpha.52(@types/node@20.14.0)(@types/react-dom@18.0.10)(@types/react@18.0.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.18.0)(terser@5.31.0)(typescript@5.5.2): + vocs@1.0.0-alpha.52(@types/node@20.14.0)(@types/react-dom@18.0.10)(@types/react@18.0.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.18.0)(terser@5.31.0)(typescript@5.5.3): dependencies: '@floating-ui/react': 0.26.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@hono/node-server': 1.11.2 @@ -12857,7 +12864,7 @@ snapshots: '@radix-ui/react-tabs': 1.0.4(@types/react-dom@18.0.10)(@types/react@18.0.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@shikijs/rehype': 1.6.2 '@shikijs/transformers': 1.6.2 - '@shikijs/twoslash': 1.6.2(typescript@5.5.2) + '@shikijs/twoslash': 1.6.2(typescript@5.5.3) '@vanilla-extract/css': 1.15.2 '@vanilla-extract/dynamic': 2.1.1 '@vanilla-extract/vite-plugin': 3.9.5(@types/node@20.14.0)(terser@5.31.0)(vite@5.2.12(@types/node@20.14.0)(terser@5.31.0)) @@ -12900,7 +12907,7 @@ snapshots: shiki: 1.6.2 tailwindcss: 3.4.3 toml: 3.0.0 - twoslash: 0.2.6(typescript@5.5.2) + twoslash: 0.2.6(typescript@5.5.3) ua-parser-js: 1.0.38 unified: 11.0.4 unist-util-visit: 5.0.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 4c8ad13958..99167a128e 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,19 @@ # viem +## 2.17.0 + +### Minor Changes + +- [#2335](https://github.com/wevm/viem/pull/2335) [`3fce1c3`](https://github.com/wevm/viem/commit/3fce1c36414dfb4cd1b8df3f913fe1cc8abba7db) Thanks [@aaronmgdr](https://github.com/aaronmgdr)! - Added support for serializing and parsing OP deposit transactions on Celo. + +### Patch Changes + +- [#2459](https://github.com/wevm/viem/pull/2459) [`76092d8`](https://github.com/wevm/viem/commit/76092d851177edeeb6e801976fb9fc1afee94ee9) Thanks [@besated](https://github.com/besated)! - Added Sei testnet chain. + +- [#2465](https://github.com/wevm/viem/pull/2465) [`32a71ab`](https://github.com/wevm/viem/commit/32a71ab2434a7cb53a59f6a5cc901a68ee78f362) Thanks [@giskook](https://github.com/giskook)! - Updated `xLayerTestnet` RPC URL. + +- [#2447](https://github.com/wevm/viem/pull/2447) [`861d962`](https://github.com/wevm/viem/commit/861d962507cef076ceffa479ba74cd2fade0308c) Thanks [@jerray](https://github.com/jerray)! - Tweaked native currency property for `btr` and `btrTestnet` chains. + ## 2.16.5 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index a3f84bd58a..5659da06dd 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.16.5' +export const version = '2.17.0' diff --git a/src/jsr.json b/src/jsr.json index b0517ea4a8..b1d5b4a1ed 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.16.5", + "version": "2.17.0", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index 15b34f4036..d97e4d332e 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.16.5", + "version": "2.17.0", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From f7afaa2e0c687e45fe85c8de51cbd8a12f2318a4 Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 3 Jul 2024 09:32:09 +1000 Subject: [PATCH 13/68] ci: unskip wagmi --- .github/workflows/verify.yml | 66 ++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 30f068c619..2dd59f2fee 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -210,37 +210,37 @@ jobs: shell: bash run: pnpm vectors - # wagmi: - # name: Wagmi - # needs: [build, types] - # runs-on: ubuntu-latest - # timeout-minutes: 10 - # strategy: - # matrix: - # typescript-version: ['5.4.5', '5.5.2'] - - # steps: - # - name: Clone repository - # uses: actions/checkout@v4 - # with: - # submodules: 'recursive' - - # - name: Install dependencies - # uses: ./.github/actions/install-dependencies - - # - name: Setup wagmi - # uses: ./.github/actions/setup-wagmi - # env: - # GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # - run: pnpm add -D -w typescript@${{ matrix.typescript-version }} - # working-directory: ./wagmi - - # - name: Check types - # run: pnpm typecheck - # working-directory: ./wagmi - - # - name: Check build - # run: pnpm build - # working-directory: ./wagmi + wagmi: + name: Wagmi + needs: [build, types] + runs-on: ubuntu-latest + timeout-minutes: 10 + strategy: + matrix: + typescript-version: ['5.4.5', '5.5.2'] + + steps: + - name: Clone repository + uses: actions/checkout@v4 + with: + submodules: 'recursive' + + - name: Install dependencies + uses: ./.github/actions/install-dependencies + + - name: Setup wagmi + uses: ./.github/actions/setup-wagmi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - run: pnpm add -D -w typescript@${{ matrix.typescript-version }} + working-directory: ./wagmi + + - name: Check types + run: pnpm typecheck + working-directory: ./wagmi + + - name: Check build + run: pnpm build + working-directory: ./wagmi From f5ae57f963cd8461f228c212dd1df7d9d99f6d47 Mon Sep 17 00:00:00 2001 From: Michele Bruno <43304601+michelebruno@users.noreply.github.com> Date: Thu, 4 Jul 2024 00:09:01 +0200 Subject: [PATCH 14/68] feat(chains): add multicall3 contract to Berachain bArtio (#2471) * Add multicall3 contract to Berachain bArtio Multicall3 was missing but listed on https://www.multicall3.com/deployments * Create strong-beds-drive.md --------- Co-authored-by: jxom --- .changeset/strong-beds-drive.md | 5 +++++ src/chains/definitions/berachainTestnetbArtio.ts | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 .changeset/strong-beds-drive.md diff --git a/.changeset/strong-beds-drive.md b/.changeset/strong-beds-drive.md new file mode 100644 index 0000000000..e5dd35f68a --- /dev/null +++ b/.changeset/strong-beds-drive.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added multicall3 contract to Berachain bArtio. diff --git a/src/chains/definitions/berachainTestnetbArtio.ts b/src/chains/definitions/berachainTestnetbArtio.ts index 0b2f6c95fc..8c109f7808 100644 --- a/src/chains/definitions/berachainTestnetbArtio.ts +++ b/src/chains/definitions/berachainTestnetbArtio.ts @@ -8,6 +8,12 @@ export const berachainTestnetbArtio = /*#__PURE__*/ defineChain({ name: 'BERA Token', symbol: 'BERA', }, + contracts: { + multicall3: { + address: '0xcA11bde05977b3631167028862bE2a173976CA11', + blockCreated: 109269 + }, + }, rpcUrls: { default: { http: ['https://bartio.rpc.berachain.com'] }, }, From 203139c98045c8b4ae37f13a9437488aab626d42 Mon Sep 17 00:00:00 2001 From: 0xCLARITY Date: Wed, 3 Jul 2024 15:09:34 -0700 Subject: [PATCH 15/68] docs: update estimateGas.md (#2472) Co-worker got confused by the docs saying the units of `estimateGas` were in `wei`. --- site/pages/docs/actions/public/estimateGas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/pages/docs/actions/public/estimateGas.md b/site/pages/docs/actions/public/estimateGas.md index aaaa52de53..487744f2ec 100644 --- a/site/pages/docs/actions/public/estimateGas.md +++ b/site/pages/docs/actions/public/estimateGas.md @@ -39,7 +39,7 @@ export const publicClient = createPublicClient({ `bigint` -The gas estimate (in wei). +The gas estimate (in gas). ## Parameters From b60d34823f889fba51e24088b382982715dfe4de Mon Sep 17 00:00:00 2001 From: echo Date: Thu, 4 Jul 2024 06:09:57 +0800 Subject: [PATCH 16/68] feat(chains): add Crab and Koi chain (#2469) * Support Crab and Koi chain * Update koi.ts * Update Koi chain info * changeset --- .changeset/.lucky-actors-smell.md | 5 +++++ src/chains/definitions/crab.ts | 26 ++++++++++++++++++++++++++ src/chains/definitions/koi.ts | 27 +++++++++++++++++++++++++++ src/chains/index.ts | 2 ++ 4 files changed, 60 insertions(+) create mode 100644 .changeset/.lucky-actors-smell.md create mode 100644 src/chains/definitions/crab.ts create mode 100644 src/chains/definitions/koi.ts diff --git a/.changeset/.lucky-actors-smell.md b/.changeset/.lucky-actors-smell.md new file mode 100644 index 0000000000..2c16bdffb3 --- /dev/null +++ b/.changeset/.lucky-actors-smell.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added Crab and Koi chain \ No newline at end of file diff --git a/src/chains/definitions/crab.ts b/src/chains/definitions/crab.ts new file mode 100644 index 0000000000..c6fb5bce72 --- /dev/null +++ b/src/chains/definitions/crab.ts @@ -0,0 +1,26 @@ +import { defineChain } from '../../utils/chain/defineChain.js' + +export const crab = defineChain({ + id: 44, + name: 'Crab Network', + nativeCurrency: { + decimals: 18, + name: 'Crab Network Native Token', + symbol: 'CRAB', + }, + rpcUrls: { + default: { + http: ['https://crab-rpc.darwinia.network'], + webSocket: ['wss://crab-rpc.darwinia.network'], + }, + }, + blockExplorers: { + default: { name: 'Blockscout', url: 'https://crab-scan.darwinia.network' }, + }, + contracts: { + multicall3: { + address: '0xca11bde05977b3631167028862be2a173976ca11', + blockCreated: 3032593, + }, + }, +}) \ No newline at end of file diff --git a/src/chains/definitions/koi.ts b/src/chains/definitions/koi.ts new file mode 100644 index 0000000000..b7fa3d3fa7 --- /dev/null +++ b/src/chains/definitions/koi.ts @@ -0,0 +1,27 @@ +import { defineChain } from '../../utils/chain/defineChain.js' + +export const koi = defineChain({ + id: 701, + name: 'Koi Network', + nativeCurrency: { + decimals: 18, + name: 'Koi Network Native Token', + symbol: 'KRING', + }, + rpcUrls: { + default: { + http: ['https://koi-rpc.darwinia.network'], + webSocket: ['wss://koi-rpc.darwinia.network'], + }, + }, + blockExplorers: { + default: { name: 'Blockscout', url: 'https://koi-scan.darwinia.network' }, + }, + contracts: { + multicall3: { + address: '0xca11bde05977b3631167028862be2a173976ca11', + blockCreated: 180001, + }, + }, + testnet: true, +}) diff --git a/src/chains/index.ts b/src/chains/index.ts index e87b7c8b5f..54915d0913 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -56,6 +56,7 @@ export { classic } from './definitions/classic.js' export { confluxESpace } from './definitions/confluxESpace.js' export { confluxESpaceTestnet } from './definitions/confluxESpaceTestnet.js' export { coreDao } from './definitions/coreDao.js' +export { crab } from './definitions/crab.js' export { cronos } from './definitions/cronos.js' export { cronosTestnet } from './definitions/cronosTestnet.js' export { crossbell } from './definitions/crossbell.js' @@ -130,6 +131,7 @@ export { kavaTestnet } from './definitions/kavaTestnet.js' export { kcc } from './definitions/kcc.js' export { klaytn } from './definitions/klaytn.js' export { klaytnBaobab } from './definitions/klaytnBaobab.js' +export { koi } from './definitions/koi.js' export { kroma } from './definitions/kroma.js' export { kromaSepolia } from './definitions/kromaSepolia.js' export { l3x } from './definitions/l3x.js' From 7f1af937347d9144dbc0c3d44e1e411448d7972a Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 3 Jul 2024 22:11:01 +0000 Subject: [PATCH 17/68] chore: format --- src/chains/definitions/berachainTestnetbArtio.ts | 4 ++-- src/chains/definitions/crab.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/chains/definitions/berachainTestnetbArtio.ts b/src/chains/definitions/berachainTestnetbArtio.ts index 8c109f7808..4d159b236b 100644 --- a/src/chains/definitions/berachainTestnetbArtio.ts +++ b/src/chains/definitions/berachainTestnetbArtio.ts @@ -10,8 +10,8 @@ export const berachainTestnetbArtio = /*#__PURE__*/ defineChain({ }, contracts: { multicall3: { - address: '0xcA11bde05977b3631167028862bE2a173976CA11', - blockCreated: 109269 + address: '0xcA11bde05977b3631167028862bE2a173976CA11', + blockCreated: 109269, }, }, rpcUrls: { diff --git a/src/chains/definitions/crab.ts b/src/chains/definitions/crab.ts index c6fb5bce72..cb7429a45b 100644 --- a/src/chains/definitions/crab.ts +++ b/src/chains/definitions/crab.ts @@ -23,4 +23,4 @@ export const crab = defineChain({ blockCreated: 3032593, }, }, -}) \ No newline at end of file +}) From f12dfdb9fa15b68741d79972c97fb3fa99551c85 Mon Sep 17 00:00:00 2001 From: jxom Date: Thu, 4 Jul 2024 16:08:38 +1000 Subject: [PATCH 18/68] fix: resolves #2470 --- .changeset/afraid-dots-film.md | 5 +++++ src/actions/public/watchContractEvent.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/afraid-dots-film.md diff --git a/.changeset/afraid-dots-film.md b/.changeset/afraid-dots-film.md new file mode 100644 index 0000000000..ebbbe9aa59 --- /dev/null +++ b/.changeset/afraid-dots-film.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Fixed `watchContractEvent` querying for events against an invalid block range. diff --git a/src/actions/public/watchContractEvent.ts b/src/actions/public/watchContractEvent.ts index 4fb17fd333..999e297697 100644 --- a/src/actions/public/watchContractEvent.ts +++ b/src/actions/public/watchContractEvent.ts @@ -229,7 +229,7 @@ export function watchContractEvent< // If the block number has changed, we will need to fetch the logs. // If the block number doesn't exist, we are yet to reach the first poll interval, // so do not emit any logs. - if (previousBlockNumber && previousBlockNumber !== blockNumber) { + if (previousBlockNumber && previousBlockNumber < blockNumber) { logs = await getAction( client, getContractEvents, From c5a33911019219c11d96312293384dbbfa5bd452 Mon Sep 17 00:00:00 2001 From: tiny stone <719045032@qq.com> Date: Fri, 5 Jul 2024 05:36:37 +0800 Subject: [PATCH 19/68] feat(chains): add zklink nova (#2476) * feat: add zkLink Nava chain * feat: update name:wq * feat: Added zkLinkNova chain * Update zkLinkNova.ts * Update index.ts --------- Co-authored-by: Stone Co-authored-by: tinystone Co-authored-by: jxom --- .changeset/tasty-masks-talk.md | 5 +++++ src/chains/definitions/zkLinkNova.ts | 20 ++++++++++++++++++++ src/chains/index.ts | 1 + 3 files changed, 26 insertions(+) create mode 100644 .changeset/tasty-masks-talk.md create mode 100644 src/chains/definitions/zkLinkNova.ts diff --git a/.changeset/tasty-masks-talk.md b/.changeset/tasty-masks-talk.md new file mode 100644 index 0000000000..1c51896d13 --- /dev/null +++ b/.changeset/tasty-masks-talk.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added zkLinkNova chain. diff --git a/src/chains/definitions/zkLinkNova.ts b/src/chains/definitions/zkLinkNova.ts new file mode 100644 index 0000000000..670da69c5b --- /dev/null +++ b/src/chains/definitions/zkLinkNova.ts @@ -0,0 +1,20 @@ +import { defineChain } from '../../utils/chain/defineChain.js' + +export const zkLinkNova = /*#__PURE__*/ defineChain({ + id: 810180, + name: 'zkLink Nova', + nativeCurrency: { + decimals: 18, + name: 'ETH', + symbol: 'ETH', + }, + rpcUrls: { + default: { http: ['https://rpc.zklink.io'] }, + }, + blockExplorers: { + default: { + name: 'zkLink Nova Block Explorer', + url: 'https://explorer.zklink.io', + }, + }, +}) diff --git a/src/chains/index.ts b/src/chains/index.ts index 54915d0913..7baf1f5284 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -297,6 +297,7 @@ export { zilliqa } from './definitions/zilliqa.js' export { zilliqaTestnet } from './definitions/zilliqaTestnet.js' export { zkFair } from './definitions/zkFair.js' export { zkFairTestnet } from './definitions/zkFairTestnet.js' +export { zkLinkNova } from './definitions/zkLinkNova.js' export { zkSync } from './definitions/zkSync.js' export { zkSyncInMemoryNode } from './definitions/zkSyncInMemoryNode.js' export { zkSyncLocalNode } from './definitions/zkSyncLocalNode.js' From 741b83a65bb8c9eeebc695ddf54c042a3715d665 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 07:40:18 +1000 Subject: [PATCH 20/68] chore: version package (#2473) Co-authored-by: github-actions[bot] --- .changeset/afraid-dots-film.md | 5 ----- .changeset/strong-beds-drive.md | 5 ----- .changeset/tasty-masks-talk.md | 5 ----- pnpm-lock.yaml | 40 ++++++++++++++++----------------- src/CHANGELOG.md | 10 +++++++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 8 files changed, 33 insertions(+), 38 deletions(-) delete mode 100644 .changeset/afraid-dots-film.md delete mode 100644 .changeset/strong-beds-drive.md delete mode 100644 .changeset/tasty-masks-talk.md diff --git a/.changeset/afraid-dots-film.md b/.changeset/afraid-dots-film.md deleted file mode 100644 index ebbbe9aa59..0000000000 --- a/.changeset/afraid-dots-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Fixed `watchContractEvent` querying for events against an invalid block range. diff --git a/.changeset/strong-beds-drive.md b/.changeset/strong-beds-drive.md deleted file mode 100644 index e5dd35f68a..0000000000 --- a/.changeset/strong-beds-drive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added multicall3 contract to Berachain bArtio. diff --git a/.changeset/tasty-masks-talk.md b/.changeset/tasty-masks-talk.md deleted file mode 100644 index 1c51896d13..0000000000 --- a/.changeset/tasty-masks-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added zkLinkNova chain. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f05dfed1fd..0ec45e881f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.16.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.0(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -6007,8 +6007,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.16.5: - resolution: {integrity: sha512-QDESALYDyLSP+pIr7adH3QPZ+3is16aOVMXXZE0X1GVbgL7PDMZQ8xIF1X/B1hgyqkBl2HhMpUaq6ksUdBV/YA==} + viem@2.17.0: + resolution: {integrity: sha512-+gaVlsfDsHL1oYdjpatdRxW1WK/slLYVvpOws3fEdLfQFUToezKI6YLC9l1g2uKm4Hg3OdGX1KQy/G7/58tTKQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -12712,7 +12712,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.16.5(typescript@5.4.2)(zod@3.22.4): + viem@2.17.0(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 99167a128e..6fbf3edff9 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,15 @@ # viem +## 2.17.1 + +### Patch Changes + +- [`f12dfdb9`](https://github.com/wevm/viem/commit/f12dfdb9fa15b68741d79972c97fb3fa99551c85) Thanks [@jxom](https://github.com/jxom)! - Fixed `watchContractEvent` querying for events against an invalid block range. + +- [#2471](https://github.com/wevm/viem/pull/2471) [`f5ae57f9`](https://github.com/wevm/viem/commit/f5ae57f963cd8461f228c212dd1df7d9d99f6d47) Thanks [@michelebruno](https://github.com/michelebruno)! - Added multicall3 contract to Berachain bArtio. + +- [#2476](https://github.com/wevm/viem/pull/2476) [`c5a33911`](https://github.com/wevm/viem/commit/c5a33911019219c11d96312293384dbbfa5bd452) Thanks [@sj719045032](https://github.com/sj719045032)! - Added zkLinkNova chain. + ## 2.17.0 ### Minor Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index 5659da06dd..083a7e8614 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.0' +export const version = '2.17.1' diff --git a/src/jsr.json b/src/jsr.json index b1d5b4a1ed..6742d63a86 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.0", + "version": "2.17.1", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index d97e4d332e..329556a4bd 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.0", + "version": "2.17.1", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 795ca46cf93bc496abb23a5b868ea48bd80860ae Mon Sep 17 00:00:00 2001 From: tiny stone <719045032@qq.com> Date: Sat, 6 Jul 2024 10:04:08 +0800 Subject: [PATCH 21/68] feat: add zkLink Nava Sepolia Testnet chain (#2478) * feat: add zkLink Nava Sepolia Testnet chain * Update index.ts * Update six-ravens-relax.md --------- Co-authored-by: tinystone Co-authored-by: jxom --- .changeset/six-ravens-relax.md | 5 +++++ .../definitions/zkLinkNovaSepoliaTestnet.ts | 20 +++++++++++++++++++ src/chains/index.ts | 1 + 3 files changed, 26 insertions(+) create mode 100644 .changeset/six-ravens-relax.md create mode 100644 src/chains/definitions/zkLinkNovaSepoliaTestnet.ts diff --git a/.changeset/six-ravens-relax.md b/.changeset/six-ravens-relax.md new file mode 100644 index 0000000000..91d81072df --- /dev/null +++ b/.changeset/six-ravens-relax.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added zkLink Nova Sepolia Testnet chain. diff --git a/src/chains/definitions/zkLinkNovaSepoliaTestnet.ts b/src/chains/definitions/zkLinkNovaSepoliaTestnet.ts new file mode 100644 index 0000000000..0f182ba45e --- /dev/null +++ b/src/chains/definitions/zkLinkNovaSepoliaTestnet.ts @@ -0,0 +1,20 @@ +import { defineChain } from '../../utils/chain/defineChain.js' + +export const zkLinkNovaSepoliaTestnet = /*#__PURE__*/ defineChain({ + id: 810181, + name: 'zkLink Nova Sepolia Testnet', + nativeCurrency: { + decimals: 18, + name: 'ETH', + symbol: 'ETH', + }, + rpcUrls: { + default: { http: ['https://sepolia.rpc.zklink.io'] }, + }, + blockExplorers: { + default: { + name: 'zkLink Nova Block Explorer', + url: 'https://sepolia.explorer.zklink.io', + }, + }, +}) diff --git a/src/chains/index.ts b/src/chains/index.ts index 7baf1f5284..4c72f5a3dd 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -298,6 +298,7 @@ export { zilliqaTestnet } from './definitions/zilliqaTestnet.js' export { zkFair } from './definitions/zkFair.js' export { zkFairTestnet } from './definitions/zkFairTestnet.js' export { zkLinkNova } from './definitions/zkLinkNova.js' +export { zkLinkNovaSepoliaTestnet } from './definitions/zkLinkNovaSepoliaTestnet.js' export { zkSync } from './definitions/zkSync.js' export { zkSyncInMemoryNode } from './definitions/zkSyncInMemoryNode.js' export { zkSyncLocalNode } from './definitions/zkSyncLocalNode.js' From 662d7d977efc02898f809b414ef5668ee6a99c64 Mon Sep 17 00:00:00 2001 From: jxom Date: Sat, 6 Jul 2024 02:04:53 +0000 Subject: [PATCH 22/68] chore: format --- src/chains/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chains/index.ts b/src/chains/index.ts index 4c72f5a3dd..b0c6e4a11c 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -298,7 +298,7 @@ export { zilliqaTestnet } from './definitions/zilliqaTestnet.js' export { zkFair } from './definitions/zkFair.js' export { zkFairTestnet } from './definitions/zkFairTestnet.js' export { zkLinkNova } from './definitions/zkLinkNova.js' -export { zkLinkNovaSepoliaTestnet } from './definitions/zkLinkNovaSepoliaTestnet.js' +export { zkLinkNovaSepoliaTestnet } from './definitions/zkLinkNovaSepoliaTestnet.js' export { zkSync } from './definitions/zkSync.js' export { zkSyncInMemoryNode } from './definitions/zkSyncInMemoryNode.js' export { zkSyncLocalNode } from './definitions/zkSyncLocalNode.js' From 5028b3fb723100e49ca9b301405360b23c2a1003 Mon Sep 17 00:00:00 2001 From: Caven Date: Sat, 6 Jul 2024 10:05:21 +0800 Subject: [PATCH 23/68] feat(chains): add Artela Testnet chain (#2479) * feat: add Artela Testnet chain * Update dry-mirrors-remain.md --------- Co-authored-by: jxom --- .changeset/dry-mirrors-remain.md | 5 +++++ pnpm-lock.yaml | 1 - src/chains/definitions/artelaTestnet.ts | 26 +++++++++++++++++++++++++ src/chains/index.ts | 1 + 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 .changeset/dry-mirrors-remain.md create mode 100644 src/chains/definitions/artelaTestnet.ts diff --git a/.changeset/dry-mirrors-remain.md b/.changeset/dry-mirrors-remain.md new file mode 100644 index 0000000000..6f42c79522 --- /dev/null +++ b/.changeset/dry-mirrors-remain.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added Artela Testnet chain. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ec45e881f..947ac77427 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2743,7 +2743,6 @@ packages: bun@1.1.12: resolution: {integrity: sha512-NZzeZuZk7VwCs8VAXnXUHCPOlTS/IyHCscChtT1M1FLSwhBcVMsGVStYlXaaoqsinBKgp0CGJdhnJw2gR3NkDw==} - cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true diff --git a/src/chains/definitions/artelaTestnet.ts b/src/chains/definitions/artelaTestnet.ts new file mode 100644 index 0000000000..435fd6ed31 --- /dev/null +++ b/src/chains/definitions/artelaTestnet.ts @@ -0,0 +1,26 @@ +import { defineChain } from '../../utils/chain/defineChain.js' + +export const artelaTestnet = /*#__PURE__*/ defineChain({ + id: 11822, + name: 'Artela Testnet', + nativeCurrency: { name: 'ART', symbol: 'ART', decimals: 18 }, + rpcUrls: { + default: { + http: ['https://betanet-rpc1.artela.network'], + }, + }, + blockExplorers: { + default: { + name: 'Artela', + url: 'https://betanet-scan.artela.network', + apiUrl: 'https://betanet-scan.artela.network/api', + }, + }, + contracts: { + multicall3: { + address: '0xd07c8635f76e8745Ee7092fbb6e8fbc5FeF09DD7', + blockCreated: 7001871, + }, + }, + testnet: true, +}) diff --git a/src/chains/index.ts b/src/chains/index.ts index b0c6e4a11c..c4b7545da6 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -15,6 +15,7 @@ export { astarZkyoto } from './definitions/astarZkyoto.js' export { arbitrumSepolia } from './definitions/arbitrumSepolia.js' export { areonNetwork } from './definitions/areonNetwork.js' export { areonNetworkTestnet } from './definitions/areonNetworkTestnet.js' +export { artelaTestnet } from './definitions/artelaTestnet.js' export { aurora } from './definitions/aurora.js' export { auroraTestnet } from './definitions/auroraTestnet.js' export { auroria } from './definitions/auroria.js' From 758b9a12fa6be9471668f26dd2f9ba9b603bb7e7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:21:51 +1000 Subject: [PATCH 24/68] chore: version package (#2481) Co-authored-by: github-actions[bot] --- .changeset/dry-mirrors-remain.md | 5 ---- .changeset/six-ravens-relax.md | 5 ---- pnpm-lock.yaml | 41 ++++++++++++++++---------------- src/CHANGELOG.md | 8 +++++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 7 files changed, 32 insertions(+), 33 deletions(-) delete mode 100644 .changeset/dry-mirrors-remain.md delete mode 100644 .changeset/six-ravens-relax.md diff --git a/.changeset/dry-mirrors-remain.md b/.changeset/dry-mirrors-remain.md deleted file mode 100644 index 6f42c79522..0000000000 --- a/.changeset/dry-mirrors-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added Artela Testnet chain. diff --git a/.changeset/six-ravens-relax.md b/.changeset/six-ravens-relax.md deleted file mode 100644 index 91d81072df..0000000000 --- a/.changeset/six-ravens-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added zkLink Nova Sepolia Testnet chain. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 947ac77427..272d3395ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.0(typescript@5.4.2)(zod@3.22.4) + version: 2.17.1(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -2743,6 +2743,7 @@ packages: bun@1.1.12: resolution: {integrity: sha512-NZzeZuZk7VwCs8VAXnXUHCPOlTS/IyHCscChtT1M1FLSwhBcVMsGVStYlXaaoqsinBKgp0CGJdhnJw2gR3NkDw==} + cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true @@ -6006,8 +6007,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.17.0: - resolution: {integrity: sha512-+gaVlsfDsHL1oYdjpatdRxW1WK/slLYVvpOws3fEdLfQFUToezKI6YLC9l1g2uKm4Hg3OdGX1KQy/G7/58tTKQ==} + viem@2.17.1: + resolution: {integrity: sha512-iLwFAfn7aWfvc1KY176YNTJQpPdepRhvaltae6TomZ+DU5M7LdASP2ywdAHw/rezdEmrH/ytwG2WWnjWioE0fA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -12711,7 +12712,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.17.0(typescript@5.4.2)(zod@3.22.4): + viem@2.17.1(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 6fbf3edff9..198bd9384d 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,13 @@ # viem +## 2.17.2 + +### Patch Changes + +- [#2479](https://github.com/wevm/viem/pull/2479) [`5028b3f`](https://github.com/wevm/viem/commit/5028b3fb723100e49ca9b301405360b23c2a1003) Thanks [@keyding](https://github.com/keyding)! - Added Artela Testnet chain. + +- [#2478](https://github.com/wevm/viem/pull/2478) [`795ca46`](https://github.com/wevm/viem/commit/795ca46cf93bc496abb23a5b868ea48bd80860ae) Thanks [@sj719045032](https://github.com/sj719045032)! - Added zkLink Nova Sepolia Testnet chain. + ## 2.17.1 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index 083a7e8614..e291f4b23c 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.1' +export const version = '2.17.2' diff --git a/src/jsr.json b/src/jsr.json index 6742d63a86..d2f01b1ce5 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.1", + "version": "2.17.2", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index 329556a4bd..4236cb5811 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.1", + "version": "2.17.2", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 512918b985b6f2af1b2bff50e721d2f6ad91459c Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 7 Jul 2024 11:32:50 +1000 Subject: [PATCH 25/68] tests: update fork block number --- src/actions/public/call.test.ts | 12 +- src/actions/public/getBlock.test.ts | 787 ++++++++--------- .../public/getBlockTransactionCount.test.ts | 4 +- src/actions/public/getEip712Domain.test.ts | 4 +- src/actions/public/getFeeHistory.test.ts | 86 +- src/actions/public/getFilterChanges.test.ts | 74 +- src/actions/public/getFilterLogs.test.ts | 62 +- src/actions/public/getLogs.test.ts | 84 +- .../public/getTransactionReceipt.test.ts | 81 +- src/actions/public/multicall.test.ts | 14 +- src/actions/public/readContract.test.ts | 4 +- .../signTransaction.test.ts.snap | 2 +- .../wallet/prepareTransactionRequest.test.ts | 94 +- src/actions/wallet/sendTransaction.test.ts | 16 +- src/actions/wallet/signTransaction.test.ts | 2 +- src/clients/decorators/public.test.ts | 2 +- src/errors/request.test.ts | 6 +- .../eip5792/actions/getCallsStatus.test.ts | 12 +- .../eip5792/actions/writeContracts.test.ts | 12 +- .../solady/decorators/solady.test.ts | 8 +- src/utils/abi/parseEventLogs.test.ts | 114 +-- src/utils/nonceManager.test.ts | 88 +- src/utils/rpc/http.test.ts | 12 +- src/utils/rpc/ipc.test.ts | 822 +++++++++--------- src/utils/rpc/webSocket.test.ts | 822 +++++++++--------- test/src/anvil.ts | 2 +- 26 files changed, 1667 insertions(+), 1559 deletions(-) diff --git a/src/actions/public/call.test.ts b/src/actions/public/call.test.ts index fdf6d59f19..49282e21da 100644 --- a/src/actions/public/call.test.ts +++ b/src/actions/public/call.test.ts @@ -114,13 +114,13 @@ describe('ccip', () => { to: contractAddress!, }), ).rejects.toMatchInlineSnapshot(` - [CallExecutionError: Execution reverted with reason: custom error 556f1830:000000000000000000000000cc5bc84c…00000000000000000000000000000000 (576 bytes). + [CallExecutionError: Execution reverted with reason: custom error 556f1830:000000000000000000000000fb6dab62…00000000000000000000000000000000 (576 bytes). Raw Call Arguments: - to: 0xcc5bc84c3fdbcf262aadd9f76652d6784293dd9e + to: 0xfb6dab6200b8958c2655c3747708f82243d3f32e data: 0xbf40fac1000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000096a786f6d2e7669656d0000000000000000000000000000000000000000000000 - Details: execution reverted: custom error 556f1830:000000000000000000000000cc5bc84c…00000000000000000000000000000000 (576 bytes) + Details: execution reverted: custom error 556f1830:000000000000000000000000fb6dab62…00000000000000000000000000000000 (576 bytes) Version: viem@x.y.z] `) @@ -1066,7 +1066,7 @@ describe('deployless call (factory)', () => { }) expect(result).toMatchInlineSnapshot(` { - "data": "0x0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d8a0ab4f74d04b9ee34ceccef647051601720dc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000f4d6f636b343333374163636f756e740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data": "0x0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b8e1b1e362872b237526e74b227077b0aee8e22300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000f4d6f636b343333374163636f756e740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", } `) @@ -1081,7 +1081,7 @@ describe('deployless call (factory)', () => { "Mock4337Account", "1", 1n, - "0xd8a0AB4f74d04b9EE34CECCEF647051601720Dc1", + "0xB8e1B1e362872b237526e74B227077B0aeE8e223", "0x0000000000000000000000000000000000000000000000000000000000000000", [], ] @@ -1172,7 +1172,7 @@ describe('deployless call (bytecode)', () => { "success": true, }, { - "returnData": "0x0000000000000000000000000000000000000000000000000000000000000277", + "returnData": "0x0000000000000000000000000000000000000000000000000000000000000288", "success": true, }, ] diff --git a/src/actions/public/getBlock.test.ts b/src/actions/public/getBlock.test.ts index 14631db152..e9f802c632 100644 --- a/src/actions/public/getBlock.test.ts +++ b/src/actions/public/getBlock.test.ts @@ -118,250 +118,254 @@ describe('args: blockNumber', () => { }) expect(block).toMatchInlineSnapshot(` { - "baseFeePerGas": 5240957424n, - "blobGasUsed": 393216n, + "baseFeePerGas": 9036579667n, + "blobGasUsed": 0n, "difficulty": 0n, - "excessBlobGas": 393216n, - "extraData": "0x407273796e636275696c646572", + "excessBlobGas": 0n, + "extraData": "0x6265617665726275696c642e6f7267", "gasLimit": 30000000n, - "gasUsed": 11497595n, - "hash": "0x72e938fa6ab225be2ce940db9aea7d670b50b3320b8deaeea1084ab645a1db81", - "logsBloom": "0x22e3440031939318c880faa0c25882352633a206d040224202804091810ac60182469a32f0938a0862a48ea4c0521149632104a0a88820152c2491b550abea906722520965628b2d2902f53f0000e57cc0150031c4c00c04912468808b2198b046158021a2526a034244f7da81040c4d08110585aec88e44d101045410189809821898480859446e4400200641222a1400cb0c3155e5069c90272052089251589a924fa21894eac4ecb0e2c40c4506c064009c2000bdc9cf0cf0da081c00c2545b1017a605c820615800cc494f20b04c0100180410200071200505139636a062287fa029129215104a0500c4640319101806b56839189650d32020b169806c48", - "miner": "0x1f9090aae28b8a3dceadf281b0f12828e676c326", - "mixHash": "0x23d23e04143c24368a9af1defd619523ec85cbb2b2c47a7c136401d6854f26e9", + "gasUsed": 11308235n, + "hash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "logsBloom": "0x05a1757a816e01054954b14aa90152112749c1e05a8e8580ad09ec562c40181205c424b4c543622dee0b0b45628f2b4d625340669a8021a46854300118fa2040303cf68a78018f782c03753b20a160a468814401346e5c5b8316534583e048a15bcb87e60f60506f0dad9f405372295989185f6d0b001c3cba505c9d5c89453a28249a72b8b2b01402e805d93a2b264ea83c4f2ddd88006f260900464a7333921a22ed6914197c06cc4671e8e8922c2805cd4e064415e24c0f39beea1a8ca3c03fd15e92045b17d6454837b4e3d840c02b613616e6ca55140843773a311121f2a396f60229532230a61c3687a4150dc5059f70a9fb2821db940c681d240a8cc5", + "miner": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5", + "mixHash": "0x9f108d6eec7e2a11cdcb257f80b91dce7c70af0f5f3c60732499cb549eadcbc8", "nonce": "0x0000000000000000", - "number": 19808249n, - "parentBeaconBlockRoot": "0x10be9dae4e7e8154305b2519976d7b969c8b43eaf979063b435aaaac2853e91b", - "parentHash": "0x488e72b60d6ce9d7d2864e32d42b2b0dd0c2231def0c8b47c2f73988c4c514bf", - "receiptsRoot": "0x2d1953e6236896e34a2476aed2e08aa9af2c15783cbfaaf317e78a739ac8ad99", + "number": 19868019n, + "parentBeaconBlockRoot": "0x159035f65cb1ea0ff28d439e4f2b3b751c24c6710eda930bc4d7121881885a0b", + "parentHash": "0x28d779fee521840d1b80b3a457259e34910e8ec871ca75f90e1f7d0a1a8e846b", + "receiptsRoot": "0x415b9f4b2083a75dbb81d9f234653b34e7a9e02394f5e49259c443aca10088e8", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": 154461n, - "stateRoot": "0xd5488b1c74e85a8b26eb933f9389899d861e762eced21cc80f13e504dc3ffb01", - "timestamp": 1714964735n, + "size": 62253n, + "stateRoot": "0xe37f6c0612de420b2103e0a1d7ffb828fd6081e60d9edfa963f7c4a8feea54ce", + "timestamp": 1715686967n, "totalDifficulty": 58750003716598352816469n, "transactions": [ - "0x886b09ecc2a01291717ca3171135fb4917c5c263bab02b570b04699c20643bc4", - "0x7120b9afb1dcbf8a3a937ecfdc3b013a119f3478f78d472390a310a5b9e905ff", - "0x4f03757c3c98b9703a7d39761391846bb7acb801be84ec75a3e3c98c2bab1527", - "0x6b1c43619297ae89dd166f7fa376b2ccbe3681878ae4a09fe5534cf36b2e4f3c", - "0xc3650c2fc3aba9e0d94d62fc74a1c01e5d0b8dad01998237c26f94e4bd781a30", - "0xdc584c682ef73ea4424b80dc2c9dd107c54f93b6ef2e1ca597633357b6e98ba9", - "0x0a056e50d949ea37cb9035810d1b4040d6ab05526fc419992f9198521159b333", - "0x889a5fa247bad5156c5c883f1a2642b26aae8d72258bcc6ba51853983c578ebd", - "0x39142d069aea564e678103949fe0ea88662a6ff2f9be90888ebfa914a15e4438", - "0x6b334a8ebc4e399b790230f3506412cbde04b5182a0c0ba8fc0bc05028d68d7a", - "0x9f596ef1e45866c3b747015108ebf69295d8cdfee2f1740e439cc88b744a35e0", - "0x111524f0e1cfd9f926e67fad4c133dbe9466857d1811bc3990a6685378d4c3de", - "0x5c9591b7ece5b1a0c10eff5f206c5b106bdfb9c2a178a00ca4b698fd8239a320", - "0x640e1df9e769a63406d6ca9221e53055b4def8465abae297ff777a785c3c030b", - "0x300b18b54017ec6d11f5d64884d5535c74263cd8b5c273a48bd955c4d95aea47", - "0x17a341742d8bfc4f9f172a7934434a3131ed13b360727bae9e4f783ba567996f", - "0x11c9b5b8f53783fa96095f51929ecb977fd9b6a68bf79ae4a70dcafde07369c3", - "0xc0edf72a979fc4da03ac76967b5293d9078c4b51d61245f89d653e6cd36d195e", - "0xd395eb075cb5f57172dd97fe7d7b8cc0974f84567c5d361e50c2d39de3dd6569", - "0xec6129b9e3b6508cdada30575bf8d429b4a8be367073f6d32bcbd15487d4b8a5", - "0xe96ee5f2e20d34465225a91de1804f89f15117d1653b70a52ac46a33dadece5f", - "0x0b3288bf112cc12d02d2333831e804e34e8e6b725b75a0735159a541c122508c", - "0x52b440dd26d30776822659935682aa5de3da31e6e009a859be31a25284da9dc3", - "0xde7fdcfd8c0d7be57c1f71d2389d467224e08c4ccace1cb4ea7d6ee6f5bd08a6", - "0xc17b020b420ff332f4313b2a7d777b2df05cae5f0f6e7fc0559c47385b29da81", - "0x70f3cdd5608c3e2d667b92e8e56adc0b2f4d462b4512d400a02e74674e6afd5d", - "0x066364df37f5b82be59eeef18475ef2af9f0dbca835cc642d034cfe748ef8a32", - "0x251aacd650669415b8554a8881d4af13485135a81dcaf4a73817e9ff5543fde3", - "0x45dd302101546019e973d6f5fd94e1bb6a4092cb291124b4405d8056685c4bad", - "0xbe32376bbbca2fd4bc575cc0e5df6253672dd9c5de91034896c0edc24376e717", - "0x37c7e6f924bc7ebcb933f488d40f6e2a043cf4bd74ce90922ac19746db51dbdd", - "0x7c30e408315a0fcf2ec953d2c25a7fcebeabc317bbf127bbb5be79721c9420f1", - "0x0f3061ca328656a605ff26a218b1fd0f0ea5a4e71f3ed318ba307b879de35b8d", - "0x64b74a0e2eed40d11513dfefbf153f4c6e91266019ea3ef8f0878c754a9c6aae", - "0x165128ed51535a1efccb070a6188a8d1fbac544449d412dc9b62607b3f586420", - "0x3497ede25fd198babd44de6642f9396951b0172359fa6c45242ccedc262c222d", - "0x207075aa3e281e9b22986cbcc038960308c756f707fa3f0921545a35f309cd58", - "0x0bfa52656ee48c4a2cb5c57076d4d4650833b5697a06bb2245b2adae7d69e1ee", - "0xadbede5084444f8ef8a8c6bcf01312d0b11a72f56b41de26edb51b58dd0c38d3", - "0x6ea0a653ddd85f2d2b0dd945f53370c0d140d99b6dcb2ee6e16a398ff9d04a0f", - "0x83c461a74443b52c4e6690149b933eb7aa9af0ac84658a14d97ed749aa6e999e", - "0x556ba7e2f19ba54bbd6e308b0ece1afe017eb0e89b97b547845dc00da6d72da2", - "0xf6caa833794e2f1ea25cd2e231ee2fd92dac9316079033e0ab0003dbc26e5dab", - "0x8e2d26bfac2712a17c7314935c970967293c7ccd129dea9eadef292427309535", - "0xdee9e9a392f23e8d706cf4ba5f818761b62b4ce50c28192a4d2c7f0d14246b61", - "0x21cddf24ab37dbb7d82cb3cb54fae49761f522cc70587c559e7a451586106757", - "0xb58f2bea38abb7243c0f80cd7d35e7359a39e6318a09c0d079ae0d36fe750f42", - "0x0ee5e43ab1d8647c39f6435a49b5e36f3986b665cbadc8a7bafada5a7b1beabe", - "0x56eb597df46cec3c7c67606244fb3b393f0de1cb0cd0e0be3c5fddfa220062a1", - "0xf18ade01c2a027594171c1d48ad58833f4a40a77bf81b4c2bcb8ae628d60e64d", - "0xe90abed6c0fcf2e98d9a84dd6a643e39cdf0a7d79a23b13d18558ce0fab8e724", - "0xbc9ff1f139c162882587f60851cc8538649d406a9f01a339df7d0f45581b5617", - "0xf336a9938b5e48413c4995f80e155029e1e628570a08d8e20f642d91199648c2", - "0x3f62fa7b9944c03a93e274670f2883382b7c1efdb315f3ae9a91097715ee448a", - "0xb683c8447b94a23618703af9cac43ecec101a182df2b532161ef59037057c96c", - "0xf9f4670099ba72ef04c34ba7bad0bec88adf3d5d1c1519c880ac29cc75802d91", - "0x0ea069731f58749dc6129d4d6b74bc370331017ea81e70263a1304bea5d1f014", - "0xa9088f6899a227bc8594aaaf79776b0de771a357cd7fb8153e2ec4845b3b67bb", - "0x90a6809a92ac9871e00cefaba384e75afbd88f1d53b73b5c6f01f05ebdf572f4", - "0xde0459c22b24c2e7c0fd5e06e2fe952d40b454057dd0f7b32443121ce15de5ba", - "0x44d99905b9c585bfcb1ff319eea43cbee4ad64d7a0788e09297df36d3ad10ea3", - "0x6b1d138384bea0b361065f0b9ac195af2873f5391b2d7cb17dcbe2e2824c514e", - "0xc06b8d8dbfd6488fcff8e47b37159953f86922399204029dfd18c94da0d5554d", - "0x0605f85df25ba83097c4d8ee0583947ba295bbabbcd151db211c64b726b67768", - "0x304d653a2c6dbb1e146b32748ab7ead4a0801a8534f7b7ab9b2a4a993f7bc0cc", - "0x703f9941add97054f51081cdb64d4d786be70a3cdd87955deb6ce5b7e92f0bf5", - "0x06f1d35016a79ff4ce82f2caccdc009cf7efb807e09fe7c9dbc738c4305ee9a0", - "0xcf05d4c9de973f072b9f3d5f6089c58a15e8d53b99675f1a444c80808e1f2087", - "0xf6772ac1ea7227f8d81fe10ddbd458143530a51e14ab857aa94d88d0afd840e1", - "0x24b6e8d1454b414d6c3bb0f6f3a04ecadc510e2093d43cbbb6b300407f82ffc5", - "0x1ee9b6dedfa32c3334da32d5dc9548c77ada6646199bfdba813d891dcf1b4aa1", - "0x70861b6746eaaf11cf66b2d14fc90469bc654e4cc7e38e2f041cb706b64b132f", - "0xf6fa0463ad0bb0f359eb49ad5b28ab1c6587bd108779da34e441b8d3f5d297d3", - "0x5b208a4193d9678ce46cbbe83e5c020476780841744b7dd284322c256c51300a", - "0x9cf14ea90029266ccde5bf9977a6e51e99bd2102a15ad579be8e0c45edc540f3", - "0xabacc99e03c2b8191dbaad009f70975d7155e51bd9dab8056a0864c7f7a7ac09", - "0x8458773a88d0d36a0d913f8fe75923a89346c81f923cddf4693dbfe422041a02", - "0x0312207a583b157c3add695d404f4f2021093cf46f9fca25ce1dc8fe82bbe9fe", - "0x8d113677552a1056fbf23cb34a7dfe10a61b6e34f6595d3ad21fefe0d6296eeb", - "0x5c5b80281297df047564e3564079b9877200fc734de86103502accb40387864d", - "0x4dfcc7dea909b4b413d7ab123dce59de27e1e472e189ee96e221e0c0f2d50634", - "0xe9e0e003e54b806af3d989f633a2eb28adb4a00353e7cd70b49093770613a62b", - "0x83f7df3cf319d514e35b814a8bb2b34854398cfb5a5e418d5f3dfa0c5a5b406c", - "0xff172df0803a68ec8da428623cbe399877a06e63e7a730cbfc584279ccf47737", - "0xb9a96cd2d5b1c3f7fdf1d2836a296ed02fd59bb68faae20954113fc9696d32db", - "0xf5b61176cc2f9d90efcf5a2eeed36368d13ffe68401fe0ade18d592a65f899e7", - "0x3322dcd4e6ff20b7c72f23f4c9fee9f53baa7d2393d0b71992e61f693c7893ed", - "0x1da91f066d71143b15a7863dee249f7089da7e26084fe94ffd10197734ed5cf8", - "0x09b5a44aca00666af4158463825d350d51788e444c1237d21f91b56e986c7b5a", - "0x06f9d5ae10a966e1502738a102b38778a74d2416bc5ca9020d06f2a3911bed36", - "0x407472d6ac7c050b1b50d7e127fd4afc93baaa9aa05326859ad019635917f86c", - "0x58917b36b255c42258a1d0cc42bdf87c3fca62d1d96761f9cffabc1e48d65fb4", - "0x1026a95195609813166c184dfe015df00732d02a0b4ca01ea0046db55fdfcfe3", - "0xc1a38cc40293d632135443e2ba3b637d5f23ae3d0bf067ec475a0ba66e93c99d", - "0x31d91a5249feca497af2397634cdd80c0acfc8f6bb57bff72395f683d1b93019", - "0x3808ebfbffa2734e1de1f5d504d36f6c64f6d548562eec5804d13bc22ae2be83", - "0x39a0695fc2a986f67be9afdccd44d962e4ba1fe63f13330a1d0a934444b6ff94", - "0x29a575f042ab88dd02dd2f78399fdd77efbbab53783c6eceecff5f28a35b247d", - "0xaf6987ac88fce69edc21d8a6fd113adda99867ce4ea6996cc487c3c832ca6bd5", - "0xf0c187bdf68a29625cfcdaf573c441d2967d13e9ebdefe7c36d3bfa2e926b1cb", - "0xae5a800c97bb7600ab2af45083d80159fbbbcda99c43f721b6b4e58989abed92", - "0xd1705c20b9eefc74a620772047ef701a2ccc1c9af869a80ed418ddab53aaa2dc", - "0x2621df68331905591cfb3474a84c92c8e2d247168efe62437b8fdee76dbcdf75", - "0x25087949b6bb276530c091b29ae27150a53243785e582455965fec82245f5deb", - "0x150db220b21dbc0b0da30c4fd35f02d82db55bcf006c68eb85a27aa0b4bdabbd", - "0xeeecd7dd17c5aa37429a2c3b6240e0bc6fb3c5a9f9f8d75a858c3cffc81302a2", - "0x7d5e548a75361c489d373355e0c826aea4b7f8a15cfb0cc613022b32051c0e59", - "0x993609d32daa335b1622b16b9f5f058bd4327c8f713159bc5ce6485695961bcd", - "0xa4dd39b6c610fb931687354f06ee0980af7aed5a13b2108a97f1ef94c78854c3", - "0x9560602986f1cb583d9c80979a62b9606ffb44dddd82ebf9cd1fb948298b45f2", - "0x3f1c92bb60be5b3249d216a8a7494793f7fe3765d8dcd6a6696c8529108eeb74", - "0x125e53eb83d6debbef8bdb8a6193b0e911b77c83de15db0a863e4d874f149588", - "0x97fdd635bc175e438bcfa4fce1fe7aaaf6141f73924cd06a2401145888c86424", - "0x2f922d70b9759e4f4ea7a23738736c509f43a7236e31e59d60b015d61cffb9da", - "0x7334485a076607d55b05f238a64f331e73c70a8d05501399d4a638fb49907557", - "0x96b9b6ea9ba995a32f40af0e76ac2442d2b3c8ff78eb089c6a7c83e6f81bd0d7", - "0x4caea43914fc92cfc6d9b9a57765a5aa07a8fca3dc70a6bec7988be9dd9c3955", - "0x3e370ec9e579c08d98e9d5096f0667931fdbea9bc741f8a674be9697c40443a9", - "0x2507a512b704b36f9b155127c9e865330051c1f7134b6bf7f3f95c6c6b38e246", - "0x17424457061b65b6c5579434ec8f88b6c71d7d9629ea6ad5477c0337d4097ce6", + "0x985ca9ceaecc90bded8a892e45e2127eab09746cd7dffee057fba12ee066e161", + "0x32e57c908dc3407db0e54edaa9ed47419012ea97254c14e20111f7b5fef24eab", + "0x36cc29ccb58c330eee72456b504ddb5f6e94d6d858c86f63eb0ea34937dd89f3", + "0x5966da273533a59076559d4194d78243f84dd81d891d4c51d3a863265b3a5596", + "0x954e99a632475510053291953e6e351f4b53a4f55a3a81ae0bab9b20d6d729a3", + "0xdebbde52240c719e275d892453a2060b4867a9a19a8bdcbfd2e0dc0ad49b48cc", + "0xc9ab9e94ed525a75b1df3f1d81dc33378f17a4f9b2601719c911898f0cbb1fa3", + "0x64bda7ad4d287b86ef5d04f393807b1e603cdf0f199a4d1a79ed1ae82b026b8f", + "0x4d33586bb3f42614f3e7b326006aebf88883d1ca040365123b48a65ad2dcecc2", + "0xf82cd8300c78adb5700b5fb446750d808657f7e9ca330682e5d2ef4f4f67e07f", + "0x4af59730297eeac03919b73030194c98571d50472bad27e3bede0c9da9ec0687", + "0xe17f6b1fa7a6c45528d9fed517135362235771490a5d4d03e373cb34e5aa9941", + "0xc5ef59abc312c2a069057ae5809b81ccb4f87fdd630f6d7dc9123039e09c87f2", + "0xc9b60bcae977cfac8a0245e63ca3746c97d22c4c482b2d8a0d9d4d2f52d1b24d", + "0xf1f587b26b091a023b65bf25797e829fae7de9ca084e2bee4fb0b7d2bccf18f5", + "0x4c7a89f68bbee851386d897c9fc85504faa514549e765257b707b3d8ec32e3c7", + "0x0aa0f51b90c6cdc0b1d01ba17304f6936e947e0c6949cc085b5d266e63a7305e", + "0xe96aaeca9a319dec34298a596591c3d1dedfe03fd8d17dc76c3f5b4819d9289a", + "0x7b43eb268ced6537a438a43e2c15f18ed3fc0acb3a448841309d1e59afdb59e4", + "0x9dabe3cb5cbff0cc89fd935b29095fc4b4d79e73d6799665197b209e8fae43e6", + "0xb084ff374e32df40d8af00b962d09a482df74f8d8453501e0e80659568f5f567", + "0x054e33d58d1486ed33072aba9ed23db975a068da02a33b3985cb9f5894d05836", + "0xdfa3df293acfb0654a1c615387f84cc630a20a70d191cbb0b8aa7c128b2aa786", + "0xd62eb265e3538f00aa676da3e82b42bae4162f9e18185e4dfbb338a637c9fd23", + "0xe9c0f5bc85672715b510331fb7b729c5585161d0b3b6878e707633848fa1c55b", + "0x9a83cfa21bc42f15ffb048d6f9713b2f6474313d5d56f75856fbd1fee612c989", + "0xbc12168406a65ec994167f8aa922c799d882882278ba447b21fb7cc1403c449e", + "0x70931c24291dc10d944cc6c5e0c2ec250917795dcb4f0b364ac031c13793c083", + "0x24c2eac200b4fb5568c02e100e09022f0a07e4e299425ce45bea3a212e6560f6", + "0x49e69ab10d9de86f9de6c36476724feb54ff6b8dcc9c0317a8b346044d8e78b3", + "0x19bff8bb3ab9707850bd48772b4bb6d832fd9ed916fdd446f0906df1f42a04f9", + "0x248964bf8faae6d9949e453728f78eeca8420f8df791862164e614d999f07442", + "0xabf9f2cc992ffeeacbe3058aca7b24659ba403aa894f1975422a3dbcb0ada1f6", + "0xf17d415c1393ab67869b4233c8b957abd36fd22f2e99d4fff501ec4172e33e34", + "0x08916abc5c7dbc0b562148bc0e7f736695b6e105bc7b16bde63515c3af0940cb", + "0x01b9a5d3a6b72345601bac13a6193f97ebb65e117d161daa4ce45e6420e0dc21", + "0xfa86d494adf37e298252a1d33da21e3709e84f9a35b99c49c6ca2ee598cb0ae7", + "0xc0f6358b454520cb42f05f7db8dee63b4ba375c3dff1162d249c87beb5c137d3", + "0xdd87e0e0c1e44179fb729edac2416c128c252f61a85bf7b7a578ec8013c10209", + "0x4a949fdc2dc7f170508afbb06b80e426f92e48c1550b0d6c1c8c1ddbe3968748", + "0xb78aa0dfcf908802a886fc9a8b9e15f03d18e4c4ae61bcc0a588ac0bfe0b0f61", + "0xce8ead19d931f821120e94d0461cd56c240c002779e38a16c591b2c2807f37a7", + "0x386d753fb5083fc234893a6bad40a3cc928b0d90450aa8b771e67ccbebf13716", + "0xd6e36c2a1070fd206fb2b24a0b1a46b07a1226f3bc29e239ebbe030e9961772c", + "0xc7062f57dac83118e46e6396013492fed7f9529d21f37fadba50ba30cdb0c978", + "0x3213edd32bb188a4ca62d67f26eb8e92c6bc66d4349a42a22c7f35727a73410a", + "0xe37ef15fab42af9e2f947407b2b33dcb6897f0269f1da49cb27d35d5f7f9e9e1", + "0xbd510d6ec9800a65f217a160b71da9c969fecce0c342dff259ee48004f380738", + "0x0fd4ad04f97243f742259c1789a631667c04c32b2fe69f7ba51a5bcc0612251b", + "0xc428fffb5eb2b53a897d0382be27f6a8b8a465508e6444a77533538029397f96", + "0xe20dc556bd5cf5ff20cae88c120e614c5b679b2c7eedc8063b933a188e3c19fd", + "0x8175512f8a95771a6ecf77fc2024076c22bd7324b76fe831199a243aa4a27c0b", + "0xa18a7ce1f0d24e0e6e366253e5b60f0b348714dd9254134338f86ac8207a5e7e", + "0x22df74019c85f345f10c0823e62ff1819d9e72115f4a0a1bf58352b55def0550", + "0x51fcd2225be22e0411ff66388c76569d56cd443792c3f9814533ba7321e3894b", + "0x3a40c844659959b519c903a5b3eaa74feedcb7ae2dab222af0b98dd1e613152f", + "0x4f7b4a2b0d4705d6060705e0cf3e73e20e197164fd67e4109fc830bb464af529", + "0x5d31186046cf78e96391e81c38f62878b9b7591dbf0baed5da7bc2c1e036cdd8", + "0xd32ea7644b3daf36c6581e46a2dc3f3127ee3724951b9f02d2b94d4082c4b77a", + "0xaaa6c054ff6238551d406f07369733217328f4c378a28acf6cef0cebb1aa853b", + "0xef0b0e0c2865aaeba2650380be07647e0feea0694ba627d13c5dd84f22db08b0", + "0xa50af96ab161215eaae753858a52b09cb1c4bf398069a1a0d16ecf5ede0fdb2e", + "0xfa64d4e29cc662b66d933cda646a63de1e472df3de9f3e20578ce40476f6496a", + "0x6f64c328b7a75d43fd18f2899dde7b12780b9e80205f6ce4f4a2a55a9c10ef92", + "0x7624837a43c3af5772d4b558c79e316ebc49b54bd5a42481a86e63780a3f4614", + "0x35d17c91123e5279f369c8c33da9843e1fe5ad2ec075ea36e60871e6771f254e", + "0xbd86c865f636fbbeb047aa3c011d7c4d12ff188ac620868390a81712ba4f5bc6", + "0x13b2e551aba2eece336b98dbab7e779a131d66f7d0c2d778ee5d33d71cbc3b91", + "0x9a26feb4b547431746ae8cfab96be6e12726e3cb0b77af2db26375f3e649ee46", + "0x9bd36aa10c3efc073c2da0c9a1eb21c2b609d2c0f5d786db3fe91a46d2995e14", + "0xd286dd2dd0137526319372bbe0f9a79442d6b98731fc0495f5ad29dca872c4ba", + "0x60c3c92422ede1228e077bcf04461e2d050b51d3a020e2f54a1c01ae2780bdef", + "0x03fccff77cb10c90d5438a0a1b336ea17ecbd5ece5fb13a1ff4e2e22074708ce", + "0x265b734355531da082476663f1f5b3d6927b440dc468615156c1cf1a1db3561e", + "0x0cade2907a0e2441406b893429e1e356eb40f5244f1cc841648bc6e11ab73feb", + "0x302e20a6d06555ff9c68de463b52c7383287b75eb8500d6ff020d735fda590e6", + "0xb07b2d7833d1ddaf0fe2d16114664e370eeec8f4dfecbad5c165e9633b338a53", + "0x497a45dd663b3cd6ddb805a4483391ca0b0c8e7c140d40ec1c372889d2ebdfd5", + "0x4189d0c8571b291e4a571320dc20893c8663a48e647c97d2c0466796f417ff9d", + "0xfc3a8e8b5f6f430f850acba920be6f6d3a21387ec2d4f55dad0963db1d55e724", + "0xa249ca00a171408d2fec293cbb8090cddbf1dc12a6810fc1045f1c0762f9dee2", + "0xe13f9ab1104d3e6e76c8d7f0a2beb2bd14f38ddea8a6a71742ca7dce0cfa06a1", + "0x9e914125cb609aa76fbd517b4fda29b2cb4a38c35a6c5fec522cc704ca6b78c9", + "0xe87ab3af19aa6a47981adba95fa8d9cb374e2b049bcfde2ee36b2be570831bd0", + "0x7343d51b2b5e61c1b955cd8a3ce88c063c0cbdd4b4a57b613645b0d41d2bc4de", + "0x9486fb9ff288444fbd27bb0cc1ea65803dc4665fa0510792064a71edc81fd38e", + "0x6c7d81763741c66b1cd8b26412e349d9eae5acbc59b2beb24eb1773f4afac015", + "0x6d9c5dcb8c9d0e109a944a9acba0f750f3c2571ba5a1cda602497393001af0a5", + "0x9c2fab0ebc32b28e2890af06b0eac948ddc0c21389daa2152e8f19571abfb575", + "0x793fe36c8910f2897491292b4dd027ddb4dbebe04fcbf3665ee49d1da17bf9f9", + "0x63ecbbaec1a9caccd37834d169131519be0fd4ff5bbd024752e08d6bd4182f67", + "0xe34feab296b36a546744ba6127a679ef991771785be7071cc549be7543df6a73", + "0xefc6e872e1c01d377005b6cc2d91f0dd8c761c9aff5e334186fa2ca216199e63", + "0xdf8a3c3701684893c3deb5ea2849a98147eedd1a5cda71ad6ea30c6d8a676c4b", + "0x27cd453d78c36dd1edcd9a3cb2adb21f4826407febf81f34dcbfdbcc304c1693", + "0xfe8ec22519f7c941c793e60fe473061c572480f5f71ef811879253c27feec192", + "0x2547f3cfe5210cdc1534e782ef1552c55dc6edc1bc014833c560cbe95beb18cc", + "0xe6cd4feb52ea15bc1dc064fe1cd25de83378d2b59365b0b31b1f1a118b36f1a0", + "0x092aa45e682fe43480f2f90b46414d565d4be4a78ea8c6b4d3f2be56d99afd2b", + "0xd8a82f85b7d571eeedb0dfc2537bd621383cb70a8a6b56ecbb5da0a483d972c0", + "0x9242d4aad949fc46a1f7b4ed2c973f25e02d4a3bcf716bbbb4bd83deb339f6b1", + "0x6f1bd81793fdc7d0952f81ee659c598eed80e151915996c90cf456c86ef25c9f", + "0xd39e3fbb0cd22d78b6be12b3f2a8081ba1ac93d0af0df53ca379ddd8ea2c8e6d", + "0x21184cca95fdd55d2a5e6e1ac68c1fde6624be4077afeec35be12ab3337bb6f2", + "0x46f7a1329c9859de6fde82c92c6650f1f4f0b16c8c3788d473b279326d6ff759", + "0x17150b2404ffae04e39186628ff38bbee557c415d4ef1a31578e5570c0ac1002", + "0x551917037f6cf7ea340fda07aff14cba09d087725848c11cefed0338d726f154", + "0x1a9d126a22e407d939165319347f3ca18058c7cfa9539266aaa52ae049216821", + "0xca9f9ff07879588cc08835cc45ef27629a218d5103b15caefb90819df4416626", + "0x2030f9e7486da9cb5434ac2ed67552e914a9ffdc4663de2604ed9bf036492c58", + "0xcd1af8ecc3de9576522040bf607340db9b064caeebc9e853c68b0ce9b86954d8", + "0x9f84abff04edd7316ff6634b46cbaea92921625faeb6accffd29467fcd3d8b56", + "0x3e68b854068a98c5de20d32ebcb6079821d8fb9bae9ede10aae80d1174ea2f3f", + "0x97768c4dd3450be389f0a9ad70b2cd66155e60baf8ed4c58550cfe5992becbfe", + "0x759b74b4b996e39a73d89dbbec4de4349e07e5dcd4aea3f6ad18b3a1aaa9e7be", + "0x858345a04dc7ade8de93a9c333fbcb62d33e6aaf7983d38fddc75fcca7a436fd", + "0x3c9882c289609b442085b06dfd072ed2de2207fb46fccb4f76bcfe5d210bc280", + "0xf8c1f4b2f65f097a420c7e575f8c1e73c9d614af62715eb5306f347f9c5ad0a8", + "0xf9881f2316305ed8866d36253e4c8b58e1bc96fd2404a9e1c559206dcf3d3de3", + "0x0b069dcee506650aa45fb2f9ea4f5c6cf6cc746e96d72b08f6ae20798e2c05ba", + "0x8833a57ce6aceb81ecd1cf75b6cada58c78d77035843313b78f1a1417f11d00a", + "0x5eaf5d98f1ef1ad84e6df6135717ef198cac4ab430c9cd5c7b59c39c48535ef8", + "0x763140b4b7f4a68eabac21e0c98aa7cb013a914abac7000fd20550db2b39348b", + "0x45d05a377106383e0307f404d0eeb9c899bb34e1572af85c7b38e7836290b3c9", ], - "transactionsRoot": "0x5b562b0ace357d4ad0a402a0ccd66992474e445b17ccae8415d610589bf8e85b", + "transactionsRoot": "0x202fe84b06e824fdf77a2f47762188f9346cbd82994b90ee5a063c8202eb7212", "uncles": [], "withdrawals": [ { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b6b1d", - "index": "0x2a5127b", - "validatorIndex": "0x4e930", + "amount": "0x11b3013", + "index": "0x2b3aa1b", + "validatorIndex": "0x36305", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ae511", - "index": "0x2a5127c", - "validatorIndex": "0x4e931", + "amount": "0x11b82aa", + "index": "0x2b3aa1c", + "validatorIndex": "0x36306", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b600b", - "index": "0x2a5127d", - "validatorIndex": "0x4e932", + "amount": "0x11c3fd2", + "index": "0x2b3aa1d", + "validatorIndex": "0x36307", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b294d", - "index": "0x2a5127e", - "validatorIndex": "0x4e933", + "amount": "0x11cd47e", + "index": "0x2b3aa1e", + "validatorIndex": "0x36308", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b6d16", - "index": "0x2a5127f", - "validatorIndex": "0x4e934", + "amount": "0x11ce36c", + "index": "0x2b3aa1f", + "validatorIndex": "0x36309", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b31e3", - "index": "0x2a51280", - "validatorIndex": "0x4e935", + "amount": "0x11b7466", + "index": "0x2b3aa20", + "validatorIndex": "0x3630a", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11acef7", - "index": "0x2a51281", - "validatorIndex": "0x4e936", + "amount": "0x11ba415", + "index": "0x2b3aa21", + "validatorIndex": "0x3630b", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a2de0", - "index": "0x2a51282", - "validatorIndex": "0x4e937", + "amount": "0x11c2d03", + "index": "0x2b3aa22", + "validatorIndex": "0x3630c", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b484f", - "index": "0x2a51283", - "validatorIndex": "0x4e938", + "amount": "0x11c8650", + "index": "0x2b3aa23", + "validatorIndex": "0x3630d", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b57af", - "index": "0x2a51284", - "validatorIndex": "0x4e939", + "amount": "0x11c5852", + "index": "0x2b3aa24", + "validatorIndex": "0x3630e", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11af5b2", - "index": "0x2a51285", - "validatorIndex": "0x4e93a", + "amount": "0x11b35b1", + "index": "0x2b3aa25", + "validatorIndex": "0x3630f", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a36f4", - "index": "0x2a51286", - "validatorIndex": "0x4e93b", + "amount": "0x11bd2a6", + "index": "0x2b3aa26", + "validatorIndex": "0x36310", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x119867e", - "index": "0x2a51287", - "validatorIndex": "0x4e93c", + "amount": "0x11c99b6", + "index": "0x2b3aa27", + "validatorIndex": "0x36311", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b632f", - "index": "0x2a51288", - "validatorIndex": "0x4e93d", + "amount": "0x11b2b56", + "index": "0x2b3aa28", + "validatorIndex": "0x36312", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0xb7ef8bf", - "index": "0x2a51289", - "validatorIndex": "0x4e93e", + "amount": "0x11c9b59", + "index": "0x2b3aa29", + "validatorIndex": "0x36313", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11bb871", - "index": "0x2a5128a", - "validatorIndex": "0x4e93f", + "amount": "0x11b10e6", + "index": "0x2b3aa2a", + "validatorIndex": "0x36314", }, ], - "withdrawalsRoot": "0x7ec76a2942b6ad99ff0fc13c65025b3a89413813e5b53dc32599bea4215ca660", + "withdrawalsRoot": "0xd420104a95094d97f7f94cde407b748e8613135ee7424f52164b39a44fe8a4cb", } `) }) @@ -484,270 +488,273 @@ describe('args: hash', () => { }) expect(block).toMatchInlineSnapshot(` { - "baseFeePerGas": 5087991129n, - "blobGasUsed": 131072n, + "baseFeePerGas": 8758571930n, + "blobGasUsed": 0n, "difficulty": 0n, - "excessBlobGas": 393216n, + "excessBlobGas": 0n, "extraData": "0x6265617665726275696c642e6f7267", "gasLimit": 30000000n, - "gasUsed": 15108959n, - "hash": "0x33a7971472539aa0ffab0ee330347acd56ca7d2682bfbc80872110ee15e7d8f7", - "logsBloom": "0x80a715cbad9a534e26a01218c885fc2384c7418ebb08610ce30b692726685230a8d1d4be7c512b1963d50bc3fa9b310512532f52ba86229ee000e6a941fab0a45026e41f4f8a4baa2993f06d4ce308fe84b4026b0b4f8cd4d6445240806750615ed8433dae4e24e01d4183978821ac9f00123297008a2648f269c41f7c98d1059a63ba6aa345d42410d70250213a65761258b78143d4709c100282df6a523a79bec1036e5814f9583cdb81c519d7b70016976e8ae1c98346091840262b154741d999907beade05423823ff7a09cd783c06cd621795d85112bf7ffc0620a1a0da5854e4897c2014ea02f596915c43902c9ca0532193797747712152267d0057cc", + "gasUsed": 13655878n, + "hash": "0x0c3e51fc62e1dd7401c8884882755b72e1c5720d0b01c75443cdfa8a129d3fc9", + "logsBloom": "0xd123054441c15c9d30998061c8899fbdb40be9b00b9c9b73202d015aef6a92b80e6a1520ca498004de50db02f992518322199054de076a903019e47aa1a8b018a046a6c95d2d39a92c06e33ea9a225aa80c5408964c57f5fe083d5dc8a7051e5e92f4844e244023e90cc74c040236e49c31b9aa023596ec5aa1c0e1458593c036dbe9f7cbaa69538a2ed205c0ae2145e441b1319eb6946a9d82da46e6e9c0ca85f9688c6fa946b844bbdd4cc3f225ce09641d62220214a7cb9744c66340c807013f0315212455a000620a3b27359c8c13e1000130da23e141107d28a4900e1909470a80b03d746114b1596d3a4430b68b4ff3e219bac38d8dfa1680ae4005d4d", "miner": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5", - "mixHash": "0x0403c5067873bff3108703e127c63a2882509ee91006d921e2955c2420470958", + "mixHash": "0x7702b2acc3443bd74c0b3ff142414f9d51e4caa0f111d57d319f4d46e21dedf7", "nonce": "0x0000000000000000", - "number": 19808250n, - "parentBeaconBlockRoot": "0xed1c13ebb84bf75b852cb3e703f8a7d7c8465a039ce058e2390ece725a54ca47", - "parentHash": "0x72e938fa6ab225be2ce940db9aea7d670b50b3320b8deaeea1084ab645a1db81", - "receiptsRoot": "0x649c9570fc198f14fa93c9b3fb0d7bda1f75a2a05761ffd832768841fc274aca", + "number": 19868020n, + "parentBeaconBlockRoot": "0xd472790dc1fd2d1b1cc9e208706266196f261e4c1a74f535d86981670c0d5f99", + "parentHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "receiptsRoot": "0xe2822bc9663118439077ad806cd7a2a1a75bf1d70bf61d901199cf599c46f9d7", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": 78523n, - "stateRoot": "0xb821f1259927e7c699f2b06cd550d45e8cb322c06256f17ba36caaec33ae865e", - "timestamp": 1714964747n, + "size": 56024n, + "stateRoot": "0x115fd5eac921e6728825958b2b87da8aaf17edc0085164f11de798f6ed00abbd", + "timestamp": 1715686979n, "totalDifficulty": 58750003716598352816469n, "transactions": [ - "0x12860ead0532b3a4f4aa5f8187d7d0365f6ae93764c8771ac13c6d38560033d6", - "0xed513dcfd2a4f635bfaa476c78919cdd116090513e73ae6b369fa2012ee5a9b0", - "0xc72e7c15c972b5e4e2ccde950691426dd5a725cb63fa2e9784df0f98bc4c1751", - "0x258c636c6d237e14c081c57e7e49043cbc1c81dc7d0b9628ff2c7c6b9a3ffca8", - "0x0800e07eafdb3c33bacd4511503110953d231342a7c29c88c3706b70210d3079", - "0x7fb43c8bba50ffaa4e5b679e0bb55213d55def53e86524b50cd929d69d25a11a", - "0xce5ae725bcf217588fea1f50a5e90b73be01be20a0c280a74992365b84a0e1dc", - "0x39014032f86eb1c043ecf794e04b2a03127a41a1a65b3ab232705a7bf7ccd3d8", - "0x54c8ed510339118a344942a487b46d8627c8627f35cd24efd924e5d39a0bbbaf", - "0x10fe93d2263dd06a9ebf720b2987f07032fe3c4371c8f0c47f92969e19d638b1", - "0x9126f9bc92a2abcd95c35916d45258490d9743a536fa98b7da0f6bd878aa40c3", - "0xaf7690eb86ab1e3e0622454477b7048081ad555d398ec7d3ee7ea80e7b7136a5", - "0x2812d7e89b861cb2b6654ae85728bf046ea1b651d558f984e22df08357958d46", - "0x0351d36488fb798fd81d65de7adbaed0b3de372ecb1dcfb7722281d4595b27dc", - "0xc5fa349a9fe36be632e9ee0da47cd1f585cee05027ac7d241a12ca7e59ac01c5", - "0x9a2e22ac7b57614bc59d69f0cf6d8cd664e625a39b4bd3518fe02174fb36b53e", - "0x40b80ab435c5d21ac7a8607cd19dd90bae1abfdd45727726a0027c0a6d0f0f40", - "0x3caf97e1c0d81062c8047bdbac7c427e0c2b4a0bc6f860cc3892ec884444b9b0", - "0x350bcf3893818beae014118a42a6666559d7ff21ee9824b88a287f0efd734627", - "0x7588537e4c3f06d40e4efc1a495dbfbe042b6064b81104de82f5ef0987b64cdf", - "0xbc20d73ee056c066705c7cbe3fea6eb1b7caea7b56ca53fc3298396f1fb70d57", - "0x2f08911326a2c5c60a7f86ef99084d5b73d2393dfe00622f627459bcdbd62e10", - "0xfb6055df069e04ae38c2d553f891d3ee6ab9eadec01d5fd8bf0c8b477c7c89af", - "0xdf7a8624a9d3b9fd3cf65363243b9db1226199e2035cfc9188208f89d7e38cbc", - "0xb986e24702b5a08144261a64a2e189f872edaaed979082d33f31069cbaf82420", - "0x472adb3a051dc3dd82db424786c900dc1d87f3803d0ce6502bc709687114f98a", - "0xdbc480aaba9b60b3b464adf78a4220446775490cabbc5952f1ec57318608a81f", - "0x7b2770dbe042ad96bf6a91855b635e78c5d027f3798424356d3c45c3002cf499", - "0x12459c7ce4a983588e168351f2206843a4b11eddda203fd3a6a2d4580f7d23bd", - "0x9d8b25edb003dc088028133efe714ce235b1f6ee1768cdbd7ff69ada032d4a21", - "0x370c36c4292fe4d437618e4a045c6fb2c6bc22621411f40ebfb82fcfa2f7b9e0", - "0x8145af3796c4964e5a6ff964de8ab23b615112ca280ea7beea97753b6c849280", - "0xefc0bfa3a0c44ef04d36335054a41ede3cc507c759be41a1cfe83b18f5fd129c", - "0xc79e7863bb792590dd0b3c4622a180bf70f767591eacaad48a0af10930332679", - "0xf47931c3a313968e1cd137b5067ad1b90c54bccc2ce16ca01318bacada4b4a31", - "0xd54f767e01c4267be2c0fbe8db9e4d845fda4cb113a3899ada4289480dd5f859", - "0x2cd97e83ebbd33bc8d7d2d39aa9cdcec1ac261bab1702548ede4ebead14c47e8", - "0x80c0d28d0ccf69dca51d263e0a4107c8a554c40dfcb207c1eb2c95a07618a5ac", - "0xe5033b68abcf549b32ca59903c655e12007d96e8dbd53e37d2ee00501d2b7de1", - "0x4ad9f131b26daf8424a72a58ffdb82014eefdcf4ac1473f504777dab84b87535", - "0xaca6f6a0a1f94e265d31be0ec2d6b5f7da27e6df40595b067c71ac65eac50e94", - "0x1d356bf7c11ab24a8b6c51b38b1f822e2deed2c9dc4bba515bfd46e27b20d5ba", - "0xe58b2851229cfd243981f0e3a10a6b1dc7a9df7e2a5afae1f0e61505e960375c", - "0x931c4dacb13e711a8578f02df6df51a381cfb05fa81da5f766638952910a3286", - "0xb199838a7add300d484e03f452a09c7cdb0afb0e7c67e5884367b9c8a674d182", - "0x2110462201aee32e8d9ddb5c9dd9513592ffde32382da1aabf007630ccf77ea1", - "0xf5ac56284d6d4aa75fa67ccfc58a5658d2cae41d01f412cdab962e91276e06a0", - "0x4ec6f73e1245c247ff6868795b7f0b6789f6a9342c8580b7f9a80d34c3959c6b", - "0xcf77dbfe46f7c12dd9f8042e4b86e7c28a519f1a833cc30f4b581418a3440103", - "0xd4ad311394d0d0a06be4bb32f85ee6f5f6b5f2a688b252e4fb89c3dc374b8bd6", - "0x5f998e622a5ecdd34ac52e89cac0e8959e734a4afb850c18b7829a4c1c30fde6", - "0xac150958348194a84cf894631ecca299cc1ba46b92d36222906f1695d45ff127", - "0x029101258e3a0d66780f2ec8a6c74e93f1f574466af72a771bf4452ed4a36f58", - "0x9d986ebbcfae4e31be2aa5fa5c7f2fcd7f0856ca6521a7e397b7a2bbc48d8ba4", - "0xc39c67e7efb378137a47dec994ac018f3b9674a1fd0dcb2c8d39ed41c8655206", - "0x9a416e3dd237f7f9b5c696197f18a53390f52fe2971658f284704167365c9e35", - "0xe9305e739cf066fd8e1468dd25f460db18f33b8ea171c95a9c424c5aa7e3c235", - "0x8832a517ca2deb2a66b5e0681fe0c85c5c1af12aeb94d50b531a264ae1eb9e33", - "0xa9f74c7b27928f1e4b6344889e22939409d07a602619b62903c5776120e0a558", - "0xa10590ec01af9f837be9d6b3ad688acbdbbb3fc8b03bc2cfd9248ba20c6c64ea", - "0x4ed77d7ad8b1ac8fdf1bab5e03a8d8c73687b8a7788b8040a0c1bdce2931f0d4", - "0x406705bbec19171a8d5699522732698255b122a495bb4141e2c11605972495f5", - "0x0847427ddcdae27ed2029ecfc9a0fd27cdd919c5648ae715b8c25f336a3f92d4", - "0x6256806522d5dfd39f9a7fd8a2aef44c73a555c24a3fac6ab1570771e641a05e", - "0xfe1a5fa2b637212e86d593b3d7ae041babad31b866d054e901f2ff33c468e418", - "0x6a9576201f7c85a2c327581f30702e94d2a350caef89c8400d9569aa91951bfe", - "0x5f77b63367a427cc620ca5e3a660b1dde2beb5ca98e56adfd55a4861ae14e1b5", - "0xe31b66b16d8a41d32dc6f422502bdee12bc747d9314b1856b4b4bc9cb3dd9403", - "0x3531698211550e8674966e596c678f8953e58b304ed7811c4fe663b7b9c7cffd", - "0xeb2c5a76791d6ff1c11bf730253658f51daeb00906e394b47aea835c9fdba77b", - "0x86d1ddc92753c1c1f0302a690d2063c6e0dfd2d6862c592274fd7905efa49eec", - "0xfc574ead986bf97b1f8a2f238d88727f3d4a72046c63f83290fb37dba3201b5c", - "0x325936f0be7ea6043238e77bd1bdeabccd759967879908fd627f72727518931e", - "0x20364ae1ea8b9801894ffe225d7d976f80e7362dab1f5a7130d25243b8889eec", - "0x279735ea4729dc90a118266648a2feebce7ca64cb1afa9545e19ea13da0cf83b", - "0x0fa0f631fd043dacfc8d46a5928abeecad3f78364b82e7186c60875837bdbbbd", - "0x4bc7e1074376aa78335f8b4b8f62e9292cace9dae0aed6d26a203a03cddd4109", - "0x775e28757ae6e072cd3b81d85e4de4bc924b69341585ffa644898fd954808aa0", - "0xd08f902819d47dd5b7d2d34273aea34562d7d3e6e696087625a6654055ef655f", - "0x4f11a66edea360f5f27f462a11f93d817cee7a870c9449814f96dbd155cc5bc8", - "0xbc4798ebf06e8de6f41f3266e38eba95c4fb1a26476bb1e33029d8cdb7036a24", - "0x4b1cf02ef289636671481e8364afc84bc79cc1f196c75d59bcd8e6442190e9e3", - "0x08e9a2c505d6975f87dbb3fd680a748bc3a10894a6c05d045d7cead1311daa50", - "0x9c18c613880668be568156190381fc36662369e49e8a436243eaaeeb5caf42b0", - "0xe935bd3ef799f26b7efcb0796fcd6762aa2736b6241a5ddd4de90ff9acb5600a", - "0xa2dac6abd420580dbe113c0c64190f731519f3ad51f37426c377022aeb9ddc44", - "0x3b20edf7281bf115eea7287643f68ddf70b464baa26ab493e906a8b4cc0bd183", - "0x6bba175b959f2af9fe4d89a92e55e259ee7ca98207739ff9e86ddf8f1a90fc75", - "0xcc34030e9d69b6f7813ee9647cde4ab4bd23fb3c4cd76dd1d3b0a9b5b72b124d", - "0xaf28bbd7c9eea390ecf90b0ba6cd7074bbfd202956b80a411a72a29bf1d0a065", - "0x8126d643814b5d013674ead269132aa4b223074afcd406ad0d7ca07d598b3e52", - "0x781de3d23e65f4f7369b07795ad1f1237b53d8f054a2d58aa24eadb7e42ee07d", - "0xd01c2a8c4020ac9faced0d25476622ea82030ffeeb7c69ffeec6004827c70f07", - "0x133d37de851fbbc8f6496519012e4ae17d60e3ac58c8987d4de3142161b8dc6b", - "0xcd21c5e94e1362390688c541be600a53f318a299e7fba155fe032e61a85c87db", - "0x1a03c128b6b6a4348f56ebf4076f5c051ecd22f0c3534216fb02b1bc33a0602c", - "0xbb486632d0c2fb6fab0a17a0b39258695f9a178f5e27e9a72c36df76cc1263d8", - "0xa59bb99d7c0becdc070c02ea453409dda451b5e6c66ca42a081d01607691c68e", - "0x6b8701f8bf6a5bf853cfe765d5d86153cecbbd46c41e6afb81d26d1e79031cfe", - "0x8399c2f547d7abfb99dbc586250134b57e46577f7a2e55e9c7c2618e56239292", - "0xd37d12d8518dc02e8b3cbb5fa0b59f56fe6c0a70805c755ffff6b74edfcae2f4", - "0x765ea9c689e67f4f773e4058a2fea01edf70da6db50064507e684877394aa502", - "0x89675014845e26847ef059d21ea4af749975a7ec3f4a6976e6c6e8c53b0b145c", - "0x2ffd985bbae3b9ff11f8451b8bb19515a449115abdfab09474515d1cdc5ce124", - "0xc6c58abde0a22e572bf6e16180dc968f02dc3afa3d15d0aa8f4215e42f757a62", - "0x37b84f52321c2d4c81efec686237f125b770a2a3c103a684d63ed590e90431b7", - "0x3706bc60b4a99c01097c06f39512247448abdb0d15f5f609220811da018ae17e", - "0x7d2eab2fec674e1c7e370eeb167ecb74029c0a232f1235e845963fc7d3dda954", - "0xd4c6ab4c94c53e5aadfee12542526d55630690ee7e8402a5c992a000950be6fb", - "0x3d0517ea747fc46a1af3e8bd66a5e9c1baec849a3e8d6ec8c0cfe065a42cccf3", - "0xcfd5693a2101852aec988e057da93871f453f758cecdd38b9194652dbd9b9c25", - "0xc097c97e4acc5360de98e4d72af55333c05d154eac3424059e7848d32013e025", - "0x7527429baf457ba3644188a75a109960ae0d845449386ad4aa8e5581cd7b1a41", - "0x061e3b2a4c0cd6490993ea94fd4e7563d362585af12bb3458952b752426886ce", - "0xf9af3398ad3edde0ca7f4603e5851d302f39b617e4aa1eb3568392bf5144bcf4", - "0x7f478c943917b27a3441d42ddce13838efe3926ed6ca87e812be441501b37016", - "0x94f5ebf04e6d04d89dca2643daa02439833b153460d3f33de578047d0f04ff8e", - "0x2e03c81dc609ccbf0e91b6b67b79f3088028b736679de46f51caafbc9dd6a488", - "0xfc6472d85609fbbb6ac8dec4bf069f51d3a96f59f163738e38724aefcb5d9423", - "0xf70cfd8d0721b13b8e75c8aa24e6fa984576b1916fa14edc932fc8f53132d9df", - "0xbf6190304df41dafe26113b37dc45a9812ccfe9ee40a1dfb97bf85e71c5e9829", - "0xa59cffc13207fe46b3c41ff728f3e1fe8172492854208ed6ee34485a4a452638", - "0xa0447569ee667995ccdf4edbe77abbb9e499741b7d084928a2cd4fec010ae3af", - "0x38de793ad609ad9774dc298e1b3050eb022858125e22640ac6f4ba4713004320", - "0xd83b345b4a6cc0ce214d987ba4a39d2f981ee7e54bba697138cb9a2e3f354a31", - "0xc58657f3919410d504d0b3e16cd8baa1a38a2405b490a288eb64635c86038848", - "0xf49b53d2c68f855bbb828109d66cf75952fa16d6d21a6aa8fe04cba4ae54e91a", - "0x98559bbb58decddbfddb8f074e4e681fda52ee5e41d9b230af4ad054c6b05448", - "0x0cda4b71587108b814822df6e4ee65e466716c634c5a080c87bb9c92d0a01304", - "0xb5dc2541610f061f46d81ad092e7222a85bc6d208044b8d57ba2381334901536", - "0x6de7c83368dacd692c865fb42fcca63ade071e98717cb62424bdd256f1368d26", - "0xc553a57130c5877337bbae3150b497fff994a1150494911659c1fca1cc8aabd6", - "0x9fa1899b30b6da8079838aa0b597ed5a48a1182006b28053babafab8ac3b796d", - "0x545d5046aa19ce6f402e93bd77d0c29f9ae58f07856ace50e91e9fdcb15b0bee", - "0x6a8698facdbed4b6659ad745fd4eb434bc129cecaffad99c3f08f4d688b1df02", - "0xeb1269ed5c9a4945c0725be8b986212057a19bf9127c8252949270a3e1996f1a", - "0xf4792b8be1496300e500d7a702b4ae2824c14d5f438604fdfe94388867c7c9c5", - "0x64c6a2e4cea7d4784d12677704549df5bb8b27ebeabe41891781b9a641430848", - "0x45bda137a2426603437ad1e393bfc93855c84c9eb116299640f842ae15beb46a", - "0x77374a47adc133e93d9661b8ce8e672a343cd5a2b2a079034de69211a0ab0893", + "0x5d374a026007c13e901765497b9164d44822902463efdf7b574b10c476ee2ad6", + "0x2762a7fb7c973e888edc457a3808d3882b5c8fc4f6c43a082d823319b126b91a", + "0xe637d86545a9b508b373fdd46cc71682ac4a5dba222d7c9ac01380306cc96cd9", + "0xecdfec41e9859fa217c5467debc9a5fa95290c3273f0ecf282f802983d2ca105", + "0x75f544151f040710f96a2c8cd6da6cd7bb60e461bfc9b4f87d015562d9a55328", + "0x07e609166382b05cd4cfd59764226374af8457a5dc0cea255721e5570cb32844", + "0x08109ccb2b1609d10cd929594ba3a131d59c7aa6eb174cc7bf578670a8198405", + "0x932fb264036b15e8a9704501e4f1ae34a9ac7543c498223c3456f03ebbefe221", + "0x4773aaf55c914947aeefe6c996b961c900bddd82b4e809d47a5f99af22b014ef", + "0x04d0728690604a7ec930782021704bb5d75d16d2c3330f8ab051348c906c52d4", + "0x61d5fc3a8aa4f5e802dcd54a7fceaad89a97c873578b845ad12b34a96540aeb7", + "0xd14bf1505356f83e55d4baffa315e0e9210479dff7486c4164a050c935d5bccf", + "0x6c4e8a1e9484ad717ef42df12a6cb9655216b6a2f7420f52dc540ed952860fdb", + "0x1d2361b3ec4fcb498732048e348fec130f15fb7e05187d8878985681c506b32a", + "0xc3da74a44904c29c9046587cbade10386db5aed500d7ead58335a9757fc64c93", + "0xc8632c7648b32e86023d8b585145bda62e5f8c160a5e6c8c02ec183297d05d2d", + "0xb6a79dcd720a72d2ea5728a8e58885304202535b00861113dce00d07bca7f3ab", + "0xc8b9a208eccabd84320946527cb1df897ec48318c1ca67e5fedc48388152518a", + "0xd5b0feea2d8e474913d280c45c4a6e365ec2bd8ab09982f0b07a7e6e2e433526", + "0xd67fa075f7abde07de71273e227856b43373276f18eb1446d1566cfafe896947", + "0xca96b4905a5854d52f3152dc2f86b1e8ef0891ce82b8a6d0622d4470fa980c03", + "0xd80b94b3d5e72e1cc74b3acbf6bec79bde51d6341f021a1259fe2e3303a919f4", + "0x0e034d76d3593f1f07baf2452e337da912dfc06fd61704e658797eaf5c33222e", + "0x755a7415073e029b231d575f935a10ae657eb30d3aa3edd32fcfc812ba2075b9", + "0x082bebb8c90bc915b6931d6d135ae7016a41b01e6d07151b5d11d2e3cc15868c", + "0x5a550298d163c3a6b1ca91412076781462a6e77825a7a34789e514f566a2ddd2", + "0x7f5523181ea3b7b83577e2de0ff3edf0b7bed050436fd6958274a0a6882a487d", + "0xc63aa388331f5016643dc4744dc47f0b79ac2dc30f2837f36058959de5c6d97b", + "0xa1cdde08be62979fb2d51e3d1447e67ef9a72e7e9ad6c70834b6667ab4b25b2f", + "0xeaf27f121d562cf7d6ba5fe04cb7477c2eae917f6ed0d254c474595334e1e61b", + "0x4d3a2c0aa20291ec2a3e9663676770bb1cb1c33c8caa7308ec9b0e180df42039", + "0x1f13065bd8d6bd0ff04592f8216576eb2ce38d766cf1fd4114392b4e622a7658", + "0x220ce318063ac4496ba1e7946b78fd1574f95518ac920563531b124bbc3ec22d", + "0x6c258638f3e25d325a1f73075a338ce02e57b4fac1b2a810a544d40b24e8b9f9", + "0xa2a5fdce0672a32e04908e9a12a683697057855a33da8ab3cfc5275094f270fe", + "0xfeb465bea0d19e832b87965440a36b3ea1d8bffda29d27ab72bf196f5a3954c0", + "0x20b39aed43810bfc46a279f91e2814ae5a56906f7b7505c499850f2605c82dac", + "0xd75f805748cdf37402c13b685d9dd9884ba1c0b0e3189f9f613a3a9ed223dbc8", + "0x46bb82c63a8a2e29d01360f78d5ee871178847627774756ca6efc614c9710cee", + "0x37a217624ca5724463612bc0a4f0943a3bf8599a05e9d4dc82da20bb0df79867", + "0xca8ec3dfca0e43c79a9a32cdd8a01c161a8fbbed07d6f5b4231dc7b4086d1380", + "0x12f7e01f6efcfb1c56bb3d4bf4358c32df847303c92d4f646996d4c601e1bd2f", + "0x50a0a2e7abaeee10aa9ec6ca0303a019acd2b09279357a480fd37c2c03e177f1", + "0x0c0134f6a1f68649f4777c86668ac2c3d348cd5ee9f71adaf5a783a3852a2e1c", + "0x740fb5ab5762b25c2be2f3590cb0811d74b54dae5e40f52bf1e68c8fe2cb6e92", + "0xa2218d513e2ca93a8acb3652d638af7be7e62711f48e81bf255fff3cfbe3a0dd", + "0x413a7f87acffc04ef34261ae47737ab2f5f461d0af5d57269c5f6cdf78275159", + "0x60d81ea9118a9d8075101f22e09d0646f155f23c2f4b84804f7ffc5afb203a68", + "0x2ff7f513238717f264521c91bc457fb17800beda940eaf6d7e56b1c866b42c06", + "0xda6dc1ae732e7ecbcac5765fc442fcee5a3617b5d575f5103b4fd9f706847c07", + "0xf59ef60c1d9dda81fc22a8e985b6d3e589f512eb8b2518b3511a43908a460294", + "0x81c6e17337cabd304c329a799b02e02245f37ece12a413f5c49282d18b1883cb", + "0x18fb9299e78ffe36bfea65442d790288937a4d1d5b69138525dadaa70dc42367", + "0x9db74bf461bb809717866699fb8b5d6bbe33b5bcc967dec46357331272e20df2", + "0xc59eefbe4041f7dc7fdf2c86c9cfc0f1706993dcee80de6b27f25489cb8e10a9", + "0x38b2207a133bfc3aec210fb386a199efb9087d13330fa0f637bfe37df59c312f", + "0xd35ffbf38934b54a900e35c65c07fc3081993ebf5a55bc67977b73410abc211f", + "0xa13e7a446c7f3ddaa8555c5d3437e8d827303b152a4dbb09ff01bde01a0585b0", + "0x0bb1b3eea492459f2796fb9b3f7022417860f3a5450374220c0c9c3bd2e63512", + "0xd9ebb04da1035f95bf3ed0bd06268f53737001f3f292ac825852875c57a6c4be", + "0xe07cf18aa356d0134f2e0da6f68de7c9f28af854455fbdd38770b44be98a1dc6", + "0x9be4c6c6a3c5622fcd0a1bbe13e21b8612eb39932f05b42972edf2ed184804dc", + "0x9cf9a53f37175b3eba970af4b06a9fa98042e08882b2ed96dd285c0eaaa8e13c", + "0x23f3b4e0dad22684741df92bba387be4e5c05414aca5bf54383e74a4b24b30eb", + "0x4dcfcf6353596c9665fd94b7b9281b65e0a94b45f98ddff681db9ffc5c561602", + "0x460b33043b87067727977ec7daea667bf440f482f0e77ab5a86745832c05d09e", + "0x2fd8ab214c757b69349f10a86d94ccdae0a2c692f3408ea4d65bf5a58c710166", + "0x6627f34e22dec201d70e4304375e60b0703a992610487356a7af6812c4ae89f0", + "0x6a2ac6c7b4f140443ea9190beba68706aa0828055cc0a49c037f6bed4a3b94c9", + "0xbadc35a3b5eb2524ddea54babbc6a7c531f94c845b499e2773f0d82f347976df", + "0x258972ea1dced55b6b95ed07085de981786401d4da790000d7bd8739b0132cd9", + "0x2b70ba122ab93b5b020a3e0ede3e5170d91b2fd8c429c4909b025a68e50a0a2a", + "0xa1f2796fbf29d6cb19d541bb9e2ac1bdb8ecf4f64e9d4068a77b18325d736be8", + "0x297b30d9b997e375d6d560c9670449c4ab9fc9e6cbfcfb094c659d053bd74fae", + "0x4f2058432f7e90bde5ac4661e66dd4ddb4865a31a015b5da7a74f1ed682d4471", + "0x88777368f2847a5a370cb5c6113b25841987168e1d60eff8f5e622b608c073b1", + "0x4b6de4690fed6b924865cf234a94b74f8765c969d821bbddeb4333936c558aa9", + "0x89db01005aa4cd9b60c481763f21dffe39a7ba2da6a4df80e1649fe71952ef70", + "0x888b2ccb261734919308c792c458dcafbaf5ec09b35ff490b77e55304d8f6352", + "0x847e03a9a940c74f151694bed14c82fc53eaaae5e4236e7f0525ab438f5e9d77", + "0x176f3b0b49ee54ec554dc3a4dea00b3d115e48a8c0d5d3c6f328d7da8f6beff7", + "0x009d634f81d6cbefe083d48d0741ab332f238bf496aafca838095e6fde0b541f", + "0xaec2cd6a1cf8954187174f4a62c07b021293cac8b69d1b48cd206ba3244292ba", + "0xc914a43546e51a0d4ab116e8fc86bd639c14b563474c9c247bb406404b6241c3", + "0xdd7f4c16cc0512e308b521c944e11b852d652652656ba5c30589fbbd4454002d", + "0x0329301ecb0cca138d687a07c3fc0e13358d10fb73f7ddac636fe1940d45be8b", + "0x2f569a19dff21bc2674064a636b3f87689f3e0ed0ef69a0d99bbedb5721e154c", + "0x06f42e2ae50574d560a495411ed504d3ca1c34ff5fe9f6f74a4327a9ada801f5", + "0x04db2f50573f591543a42ad27ad89efe7182ff286b6d2c75e8787cdfd67682ad", + "0xcac34907d292c7d1e8e307a3c669e9867977630b6667aa8ed0db0d0cb0e757f8", + "0xe043631e0d3d42dfacb87783a95d9a7fb6d1b4a6b556ad5ffd9724dfec8a05dd", + "0x163bd1073a5e99e886ae0ca8a469a58096e9992f772d8cf03c12897bc759ebf9", + "0xe468530ce156f65bf52574d52c7b55489ae9a4a7bc3df7710e3ef8fd47d72386", + "0xc19059a3d7e5f89c1bd674b798c5ff3860748acd9ccb7d684785358bc5a12d20", + "0x73f819dd32e6679910453dafe4976b5724749fcd18407078e46864a22e47181d", + "0xfe592761d1dc1bd893e0f8fdc548eaa3f5b441fda87ee71826d2d498a19b1f33", + "0x291c84340609f89adc913f236425e23792af8728f6320f5e67f936384e02debc", + "0x48aafb002e34c51e578c57e780ef52676301c44ce359c943238e56188c9be970", + "0xb3790060ee3927e51a8415bf742287ed54fefd32e8e5e0e6e6d8327504f67e3f", + "0x3fb1be8cec3734f7f261eee9bb67e16f89bd5e3836822cb30b79c3661fbbe00e", + "0x32ca794db2e8bb3a6ce2fee48506541397112c3deea2dfe46deeae71ee9f663a", + "0x81dc670fb945eb8c35b00b50f015fd9cef8c4560a855563364d01f2ef4508e14", + "0xbd6556b6d46cca1b2b17a19a3a59c240b0ef3cf48a64dec4d3998c9cc24c1a8e", + "0x90ad6135bfdf67e34c8f73238d31cc0986af1cb489bcfe81fc3eee05d9c29b97", + "0x6e1cb115a90aabc2808bc7322acd7b3c34545f4aa8038f5c6d730da941c2e676", + "0xf3f3af837c7e33b56008a0c04e8ab247210934cb6f3c5067e3a7a37f3e5dafe1", + "0xc9d4ceee42f0ec528c1a63eb9d44098fd23beeedba9604f9e083afb2d505fdef", + "0x17e4dea18b087b93f1215bcfad045ec54713658ebc484fe4e8986a771b0852a9", + "0xfb649abb7e83c2cd08e1e30f0604d06186e3d34901206b1d4c409b26b0510d08", + "0xcf248cf3701057459fc2347f9a9c3dc75332df6cfe002a8befe950ec2aa41b8c", + "0xe355fea96b01d1f58a9ad11787f347ab05da938b8ae8355fb4a4811c1791ddf2", + "0xf41a9728a3c5beb95bd54d48781fc5989608892c59cdf58545787581d7ef86a3", + "0x974a1c129883d3d47d8faaae93cb8a0559b095ec5440f2e876b1ee12588be268", + "0x7902398372de025e2a389ab30720d9219a48e0c843800fe2a117870b8588514e", + "0x3858c51d5edd299685ce0ac9aa398d572eba7a25afe941580e9ff281f3ef4b96", + "0x1a1a0c85194c4ceba80a6266fd6cf9977ace734c0bbe36fdb3f3b14fe185dbfc", + "0xfc0faddbc7dfa5939e91d6759c1a58bc8fb19ee24fb19aa31d05cbf8cada3cf2", + "0x99a9b35bfa30a6546895c6d134041b1564f7d404693619cf94fd6d5087559c2e", + "0x9689c75b7fa465187f1723e96ae4a1092f6f6aa86e187882acced16882682e46", + "0x70c6c50149f0bc6fd7c685bc9fab53dfd3f484a3c9bf206578951684a7e78d22", + "0x1c2b3e1326bc24046d45e3c626ce5e865e9f0f4807f129994558caeccc7e4c40", + "0x41491514a58d6db155b09d99c21e935f60aabdcb0b2bfd0ac3c7a66add88c8dc", + "0x120d2916730adbd56c3a6fd6fd4618af561c81b73952b9f247ebd6fb0d253a01", + "0xc65bb3d2984276ad902ed5d790cdbc5cfb953d5ff01dd0790532b2214dfb2f78", + "0xbdf1cf02af245b580cf20f728fddfa39c6eb5b0ed70e0487c1074fbf28ebc0b0", + "0xcbd578f01e8b5feba2ab69487c979e551c33ce2b73902c63943df9945dd23b9b", + "0xc8c42876c9f093326fd24262be17af1ec0a1030693f7e4a24201c28b3b90d82c", + "0x0b8839b2d0aa101cc2e8887c2d20c83d813559e7800f7ad9ce9af8be697a9a18", + "0xf621df816c070c7f0091dda13b34e6a46a7a86dab6852500351d4f5e2ae9eefe", + "0x8418a842e94ae25f54f427b389cee45d06da8cd3f55e41be9332c56241d48962", + "0xac58a960f5db3cc0570a20f8ca307ef444d9a90f630c7b629e66e4313aad45b3", + "0xf66d09329c4db75279f910ebe6d7a1c643632668a711dfb8069f47cf00d7a57a", + "0xdcacf0e0951030d0f733cbbb46b5f0b3b45840953525b757001ceb74bae9fa4b", + "0x941e10e4fde951acfbc184d76a51823b6ab04214b297e7e52bee236d8f66b8b9", + "0xd1dd9fbed648c9d93f590a91ef9922b6256878a498e61055d8fec739395ce0e9", + "0xe7eae47cd583cab13d7d684adc6e443ef38d83c7d2120171eecf7b0c9168a77b", + "0x08a6ff7d42b3056bc571e9c16607b373d37565a71cac95b9a85bf5788f08ea0d", + "0x3bae2e6ec6af9bbffe37b395df67769b234cdd743bd848764420ff2799ea673c", + "0xaa0b772f59055d8dfbef446352b2d08fbacd97968643a300e03e520c50ffdcbf", + "0xd8d29dfd14ab5068e615662b3580d191663f64cc15557873194d7b2718dc0425", + "0x0561ae8390935eece56ca93e3ea5feaa187e3777418fc19134649726c9519f41", + "0xe3c8dc3145997086caf05a06d4209d10096df09379fce4819f40c13cad005d3e", + "0x02d87b27d2a9e5cb47a71051ef0ef3202e2a86373807753e8603807e43ecf4f5", ], - "transactionsRoot": "0x17429d391ba2a1d033a60a9bdb2899a1c06e25747fcb4c9bc8476c3c72cc357a", + "transactionsRoot": "0xec75fee6c90538b6b5d846f5fd25f550591eaccbb366fc393c4a693f8370d0b4", "uncles": [], "withdrawals": [ { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b7ed9", - "index": "0x2a5128b", - "validatorIndex": "0x4e940", + "amount": "0x11cdffd", + "index": "0x2b3aa2b", + "validatorIndex": "0x36315", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b37eb", - "index": "0x2a5128c", - "validatorIndex": "0x4e941", + "amount": "0x11bee1f", + "index": "0x2b3aa2c", + "validatorIndex": "0x36316", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1c7ee99", - "index": "0x2a5128d", - "validatorIndex": "0x4e942", + "amount": "0x11c8a4c", + "index": "0x2b3aa2d", + "validatorIndex": "0x36317", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aab91", - "index": "0x2a5128e", - "validatorIndex": "0x4e943", + "amount": "0x11bfb57", + "index": "0x2b3aa2e", + "validatorIndex": "0x36318", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a6e72", - "index": "0x2a5128f", - "validatorIndex": "0x4e944", + "amount": "0x11becdc", + "index": "0x2b3aa2f", + "validatorIndex": "0x36319", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b2baf", - "index": "0x2a51290", - "validatorIndex": "0x4e945", + "amount": "0x11c0882", + "index": "0x2b3aa30", + "validatorIndex": "0x3631a", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11bd042", - "index": "0x2a51291", - "validatorIndex": "0x4e946", + "amount": "0x11c12c5", + "index": "0x2b3aa31", + "validatorIndex": "0x3631b", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9593", - "index": "0x2a51292", - "validatorIndex": "0x4e947", + "amount": "0x11caadf", + "index": "0x2b3aa32", + "validatorIndex": "0x3631c", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad611", - "index": "0x2a51293", - "validatorIndex": "0x4e948", + "amount": "0x11c47d5", + "index": "0x2b3aa33", + "validatorIndex": "0x3631d", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b8446", - "index": "0x2a51294", - "validatorIndex": "0x4e949", + "amount": "0x3c9a1eb", + "index": "0x2b3aa34", + "validatorIndex": "0x3631e", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x119349e", - "index": "0x2a51295", - "validatorIndex": "0x4e94a", + "amount": "0x11c1404", + "index": "0x2b3aa35", + "validatorIndex": "0x3631f", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad839", - "index": "0x2a51296", - "validatorIndex": "0x4e94b", + "amount": "0x11c22d9", + "index": "0x2b3aa36", + "validatorIndex": "0x36320", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9715", - "index": "0x2a51297", - "validatorIndex": "0x4e94c", + "amount": "0x11c2dab", + "index": "0x2b3aa37", + "validatorIndex": "0x36321", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b820b", - "index": "0x2a51298", - "validatorIndex": "0x4e94d", + "amount": "0x11bfdf6", + "index": "0x2b3aa38", + "validatorIndex": "0x36322", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aad2b", - "index": "0x2a51299", - "validatorIndex": "0x4e94e", + "amount": "0x11bafb3", + "index": "0x2b3aa39", + "validatorIndex": "0x36323", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b090a", - "index": "0x2a5129a", - "validatorIndex": "0x4e94f", + "amount": "0x11b9154", + "index": "0x2b3aa3a", + "validatorIndex": "0x36324", }, ], - "withdrawalsRoot": "0x158cc8e8a444e3f70658da20714882c73b2c8932eb09b691271da474471d137b", + "withdrawalsRoot": "0x3f196863f2d0d52b020c33d1ac2fb588f257ac153baa09fbee2cc1cce42fadef", } `) }) diff --git a/src/actions/public/getBlockTransactionCount.test.ts b/src/actions/public/getBlockTransactionCount.test.ts index af20d22b47..bb64991e9e 100644 --- a/src/actions/public/getBlockTransactionCount.test.ts +++ b/src/actions/public/getBlockTransactionCount.test.ts @@ -20,7 +20,7 @@ test('args: blockNumber', async () => { await getBlockTransactionCount(client, { blockNumber: anvilMainnet.forkBlockNumber - 1n, }), - ).toBe(120) + ).toBe(124) }) test('args: blockHash', async () => { @@ -31,7 +31,7 @@ test('args: blockHash', async () => { await getBlockTransactionCount(client, { blockHash: block.hash!, }), - ).toBe(120) + ).toBe(124) }) test('args: blockTag', async () => { diff --git a/src/actions/public/getEip712Domain.test.ts b/src/actions/public/getEip712Domain.test.ts index a5f165f10f..1238f742d9 100644 --- a/src/actions/public/getEip712Domain.test.ts +++ b/src/actions/public/getEip712Domain.test.ts @@ -35,7 +35,7 @@ test('default', async () => { "chainId": 1, "name": "Mock4337Account", "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "verifyingContract": "0x8a00708a83D977494139D21D618C6C2A71fA8ed1", + "verifyingContract": "0xE911628bF8428C23f179a07b081325cAe376DE1f", "version": "1", }, "extensions": [], @@ -71,7 +71,7 @@ test('counterfactual call', async () => { "chainId": 1, "name": "Mock4337Account", "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "verifyingContract": "0xd8a0AB4f74d04b9EE34CECCEF647051601720Dc1", + "verifyingContract": "0xB8e1B1e362872b237526e74B227077B0aeE8e223", "version": "1", }, "extensions": [], diff --git a/src/actions/public/getFeeHistory.test.ts b/src/actions/public/getFeeHistory.test.ts index 1e029b7c28..9d11168c51 100644 --- a/src/actions/public/getFeeHistory.test.ts +++ b/src/actions/public/getFeeHistory.test.ts @@ -16,39 +16,39 @@ test('default', async () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": [ - 5213557505n, - 4699268689n, - 5240957424n, - 5087991129n, - 5092610982n, + 7975081261n, + 8971754480n, + 9036579667n, + 8758571930n, + 8660467020n, ], "gasUsedRatio": [ - 0.10542196666666669, - 0.9610834333333332, - 0.38325316666666664, - 0.5036319666666667, + 0.9998937, + 0.5289019, + 0.37694116666666666, + 0.45519593333333336, ], - "oldestBlock": 19808247n, + "oldestBlock": 19868017n, "reward": [ [ - 1000000000n, - 2000000000n, - 39786442495n, + 0n, + 155751813n, + 100000000000n, ], [ 0n, - 369076887n, - 118577352971n, + 155751813n, + 11028245520n, ], [ 0n, - 41648601n, - 6972600081n, + 300000000n, + 18152944408993n, ], [ 0n, - 162008871n, - 7900000000n, + 500000004n, + 81241428070n, ], ], } @@ -75,25 +75,25 @@ test('args: blockCount', async () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": [ - 5240957424n, - 5087991129n, - 5092610982n, + 9036579667n, + 8758571930n, + 8660467020n, ], "gasUsedRatio": [ - 0.38325316666666664, - 0.5036319666666667, + 0.37694116666666666, + 0.45519593333333336, ], - "oldestBlock": 19808249n, + "oldestBlock": 19868019n, "reward": [ [ 0n, - 41648601n, - 6972600081n, + 300000000n, + 18152944408993n, ], [ 0n, - 162008871n, - 7900000000n, + 500000004n, + 81241428070n, ], ], } @@ -110,29 +110,29 @@ test('args: rewardPercentiles', async () => { ).toMatchInlineSnapshot(` { "baseFeePerGas": [ - 5240957424n, - 5087991129n, - 5092610982n, + 9036579667n, + 8758571930n, + 8660467020n, ], "gasUsedRatio": [ - 0.38325316666666664, - 0.5036319666666667, + 0.37694116666666666, + 0.45519593333333336, ], - "oldestBlock": 19808249n, + "oldestBlock": 19868019n, "reward": [ [ 0n, - 10000000n, - 41648601n, - 500000000n, - 6972600081n, + 66924164n, + 300000000n, + 1533517846n, + 18152944408993n, ], [ 0n, - 90000000n, - 162008871n, - 500000000n, - 7900000000n, + 66924164n, + 500000004n, + 2000000000n, + 81241428070n, ], ], } diff --git a/src/actions/public/getFilterChanges.test.ts b/src/actions/public/getFilterChanges.test.ts index b44a68a827..67b9dbbc35 100644 --- a/src/actions/public/getFilterChanges.test.ts +++ b/src/actions/public/getFilterChanges.test.ts @@ -319,7 +319,7 @@ describe('contract events', () => { 'Transfer' >[] >(logs) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) }) test('args: strict', async () => { @@ -343,7 +343,7 @@ describe('contract events', () => { 'Transfer' >[] >(logs) - expect(logs.length).toBe(698) + expect(logs.length).toBe(958) }) test('args: singular `from`', async () => { @@ -821,12 +821,14 @@ describe('events', () => { let logs = await getFilterChanges(client, { filter }) assertType[]>(logs) - expect(logs.length).toBe(881) - expect(logs[0].args).toEqual({ - from: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - to: '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - value: 100000000000000000n, - }) + expect(logs.length).toBe(973) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, + } + `) expect(logs[0].eventName).toEqual('Transfer') logs = await getFilterChanges(client, { filter }) @@ -845,18 +847,20 @@ describe('events', () => { assertType[]>(logs) - expect(logs.length).toBe(698) + expect(logs.length).toBe(958) expectTypeOf(logs[0].args).toEqualTypeOf<{ from: Address to: Address value: bigint }>() - expect(logs[0].args).toEqual({ - from: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - to: '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - value: 100000000000000000n, - }) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, + } + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') @@ -877,18 +881,20 @@ describe('events', () => { logs, ) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) expectTypeOf(logs[0].args).toEqualTypeOf<{ from?: Address to?: Address value?: bigint }>() - expect(logs[0].args).toEqual({ - from: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - to: '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - value: 100000000000000000n, - }) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, + } + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') @@ -907,16 +913,18 @@ describe('events', () => { let logs = await getFilterChanges(client, { filter }) assertType[]>(logs) - expect(logs.length).toBe(698) + expect(logs.length).toBe(958) expectTypeOf(logs[0].args).toEqualTypeOf< readonly [`0x${string}`, `0x${string}`, bigint] >() - expect(logs[0].args).toEqual([ - '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - 100000000000000000n, - ]) + expect(logs[0].args).toMatchInlineSnapshot(` + [ + "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + 17991444454902871n, + ] + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') @@ -936,7 +944,7 @@ describe('events', () => { logs, ) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) expectTypeOf(logs[0].args).toEqualTypeOf< | readonly [] @@ -944,11 +952,13 @@ describe('events', () => { | readonly [`0x${string}`, `0x${string}`] | readonly [`0x${string}`] >() - expect(logs[0].args).toEqual([ - '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - 100000000000000000n, - ]) + expect(logs[0].args).toMatchInlineSnapshot(` + [ + "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + 17991444454902871n, + ] + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') diff --git a/src/actions/public/getFilterLogs.test.ts b/src/actions/public/getFilterLogs.test.ts index 210cc2cffc..219cf9c0c9 100644 --- a/src/actions/public/getFilterLogs.test.ts +++ b/src/actions/public/getFilterLogs.test.ts @@ -278,7 +278,7 @@ describe('contract events', () => { 'Transfer' >[] >(logs) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) }) test('args: strict', async () => { @@ -302,7 +302,7 @@ describe('contract events', () => { 'Transfer' >[] >(logs) - expect(logs.length).toBe(698) + expect(logs.length).toBe(958) }) test('args: singular `from`', async () => { @@ -712,7 +712,7 @@ describe('raw events', () => { const logs = await getFilterLogs(client, { filter }) assertType[]>(logs) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) }) test('args: strict = true (named)', async () => { @@ -727,18 +727,20 @@ describe('raw events', () => { assertType[]>(logs) - expect(logs.length).toBe(698) + expect(logs.length).toBe(958) expectTypeOf(logs[0].args).toEqualTypeOf<{ from: Address to: Address value: bigint }>() - expect(logs[0].args).toEqual({ - from: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - to: '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - value: 100000000000000000n, - }) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, + } + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') }) @@ -756,18 +758,20 @@ describe('raw events', () => { logs, ) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) expectTypeOf(logs[0].args).toEqualTypeOf<{ from?: Address to?: Address value?: bigint }>() - expect(logs[0].args).toEqual({ - from: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - to: '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - value: 100000000000000000n, - }) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, + } + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') }) @@ -784,16 +788,18 @@ describe('raw events', () => { assertType[]>(logs) - expect(logs.length).toBe(698) + expect(logs.length).toBe(958) expectTypeOf(logs[0].args).toEqualTypeOf< readonly [`0x${string}`, `0x${string}`, bigint] >() - expect(logs[0].args).toEqual([ - '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - 100000000000000000n, - ]) + expect(logs[0].args).toMatchInlineSnapshot(` + [ + "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + 17991444454902871n, + ] + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') }) @@ -811,7 +817,7 @@ describe('raw events', () => { logs, ) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) expectTypeOf(logs[0].args).toEqualTypeOf< | readonly [] @@ -819,11 +825,13 @@ describe('raw events', () => { | readonly [`0x${string}`, `0x${string}`] | readonly [`0x${string}`] >() - expect(logs[0].args).toEqual([ - '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - 100000000000000000n, - ]) + expect(logs[0].args).toMatchInlineSnapshot(` + [ + "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + 17991444454902871n, + ] + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') }) diff --git a/src/actions/public/getLogs.test.ts b/src/actions/public/getLogs.test.ts index 151cd8caa1..e270f6a13e 100644 --- a/src/actions/public/getLogs.test.ts +++ b/src/actions/public/getLogs.test.ts @@ -234,13 +234,15 @@ describe('events', () => { toBlock: anvilMainnet.forkBlockNumber, }) assertType[]>(logs) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) expect(logs[0].eventName).toEqual('Transfer') - expect(logs[0].args).toEqual({ - from: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - to: '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - value: 100000000000000000n, - }) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, + } + `) }) test('args: blockHash', async () => { @@ -252,13 +254,15 @@ describe('events', () => { blockHash: block.hash!, }) assertType[]>(logs) - expect(logs.length).toBe(86) + expect(logs.length).toBe(161) expect(logs[0].eventName).toEqual('Transfer') - expect(logs[0].args).toEqual({ - from: '0x00eb6C179ebfc11D7682fc2f602169f32eAcCf78', - to: '0x3CC936b795A188F0e246cBB2D74C5Bd190aeCF18', - value: 7772954000000000000000000n, - }) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x6b75d8AF000000e20B7a7DDf000Ba900b4009A80", + "to": "0x5CEd44F03ff443BBE14d8eA23bc24425FB89E3ED", + "value": 158620485778292080640n, + } + `) }) test('args: strict = true (named)', async () => { @@ -270,18 +274,20 @@ describe('events', () => { }) assertType[]>(logs) - expect(logs.length).toBe(698) + expect(logs.length).toBe(958) expectTypeOf(logs[0].args).toEqualTypeOf<{ from: `0x${string}` to: `0x${string}` value: bigint }>() - expect(logs[0].args).toEqual({ - from: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - to: '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - value: 100000000000000000n, - }) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, + } + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') @@ -297,18 +303,20 @@ describe('events', () => { assertType[]>( logs, ) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) expectTypeOf(logs[0].args).toEqualTypeOf<{ from?: `0x${string}` to?: `0x${string}` value?: bigint }>() - expect(logs[0].args).toEqual({ - from: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - to: '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - value: 100000000000000000n, - }) + expect(logs[0].args).toMatchInlineSnapshot(` + { + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, + } + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') @@ -323,16 +331,18 @@ describe('events', () => { }) assertType[]>(logs) - expect(logs.length).toBe(698) + expect(logs.length).toBe(958) expectTypeOf(logs[0].args).toEqualTypeOf< readonly [`0x${string}`, `0x${string}`, bigint] >() - expect(logs[0].args).toEqual([ - '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - 100000000000000000n, - ]) + expect(logs[0].args).toMatchInlineSnapshot(` + [ + "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + 17991444454902871n, + ] + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') @@ -348,7 +358,7 @@ describe('events', () => { assertType[]>( logs, ) - expect(logs.length).toBe(881) + expect(logs.length).toBe(973) expectTypeOf(logs[0].args).toEqualTypeOf< | readonly [] @@ -356,11 +366,13 @@ describe('events', () => { | readonly [`0x${string}`, `0x${string}`] | readonly [`0x${string}`] >() - expect(logs[0].args).toEqual([ - '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', - '0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8', - 100000000000000000n, - ]) + expect(logs[0].args).toMatchInlineSnapshot(` + [ + "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + 17991444454902871n, + ] + `) expectTypeOf(logs[0].eventName).toEqualTypeOf<'Transfer'>() expect(logs[0].eventName).toEqual('Transfer') diff --git a/src/actions/public/getTransactionReceipt.test.ts b/src/actions/public/getTransactionReceipt.test.ts index 178a7d7776..e26e6f5e3f 100644 --- a/src/actions/public/getTransactionReceipt.test.ts +++ b/src/actions/public/getTransactionReceipt.test.ts @@ -31,20 +31,79 @@ test('gets transaction receipt', async () => { assertType(receipt) expect(receipt).toMatchInlineSnapshot(` { - "blockHash": "0x72e938fa6ab225be2ce940db9aea7d670b50b3320b8deaeea1084ab645a1db81", - "blockNumber": 19808249n, + "blockHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "blockNumber": 19868019n, "contractAddress": null, - "cumulativeGasUsed": 21000n, - "effectiveGasPrice": 12213557505n, - "from": "0x75e89d5979e4f6fba9f97c104c2f0afb3f1dcb88", - "gasUsed": 21000n, - "logs": [], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cumulativeGasUsed": 86221n, + "effectiveGasPrice": 9036579667n, + "from": "0xae2fc483527b8ef99eb5d9b44875f005ba1fae13", + "gasUsed": 86221n, + "logs": [ + { + "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "blockHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "blockNumber": 19868019n, + "data": "0x000000000000000000000000000000000000000000000008994d2b6873000000", + "logIndex": 0, + "removed": false, + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80", + "0x0000000000000000000000005ced44f03ff443bbe14d8ea23bc24425fb89e3ed", + ], + "transactionHash": "0x985ca9ceaecc90bded8a892e45e2127eab09746cd7dffee057fba12ee066e161", + "transactionIndex": 0, + }, + { + "address": "0x594daad7d77592a2b97b725a7ad59d7e188b5bfa", + "blockHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "blockNumber": 19868019n, + "data": "0x0000000000000000000000000000000000000000015c7fc50000000000000000", + "logIndex": 1, + "removed": false, + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000005ced44f03ff443bbe14d8ea23bc24425fb89e3ed", + "0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80", + ], + "transactionHash": "0x985ca9ceaecc90bded8a892e45e2127eab09746cd7dffee057fba12ee066e161", + "transactionIndex": 0, + }, + { + "address": "0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed", + "blockHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "blockNumber": 19868019n, + "data": "0x000000000000000000000000000000000000000005ff6ad38106c3459dba67a900000000000000000000000000000000000000000000002e5eb2e56308fd8231", + "logIndex": 2, + "removed": false, + "topics": [ + "0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1", + ], + "transactionHash": "0x985ca9ceaecc90bded8a892e45e2127eab09746cd7dffee057fba12ee066e161", + "transactionIndex": 0, + }, + { + "address": "0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed", + "blockHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "blockNumber": 19868019n, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008994d2b68730000000000000000000000000000000000000000000000015c7fc500000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logIndex": 3, + "removed": false, + "topics": [ + "0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822", + "0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80", + "0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80", + ], + "transactionHash": "0x985ca9ceaecc90bded8a892e45e2127eab09746cd7dffee057fba12ee066e161", + "transactionIndex": 0, + }, + ], + "logsBloom": "0x00200000000000000800000080000000000000000000000000000000000000000000008000000020000000000000000002000000088000000000000000020000000000000000000000000008000000200000000000000000000000000000000000000000000000000000000000000000000000000000000080000010000000000000000000000000000000000000000400000800000000080000004000000000000000000000000000000000000000000000000000004000000000000800000008000002000000000000040000000000000000000000001000000000000000000000200000000000000000000000000000000000000000000000000000000000", "status": "success", - "to": "0x1f7366d3f39a8c74b72fdf7b0825f9b6cdf3a23c", - "transactionHash": "0x886b09ecc2a01291717ca3171135fb4917c5c263bab02b570b04699c20643bc4", + "to": "0x6b75d8af000000e20b7a7ddf000ba900b4009a80", + "transactionHash": "0x985ca9ceaecc90bded8a892e45e2127eab09746cd7dffee057fba12ee066e161", "transactionIndex": 0, - "type": "legacy", + "type": "eip1559", } `) }) diff --git a/src/actions/public/multicall.test.ts b/src/actions/public/multicall.test.ts index 65fd68fb04..1476c5ce89 100644 --- a/src/actions/public/multicall.test.ts +++ b/src/actions/public/multicall.test.ts @@ -50,7 +50,7 @@ test('default', async () => { ).toMatchInlineSnapshot(` [ { - "result": 25847278192610069n, + "result": 25386964533553076n, "status": "success", }, { @@ -89,7 +89,7 @@ test('args: allowFailure', async () => { }), ).toMatchInlineSnapshot(` [ - 25847278192610069n, + 25386964533553076n, 9063377042n, 10000n, ] @@ -151,11 +151,11 @@ test('args: batchSize', async () => { ).toMatchInlineSnapshot(` [ { - "result": 25847278192610069n, + "result": 25386964533553076n, "status": "success", }, { - "result": 25847278192610069n, + "result": 25386964533553076n, "status": "success", }, { @@ -167,7 +167,7 @@ test('args: batchSize', async () => { "status": "success", }, { - "result": 25847278192610069n, + "result": 25386964533553076n, "status": "success", }, { @@ -179,7 +179,7 @@ test('args: batchSize', async () => { "status": "success", }, { - "result": 25847278192610069n, + "result": 25386964533553076n, "status": "success", }, { @@ -263,7 +263,7 @@ test('args: multicallAddress', async () => { ).toMatchInlineSnapshot(` [ { - "result": 25847278192610069n, + "result": 25386964533553076n, "status": "success", }, { diff --git a/src/actions/public/readContract.test.ts b/src/actions/public/readContract.test.ts index 3ad821f005..19c94263a4 100644 --- a/src/actions/public/readContract.test.ts +++ b/src/actions/public/readContract.test.ts @@ -92,7 +92,7 @@ describe('wagmi', () => { blockNumber: anvilMainnet.forkBlockNumber, functionName: 'totalSupply', }), - ).toEqual(631n) + ).toEqual(648n) }) test('overloaded function', async () => { @@ -225,7 +225,7 @@ describe('deployless read (factory)', () => { "Mock4337Account", "1", 1n, - "0x8a00708a83D977494139D21D618C6C2A71fA8ed1", + "0xE911628bF8428C23f179a07b081325cAe376DE1f", "0x0000000000000000000000000000000000000000000000000000000000000000", [], ] diff --git a/src/actions/wallet/__snapshots__/signTransaction.test.ts.snap b/src/actions/wallet/__snapshots__/signTransaction.test.ts.snap index c389ab72a6..23e8687459 100644 --- a/src/actions/wallet/__snapshots__/signTransaction.test.ts.snap +++ b/src/actions/wallet/__snapshots__/signTransaction.test.ts.snap @@ -2,4 +2,4 @@ exports[`eip4844 > default: local 1`] = `"0x03fa040184f8ae0182031180808252089400000000000000000000000000000000000000008080c08504a817c800f842a0012580b7683c14cc7540be305587b0eec4e7ec739094213ca080e2526c9237c4a001243c18a024c835cce144b3b6b0eb878b7820c7c7b7d9feff80080d76519c4580a0c6a1423071048feb43d74529b6241ad5b936a56a2db5e4e17d3fd0fee63673faa0166f063528f9477309bedc59915433d72a3726d1732db20fdc64bdd95404dd57fa040008ba020000004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e0073656374657475722061646970697363696e6720656c69742e20557420756c0074726963696573206f726369207175616d2c2073697420616d657420656c65006966656e6420616e7465206672696e67696c6c61206e65632e2050726f696e0020616c697175616d20696e2074656c6c7573206772617669646120636f6e7600616c6c69732e2050726f696e2072757472756d20636f6e7365717561742065006e696d20736564206d616c6573756164612e2041656e65616e206567657374006173206d657475732076697461652073656d20636f6e64696d656e74756d200073757363697069742e2053757370656e64697373652061726375206475692c00206772617669646120696e2065726f732065742c206d617474697320616c6900717565742074656c6c75732e20496e74656765722070656c6c656e7465737100756520616e74652066696e69627573206d692072757472756d20616c69717500616d2e20496e7465676572206d6174746973206469616d2073656420666575006769617420696d706572646965742e20467573636520696420626962656e6400756d206d617373612e20496e74656765722061742074656d70757320656e69006d2e20416c697175616d206574206d6f6c6c6973206d61676e612e0a0a536500642073656d70657220656c656d656e74756d206d61737361206e6f6e2076690076657272612e205365642073697420616d6574206d61676e612065742069700073756d207472697374697175652076756c7075746174652e2050656c6c656e0074657371756520696e206c696265726f2073656d2e2053757370656e64697300736520736f64616c65732074656d706f722061756775652074696e63696475006e7420666163696c697369732e204d616563656e6173207363656c657269730071756520697073756d20617420666575676961742064696374756d2e204d61006563656e61732076656c2075726e6120736564206d6574757320756c7472690063696573206d6f6c6c69732e204e756c6c61206c6f72656d206d6175726973002c2073757363697069742065676574206172637520696e2c2072757472756d002072757472756d206d617373612e204d616563656e617320616320696d706500726469657420656c69742c2073656420737573636970697420697073756d2e002050726f696e206d6f6c6573746965206d6173736120617263752c20612063006f6e64696d656e74756d206f64696f20756c7472696365732073697420616d0065742e205072616573656e742072686f6e6375732065782070757275732c200073656420706c616365726174206e756e63206f726e6172652065742e205068006173656c6c75732061206e696268206d616c6573756164612c20756c6c616d00636f72706572206e69736c2061742c2070656c6c656e746573717565206c6f0072656d2e2050686173656c6c7573206c6f72656d20697073756d2c20756c6c00616d636f727065722075742076756c70757461746520616c69717565742c20007661726975732065676574206c6f72656d2e0a0a4d61757269732068656e640072657269742074696e636964756e74207175616d20616320696e7465726475006d2e20496e206120697073756d206e6f6e207175616d206d6178696d7573200066696e696275732e20536564206f64696f2065782c206c6163696e69612076006974616520697073756d2073616769747469732c207665686963756c612065006765737461732072697375732e204e756c6c616d20616320656c656966656e006420646f6c6f722c20657520706f72747469746f722074656c6c75732e204d00616563656e617320746f72746f722076656c69742c20636f6e64696d656e7400756d20696420656e696d2076656c2c20657569736d6f64206f726e617265200072697375732e20416c697175616d206964206c6f72656d20696e7465726475006d2c20616c697175616d20707572757320696e2c207068617265747261206a007573746f2e205574207669746165206c656f206469616d2e204e756c6c612000656c656d656e74756d206e756e63206d657475732c206e65632076617269750073206f64696f2066696e69627573206e65632e20457469616d207175697320006e69736c20696e74657264756d2c20766f6c757470617420646f6c6f72206500742c2072686f6e637573206e6962682e204d616563656e6173206e6f6e207200757472756d2061756775652c20657520656c656966656e64206d692e20446f006e6563206c6f626f7274697320616e7465207669746165206175677565207000686172657472612c206174206c6163696e696120746f72746f7220707265740069756d2e0a0a4d616563656e61732061742074656d706f72206d61676e612c0020696e20737573636970697420656e696d2e204e756c6c6120656c656d656e0074756d2072757472756d2065782c206567657420736f64616c6573206e756c006c6120636f6e76616c6c69732076697461652e20566976616d757320646967006e697373696d2c2065726f7320657520656c656d656e74756d20736f6c6c69006369747564696e2c206c6f72656d20647569206c7563747573207361706965006e2c206163206d617474697320646f6c6f7220656e696d2073757363697069007420656c69742e204e756c6c61206567657420696d70657264696574206d65007475732e2043757261626974757220636f6e64696d656e74756d206120707500727573207363656c6572697371756520756c7472696365732e20416c69717500616d206c696265726f206d692c20766573746962756c756d2065742074656d00706f722065752c2070686172657472612073697420616d657420656c69742e0020557420696420616c697175616d206c696265726f2e0a0a53656420636f6e007365637465747572206c65637475732066696e69627573206c656374757320006f726e61726520706f7274612e20447569732073656420636f6e677565207300617069656e2c20757420696d7065726469657420656e696d2e205365642065006c656d656e74756d20696163756c6973206c6967756c612c206e6f6e207665006e656e617469732073617069656e206c75637475732069642e2053656420650066666963697475722c20616e7465207669746165206d6f6c657374696520650066666963697475722c20656c697420697073756d20636f6e64696d656e7475006d20697073756d2c2076656c206d6f6c6c6973206d61676e61206f64696f20007669746165206c616375732e2053757370656e64697373652065676573746100732073656d206f64696f2c20696e20766573746962756c756d206e69736c2000706f72747469746f722076656c2e20496e2074696e636964756e742c206d65007475732061206c6f626f7274697320756c7472696365732c20697073756d20006d6574757320766573746962756c756d206e756c6c612c20617420696d706500726469657420746f72746f72206e6571756520736564206d692e204d61757200697320617420616e746520616e74652e20566573746962756c756d2063757200737573207665686963756c6120756c7472696365732e204d6f726269206c750063747573206120657374206e656320696d706572646965742e205574206e6f006e2075726e61206672696e67696c6c612c2065676573746173206d65747573002065752c2064696374756d20656c69742e20496e2064696374756d20707572007573206964206c656374757320616c69717565742074656d706f722e20416c00697175616d206572617420766f6c75747061742e204e616d206175677565200066656c69732c20696d70657264696574206174206d61676e61206e65632c200070656c6c656e746573717565207661726975732074656c6c75732e0a0a4d61006563656e617320656765742065782070656c6c656e7465737175652c20656c00656d656e74756d206469616d2061742c20656c656966656e6420646f6c6f72002e204e756c6c616d20626962656e64756d2065726f73206e656320646f6c6f007220646170696275732c2061742073616769747469732065737420636f6e6400696d656e74756d2e205072616573656e74206e6f6e2068656e647265726974002065726f732e204d616563656e617320636f6e736571756174206d617373610020766974616520647569207665686963756c612c20757420756c747269636500732072697375732073656d7065722e2053757370656e646973736520646170006962757320616e746520646f6c6f722c206120626962656e64756d2076656c0069742074726973746971756520696e2e204d616563656e6173206e65632069006163756c697320656e696d2e20566573746962756c756d20736564206f6469006f2064696374756d2c20766573746962756c756d206f64696f20656765742c0020656c656966656e64206d657475732e204d6175726973206163206c69626500726f20736564206c656f2070756c76696e617220636f6e76616c6c69732e200044756973207665686963756c61206f72636920656c69742e2056657374696200756c756d2065666669636974757220656765737461732065782061206f726e006172652e2051756973717565206f726e617265206e6962682063757273757300206d6f6c65737469652070656c6c656e7465737175652e0a0a446f6e6563200074696e636964756e7420666575676961742073757363697069742e2056657300746962756c756d20756c6c616d636f7270657220646f6c6f72206e6f6e206c006967756c6120766573746962756c756d2c20612070756c76696e6172206e75006e6320636f6e7365717561742e20416c697175616d2070756c76696e617220007661726975732074656c6c757320657520617563746f722e204d6175726973002076697665727261207665686963756c612065782c20766974616520616c69007175616d20617263752064696374756d2069642e205175697371756520706800617265747261207669746165206d61676e6120696e206f726e6172652e2056006573746962756c756d207072657469756d207363656c65726973717565206f0064696f20696420636f6e73656374657475722e204e756c6c61207365642065006e696d207574207175616d20636f6e736563746574757220747269737469710075652e0a0a4e756c6c616d206f64696f206d61757269732c20666575676961007420657520666575676961742075742c20706f737565726520766974616520006d61676e612e205365642076697461652073656d706572207475727069732c002073697420616d6574207363656c65726973717565206e756c6c612e2051750069737175652074656d707573206e6f6e206d692073656420706f7274746974006f722e2050726f696e206c656f2065782c20706f73756572652065752065670065737461732076656c2c206d6f6c657374696520736564206d657475732e20004e616d20747269737469717565206c6163757320657420697073756d206d610078696d757320756c747269636965732e204e756c6c616d20706f7375657265002073697420616d65742073617069656e206d6f6c657374696520756c6c616d00636f727065722e204d6f72626920656765737461732c20657261742061632000626c616e6469742064696374756d2c2073617069656e206e69736c2066696e0069627573206e6973692c2073656420656666696369747572206c6563747573002073656d20657520697073756d2e2050686173656c6c7573206c656f206175006775652c2076756c70757461746520706c616365726174206175677565206500752c2074656d706f722074696e636964756e74206c6f72656d2e204675736300652073697420616d65742073656d70657220746f72746f722e0a0a5375737000656e646973736520706f74656e74692e204d616563656e6173206964206461007069627573207475727069732c206e6f6e2076756c7075746174652065782e00204e756c6c616d2072757472756d206c6967756c61206e65632072697375730020737573636970697420766f6c75747061742e20416c697175616d206c756300747573206e657175652073697420616d65742061726375207472697374697100756520766f6c75747061742e205365642076697461652066656c6973206c6f0072656d2e20416c697175616d20706c61636572617420656c656d656e74756d002073617069656e2c2076697461652076756c7075746174652072697375732000766f6c757470617420696e2e204d616563656e6173207669746165206475690020657261742e2050686173656c6c7573206672696e67696c6c61207361706900656e2073656420647569207665686963756c612c2076617269757320636f6e00736563746574757220616e746520736f6c6c696369747564696e2e20437261007320696163756c69732c2073617069656e20696e74657264756d20696d7065007264696574206566666963697475722c20647569206d61757269732070756c0076696e617220697073756d2c2061742076656e656e61746973206e69736c20006f64696f2071756973207175616d2e204e756e63206566666963697475722000636f6e73656374657475722073656d7065722e204e756c6c616d20706f737500657265206e756c6c612072686f6e6375732070756c76696e617220756c74720069636965732e204e756e632074656c6c757320617263752c2068656e6472650072697420736f6c6c696369747564696e206469616d2076697461652c206865006e6472657269742066696e696275732065782e0a0a536564206c6f626f7274006973206d6174746973206c6967756c612c20766974616520636f6e76616c6c006973206c656f2064617069627573206e6f6e2e204d616563656e617320766900746165206c61637573206575206e69736c20617563746f7220656c656d656e0074756d206e6563207669746165206c65637475732e204d616563656e617320007669746165206f726369207669746165206d6920756c6c616d636f727065720020706f72747469746f72206964206c6f626f72746973206e69736c2e20446f006e6563206964206d617572697320697073756d2e20416c697175616d20657200617420766f6c75747061742e20566976616d7573206c6f626f72746973206e00696268207574206573742076756c70757461746520666575676961742e2049006e7465676572206c696265726f207175616d2c20756c74726963657320617400206f7263692061742c20636f6e677565206665726d656e74756d206d61737300612e20457469616d2069642065726f7320696163756c69732c20636f6e6469006d656e74756d206f7263692074696e636964756e742c206d6174746973206d00657475732e204d616563656e617320756c7472696365732073697420616d65007420646f6c6f722069642070656c6c656e7465737175652e2056657374696200756c756d20706f727461206d6178696d7573206e69736c2c20696e2066696e006962757320746f72746f7220766f6c75747061742075742e2055742067726100766964612c20646f6c6f7220756c7472696365732068656e6472657269742000666575676961742c20656e696d2073656d20696e74657264756d206c696775006c612c20616320656666696369747572206572617420656c6974206964206c006f72656d2e20496e2073697420616d657420756c6c616d636f72706572206c006f72656d2e0a0a50686173656c6c7573206c6967756c612075726e612c2063006f6e736571756174206574206c756374757320612c206f726e617265206574002061756775652e20566573746962756c756d20657420616e7465206174206c006163757320626962656e64756d20696d706572646965742e20457469616d200074757270697320617263752c2063757273757320766974616520766976657200726120612c2068656e64726572697420766974616520617263752e2050726f00696e206f726e617265206d6175726973207574206d61676e61206d6f6c657300746965206d61747469732e20446f6e65632074656d706f72206c6563747573002071756973206d617373612076756c70757461746520696e74657264756d2e002050726f696e206575206c6967756c61206469616d2e204d616563656e617300206461706962757320747572706973206c65637475732c2075742066616369006c6973697320656c6974206469676e697373696d2075742e204e756e632062006c616e646974206f726369206120616e746520666163696c697369732c2061007420636f6e76616c6c69732066656c697320666163696c697369732e2043750072616269747572207375736369706974206d692061206c696265726f20706f0073756572652c2071756973206f726e617265206a7573746f2076697665727200612e2050656c6c656e746573717565206861626974616e74206d6f72626920007472697374697175652073656e6563747573206574206e6574757320657420006d616c6573756164612066616d6573206163207475727069732065676573740061732e204e756c6c612070756c76696e6172207363656c6572697371756520006d61676e612c2065676574206c6f626f72746973206e69626820636f6d6d6f00646f2061742e20447569732065676574207661726975732066656c69732c2000636f6e64696d656e74756d20706c616365726174206c65637475732e20416c00697175616d20617563746f722074656d706f722075726e612065752070756c0076696e61722e204d6f726269206375727375732074656d706f72206e65717500652c206e6f6e20626c616e64697420646f6c6f7220666163696c697369732000656765742e2053656420736564206c6f626f727469732073656d2e0a0a4d61007572697320756c7472696369657320656c69742075726e612c2076656c2061006c697175657420707572757320617563746f722076697461652e20507261650073656e742076697665727261206f64696f2074656c6c75732c20717569732000706f7375657265206e756c6c6120616c69717565742061742e204c6f72656d0020697073756d20646f6c6f722073697420616d65742c20636f6e7365637465007475722061646970697363696e6720656c69742e20437572616269747572200065676574206d65747573206174206c6967756c6120656c656966656e642070006861726574726120696e206d616c657375616461206475692e20447569732000636f6e7365637465747572206469616d2075742066657567696174207275740072756d2e20566976616d757320657569736d6f64206e69736c2076656c206d006178696d75732073616769747469732e20496e20636f6d6d6f646f207369740020616d6574206c6f72656d2065742074696e636964756e742e205574207065006c6c656e746573717565206e756c6c61206e6f6e206d617572697320636f6e0064696d656e74756d2c2069642076756c707574617465206f64696f20626c61006e6469742e2053757370656e6469737365206e6f6e207072657469756d206d0061757269732c206e65632074696e636964756e742073617069656e2e0a0a460075736365206461706962757320657569736d6f64207475727069732c2075740020656c656d656e74756d20656e696d20657569736d6f64206e6f6e2e204e61006d2061206e6962682074656c6c75732e2050656c6c656e7465737175652069006163756c697320746f72746f722073656420706f72747469746f7220636f6e0064696d656e74756d2e204375726162697475722066617563696275732074750072706973206d6178696d75732c2076656e656e6174697320616e746520736500642c206d6f6c6c69732072697375732e205365642074656d707573206d6167006e612065676574206e756e6320706f72747469746f722c206174207275747200756d207175616d20636f6d6d6f646f2e20496e746567657220626c616e64690074207661726975732074656c6c75732073697420616d65742072757472756d002e2050726f696e206d6f6c6c697320747269737469717565206e6571756520007365642074656d7075732e204475697320706c6163657261742c206f726369002069642064696374756d20766573746962756c756d2c206c6967756c612064006f6c6f7220766f6c7574706174206c656f2c2076697461652066617563696200757320656e696d206e756c6c6120717569732065782e20437261732066617500636962757320657374206573742c2073697420616d657420616363756d7361006e206c6163757320696d706572646965742069642e204e616d206d6174746900732c206e756e6320736564206469676e697373696d20706c6163657261742c00206d617373612075726e6120696163756c69732076656c69742c207175697300206c7563747573206469616d206a7573746f206575206e6973692e20416c69007175616d206572617420766f6c75747061742e0a0a50656c6c656e74657371007565206e6571756520617263752c20636f6e677565206e6f6e2061756775650020717569732c2074726973746971756520696e74657264756d206e756e632e002050726f696e20646f6c6f7220746f72746f722c206461706962757320736500642070656c6c656e74657371756520612c2072757472756d2065676574206e006973692e20437261732065742074656d7075732074656c6c75732e204e756c006c6120706f72747469746f722c206e69736920657520617563746f7220766100726975732c206572617420746f72746f722072757472756d20747572706973002c206e6f6e2068656e64726572697420616e7465206e6571756520757420650073742e20416c697175616d2076756c7075746174652076656c69742076697400616520657569736d6f6420656765737461732e20496e7465676572207275740072756d206d6f6c6c697320617263752c20757420756c74726963696573206a007573746f206d6f6c6c697320656765742e20457469616d2061742066696e690062757320656e696d2c206574206d6174746973206d61757269732e204d61650063656e617320696e20616c69717565742061756775652e204e616d20756c7400726963657320656c656d656e74756d20617263752076656c20616c69717561006d2e20566573746962756c756d20696e206c6967756c6120747269737469710075652c206661756369627573206f64696f20656765742c206c6f626f7274690073206a7573746f2e204d6f726269206575206e756e632073697420616d65740020726973757320636f6e73657175617420616c697175657420736564206163002065782e20496e2068656e64726572697420756c74726963696573206c696700756c612c2071756973207375736369706974206c6563747573206469637475006d2065752e20536564206c616f7265657420636f6e67756520756c747269630065732e2050686173656c6c7573207375736369706974206d6173736120612000666163696c6973697320696d706572646965742e0a0a447569732074696e63006964756e742065726f7320717569732067726176696461207661726975732e002053757370656e6469737365206e6f6e206475692070757275732e20496e7400657264756d206574206d616c6573756164612066616d657320616320616e74006520697073756d207072696d697320696e2066617563696275732e20446f6e0065632061742070756c76696e61722066656c69732e20446f6e6563206e65630020616c697175616d2065726f732c2064696374756d20626962656e64756d2000617263752e20496e206e656320646f6c6f722066696e696275732c20707265007469756d206c6967756c612065742c20636f6e7365717561742065782e2049006e206861632068616269746173736520706c617465612064696374756d7374002e20457469616d2074656c6c757320656e696d2c20696e74657264756d207300656d70657220697073756d20736f64616c65732c206772617669646120667200696e67696c6c6120646f6c6f722e204e756c6c61206c6163696e6961206a750073746f20736f6c6c696369747564696e206c616f72656574206d6f6c6573740069652e20457469616d20616320766573746962756c756d207175616d2c2069006420657569736d6f6420697073756d2e205574206174206772617669646120006c6f72656d2e2053757370656e646973736520696e74657264756d20656c65006966656e64206c65637475732c2065752073656d7065722070757275732076006f6c757470617420612e0a0a55742076656c20617567756520756c747269630065732c2074696e636964756e74206d6173736120612c20736167697474697300206e69736c2e2050726f696e206567657420616e746520616c697175616d2c00206f726e6172652061756775652070656c6c656e7465737175652c2064617000696275732070757275732e20496e206574206d6574757320617263752e205000656c6c656e74657371756520616c697175616d20626c616e6469742061726300752071756973207472697374697175652e204d617572697320746f72746f7200206d617373612c206d6178696d757320717569732076617269757320612c2000706f72747469746f7220636f6e73656374657475722073656d2e2050726f69006e207665686963756c6120707572757320657420696163756c697320636f6e0073656374657475722e20557420736f6c6c696369747564696e2066696e696200757320657820696e20656c656d656e74756d2e204f7263692076617269757300206e61746f7175652070656e617469627573206574206d61676e697320646900732070617274757269656e74206d6f6e7465732c206e6173636574757220720069646963756c7573206d75732e205072616573656e74206e656320696d7065007264696574206d61676e612e205574206d616c65737561646120696420707500727573206e656320766573746962756c756d2e2053757370656e64697373650020616363756d73616e2065726174206c656f2c20696e20666175636962757300206469616d20696163756c69732073697420616d65742e204475697320736f006c6c696369747564696e206c6563747573207175697320656e696d206c616300696e696120657569736d6f642076656c2075742061756775652e0a0a416c69007175616d20756c7472696369657320636f6e76616c6c69732074656c6c7573002c206964206567657374617320656c697420736167697474697320696e2e20004372617320706f72747469746f72206e69736920656765742073617069656e0020636f6e76616c6c697320706f73756572652e204d6175726973206772617600696461206e65717565207669746165206c696265726f206375727375732c2000696420636f6e736571756174206e657175652072686f6e6375732e20496e74006567657220616c69717565742065676574206e696268206163207068617265007472612e204e756c6c616d20696163756c6973206e69736c2066656c69732c00207175697320696d70657264696574206e756c6c6120756c74726963657320007365642e205175697371756520747269737469717565206c61637573206174002072686f6e63757320706f7274612e204e616d20616320636f6e64696d656e0074756d2075726e612e20536564206e656320706f72747469746f72206e696200682e205365642067726176696461206d61676e612069642070757275732070006f737565726520766573746962756c756d206e6f6e20736564206e6973692e0020566573746962756c756d2061726375207475727069732c20696163756c6900732076656c20636f6e7365717561742069642c206c6f626f72746973207369007420616d65742065782e205072616573656e7420717569732074656d706f72002061756775652e204e756c6c61206567657420656e696d20656c656966656e00642c2074696e636964756e74206c696265726f2073697420616d65742c206d006174746973206e6973692e20446f6e65632064756920657261742c2070756c0076696e61722076656c207075727573206e65632c20666163696c69736973200066696e69627573206c6f72656d2e204e756c6c616d20756c7472696365732000707572757320766573746962756c756d20636f6d6d6f646f20616c69717561006d2e0a0a4f72636920766172697573206e61746f7175652070656e61746962007573206574206d61676e6973206469732070617274757269656e74206d6f6e007465732c206e61736365747572207269646963756c7573206d75732e204e75006e6320626c616e646974206e756c6c612072697375732c2076656c20736f6400616c6573206c6f72656d206f726e6172652061632e20496e7465676572206e006f6e20646f6c6f7220626962656e64756d2c206f726e61726520746f72746f007220656765742c20756c7472696369657320697073756d2e2041656e65616e002066696e69627573206469676e697373696d206f726e6172652e204d6175720069732074656d7075732c206572617420617420626962656e64756d2061756300746f722c206c656f20656c6974206c6163696e6961206f64696f2c206174200074656d7075732061726375206475692071756973206573742e20507261657300656e74206672696e67696c6c61206c6f72656d206d616c6573756164612070006f72747469746f7220696d706572646965742e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d6f7262692076697461650020666163696c69736973206c6f72656d2c20766974616520636f6e7365717500617420697073756d2e20457469616d20696420656c656d656e74756d2065720061742e204e616d20646f6c6f72206c656f2c2074656d706f722061632065780020717569732c206469676e697373696d206665726d656e74756d20616e7465002e0a0a446f6e65632061206e756c6c612072697375732e204d6175726973200066617563696275732c206e756e63206163206d6178696d75732076656e656e00617469732c206d61676e612076656c6974207072657469756d20616e74652c00206e6f6e206665726d656e74756d20656c6974206d6175726973206e6f6e20006e756e632e20446f6e65632068656e6472657269742075726e61206174207400656c6c757320636f6e76616c6c69732c20616320666175636962757320656c006974206c6f626f727469732e204e756c6c616d20626962656e64756d20656c00656966656e64206d61676e612073697420616d657420696e74657264756d2e0020496e20696e20736f64616c657320746f72746f722c206e6f6e206c6f626f0072746973206d692e205072616573656e742076656c2073656d2061206f6469006f2076656e656e6174697320666163696c697369732e20566573746962756c00756d206163206d6f6c657374696520646f6c6f722c2061742066696e6962750073206e6973692e0a0a566573746962756c756d20616e746520697073756d20007072696d697320696e206661756369627573206f726369206c75637475732000657420756c74726963657320706f737565726520637562696c6961206375720061653b2046757363652061632074656d70757320617263752c2076697461650020696163756c6973206e657175652e2055742061206e69736c207574207665006c697420636f6e73657175617420636f6e64696d656e74756d207669746165002065676574206e6962682e2044756973206574206d61676e6120616c6971750065742c20636f6e76616c6c697320656c69742069642c20756c6c616d636f7200706572206d692e20566976616d757320696d706572646965742066656c697300207175697320636f6e7365717561742072757472756d2e204d6f7262692075007420617263752073697420616d657420617567756520636f6e677565207469006e636964756e742e2053757370656e64697373652061206d6174746973206f007263692e204e756e6320656765737461732c2076656c69742073656420646900676e697373696d2073656d7065722c20656c6974206d61757269732062696200656e64756d206e657175652c206567657420616c697175616d206e69736920006e65717565206120616e74652e204e616d2066657567696174206e657175650020646f6c6f722e20566573746962756c756d20616e746520697073756d20700072696d697320696e206661756369627573206f726369206c75637475732065007420756c74726963657320706f737565726520637562696c6961206375726100653b20557420696e20636f6e736563746574757220646f6c6f722e205175690073717565206e6f6e20636f6e677565206e657175652e0a0a4e756c6c6120730063656c657269737175652c206e65717565206567657420636f6e76616c6c69007320626962656e64756d2c206c6f72656d206d65747573207068617265747200612070757275732c2073656420626c616e6469742065726174206172637520006575206e6973692e204d617572697320706c616365726174206d6173736120006575206e6571756520766f6c75747061742c2073697420616d6574207669760065727261207269737573207363656c657269737175652e20496e2076656c2000766573746962756c756d206e756c6c612e20416c697175616d2072686f6e630075732061632061756775652076656c2076756c7075746174652e204d617572006973207669746165206469616d20696d706572646965742c20766f6c757470006174206e6962682065752c206661756369627573206d657475732e2045746900616d2070656c6c656e74657371756520747572706973206964206e6962682000636f6e73657175617420736f6c6c696369747564696e2e204e756e63206567006574206a7573746f2070756c76696e6172206d657475732072757472756d20006c75637475732073697420616d65742061206d657475732e204e756c6c612000666163696c6973692e2053757370656e646973736520657520617567756520006c65637475732e2053757370656e646973736520736f6c6c69636974756469006e20657569736d6f64207661726975732e2050686173656c6c757320616e74006520657261742c20666175636962757320696420746f72746f72206e65632c00207363656c6572697371756520766172697573206e756e632e0a0a45746961006d206672696e67696c6c6120766f6c7574706174206d692c20706f73756572006520766573746962756c756d206c6967756c6120756c74726963657320696e002e20446f6e6563207665686963756c6120747572706973207175697320756c0074726963696573207661726975732e20446f6e65632073656d70657220616e00746520657261742c20616320666575676961742074656c6c75732062696265006e64756d2069642e20446f6e656320697073756d206e69736c2c2070756c7600696e6172206e6563207175616d20696e2c20736f6c6c696369747564696e2000696e74657264756d20656e696d2e20566976616d7573206c616f72656574200074656c6c75732065676574206f72636920636f6e64696d656e74756d20736300656c657269737175652e2050726f696e206574206661756369627573206f6400696f2c206163206566666963697475722061756775652e20557420696e7465007264756d20747269737469717565206475692074656d70757320706f727461002e20416c697175616d206672696e67696c6c6120707572757320766974616500206e6962682074656d706f7220626962656e64756d2e205175697371756520006574207361676974746973206f7263692c2061742074656d706f722076656c0069742e205365642066696e696275732073617069656e20657420747572706900732073656d7065722c206e6f6e206d6f6c6573746965206e756e63206c7563007475732e20536564206a7573746f206e6973692c20736f6c6c69636974756400696e20696e20697073756d20696e2c206665726d656e74756d20707265746900756d206f64696f2e204e756c6c6120757420766f6c75747061742073656d2e000a0a436c61737320617074656e742074616369746920736f63696f73717520006164206c69746f726120746f727175656e742070657220636f6e7562696120006e6f737472612c2070657220696e636570746f732068696d656e61656f732e00204e756c6c61206e6f6e206f726369206d692e20566573746962756c756d20007361676974746973206f72636920657520636f6e64696d656e74756d20636f006e6775652e20446f6e656320736564206d61676e612070656c6c656e746573007175652c20706c61636572617420697073756d207365642c20616c69717561006d2073656d2e2043757261626974757220696d706572646965742061756775006520657420656c697420706c6163657261742c2061742070756c76696e61720020617263752066617563696275732e20566573746962756c756d2066657567006961742c20697073756d20617420756c747269636573206d6f6c6573746965002c206e65717565206f64696f20656c656966656e642076656c69742c206174002065676573746173206f72636920647569206574206573742e20496e746567006572207574206a7573746f206c65637475732e204e756c6c616d20666575670069617420696e74657264756d206f726369206e656320617563746f722e0a0a00446f6e656320616c697175657420616363756d73616e206d617373612c2076006974616520666163696c697369732072697375732e20467573636520707265007469756d206e756e63206e6f6e20636f6e73657175617420656c656d656e7400756d2e204d616563656e617320636f6e64696d656e74756d207363656c657200697371756520706f72747469746f722e204f72636920766172697573206e6100746f7175652070656e617469627573206574206d61676e697320646973207000617274757269656e74206d6f6e7465732c206e6173636574757220726964690063756c7573206d75732e204d6175726973206e6563207075727573206661750063696275732c2074656d707573206469616d206e65632c20756c74726963650073206f7263692e2041656e65616e2066617563696275732c2073617069656e0020757420706f72747469746f7220616c69717565742c206e756e6320657261007420636f6e6775652061756775652c2071756973206469676e697373696d200073656d20697073756d206574206469616d2e2053757370656e646973736520006772617669646120657569736d6f6420697073756d2c206120696d7065726400696574206e756c6c6120636f6e7365717561742061632e2050726f696e20710075697320636f6e73657175617420697073756d2c20696e20737573636970690074206e657175652e204e616d2076697461652076697665727261206c656f2e002041656e65616e20756c74726963657320706c61636572617420626c616e640069742e20496e7465676572206e6571756520617263752c20666163696c69730069732073697420616d6574206f726369207365642c20766573746962756c75006d206672696e67696c6c6120746f72746f722e2050656c6c656e746573717500652066657567696174206575206c6967756c612065676574206c6f626f72740069732e20536564206575206d6f6c6c69732065782c20696e206461706962750073206c616375732e20467573636520616c697175616d2c206e657175652063006f6e73657175617420666163696c6973697320706c6163657261742c2069700073756d206f72636920696163756c6973206a7573746f2c20696d706572646900657420706f7375657265206d61676e61206f64696f206e65632075726e612e0020437572616269747572206d6f6c6c69732c20657820696e20666163696c690073697320766f6c75747061742c206e697369206a7573746f20656c65696665006e64206c696265726f2c20612070656c6c656e74657371756520656e696d20006d61676e612071756973206e6962682e204d617572697320756c7472696369006573206469616d2065676574206c616375732070756c76696e61722c2065740020636f6e64696d656e74756d206e6962682073656d7065722e0a0a56697661006d757320746f72746f72207175616d2c20616c697175657420696e206e756e00632075742c206f726e61726520756c74726963696573206e657175652e205000656c6c656e74657371756520637572737573206163206a7573746f2076697400616520756c747269636965732e20446f6e65632065676574206e69736c207100756973206f726369206772617669646120766f6c75747061742065742069640020656e696d2e2053656420706f72747469746f72206c616375732071756973002073656d20756c74726963657320666163696c6973697320757420656765740020656e696d2e20416c697175616d20696163756c69732065726174206e656300206d617373612072686f6e6375732068656e6472657269742e20416c69717500616d206f726e6172652070686172657472612075726e612065752061756374006f722e20566976616d7573206964206469616d206120617567756520656765007374617320636f6e6775652e205072616573656e742068656e647265726974002073617069656e20696e206f72636920636f6e6775652c206567657420636f006e6775652073617069656e20696d706572646965742e205365642061756374006f7220657374206163206c7563747573206c6163696e69612e20496e746567006572206e65717565206e657175652c20656c656966656e642076656c206c65006f2069642c20626962656e64756d20756c6c616d636f727065722073656d2e0020566573746962756c756d2076656c20666163696c69736973206573742e2000536564207175697320766f6c7574706174207475727069732e0a0a4e616d20006d6174746973206d6f6c6573746965206d61676e612c20766974616520636f006e736571756174206d657475732e204e616d206d6178696d75732065756973006d6f6420656c6974206e6563206f726e6172652e204e756c6c61206d6f6c6c00697320696420707572757320717569732074656d706f722e2050656c6c656e007465737175652072686f6e637573206567657374617320666575676961742e00204475697320756c74726963657320656c6974207574206c6f72656d207075006c76696e617220736f6c6c696369747564696e2e2043757261626974757220006672696e67696c6c612076756c7075746174652076656e656e617469732e20004d61757269732074656d706f7220617563746f722075726e612e0a0a496e20006861632068616269746173736520706c617465612064696374756d73742e20004d616563656e617320617563746f72206d617474697320626962656e64756d002e20566573746962756c756d2074656d7075732072686f6e637573206c6563007475732c2069642072686f6e637573206e69736c206d6178696d7573206174002e204475697320766172697573206672696e67696c6c61206175677565206e00656320666163696c697369732e204e756c6c6120696163756c69732061207000757275732065676574206665726d656e74756d2e20457469616d206e656320007361676974746973206f7263692e205072616573656e74206d6174746973200066656c69732072697375732e204e616d206567657420656c656d656e74756d00206c6967756c612e20436c61737320617074656e742074616369746920736f0063696f737175206164206c69746f726120746f727175656e74207065722063006f6e75626961206e6f737472612c2070657220696e636570746f732068696d00656e61656f732e2050686173656c6c75732065676573746173207075727573002070656c6c656e7465737175652c2070656c6c656e7465737175652076656c006974206e6f6e2c206772617669646120656c69742e0a0a536564206e6f6e200074656d7075732070757275732e2053757370656e64697373652070756c7669006e6172206d65747573206e657175652c206e6f6e207472697374697175652000697073756d20706f727461206e6f6e2e205574206567657420747572706973002074696e636964756e742c2074656d706f722073656d20717569732c207665006e656e61746973206d61676e612e20566573746962756c756d206964206d610078696d75732072697375732e204475697320616c697175657420706f7375650072652066656c697320696e20706c6163657261742e2051756973717565207600656c6974206f64696f2c20656666696369747572206174206d617373612061002c20747269737469717565206f726e61726520646f6c6f722e204e756c6c61006d206567657374617320706c616365726174206475692075742073656d706500722e20416c697175616d20717569732073617069656e206d657475732e20440075697320656c656d656e74756d2c2065726174206e656320626c616e646974002072686f6e6375732c2065726f7320656e696d207363656c65726973717565002061756775652c206e656320766976657272612065726f73206c656f20657500206c656f2e204d6f7262692073656420666163696c69736973206a7573746f002e20566976616d75732073697420616d6574206d61676e612068656e64726500726974206c656f206772617669646120617563746f722e0a0a4e756e63206300757273757320616c6971756574206f64696f2e204e756e6320696163756c6900732065742074757270697320617420756c747269636965732e204e616d207600756c70757461746520656e696d20656765742070757275732074656d70757300206f726e6172652e204e756c6c616d20636f6e736571756174206d6f6c657300746965206469616d2c20766974616520756c747269636573206e6962682070006f72747469746f722065742e20566573746962756c756d20766f6c757470610074207574206c6f72656d20656765742070656c6c656e7465737175652e204e00616d2064617069627573206c696265726f206d692e2050656c6c656e746573007175652074696e636964756e74206e696268206e657175652c206120696e7400657264756d206c6f72656d20636f6e6775652076656e656e617469732e205000686173656c6c757320696e2073656d206574206d617373612066617563696200757320616363756d73616e2074696e636964756e742076656c206e6962682e000a0a4e756c6c61206d616c657375616461206e69736c206e69736c2c20657500206d6f6c657374696520697073756d206d6f6c6c697320656765742e20416c00697175616d2076756c70757461746520707572757320736564206c6967756c006120736167697474697320616c69717565742e20496e20616c697175616d20006469616d20677261766964612072757472756d2070756c76696e61722e2049006e206d616c6573756164612075726e612065676574206f726e6172652065670065737461732e20566573746962756c756d207669746165207363656c6572690073717565206573742c206567657420766573746962756c756d206f7263692e002050656c6c656e746573717565206672696e67696c6c61206d616c6573756100646120706f73756572652e204e756c6c6120696e74657264756d206c656f20007669746165207072657469756d20706f73756572652e204e616d206d6f6c6c0069732065726f73207365642074656c6c7573206d6174746973207361676974007469732e0a0a53757370656e646973736520636f6e64696d656e74756d206c006563747573206574206c6f72656d20657569736d6f64206375727375732e20004d6175726973206172637520617263752c2072757472756d20636f6e7365710075617420707572757320696e2c206567657374617320696163756c6973206c00696265726f2e204d6f726269207068617265747261206d6178696d7573206d00617373612c206567657420626c616e646974207475727069732070756c7669006e61722065742e204d6175726973206e656320646f6c6f722076656e656e61007469732c2070656c6c656e746573717565206d61676e612069642c2061756300746f722075726e612e204d616563656e6173207669766572726120706f7274007469746f72206e6973692c2076656c20756c74726963696573206572617420006375727375732061742e20467573636520636f6e6775652074656c6c7573200076697461652073617069656e20747269737469717565206665726d656e7475006d2e20446f6e656320696d706572646965742073656d206e6f6e206d61757200697320756c7472696365732076656e656e617469732e204372617320756c74007269636573206c6f72656d206c656f2e20536564207365642076656e656e6100746973206e657175652c20766974616520656765737461732066656c69732e00205072616573656e7420617420616e746520706f7274612c20636f6e64696d00656e74756d206c65637475732076697461652c20706f72747469746f72206e00657175652e204e616d2074656c6c7573206c616375732c20747269737469710075652074656d706f72206e756c6c61206e65632c20706c6163657261742062006962656e64756d2061756775652e204e756c6c616d20657569736d6f64207600697665727261206f7263692c206575206772617669646120656e696d20636f006e64696d656e74756d20626962656e64756d2e2053757370656e6469737365002065676574206c6f72656d20766974616520697073756d20706c616365726100742070656c6c656e74657371756520696420636f6d6d6f646f206f64696f2e00204675736365206d61747469732075726e612075742064756920636f6d6d6f00646f2c206e656320636f6d6d6f646f206475692070686172657472612e0a0a00496e206861632068616269746173736520706c617465612064696374756d7300742e204e616d206a7573746f206e6962682c207665686963756c612061206c006967756c612065752c206d617474697320656c656966656e64206c6967756c00612e205175697371756520656765742074757270697320612061756775652000747269737469717565206665726d656e74756d2e204e756c6c616d20766974006165206c61637573206d6f6c65737469652c207363656c65726973717565200061756775652061742c20656c656966656e64206e69736c2e204e756c6c6120006d61676e612065726f732c20636f6e76616c6c697320736564206f64696f20007363656c657269737175652c206c6f626f7274697320636f6e76616c6c697300206e6962682e204e616d2061742073616769747469732061756775652c2065007520766172697573206c6967756c612e204e756c6c616d20706f737565726500206d6178696d7573206e697369206e656320616c69717565742e2045746961006d207363656c657269737175652071756973206469616d20656765742065670065737461732e205072616573656e7420756c74726963696573207363656c6500726973717565206d69206e656320626962656e64756d2e2056657374696275006c756d20616c697175616d2074656c6c75732076656c206a7573746f206c61006f726565742c207574207072657469756d2073656d206f726e6172652e204e00616d20616e7465206e6962682c2066696e69627573206e6563207361706965006e20612c2076656e656e6174697320636f6e6775652072697375732e20496e002076656c206e65717565206120656e696d20636f6e7365637465747572207000656c6c656e7465737175652e20566976616d757320636f6e76616c6c69732000657374207574206e756c6c6120736167697474697320706f73756572652e200050656c6c656e74657371756520626962656e64756d20736f64616c65732069007073756d2065742068656e6472657269742e0a0a536564207269737573206600656c69732c20736f6c6c696369747564696e206575206d6f6c6573746965200065742c20657569736d6f6420656765742065782e20457469616d206567657400206e756c6c61206e6962682e20437261732067726176696461206120746f7200746f722076697665727261207661726975732e2050686173656c6c7573206600696e696275732c2073617069656e20657420616c697175616d20756c747269006365732c206d61757269732065726f7320706f72747469746f722065726f73002c20616320636f6e677565206c656f206573742065676574206d6175726973002e20536564206e756e632076656c69742c2065676573746173207365642065006c69742065752c20657569736d6f64206d6178696d75732073617069656e2e0020566573746962756c756d20616e746520697073756d207072696d69732069006e206661756369627573206f726369206c756374757320657420756c7472690063657320706f737565726520637562696c69612063757261653b2056657374006962756c756d206c656f206a7573746f2c20636f6d6d6f646f2071756973200076756c7075746174652061742c20736f6c6c696369747564696e207369742000616d6574206573742e205365642070756c76696e61722c2076656c69742073006564206469676e697373696d20766976657272612c206d6173736120646f6c006f722073656d706572206c6f72656d2c206e6f6e206d6f6c6573746965206d006175726973206f64696f2065742070757275732e204d616563656e6173206c006f626f7274697320696e74657264756d206e756e63207574206d6f6c6573740069652e20536564206d6f6c6c697320636f6d6d6f646f2076656e656e61746900732e20496e74657264756d206574206d616c6573756164612066616d65732000616320616e746520697073756d207072696d697320696e206661756369627500732e2055742073656420617263752076656c69742e204d617572697320617500677565206e756c6c612c206f726e617265206e656320616c697175657420730065642c20636f6d6d6f646f20696e206475692e0a0a496e746567657220736f006c6c696369747564696e2075726e612065676574206e756c6c61207068617200657472612c206e6f6e20766172697573206e657175652070756c76696e6172002e204e756c6c61207574206c656374757320736564206d617572697320756c006c616d636f7270657220706f7274612e2051756973717565206e656320646900616d207472697374697175652c2064617069627573206c656374757320612c0020616c697175616d206e6962682e2043757261626974757220616c697175650074206d6f6c6c69732073617069656e207574206d6f6c65737469652e205068006173656c6c7573207361676974746973206e69736c207669746165206d617800696d75732066617563696275732e20446f6e6563206d6178696d757320612000647569206575207661726975732e20457469616d2072686f6e63757320746f0072746f722076656c206e756e63206665726d656e74756d2070756c76696e61007220736564206e656320657261742e20416c697175616d207574206c656f20006e6f6e206e69736920646170696275732076756c7075746174652e20496e74006567657220616363756d73616e20636f6e6775652072686f6e6375732e205500742076756c707574617465206f64696f20656c69742c207072657469756d200073656d7065722065726174207375736369706974206e65632e205375737065006e6469737365206d6174746973207475727069732076656c2065726f73207000756c76696e617220756c7472696365732072757472756d2073697420616d65007420616e74652e204475697320656c656966656e64206d6178696d75732061007567756520696e207363656c657269737175652e20446f6e6563206e6f6e2000746f72746f722073697420616d657420657261742066617563696275732061006c69717565742e205365642074656d70757320747269737469717565207269007375732c207072657469756d207472697374697175652064756920636f6e7600616c6c69732065752e0a0a50686173656c6c757320616c697175616d2074750072706973206174206c656f20706f73756572652c2073656420616363756d7300616e206e69736c2074656d7075732e204d616563656e6173207669746165200073617069656e206a7573746f2e2050686173656c6c75732074656d70757320006672696e67696c6c612070656c6c656e7465737175652e2050656c6c656e7400657371756520617420646f6c6f72206964206d6175726973206c616f726565007420637572737573206e6f6e2071756973206d657475732e204475697320610063206d69206e6f6e2074656c6c7573206461706962757320706f7274746974006f72206e6f6e206574206c6967756c612e20457469616d20736f64616c6573002069642074757270697320696e20756c747269636965732e2053656420616e007465206c616375732c2068656e64726572697420757420706f72747469746f00722075742c206665726d656e74756d207669746165206c656f2e0a0a437261007320706861726574726120616e746520616e74652c2076756c70757461746500206665756769617420726973757320666175636962757320656765742e205000726f696e2073697420616d65742074656c6c75732072686f6e6375732c20760065686963756c61206469616d206e6f6e2c2065676573746173206573742e200043726173207669746165206c696265726f206e657175652e20446f6e65632000697073756d2066656c69732c20696e74657264756d2076656c20656765737400617320656765742c20616c6971756574206e65632065726f732e20446f6e650063206e697369206d617373612c20766573746962756c756d2076656c20656e00696d2065742c206461706962757320636f6e67756520697073756d2e20507200616573656e7420647569206573742c20636f6e677565207669746165206d6f006c657374696520717569732c206d616c657375616461206567657420646961006d2e20457469616d206e6f6e2076697665727261206f7263692e2056657374006962756c756d206d6f6c6c69732065726f73206174206c656374757320706f0072747469746f7220756c6c616d636f727065722e20496e2066657567696174002066656c6973206e656320657820756c7472696365732c2073656420666572006d656e74756d206a7573746f2066696e696275732e2044756973206e6f6e2000706f7375657265206e657175652c20657420636f6e736571756174206f726300692e20416c697175616d206575206a7573746f20756c7472696365732c207600656e656e6174697320746f72746f722061632c2072757472756d20656e696d002e0a0a496e7465676572206469676e697373696d207175616d206575206d6100757269732066696e6962757320666163696c697369732e204d617572697320006c6163696e6961206a7573746f206c65637475732c2076656c206c756374750073207175616d20766f6c757470617420766f6c75747061742e205574206e6f006e206f726369206e756c6c612e2041656e65616e20617563746f72207361700069656e206120726973757320656c656d656e74756d206d616c657375616461002e204e616d2065676574206c6563747573206c696265726f2e20416c69717500616d20697073756d206d617373612c20736f6c6c696369747564696e2061630020696163756c697320612c206d6178696d7573206575207475727069732e20004d616563656e61732076656c206e756e632076656c2065726f7320766f6c750074706174207472697374697175652076697461652061742065782e204375720061626974757220657420656e696d206d6f6c6c69732c207072657469756d2000646f6c6f7220717569732c2068656e647265726974206c616375732e20496e002074656d70757320657569736d6f6420646f6c6f722c206964206469637475006d206d657475732072757472756d20717569732e0a0a43757261626974757200207072657469756d206c6f626f72746973207363656c657269737175652e20004d61757269732076656c206d69206120697073756d207665686963756c6120007363656c657269737175652e204e756c6c6120666163696c6973692e20446f006e656320636f6e736571756174206f64696f2061206572617420756c6c616d00636f7270657220666163696c697369732e2044756973206d6173736120656e00696d2c20756c74726963696573206e6f6e2075726e6120717569732c2065750069736d6f64207072657469756d20746f72746f722e20457469616d2068656e00647265726974206c656374757320766974616520656c656d656e74756d207600756c7075746174652e20496e74657264756d206574206d616c657375616461002066616d657320616320616e746520697073756d207072696d697320696e200066617563696275732e20536564206f64696f206d61676e612c20636f6e7365006374657475722073697420616d657420706f7274612076697461652c2076690076657272612061206d61676e612e204372617320657520697073756d20656c00656966656e64206f64696f20766976657272612072757472756d206574206e006f6e206c6f72656d2e20517569737175652071756973206c656f2075742072006973757320756c6c616d636f727065722073757363697069742076656c206e006563206469616d2e20467573636520646170696275732065726f73206e6f6e00206e69736c2066617563696275732c20657420656666696369747572207365006d20706c6163657261742e20566573746962756c756d20616e74652069707300756d207072696d697320696e206661756369627573206f726369206c75637400757320657420756c74726963657320706f737565726520637562696c6961200063757261653b20416c697175616d2069642073656d206163206c6f72656d2000706f72747469746f72206c616f72656574206163207175697320656c69742e000a0a446f6e65632076656c20646f6c6f72206d6178696d75732c206d6f6c6c006973206d61676e612073697420616d65742c2070686172657472612076656c0069742e2041656e65616e2070656c6c656e74657371756520737573636970690074206c6563747573206174207665686963756c612e20446f6e6563206e656300206661756369627573206469616d2e204e616d20656765742064756920657500206d6175726973206461706962757320616c697175616d2064696374756d20006575206d61757269732e20446f6e6563206c6563747573206d657475732c20006d6f6c657374696520636f6e73657175617420756c747269636965732065670065742c206c616f72656574206e6563206475692e20446f6e6563206575206c00656374757320717569732076656c697420656c656d656e74756d2065756973006d6f642e204d616563656e617320626962656e64756d206c61637573207369007420616d657420736f6c6c696369747564696e206c6163696e69612e0a0a510075697371756520737573636970697420706f73756572652070757275732063006f6e64696d656e74756d20706f7274612e20457469616d2068656e64726572006974207574206c696265726f20696e2072757472756d2e204e756c6c616d2000756c74726963696573206c696265726f20657420647569206c6f626f7274690073206672696e67696c6c612e20496e746567657220757420656c6974206d6100676e612e2051756973717565207665686963756c61206d6f6c6c6973206c65006f2c206964207665686963756c61206d61676e6120616c6971756574207574002e20457469616d206e6f6e20706f72747469746f72206e69736c2c207369740020616d65742076756c707574617465206469616d2e2050726f696e206e657100756520657261742c20737573636970697420656765742066656c697320696e002c20677261766964612066696e69627573207175616d2e2050686173656c6c007573206d617474697320746f72746f722072697375732c20757420656c656d00656e74756d206d6574757320737573636970697420626962656e64756d2e0a000a4e756c6c616d207175616d2065782c20706f72746120696e2070757275730020696e2c206d6f6c65737469652074726973746971756520646f6c6f722e2000457469616d207472697374697175652072697375732076656c206c6163757300206672696e67696c6c612c206174206c75637475732075726e6120616c69710075616d2e20416c697175616d2065752066656c697320666575676961742c2000696163756c6973206c6f72656d2073697420616d65742c2070756c76696e61007220697073756d2e204e616d2076697461652074696e636964756e74206d6100676e612e204d617572697320756c6c616d636f727065722c206d657475732000636f6e64696d656e74756d20736f64616c657320756c6c616d636f72706572002c2073656d2074656c6c757320636f6e7365637465747572206c6563747573002c2061742074656d7075732073617069656e206d61757269732076656e656e0061746973206d61757269732e2041656e65616e20766573746962756c756d2000646f6c6f722065782c2076656c2076697665727261206e696268206d617869006d7573207365642e20457469616d20636f6d6d6f646f206d616c65737561640061206f7263692e204e616d20616363756d73616e206469616d206e6563206e00756e6320766f6c7574706174206566666963697475722e20467573636520700072657469756d20697073756d206c656f2c207175697320696e74657264756d00206172637520736f6c6c696369747564696e20656765742e2050656c6c656e00746573717565206d617474697320617420697073756d206567657420707265007469756d2e0a0a536564206c656f206d692c207068617265747261207369740020616d657420696d706572646965742065752c2074696e636964756e742065007420746f72746f722e2055742071756973207072657469756d206d61676e61002c20657520616c697175657420697073756d2e2050726f696e20616320756c0074726963657320697073756d2c2076656c206d6f6c6573746965207361706900656e2e20457469616d20736f64616c6573206e65717565206163206f726e610072652070686172657472612e204d6f7262692071756973206175677565207300697420616d65742075726e6120706c6163657261742070756c76696e61722e00204375726162697475722076617269757320666163696c69736973207269730075732c206964207375736369706974207175616d20696d7065726469657420006d616c6573756164612e20416c697175616d20646170696275732c2069707300756d2076656c20636f6e64696d656e74756d206d61747469732c206c696775006c6120657374206375727375732074656c6c75732c20657520696e7465726400756d20616e7465206c656f206e6f6e20616e74652e204e756c6c6120717561006d206e6973692c20706f737565726520657420616363756d73616e20696e7400657264756d2c2076756c707574617465206e6f6e2070757275732e204e756e00632076617269757320696d706572646965742066656c6973206e656320696e0074657264756d2e2050726f696e2076656e656e617469732061206c6967756c006120657420636f6e73656374657475722e2050686173656c6c7573206e6563002065726f73206d6f6c6c69732c20756c7472696369657320656c6974206e6f006e2c206c6163696e6961206d692e2053757370656e6469737365206c696775006c6120617263752c206665726d656e74756d20617420617563746f722071750069732c20656c656966656e64207669746165206e69736c2e0a0a53656420660065726d656e74756d20707572757320696e206f64696f2070756c76696e6172002c20766573746962756c756d20656c656966656e642065737420636f6d6d6f00646f2e20467573636520766172697573207365642074757270697320696e2000666575676961742e20557420616320666163696c69736973206f64696f2e2000557420766f6c757470617420697073756d20646f6c6f722c20696e2065756900736d6f6420646f6c6f7220696e74657264756d2069642e20536564207361700069656e206573742c20696d70657264696574206575206f726e6172652065670065742c2074656d70757320656765742066656c69732e2050686173656c6c7500732070656c6c656e7465737175652c206e756c6c612073697420616d6574200066696e6962757320677261766964612c207175616d206e69736c206469637400756d206a7573746f2c2073697420616d6574206672696e67696c6c6120646900616d206c616375732065676574206573742e20566573746962756c756d2062006c616e646974206d617572697320696e20616e7465206d6178696d75732076006f6c75747061742e2050656c6c656e746573717565206861626974616e7420006d6f726269207472697374697175652073656e6563747573206574206e6574007573206574206d616c6573756164612066616d6573206163207475727069730020656765737461732e20566573746962756c756d2066656c6973207269737500732c2073616769747469732076656c20636f6d6d6f646f207365642c20706f0072746120617563746f722073656d2e20496e74657264756d206574206d616c006573756164612066616d657320616320616e746520697073756d207072696d00697320696e2066617563696275732e204d616563656e6173206e656320706f0072747469746f722066656c69732e20446f6e656320656c656d656e74756d200073656d206e756c6c612e0a0a416c697175616d20656c656d656e74756d20650075206c6f72656d206964206c75637475732e204e756e63206174206e69626800206573742e205072616573656e7420666175636962757320766172697573200065726174206e656320706f73756572652e204e756c6c616d207175616d206c00616375732c20766f6c7574706174206e6563206c616f72656574206e6f6e2c0020706f7375657265206163206c6967756c612e2050726f696e2071756973200065676573746173206e69736c2c20736564206c75637475732066656c69732e00204e756c6c61207072657469756d207175616d206e65632066696e696275730020656c656966656e642e20457469616d206d617572697320656e696d2c207200686f6e6375732076656c206d616c657375616461207365642c20636f6e6469006d656e74756d2076697665727261206c696265726f2e20416c697175616d20007175616d2073656d2c2072757472756d2061742073617069656e206e65632c00206c616f7265657420666163696c69736973207475727069732e204e616d20006e65632074656d707573206573742e204d616563656e617320766172697573002c206e69626820617420636f6e73656374657475722074656d7075732c206e00756e63206c6f72656d206672696e67696c6c6120617263752c20696d70657200646965742072757472756d206e69736c2064756920612061756775652e20500072616573656e7420706c6163657261742073617069656e20736564206d6920006d6f6c6c697320666163696c697369732061206e65632070757275732e20500072616573656e7420736f6c6c696369747564696e2066656c6973206d61737300612c2076656c206d6174746973206c656f2068656e6472657269742061632e002053757370656e646973736520657569736d6f642064696374756d2074696e00636964756e742e0a0a416c697175616d2064617069627573206c6f72656d2000657520736f64616c65732066617563696275732e204e756c6c612074726973007469717565206f64696f2065742072697375732064696374756d2c20756c7400726963696573206c6f626f72746973206c6967756c61207361676974746973002e20496e74657264756d206574206d616c6573756164612066616d65732061006320616e746520697073756d207072696d697320696e206661756369627573002e204e756e632074656d7075732076656c2065726174207669746165206c610063696e69612e204e756c6c6120696e20656765737461732065726f732e204e00756c6c616d2076656c20646f6c6f722076656c2076656c697420706c616365007261742076756c70757461746520696e20736564206c616375732e20416c69007175616d206c6f626f7274697320616e746520696e2074656c6c75732069610063756c69732c206120636f6d6d6f646f207175616d20616363756d73616e2e002050726f696e2066657567696174206c6967756c61206964206e756e63207600756c70757461746520646170696275732e20457469616d207072657469756d00207669746165206475692073697420616d657420616c697175616d2e204165006e65616e206c6f626f727469732072757472756d206e6973692c2061207465006d7075732065726f7320666163696c697369732069642e204d617572697320006e6f6e2061726375206174206e6973692076697665727261206375727375730020657520616320646f6c6f722e0a0a4e756e6320696e206f64696f206d692e00204e616d206d617474697320736564206c6967756c612073697420616d6574002074656d706f722e20496e74656765722064696374756d207269737573206600617563696275732c2076656e656e6174697320616e74652065752c20756c74007269636573206d61757269732e20446f6e6563206e656320636f6e64696d65006e74756d2065782e2053656420666163696c69736973206f64696f20647569002c207669746165206672696e67696c6c61206d617572697320617563746f7200206e6f6e2e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e2053757370656e646973736520717569732074656c6c7573206c00616f726565742c20756c7472696365732073656d206e65632c207363656c650072697371756520656c69742e20536564207363656c65726973717565206573007420766f6c75747061742c20636f6e64696d656e74756d20616e746520612c002076656e656e61746973206d617373612e204d6f726269206e65632061756300746f72206c65637475732c206163207072657469756d206e6962682e20467500736365207363656c65726973717565206d61737361206e6f6e206375727375007320706f7274612e20566573746962756c756d206d65747573207075727573002c20636f6e736571756174206964206672696e67696c6c6120612c2074656d00707573207068617265747261206c65637475732e20566573746962756c756d0020736f64616c6573206c6f626f7274697320756c7472696365732e0a0a4e61006d2073697420616d657420626c616e646974206573742e204675736365207300697420616d65742074696e636964756e7420646f6c6f722e20446f6e6563200076656c206e697369206c616375732e204d617572697320706f7375657265200075726e6120616320656c656966656e6420616c69717565742e205375737065006e6469737365206661756369627573206665726d656e74756d206c69626572006f2c20616320617563746f72206d617373612068656e647265726974207465006d706f722e20467573636520706f72747469746f722061726375206163206c00656374757320626962656e64756d20636f6d6d6f646f2e205365642061756300746f72206575206f64696f2076656c20616c69717565742e20436c6173732000617074656e742074616369746920736f63696f737175206164206c69746f72006120746f727175656e742070657220636f6e75626961206e6f737472612c200070657220696e636570746f732068696d656e61656f732e20566976616d757300206574206c756374757320656e696d2e20566573746962756c756d2074656d00706f7220616e746520736564206d61747469732064696374756d2e205175690073717565207068617265747261206172637520656765742075726e6120756c0074726963657320617563746f722e204d6f72626920656c656966656e642063006f6e736571756174206d692069642068656e6472657269742e20467573636500206d617474697320616e746520636f6e64696d656e74756d20706f73756572006520736f64616c65732e20437572616269747572206c6f626f72746973207500726e612073697420616d6574206d617474697320656765737461732e204d610075726973206665756769617420656c69742074656c6c75732c20756c747269006369657320696d70657264696574206469616d2074656d7075732076656c2e000a0a566573746962756c756d206672696e67696c6c6120747269737469717500652075726e6120657520706f7274612e2050726f696e206665756769617420006e69736c207475727069732c207574206c6f626f727469732072697375732000696d706572646965742061742e2050686173656c6c75732073697420616d65007420616c69717565742066656c69732c20766974616520706f737565726520006d692e20416c697175616d20736167697474697320766172697573206e69620068206e6563206f726e6172652e2050656c6c656e7465737175652074696e63006964756e742076697461652065737420657520616c697175616d2e20447569007320696163756c697320757420617263752073656420656c656d656e74756d002e20467573636520616363756d73616e2c20646f6c6f72206e6f6e2074656d0070757320616363756d73616e2c20646f6c6f72207175616d20617563746f7200206e657175652c2071756973206f726e61726520616e7465206c656f206964002070757275732e2050686173656c6c75732073656420656c656966656e642000656c69742e204372617320657520706f737565726520616e74652e20496e2000616e7465206c6f72656d2c2070686172657472612073697420616d65742076006573746962756c756d207365642c2072686f6e637573206964206a7573746f002e2055742074656d707573206469676e697373696d207665686963756c612e00204d616563656e6173206d61757269732076656c69742c2065676573746173002073697420616d6574207661726975732076697461652c20666163696c69730069732073697420616d6574206c6967756c612e0a0a4d6175726973206772610076696461206c656f2073697420616d6574206f7263692076656e656e61746900732c207574206d6178696d75732073617069656e20636f6e7365717561742e00204d6f726269206e6563206f7263692065782e20566976616d757320766568006963756c61206469676e697373696d207075727573207365642074696e63690064756e742e20467573636520657569736d6f64206e6f6e20656e696d2065740020636f6d6d6f646f2e205072616573656e7420766f6c7574706174206d6f6c006573746965206f726e6172652e20566976616d757320636f6e64696d656e7400756d2076656c697420656c656d656e74756d2c207072657469756d20747572007069732065752c20626c616e6469742072697375732e204675736365207065006c6c656e746573717565206d6178696d7573206e6973692061632073656d700065722e20416c697175616d20757420657569736d6f642076656c69742c207300656420656c656d656e74756d206c6f72656d2e204d616563656e617320696400207269737573206e6f6e206d61737361206772617669646120636f6d6d6f64006f2e204e756c6c616d20696e20707572757320696420656c69742066616369006c6973697320636f6e6775652e2041656e65616e20636f6e6775652076756c00707574617465206c616f726565742e20416c697175616d206567657420656c0069742074656c6c75732e205175697371756520737573636970697420717561006d206163206d6173736120626962656e64756d20656765737461732e20416c00697175616d2071756973206578206e6f6e2076656c6974207363656c657269007371756520756c6c616d636f727065722069642065676574206d61676e612e002041656e65616e20612073656d206e6f6e2065726174206c6f626f727469730020636f6e6775652e0a0a43726173206e6f6e20647569206f64696f2e20517500697371756520766f6c7574706174207363656c657269737175652069707375006d206174207661726975732e20536564206f726e6172652073656d20736564002076656e656e6174697320636f6e7365717561742e2044756973206f726e610072652076656e656e61746973206d6f6c6c69732e20536564206578206e65710075652c2065666669636974757220626962656e64756d20706c616365726174002065742c20736f6c6c696369747564696e2076656c206f7263692e20496e740065676572206e696268206e657175652c20666163696c69736973206e6f6e20006d61757269732076656c2c20636f6e73656374657475722074726973746971007565206e756c6c612e204e756e632073697420616d657420706861726574720061206c656f2e204e756c6c616d206c656f206f7263692c20696d70657264690065742073697420616d657420696e74657264756d20717569732c2069616375006c6973206575206e69736c2e20416c697175616d2073656420747269737469007175652073656d2c206e6563206c6f626f7274697320746f72746f722e204d00616563656e617320736f64616c6573207075727573206e656320616c69717500616d20706f72747469746f722e20447569732075742066656c69732065726100742e0a0a437261732061206d6173736120696d706572646965742c2061636300756d73616e2072697375732069642c207375736369706974206e756e632e2000446f6e65632073656d70657220656e696d206575206d61676e6120636f6e730065717561742074696e636964756e742e2053757370656e646973736520636f006e736571756174206c6563747573207669746165206d6574757320616c697100756574206c616f726565742e20436c61737320617074656e74207461636974006920736f63696f737175206164206c69746f726120746f727175656e74207000657220636f6e75626961206e6f737472612c2070657220696e636570746f73002068696d656e61656f732e20446f6e656320696e74657264756d206469616d00206174206e69626820616363756d73616e2c20657420617563746f72206d6100737361206c6163696e69612e20467573636520696420657820766974616520007269737573206c616f7265657420706f72746120636f6e64696d656e74756d00206567657420656e696d2e2050686173656c6c7573206c6563747573206f6400696f2c20666163696c6973697320612074656d707573207365642c20736f6400616c6573206575206475692e204e616d20696e206d616c657375616461206f0064696f2e205175697371756520706c61636572617420697073756d2076656e00656e617469732072697375732074656d7075732066617563696275732e205000656c6c656e74657371756520656c656d656e74756d20646f6c6f72207175690073206672696e67696c6c612074656d7075732e20457469616d2074696e63690064756e7420766172697573206c6f72656d20696e206f726e6172652e204e61006d206120656c656d656e74756d206f7263692e2050686173656c6c7573206700726176696461206e69736c20657520656c697420756c747269636965732c2000657420626962656e64756d2074656c6c75732066696e696275732e0a0a437200617320626c616e6469742070756c76696e6172206d657475732c2061632069006e74657264756d2066656c6973206d6178696d757320626962656e64756d2e002041656e65616e20626962656e64756d20696d7065726469657420636f6e6400696d656e74756d2e204e616d206e6f6e206c61637573206c6967756c612e2000517569737175652073656420766573746962756c756d2073617069656e2e2000536564207665686963756c612074696e636964756e74206c656f207175697300206c6163696e69612e20536564206c61637573206c6f72656d2c20756c74720069636573206e6563206c6f72656d207365642c20706c61636572617420766f006c7574706174206d657475732e205365642075742073656d2073697420616d00657420746f72746f7220756c7472696365732073757363697069742076656c00206174207475727069732e0a0a5574207669746165206175677565207369740020616d657420656c69742070756c76696e61722068656e647265726974206e0065632061206c6967756c612e20446f6e656320706f727461206e6973692063006f6d6d6f646f20616e7465207665686963756c612073656d7065722e205574002066696e696275732c207075727573207574206661756369627573206d6f6c006c69732c2066656c6973206e65717565206d616c657375616461206e696268002c2061632076656e656e61746973206e756c6c612076656c69742061206665006c69732e204d617572697320677261766964612c206c6967756c6120696420006c6163696e696120766976657272612c206a7573746f206c696265726f2076006172697573206c6967756c612c2073697420616d657420706f727461206c6f0072656d206c696265726f2061206d657475732e20416c697175616d20756c6c00616d636f72706572206d61757269732073617069656e2c2061206772617669006461207075727573207363656c6572697371756520717569732e204e756c6c00616d2072757472756d20746f72746f722073697420616d6574206f64696f2000656666696369747572207072657469756d2e2044756973206c616f7265657400206566666963697475722076656c69742c20612073656d7065722066656c6900732e2050726f696e206e696268206c616375732c20637572737573207369740020616d6574206c656374757320717569732c2065666669636974757220766500686963756c61206475692e20446f6e65632061726375206c656f2c207275740072756d2075742063757273757320696e2c207363656c6572697371756520650074206c616375732e204d616563656e61732074696e636964756e742061726300752061206e6571756520666575676961742c2076656c2064696374756d206e0069736c2073656d7065722e20446f6e6563206e756e632076656c69742c2063006f6d6d6f646f20696420746f72746f722076697461652c20616c697175657400206661756369627573206c6f72656d2e2041656e65616e2076617269757320006d61747469732073617069656e2065676574206d6f6c6c69732e20446f6e6500632076697461652075726e6120756c6c616d636f727065722c206469676e69007373696d20656e696d2076697461652c20766573746962756c756d206d65740075732e2050686173656c6c757320636f6e73656374657475722065726f732000696d706572646965742c20677261766964612065726f732069642c206d6f6c006c69732076656c69742e0a0a5574206163206c6163757320636f6e76616c6c0069732c207665686963756c61206e6571756520717569732c2065666669636900747572206f7263692e205574206d69206c616375732c206566666963697475007220657420736f6c6c696369747564696e2075742c206661756369627573200073697420616d657420616e74652e2053656420636f6e64696d656e74756d20006567657420656c697420617420677261766964612e20457469616d206e656300206e69736c2073656420656e696d20706f72746120706c6163657261742e20005072616573656e74206672696e67696c6c61207361676974746973206c656f002c2076656c2074656d706f72206f64696f206d6f6c6c69732076697665727200612e20566573746962756c756d2066696e69627573206a7573746f207269730075732c2065752073656d706572206475692066696e696275732061632e204d00617572697320706c616365726174206c6563747573206e6973692c206e6f6e0020766573746962756c756d20746f72746f72206d61747469732061632e204e00756c6c61206e656320626962656e64756d207175616d2e0a0a53656420657400206469616d2065676574206c696265726f2070756c76696e6172206672696e0067696c6c6120756c74726963696573206964207475727069732e20507261650073656e7420657520656e696d206672696e67696c6c612c20706c61636572610074206172637520696e2c20766573746962756c756d206e657175652e2045740069616d207665686963756c6120657261742064696374756d206e6962682065007569736d6f6420736f6c6c696369747564696e2e205072616573656e74206e0065632074757270697320616c69717565742c206c6f626f72746973206c656f0020717569732c207665686963756c61207175616d2e2050686173656c6c7573002073656420626962656e64756d206e6973692e204d616563656e61732069640020646f6c6f72206567657420616e746520626c616e6469742064617069627500732e20446f6e656320656c656d656e74756d20736564206e696268206575200073616769747469732e20467573636520636f6e6775652073656d206c6f7265006d2c206e6f6e206672696e67696c6c61206f64696f20617563746f7220612e0020566573746962756c756d20616e746520697073756d207072696d69732069006e206661756369627573206f726369206c756374757320657420756c7472690063657320706f737565726520637562696c69612063757261653b204d61656300656e61732073656420636f6e7365637465747572206a7573746f2e2053656400206566666963697475722061207175616d2073697420616d6574206d617869006d75732e0a0a416c697175616d20636f6d6d6f646f20616e7465206574206d006f6c657374696520706f72747469746f722e204d616563656e617320766f6c007574706174206e69736c207363656c657269737175652c206c6f626f7274690073206d61757269732061632c2064696374756d206d617373612e205068617300656c6c7573206d616c657375616461206c6163696e6961206f64696f206964002066696e696275732e204d616563656e61732061206d61676e61206f64696f002e20467573636520697073756d2075726e612c2073616769747469732066610075636962757320616e7465207365642c20756c747269636573206461706962007573206d61757269732e2053757370656e6469737365207574206f64696f2000717569732073656d206461706962757320616c697175616d20696e2069642000646f6c6f722e205574206d61747469732071756973206f64696f20766974610065206c6f626f727469732e20416c697175616d20616320746f72746f7220610063206d657475732073656d70657220766976657272612e20416c697175616d00206e65632064696374756d206d617373612c2076656c2073757363697069740020656c69742e2044756973207365642073656d206575206e69626820636f6e00736563746574757220696163756c69732076656c2075742061756775652e200044756973207669746165206c75637475732075726e612e204e616d206e756c006c61206e6962682c20626c616e6469742073697420616d65742073656d706500722076697461652c206d6f6c6c6973206c6f626f72746973206e756e632e200053656420757420666175636962757320746f72746f722c20656765742069610063756c6973206f7263692e20496e206120626c616e646974206475692c20610074207068617265747261206d657475732e20457469616d2068656e64726572006974206c696265726f207669746165206c656374757320737573636970697400206f726e6172652e2051756973717565206d6174746973206c6163757320610074207068617265747261207661726975732e0a0a4d616563656e61732066610063696c6973697320656c697420756c747269636573207072657469756d206c006f626f727469732e2046757363652076656c20766573746962756c756d2065007261742e20457469616d206175677565206d617373612c20666575676961740020766974616520657261742061632c206c6f626f7274697320766f6c757470006174206d61676e612e20446f6e6563206d616c65737561646120736564206c006967756c6120717569732066696e696275732e204e756c6c616d20656666690063697475722076697665727261206475692c206e6f6e20766573746962756c00756d20746f72746f7220696e74657264756d2076656c2e2050726f696e2061006e7465206573742c20626c616e64697420696e207363656c65726973717565002073697420616d65742c20756c74726963696573206e65632065726f732e20005365642065726174206e69736c2c20677261766964612065742074656d706f00722065742c206665726d656e74756d2073697420616d65742065782e205365006420656666696369747572206d6920766974616520657569736d6f6420667200696e67696c6c612e2053757370656e6469737365206567657420617563746f0072206e6962682e20446f6e6563206e6563207068617265747261206f64696f002c2068656e64726572697420636f6e64696d656e74756d20646f6c6f722e0a000a4d6f72626920696d706572646965742c206469616d206e65632076756c700075746174652072757472756d2c20746f72746f72206c6f72656d20696e7465007264756d20616e74652c207669746165206375727375732074757270697320006f64696f206e6f6e206d61676e612e20446f6e6563206c616f7265657420760069746165206d61676e612073697420616d657420617563746f722e20437261007320617563746f72206e69736c20717569732076617269757320636f6d6d6f00646f2e204d6175726973206174206c6163696e6961206e756c6c612e2056650073746962756c756d20666575676961742073656d206174206d61737361206600617563696275732064696374756d2e2046757363652076656c207361706965006e2073697420616d6574206a7573746f20737573636970697420616363756d0073616e2075742076656c206f7263692e204e756c6c6120666163696c697369002e204e756c6c616d20736f6c6c696369747564696e20737573636970697420006e6973692c20657520616363756d73616e206d6574757320636f6e73656374006574757220766573746962756c756d2e20517569737175652074656c6c757300206d657475732c2073656d7065722074656d707573206d657475732071756900732c2064696374756d20656c656d656e74756d2066656c69732e205375737000656e646973736520636f6e76616c6c6973207075727573206163206c6163750073207072657469756d2c20616320616c6971756574206573742066696e69620075732e2050656c6c656e74657371756520626962656e64756d20707572757300206d61676e612c2073697420616d657420637572737573206e65717565206600657567696174206e6f6e2e2043757261626974757220696e206d6178696d750073206a7573746f2e2041656e65616e20696163756c6973206c6163696e6961002072686f6e6375732e0a0a536564206672696e67696c6c612073656d20616300206d61737361206d616c6573756164612c206d617474697320696d7065726400696574207175616d2073757363697069742e2043726173206c6163696e6961002061632065782076697461652072757472756d2e205365642065782066656c0069732c20706f727461206e656320617263752061632c2066696e6962757320006c7563747573207475727069732e204475697320697073756d206c69626572006f2c20696e74657264756d20757420696e74657264756d2075742c20656c65006d656e74756d206163206a7573746f2e204d6f7262692074726973746971750065206c6f626f7274697320706c6163657261742e2050656c6c656e746573710075652074696e636964756e742074656d70757320656e696d20617420636f6e006775652e204e756c6c61206d61747469732074696e636964756e74206e697300692c2061742072686f6e63757320616e746520656c656966656e642068656e006472657269742e204e756c6c616d2064696374756d20706861726574726120006475692e20566573746962756c756d206c75637475732065737420757420610075677565207472697374697175652c2073697420616d657420656c656d656e0074756d2074656c6c757320656c656966656e642e20496e7465676572206e650063206f726e617265206a7573746f2c207175697320706f727461206469616d002e2051756973717565206e6f6e206e697369206e6f6e206c6f72656d207075006c76696e617220706f73756572652061206567657420656c69742e20536564002065676574206c6163696e69612073656d2e2050686173656c6c7573206e6f006e206e756c6c612074656d7075732c207363656c65726973717565206c69620065726f2076656c2c207068617265747261206e6962682e0a0a53757370656e006469737365206469676e697373696d20636f6e67756520657374206964207000686172657472612e20447569732076697461652066656c697320696e206c65006374757320666163696c6973697320706861726574726120736564206163200070757275732e2050656c6c656e7465737175652076656e656e617469732070006c616365726174206d61757269732c206120626962656e64756d206d617572006973206566666963697475722076697461652e204d6f7262692065666669630069747572206d65747573206575207363656c65726973717565206661756369006275732e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b200041656e65616e20696e74657264756d20666163696c69736973207175616d2000717569732066617563696275732e20566573746962756c756d20616e74652000697073756d207072696d697320696e206661756369627573206f726369206c00756374757320657420756c74726963657320706f737565726520637562696c0069612063757261653b205072616573656e74206c6f626f72746973206d6167006e612071756973206e697369206d616c657375616461206d6178696d7573200071756973206e6f6e206c6f72656d2e20437572616269747572206e6f6e206e00756c6c612073697420616d657420657261742074696e636964756e742066610063696c6973697320617420657420746f72746f722e204d6f72626920696420006175677565207669766572726120697073756d2070756c76696e617220736300656c657269737175652071756973206e65632076656c69742e204e616d207600656c206f64696f20636f6d6d6f646f2c20706f727461206172637520696e2c0020666163696c697369732073617069656e2e204e756e632073697420616d6500742076656e656e6174697320657261742c206174206c616f72656574206175006775652e20446f6e656320617563746f722070757275732071756973207465006d706f7220666575676961742e20496e2071756973206c6f72656d206567650074206e756e63206c6163696e696120646170696275732e20446f6e65632069006163756c6973206573742076656c2072686f6e63757320616c697175616d2e000a0a4d6f726269206d61676e61206f64696f2c2076656e656e61746973207600697461652073656d2069642c20646170696275732074656d707573206e756e00632e204d6f7262692066617563696275732074656d706f72206d6178696d7500732e205175697371756520657520696d70657264696574206d61676e612c2000696420616c697175616d2075726e612e20446f6e6563207574206c69626572006f206475692e20457469616d206d6174746973206e756c6c6120717569732000617567756520696e74657264756d2c2061206d6f6c6573746965206f72636900207472697374697175652e20446f6e6563206e656320756c6c616d636f7270006572206e6962682c2061742074696e636964756e742070757275732e20447500697320626c616e646974206e69626820756c74726963696573206f7263692000616363756d73616e20736f6c6c696369747564696e2e20446f6e6563206964002061756775652071756973206e65717565206c616f72656574206f726e617200652e204e756e632072757472756d206a7573746f2075742065676573746173002068656e6472657269742e20437261732074656d70757320696e206d61757200697320612074696e636964756e742e0a0a557420706f72747469746f72207400656d70757320616c697175616d2e204d616563656e617320677261766964610020636f6e736571756174206d692c20657420747269737469717565206c6f7200656d20666575676961742073697420616d65742e205072616573656e742073006564206d6178696d7573206f64696f2c206567657420636f6e736563746574007572206c616375732e20416c697175616d20647569206e657175652c20766900766572726120636f6e73657175617420636f6e6775652076656c2c20636f6e00736571756174206964206f7263692e2041656e65616e2066696e69627573200065782073656d706572206e69736c206d61747469732c2071756973206c75630074757320656e696d206c6163696e69612e2050726f696e206964206d6173730061206d61757269732e20496e74656765722065752061726375206c6163696e006961206c656374757320657569736d6f64206c75637475732e20496e20766f006c7574706174206e6f6e206d657475732073697420616d657420636f6e7661006c6c69732e204e616d206c6967756c61206d657475732c206665726d656e7400756d2065752074656c6c75732069642c20656c656966656e642076617269750073206e657175652e204675736365206175677565206c6f72656d2c2070686100726574726120612073656d2076656c2c20636f6e64696d656e74756d206d61007474697320646f6c6f722e2046757363652073656d706572206e69736c2069006e2075726e612073757363697069742c2065676574207072657469756d206a007573746f20736f6c6c696369747564696e2e0a0a496e7465676572207669740061652072686f6e637573206573742c207175697320626962656e64756d207200697375732e20457469616d206d616c657375616461206175677565206575200074656d70757320636f6e76616c6c69732e205175697371756520717569732000656c697420666575676961742c20756c6c616d636f72706572206e6962682000696e2c206c7563747573206d617373612e2050686173656c6c757320636f6e0076616c6c69732073617069656e2076656c206c616375732074696e63696475006e742c206e656320657569736d6f64206573742070656c6c656e746573717500652e20416c697175616d20706f727461206a7573746f206120756c74726963006965732068656e6472657269742e204d6175726973206c756374757320617500677565206575206c656374757320646170696275732c20757420706f7274610020656c69742070656c6c656e7465737175652e20496e74656765722073656400206d61676e6120757420646f6c6f722074696e636964756e74206672696e6700696c6c61206964206174206475692e204d6f72626920656c656966656e64200072697375732073697420616d6574206d61676e612074656d7075732c20766500686963756c61206c6f626f72746973206f72636920736f6c6c69636974756400696e2e204e616d2065742074656d706f72206d61676e612e204d6f726269200071756973207072657469756d2072697375732c2075742076656e656e61746900732074656c6c75732e204d617572697320706f72746120646f6c6f722065740020636f6e73656374657475722068656e6472657269742e204e616d2070656c006c656e7465737175652065676573746173206f64696f207472697374697175006520677261766964612e2050656c6c656e746573717565206964206665726d00656e74756d206469616d2e20496e20636f6e7365637465747572206d69207600656c206c696265726f20657569736d6f642064696374756d2e20446f6e65630020736167697474697320616e7465206d617373612e205072616573656e7420006163206175677565206e657175652e0a0a536564206d6173736120747572700069732c20636f6e76616c6c69732065676574207665686963756c612065752c0020636f6e64696d656e74756d20736564206d657475732e2053656420636f6e0064696d656e74756d20766f6c7574706174206573742c2076656c2070756c7600696e6172206e69736920736f6c6c696369747564696e206e6f6e2e20496e740065676572207574206d61676e6120657420746f72746f722064696374756d2000636f6e64696d656e74756d20696e20706f727461206573742e20496e207369007420616d65742061756775652065782e204e756e6320766573746962756c75006d206964206c616375732076656c2070756c76696e61722e2050726f696e200070756c76696e6172206d6173736120757420616e7465206d6178696d75732c00207669746165206c7563747573207175616d20656765737461732e204475690073206d6178696d757320616e74652073697420616d6574206d616c65737561006461206469676e697373696d2e204675736365207574206c656f20626c616e006469742c20666163696c69736973206d657475732061742c20636f6e73657100756174206c696265726f2e20437261732076656e656e61746973206e6973690020656765742075726e61206665726d656e74756d2c2061742066696e6962750073207175616d20696163756c69732e20517569737175652076656c206c6f7200656d2065782e2050726f696e206a7573746f2066656c69732c207363656c650072697371756520736564206f64696f2069642c206665756769617420736f6c006c696369747564696e207175616d2e20496e74656765722076617269757320006f7263692073697420616d65742076756c7075746174652068656e647265720069742e204d6f726269206d6178696d75732c2065726f73206e6f6e20636f6e007365717561742066696e696275732c207175616d206e69626820756c6c616d00636f72706572206475692c20616320696e74657264756d2073656d20616e74006520766974616520746f72746f722e204375726162697475722076697461650020706861726574726120656e696d2e20437261732073757363697069742063006f6e677565206c656f2c20696e20736f6c6c696369747564696e206e69736900207472697374697175652061742e20566976616d757320706f72747469746f007220746f72746f7220636f6e64696d656e74756d2c20696163756c6973206c006967756c612075742c207472697374697175652065726f732e0a0a496e20650075206c756374757320616e74652e204d6f726269206d6178696d7573207572006e61206e6f6e206c6967756c6120706f73756572652c206120766f6c757470006174206f7263692073616769747469732e204e616d20617420656c6974206500676574206d692066696e696275732073656d70657220756c747269636573200073656420616e74652e205072616573656e742065752073656d706572206f720063692e204e616d2071756973206469616d206e65632065737420656666696300697475722073656d7065722e204d6f7262692073697420616d6574206f6469006f2070656c6c656e746573717565206e69736c20626c616e64697420736f6400616c65732e20447569732067726176696461206964206c6f72656d2065752000616c69717565742e205365642065726f73207475727069732c207375736369007069742073697420616d657420736f64616c6573207365642c20666163696c0069736973206574206573742e204f72636920766172697573206e61746f717500652070656e617469627573206574206d61676e697320646973207061727475007269656e74206d6f6e7465732c206e61736365747572207269646963756c750073206d75732e20566976616d75732073656d7065722074656d706f7220766100726975732e20416c697175616d20696420616c697175616d206469616d2e0a000a416c697175616d20746f72746f72206573742c206c7563747573206575200075726e6120717569732c2074656d7075732068656e6472657269742061726300752e20566573746962756c756d2073697420616d657420656c656d656e7475006d206c656f2e2053757370656e64697373652071756973206e756e632061200073617069656e2068656e64726572697420696d706572646965742e205365640020696e2065676573746173206c696265726f2e20446f6e656320636f6e677500652073697420616d6574206e65717565206461706962757320657569736d6f00642e204675736365207363656c657269737175652076656c20707572757320006964207363656c657269737175652e2050726f696e2076656c20706f7274740069746f72206e69736c2e0a0a4d6f726269206964206475692065676574207400757270697320696163756c697320636f6e6775652e204e756c6c616d2061750063746f722c206c6967756c61206567657420636f6d6d6f646f20707265746900756d2c206c696265726f206e756c6c6120756c74726963696573206f64696f002c2075742072757472756d2061726375206172637520696e206e6973692e20004d61757269732065676574206c6163757320696e20657820766172697573200073616769747469732073656420696e20656c69742e204d6175726973206d6f006c6573746965206f64696f206574206f72636920706861726574726120706c006163657261742e20496e746567657220696e20747572706973206567657420006c696265726f20636f6e7365637465747572206c6f626f7274697320657520006e6f6e206c616375732e204d616563656e61732064696374756d206c656f200074656d707573206c61637573206d617474697320736f64616c65732e20446f006e6563206a7573746f206f64696f2c2074696e636964756e7420616320617200637520656765742c20666175636962757320706f737565726520646f6c6f72002e205072616573656e742065676574206e756e63206e65632066656c69732000696e74657264756d2072686f6e6375732e20566573746962756c756d20656c00656d656e74756d206461706962757320636f6e73656374657475722e205375007370656e6469737365206964206e756e63206d61747469732c206c756374750073206e6962682073697420616d65742c20636f6e64696d656e74756d206578002e20496e7465676572206f726e6172652075726e61207669746165206e69730069206c7563747573206469676e697373696d2e2041656e65616e2074696e63006964756e742068656e647265726974207269737573206e6f6e20616363756d0073616e2e204e756c6c6120617420736f64616c6573206e69736c2e20496e7400656765722068656e647265726974207669746165206d61676e61207669746100652073757363697069742e20437261732064617069627573206c65637475730020736564206c656f207363656c657269737175652073656d7065722e204d6100757269732061207269737573206e756c6c612e0a0a53656420696163756c6900732c206c656f20757420766573746962756c756d206672696e67696c6c612c002066656c69732073617069656e20636f6e76616c6c6973206c65637475732c002076656c206c616f72656574207175616d206f7263692061206d6175726973002e204e756c6c616d20657520616363756d73616e2073617069656e2e205065006c6c656e746573717565206d617474697320736f64616c6573206d6175726900732c20757420636f6e64696d656e74756d206d61676e6120636f6e677565200076656c2e2041656e65616e20706f72747469746f72206e6973692061632065007261742066617563696275732073757363697069742e2050686173656c6c75007320656c656d656e74756d2074696e636964756e74207175616d206e65632000636f6e64696d656e74756d2e204375726162697475722066696e6962757320006e756c6c612076656c206c6163696e696120696d706572646965742e204d61006563656e61732066657567696174206d617474697320646f6c6f722c206e65006320616363756d73616e20697073756d2074656d706f722075742e205068610073656c6c757320617563746f7220666163696c697369732072757472756d2e0020536564207669746165206d69206e6f6e206f64696f2070656c6c656e7465007371756520626c616e64697420696e2061206d61676e612e0a0a5365642069006e206469616d20636f6e6775652c20636f6d6d6f646f20746f72746f722061002c20657569736d6f64206c6967756c612e20496e2061632065666669636974007572206e756e632c2076656c20756c6c616d636f7270657220697073756d2e0020416c697175616d2076656c206469616d206665726d656e74756d2c20736f006c6c696369747564696e20617263752065742c20656c656d656e74756d207300617069656e2e2043726173206c656f206d657475732c2072686f6e637573200071756973206d617373612065752c206772617669646120696163756c69732000657261742e2043757261626974757220756c7472696365732073697420616d00657420656e696d20757420617563746f722e2041656e65616e20617420617500677565206163206a7573746f2074656d70757320626962656e64756d207365006420696d7065726469657420746f72746f722e204e756c6c616d2073656420006d61757269732073617069656e2e20447569732070656c6c656e746573717500652075726e6120696e2066696e69627573206d6f6c65737469652e20507261006573656e74206e6f6e207072657469756d206d61676e612c206e6563206c610063696e696120746f72746f722e2050726f696e20666175636962757320656c00656d656e74756d206c6f72656d2c2072686f6e6375732076756c7075746174006520657820616c69717565742061632e0a0a416c697175616d2074696e63690064756e7420617263752073617069656e2c20616c697175657420737573636900706974206c656f20656c656d656e74756d2076697461652e2043726173206d00617474697320617263752076656c206f726e617265206665726d656e74756d002e204d6f72626920636f6e76616c6c6973206e697369206d6f6c65737469650020657261742073656d7065722c20736564206c7563747573206e65717565200076756c7075746174652e2053757370656e6469737365206d616c657375616400612c20646f6c6f722076656c20756c74726963657320696d70657264696574002c206d69206e69626820756c74726963696573207475727069732c206e656300207072657469756d206c696265726f20697073756d207669746165207269730075732e20416c697175616d20696e20636f6e677565206c616375732c2066650075676961742076756c7075746174652065726f732e20496e206c616f7265650074206e69626820696e2076756c70757461746520766573746962756c756d2e00205574206661756369627573206f726e617265206e756e632073697420616d00657420656c656966656e642e205072616573656e7420706c616365726174200073617069656e2076656c20656c69742074656d706f7220626962656e64756d002e204e756c6c612071756973207665686963756c6120617263752e205375730070656e646973736520736f64616c6573206c656f2061632075726e6120616c0069717565742076756c7075746174652e20536564206d6f6c6c69732c206c610063757320657520656c656966656e6420736f64616c65732c206d61676e6120006172637520766172697573206c656f2c20657520626c616e6469742066656c006973206572617420657420746f72746f722e205072616573656e742074656d007075732073697420616d6574206d61676e61207669746165206f726e617265002e20416c697175616d20656c656966656e642076656c206f64696f2069642000636f6e7365717561742e204d6175726973206574206e657175652071756973002073617069656e20706f737565726520756c74726963696573206575207369007420616d65742075726e612e20437261732072686f6e6375732065726f73200076656c2073656d2070756c76696e61722066696e696275732061206e6f6e200072697375732e0a0a536564206c6f626f72746973206f64696f207175616d2c00206e6f6e20637572737573206e756c6c6120616c697175616d206e6f6e2e2000446f6e65632061726375206573742c20666163696c6973697320696e2066610075636962757320612c2070686172657472612073697420616d6574206e6973006c2e205175697371756520696163756c6973206c656f206e6f6e20656c656d00656e74756d20706c6163657261742e2053656420766573746962756c756d20006c656f20616e74652c20616320636f6e76616c6c697320647569207361676900747469732069642e20496e206861632068616269746173736520706c61746500612064696374756d73742e20536564206d6f6c657374696520636f6e76616c006c69732066656c69732c20696e2070656c6c656e74657371756520616e74650020696e74657264756d20612e20566976616d757320706c6163657261742065006c656966656e6420616e74652e2050656c6c656e746573717565207369742000616d6574206f64696f207665686963756c612c207361676974746973206573007420656765742c20656c656d656e74756d206c6f72656d2e204d61757269730020656c6974206d61676e612c20636f6e6775652076656c2065726f73206e6500632c20696163756c6973206d616c65737561646120616e74652e2056697661006d757320696e20656666696369747572206f64696f2c207175697320616c69007175616d206e756c6c612e204e756c6c61207574206469676e697373696d20006475692e20496e206567657374617320666163696c69736973206c6f72656d002c206e6f6e20656c656d656e74756d20647569207665686963756c61206e6500632e204e756c6c61206d616c65737561646120706f72747469746f72206578002061206f726e6172652e204e756c6c61206e6f6e20766172697573206f6469006f2e2041656e65616e206e656320696d706572646965742073617069656e2e0020446f6e6563206e69736920617263752c2070756c76696e617220707265740069756d206d616c6573756164612061632c20706f72746120766974616520710075616d2e0a0a437572616269747572206d6f6c65737469652c206d6920696e0074657264756d206c7563747573206375727375732c207269737573207361700069656e206c6f626f72746973206c656f2c206174206566666963697475722000617567756520656c6974207365642074656c6c75732e204e756e6320737573006369706974206c7563747573206e69736c2073697420616d65742062696265006e64756d2e20446f6e6563206e6f6e206375727375732070757275732c20610063206661756369627573206a7573746f2e2050726f696e20617563746f722000766f6c7574706174206e756e632c20696e20747269737469717565206e6973006c20626962656e64756d2061742e2053757370656e64697373652076656e65006e61746973206e756e63206e69736c2c206e65632067726176696461206c69006265726f2074726973746971756520696e2e205175697371756520706c616300657261742061206e69736c20616320706c6163657261742e2041656e65616e0020756c74726963696573206c696265726f20696420697073756d2072686f6e006375732c2073697420616d657420616c697175616d20656e696d206c7563740075732e20447569732076656e656e6174697320646f6c6f722065742074656c006c757320636f6e736571756174206c6f626f727469732e20446f6e65632069006e206469616d20706f73756572652c206665726d656e74756d207269737573002065742c2070756c76696e6172206e657175652e0a0a496e7465676572206e006563206e6962682065752074656c6c7573207072657469756d20696e7465720064756d206174206574206469616d2e204e756c6c612070656c6c656e74657300717565206f64696f20717569732065726f73206567657374617320736f6461006c65732e2043757261626974757220656765742074656d707573206469616d002e2050656c6c656e74657371756520756c747269636965732061726375206500782c206120696d70657264696574206a7573746f20706f7375657265207665006c2e2050726f696e2076756c70757461746520736f64616c6573206d61737300612061742070686172657472612e20496e7465676572206e6f6e206d6173730061207574206c6967756c6120666575676961742074656d7075732e2051756900737175652073616769747469732076656c206e756e6320757420747269737400697175652e2041656e65616e2075742074656d706f72206a7573746f2e2044006f6e656320636f6e677565206e69736c20736564207175616d206d6f6c657300746965206d6f6c6c69732e204e756c6c616d20706c6163657261742c2074750072706973206567657420677261766964612072757472756d2c2066656c6973002076656c697420616c697175616d2065726f732c20696420656c656d656e7400756d206c6967756c612075726e6120696420657261742e204e756c6c61206e0065632072686f6e6375732073656d2e205574206e6563207665686963756c61002065782c2076656c2068656e647265726974206e657175652e20557420706c006163657261742076656c69742076656c2076656c69742068656e647265726900742c207669746165206665726d656e74756d207269737573206d6f6c6573740069652e0a0a4d6175726973206f726369206c65637475732c20696d7065726400696574207365642066696e69627573206e65632c20616c697175616d207665006c206e6962682e20566573746962756c756d206672696e67696c6c612061630063756d73616e206e756e63206574206d6f6c65737469652e205574206574200065726174206a7573746f2e2050656c6c656e74657371756520677261766964006120617263752070757275732e2041656e65616e20696e206e6962682076690074616520617263752064696374756d2074696e636964756e74206964206575002066656c69732e205072616573656e7420657420656c6974206964206d692000636f6e736563746574757220616c697175616d2e20566573746962756c756d0020696e20656e696d2064696374756d2c20626962656e64756d206572617420006e6f6e2c20756c74726963696573206f64696f2e2050656c6c656e7465737100756520636f6e76616c6c6973206f726369206e6973692c206e656320756c7400726963696573206f64696f20706f73756572652073697420616d65742e0a0a004d616563656e61732073697420616d6574206665726d656e74756d206e6973006c2e20566573746962756c756d20616e746520697073756d207072696d69730020696e206661756369627573206f726369206c756374757320657420756c7400726963657320706f737565726520637562696c69612063757261653b20507200616573656e74206174206e756e6320696e206d61676e6120636f6e73657175006174207363656c657269737175652e204d616563656e617320696e20717561006d207574206a7573746f2074696e636964756e7420617563746f722e205068006173656c6c757320757420646f6c6f72206d657475732e20496e2073656d70006572206d6920736564206c6f72656d2070686172657472612072686f6e637500732e204675736365206567657420657374206c616f726565742c20736167690074746973206c696265726f2073697420616d65742c2066657567696174206e006962682e204d6f72626920646170696275732075726e61206163207175616d00206665726d656e74756d2072686f6e6375732e20446f6e656320636f6e7661006c6c697320657569736d6f64206469676e697373696d2e204375726162697400757220757420747269737469717565206c6967756c612e0a0a536564207275007472756d2074696e636964756e74207472697374697175652e204e756e6320006d69207175616d2c20637572737573206574207665686963756c612065676500742c2074696e636964756e74206e6f6e20646f6c6f722e20446f6e65632061007563746f722066696e69627573206f726e6172652e204d6f72626920766568006963756c612c206e69736c2076656c20636f6d6d6f646f20706f7274746974006f722c20646f6c6f72206e756e63207361676974746973206469616d2c2065006765742066617563696275732073617069656e2065782076656c206d61676e00612e204375726162697475722076656c206c6967756c612073697420616d650074206c6967756c6120646170696275732066696e696275732e20457469616d002073697420616d6574206c6f72656d206c65637475732e204e756c6c616d20006665726d656e74756d206e69736c206c696265726f2c207669746165207469006e636964756e74207075727573206c6163696e696120717569732e204d6f72006269207574206d6f6c657374696520697073756d2c206575206d6f6c657374006965206c6967756c612e2050686173656c6c7573206574206c656374757320006a7573746f2e20566976616d7573206578206d61676e612c20636f6e736571007561742076656c206a7573746f2076656c2c2074656d706f7220616c69717500616d20616e74652e205365642066696e6962757320736564206d6173736120007175697320636f6d6d6f646f2e20446f6e656320696e206e696268206e6563002074656c6c757320636f6e677565206469676e697373696d206567657420760069746165206e756c6c612e204475697320656c656966656e6420706c61636500726174207269737573206120706c6163657261742e204d6175726973206e650063206c65637475732068656e6472657269742c207361676974746973207665006c697420636f6e64696d656e74756d2c2065676573746173206475692e0a0a004e616d20696163756c69732076656c697420717569732075726e6120706f720074612073616769747469732e2041656e65616e20636f6d6d6f646f206e6973006c206e656320697073756d206c6f626f727469732c20626962656e64756d200065666669636974757220656e696d20636f6e64696d656e74756d2e2050726f00696e206172637520656c69742c206665726d656e74756d2075742065676573007461732061742c206c616f726565742076656c206e69736c2e20496e74656700657220626962656e64756d20747572706973207574206469616d206665726d00656e74756d2c2065752074656d707573206c656f206672696e67696c6c612e00204d616563656e61732076656c697420617263752c20636f6e64696d656e7400756d20696d7065726469657420657261742065742c206661756369627573200076756c707574617465206c65637475732e20437572616269747572206d657400757320656e696d2c206672696e67696c6c6120757420666163696c69736973002061632c20616363756d73616e20696e20697073756d2e204e756c6c616d20007665686963756c61206c6163696e6961206d617373612c2076656c20666175006369627573206f64696f20636f6e64696d656e74756d2061742e204d61757200697320706f72747469746f722065726f73206d61676e612c207574206d617800696d75732074656c6c7573206665726d656e74756d2069642e20566976616d007573207574206c6563747573206f726e6172652c20706f72747469746f7220006469616d20656765742c20756c6c616d636f72706572206e6962682e2044750069732076656e656e617469732074656d706f7220657261742c207574207661007269757320657374206c6f626f727469732076656c2e2050686173656c6c75007320736564206578206c65637475732e205365642076656c2073617069656e0020616c697175616d2c20696e74657264756d206475692069642c20656c65690066656e64206f7263692e0a0a5072616573656e74206174206c6f626f7274690073206d657475732e204e616d2074656d707573207175616d206475692c206e006563206c7563747573206d617373612074696e636964756e7420612e205065006c6c656e74657371756520616363756d73616e2076656c697420757420617500677565206d617474697320636f6e76616c6c69732e205574206567657374610073206f64696f20656e696d2c206163207669766572726120616e746520636f006e76616c6c69732075742e2041656e65616e20696e2064756920617420717500616d206665726d656e74756d2072757472756d2e20566976616d757320656700657420636f6e76616c6c6973206c65637475732e20457469616d2065756973006d6f64206672696e67696c6c6120746f72746f722c206e656320696e7465720064756d206a7573746f206d61747469732065752e204e756c6c616d206d617800696d7573206e696268206469616d2c206575206c6f626f72746973206a757300746f207072657469756d2076697461652e20517569737175652074696e63690064756e7420646f6c6f722061742075726e6120636f6e64696d656e74756d2c00207669746165206d616c6573756164612065737420706f72747469746f722e002050656c6c656e746573717565207669746165206475692065782e2056697600616d757320766f6c757470617420697073756d207574207475727069732065006c656d656e74756d20706f7274612e20496e74657264756d206574206d616c006573756164612066616d657320616320616e746520697073756d207072696d00697320696e2066617563696275732e204d6175726973207365642066656c690073206e756c6c612e205072616573656e742076656c2072697375732076656c0069742e0a0a446f6e656320706f727461206174206469616d2073656d7065720020616c69717565742e2041656e65616e20637572737573206c6f72656d206e006f6e2076617269757320636f6d6d6f646f2e20536564206e65717565206572006f732c20656666696369747572206e6563206469616d20696e2c20747269730074697175652076697665727261206469616d2e2053757370656e64697373650020746f72746f72206475692c20657569736d6f64206e6563206e756c6c61200061632c20616c697175657420756c74726963696573206c6f72656d2e205068006173656c6c757320636f6e7365637465747572206575206573742061632065006765737461732e204e756e6320757420656c697420696e2070757275732061006363756d73616e20657569736d6f642e2043726173206c656f206f7263692c0020677261766964612076656c20626962656e64756d20656765742c20636f6e0076616c6c697320696e2072697375732e20467573636520656765742073656d007065722073617069656e2e0a0a536564206d6f6c657374696520706c61636500726174206c6967756c61206e656320766976657272612e20496e2061742065006666696369747572206d61676e612e204e616d2066696e69627573206c6f7200656d20657420726973757320756c747269636965732c2076656c2063757273007573206e65717565207363656c657269737175652e20496e74657264756d20006574206d616c6573756164612066616d657320616320616e74652069707375006d207072696d697320696e2066617563696275732e2053656420696e2065670065737461732065726f732e2041656e65616e2074656d706f722c206e6962680020636f6d6d6f646f20626962656e64756d206c75637475732c2076656c697400206e756e6320696e74657264756d206f7263692c2073697420616d6574207400656d707573206c656f2070757275732076697461652072697375732e2045740069616d207669746165207269737573206e6962682e20566573746962756c75006d206d6f6c65737469652063757273757320616e74652c2065676574206c610063696e6961206c656f206d6f6c65737469652076656c2e0a0a53757370656e00646973736520757420677261766964612073617069656e2e2056657374696200756c756d20616363756d73616e206e756e6320696e2064617069627573207300656d7065722e204e756e632076656c2073656d706572207175616d2e205065006c6c656e746573717565206861626974616e74206d6f72626920747269737400697175652073656e6563747573206574206e65747573206574206d616c657300756164612066616d65732061632074757270697320656765737461732e20460075736365206d6f6c6573746965206672696e67696c6c61206c6f72656d2c20007175697320747269737469717565206d61676e6120756c6c616d636f72706500722073697420616d65742e20437572616269747572207669746165206c6f7200656d207574206a7573746f206c616f72656574207665686963756c61206174002061206469616d2e2053757370656e646973736520616c697175657420636f006e73656374657475722065782c20757420636f6e7365637465747572206e650071756520636f6e7365637465747572206e65632e20496e74656765722076690074616520636f6e64696d656e74756d20746f72746f722e204e756e6320736500642073757363697069742073617069656e2e2050686173656c6c757320656c00656d656e74756d20657569736d6f642076656c69742c2065676574206469630074756d20646f6c6f7220756c6c616d636f727065722065752e0a0a5068617300656c6c75732061742064756920697073756d2e204e756e63206c75637475730020617563746f72206e69736c20657520617563746f722e20446f6e65632063006f6e76616c6c69732061726375206c6163696e6961206578207361676974740069732c20736564206f726e61726520616e7465206f726e6172652e204e616d002074696e636964756e74206a7573746f207475727069732c20736564206d61007474697320616e746520736f6c6c696369747564696e207365642e2053656400206f726e61726520697073756d206e6962682c2061632074656d706f72206d0061676e612076617269757320696e2e204e616d206672696e67696c6c61206d0061676e61206d692c2075742065676573746173206c6f72656d207661726975007320696e2e20536564206575206c75637475732073617069656e2e20496e7400656765722076656c206469676e697373696d20656c69742c20617420706c61006365726174207475727069732e20446f6e656320696e206e69626820696420006a7573746f206c6f626f727469732064696374756d2e20446f6e656320706800617265747261206f726369206e656320636f6e76616c6c697320736f6c6c69006369747564696e2e0a0a50656c6c656e7465737175652073697420616d657400206672696e67696c6c612073656d2c20616320737573636970697420656c6900742e20446f6e656320612074726973746971756520697073756d2c206e6f6e0020756c7472696365732065726f732e205072616573656e7420616c69717561006d20697073756d206567657420626962656e64756d20766f6c75747061742e0020447569732073697420616d6574206469616d20626962656e64756d2c2061007563746f72206e69736920656765742c206d6f6c6c697320746f72746f722e00204d61757269732065742076656c69742075726e612e2055742066656c697300206c65637475732c207072657469756d207365642074656d707573207369740020616d65742c206d6f6c6c6973207669746165206c65637475732e204d6175007269732073697420616d6574206f7263692065752074656c6c75732066616300696c697369732074696e636964756e742e20447569732068656e647265726900742066656c69732061206e6571756520617563746f7220636f6e6775652e20004d6f726269206c6967756c61206573742c2070656c6c656e746573717565200076656c2073616769747469732065742c20666175636962757320656765742000656e696d2e0a0a517569737175652064696374756d206e6973692069642073006f6c6c696369747564696e207072657469756d2e20496e74657264756d20650074206d616c6573756164612066616d657320616320616e746520697073756d00207072696d697320696e2066617563696275732e2053757370656e646973730065207665686963756c612076656e656e617469732072697375732c20617420007665686963756c61206c616375732072757472756d206e6f6e2e2050656c6c00656e746573717565206861626974616e74206d6f72626920747269737469710075652073656e6563747573206574206e65747573206574206d616c657375610064612066616d65732061632074757270697320656765737461732e20496e20007075727573206d617373612c206d6f6c657374696520696e206e6962682061002c2076656e656e6174697320626c616e64697420656c69742e205068617365006c6c75732073617069656e206469616d2c2074696e636964756e7420736f6400616c6573206469616d2076697461652c20636f6e67756520736167697474690073206f64696f2e2043757261626974757220657569736d6f64206e65632061006e746520736564207072657469756d2e2050656c6c656e746573717565206d006f6c65737469652076617269757320656e696d2c206e6f6e20666175636962007573206c656f2073616769747469732061632e20437572616269747572207100756973206d61757269732071756973206c6967756c6120756c6c616d636f7200706572206d616c65737561646120736564206575206c65637475732e0a0a5300757370656e64697373652076656c206d61676e61206469676e697373696d2c002064696374756d206e657175652073757363697069742c20626962656e6475006d206c616375732e205175697371756520717569732066656c69732061726300752e2050686173656c6c75732065726174206c656f2c2073656d7065722061007420646f6c6f7220656765742c2076656e656e617469732072686f6e637573002065782e2043726173206d6f6c6c6973206e696268207365642061756775650020736f64616c65732c2073697420616d6574206d6f6c6c6973207075727573002070686172657472612e2043726173206e6563206d692071756973206c656f0020696d7065726469657420616363756d73616e207574206964207175616d2e00204e616d206e69736c20656c69742c206f726e61726520657520756c747269006365732076697461652c20706f72747469746f72206574206c6967756c612e002050656c6c656e746573717565207665686963756c6120656c69742065742000697073756d20636f6e7365717561742c206e6563206d6f6c6c6973206573740020696e74657264756d2e2055742074656d706f7220637572737573206d6f6c0065737469652e204d61757269732074696e636964756e7420616363756d7361006e206e756e6320696420696d706572646965742e20457469616d206d616c650073756164612c206e6973692061632076756c70757461746520696163756c6900732c206e697369206f72636920706c616365726174206e756c6c612c206e6500632074696e636964756e742074656c6c757320656c69742071756973207572006e612e20457469616d206c61637573206d617373612c2068656e6472657269007420757420636f6d6d6f646f20612c20696e74657264756d206964206e6973006c2e20496e746567657220766974616520616e7465206672696e67696c6c6100206d692074696e636964756e7420636f6e73656374657475722e204e756c6c006120636f6e7365637465747572206f726e61726520626962656e64756d2e0a000a55742073697420616d657420657569736d6f642074656c6c75732e205065006c6c656e746573717565207072657469756d2074696e636964756e7420647500692065752073656d7065722e205365642076656c2065726f73206e6f6e2064006f6c6f7220696163756c697320696e74657264756d20736564207175697320006f7263692e20496e2073656d706572206c6f626f72746973206469676e69730073696d2e2053656420666175636962757320666575676961742070656c6c65006e7465737175652e2050656c6c656e74657371756520736f6c6c69636974750064696e206f64696f20736564206c65637475732073616769747469732c206e006f6e20756c7472696369657320697073756d2072757472756d2e205365642000736564206f726e6172652065782e0a0a5072616573656e7420766974616520006d6f6c6573746965207175616d2c20616320626c616e646974206f64696f2e0020457469616d2065676573746173206375727375732075726e612069642065007569736d6f642e204e616d20616c69717565742061726375206575206c756300747573206c616f726565742e20457469616d20696d7065726469657420717500616d2076656c20636f6e73657175617420626c616e6469742e204d61757269007320696e74657264756d2c206469616d20766172697573206c6163696e69610020616c69717565742c2076656c69742074656c6c757320706861726574726100206a7573746f2c20656765742073757363697069742075726e61206e756c6c00612071756973206c656f2e204e756c6c61206578206e69736c2c2066617563006962757320617420626c616e6469742061632c2063757273757320612069700073756d2e20566976616d75732071756973206469616d20636f6e6775652c2000657569736d6f642075726e612073697420616d65742c206672696e67696c6c006120646f6c6f722e204e616d206e6f6e206e756c6c6120636f6e677565206c00696265726f2074656d706f7220756c747269636965732e2050656c6c656e740065737175652070756c76696e61722073617069656e207669746165206e756e0063207363656c65726973717565206672696e67696c6c612e204675736365200068656e647265726974206566666963697475722066617563696275732e2041006c697175616d2070757275732061756775652c206c7563747573206e6f6e2000636f6e76616c6c697320717569732c206d6178696d7573206e6f6e20647569002e0a0a446f6e65632070656c6c656e74657371756520657261742065752065007374206c6163696e696120616363756d73616e2e2050726f696e206d6f6c6c0069732073656d20646f6c6f722c206964206d6f6c6c6973206c656374757320007669766572726120696e2e204e756e632071756973206d6173736120766172006975732c206665726d656e74756d206c656f2076697461652c206c6f626f7200746973206e657175652e205175697371756520756c6c616d636f7270657220006a7573746f20766974616520636f6e67756520656c656966656e642e2045740069616d206574206c61637573206573742e20496e7465676572207475727069007320617263752c20616363756d73616e2076656c20697073756d2065676574002c206d616c65737561646120756c6c616d636f72706572206a7573746f2e20004d6175726973206e6f6e2065782074696e636964756e742c20756c74726963006573206c616375732061742c20626c616e646974206f64696f2e2056657374006962756c756d2067726176696461206e65632073617069656e206e656320640069676e697373696d2e2053757370656e64697373652074656d706f7220696e00206e69736c2076656c206d6f6c6c69732e204d616563656e6173206772617600696461206c616375732074656c6c75732c20657420756c7472696369657320006e756c6c612074696e636964756e7420612e20416c697175616d20657261740020766f6c75747061742e20446f6e65632065726f73206c65637475732c20640069676e697373696d2069642073617069656e2061742c20706c6163657261740020666163696c697369732070757275732e20566976616d757320707265746900756d2c206d69206120756c6c616d636f727065722074696e636964756e742c00206475692074656c6c757320626c616e646974206d617373612c206e6563200066696e6962757320657374206e69736c2071756973206e6962682e2046757300636520646170696275732064756920696e20636f6e73656374657475722070006c6163657261742e20467573636520736f6c6c696369747564696e20656765007374617320657261742c2073697420616d657420616363756d73616e206c65006f2074696e636964756e7420696e2e204d6f7262692065666669636974757200206d61757269732069642064696374756d20666163696c697369732e0a0a5500742075726e61206d61676e612c20706f72747469746f722061632065666669006369747572206e6f6e2c20656666696369747572206174206d617373612e200041656e65616e2073656420656c6974206e6f6e2065782073757363697069740020616363756d73616e2e20416c697175616d207669746165206c656f207361006769747469732c2067726176696461206c6967756c612065742c2070756c7600696e617220646f6c6f722e20457469616d20616320746f72746f72206c6f7200656d2e2050686173656c6c7573206567657374617320696163756c69732067007261766964612e204e756e63206e6f6e206e756e63206e6962682e2056697600616d757320766974616520617563746f722073617069656e2e20437261732000706f7375657265206e756c6c61206f64696f2c20657520706f727461206578002076656e656e6174697320612e204e616d207269737573206e657175652c2000657569736d6f642075742063757273757320656765742c2066617563696275007320736f6c6c696369747564696e20746f72746f722e2043757261626974750072207574206d65747573206e6f6e206469616d20617563746f722074696e63006964756e742e20496e7465676572206d616c65737561646120707265746975006d2076656e656e617469732e20566976616d75732072686f6e637573207469006e636964756e74206c6f72656d207175697320756c747269636965732e205000686173656c6c7573206f726e6172652065726f732065742068656e6472657200697420636f6d6d6f646f2e0a0a43757261626974757220696163756c69732000636f6e7365717561742073656d20717569732070656c6c656e746573717565002e2050726f696e206d617474697320656e696d20696e2065737420736167690074746973207661726975732e204d6f726269206e65632074696e636964756e00742076656c69742c206575206469676e697373696d20657261742e20416c69007175616d206572617420766f6c75747061742e205072616573656e74206669006e696275732074656c6c757320696e2068656e6472657269742076657374690062756c756d2e20437572616269747572206d6f6c6c69732074656c6c757320006d692c206e6563206d616c6573756164612076656c6974207375736369706900742061742e205365642065726174206e657175652c2072757472756d2073650064206665726d656e74756d2076656c2c2070656c6c656e746573717565206e006f6e20616e74652e204e616d20736f64616c65732070756c76696e6172206c006f72656d2c2065742074696e636964756e74206d61737361206469676e69730073696d2061632e20457469616d206d61737361207175616d2c20766f6c757400706174206574206c6f626f727469732073697420616d65742c2076656e656e006174697320696420656e696d2e0a0a446f6e656320706f727461206e69736c0020657520697073756d20706f72747469746f722c20656765742070756c7669006e6172206c6f72656d206d6178696d75732e205574206163206e6571756520006c6f72656d2e204e756c6c612061206c6f72656d2065676574206c656f206d006f6c6c6973206469676e697373696d2e20566573746962756c756d20696d70006572646965742073656d706572206c65637475732e204e756c6c6120657420006469616d206574206e756c6c61206f726e61726520736f6c6c69636974756400696e2e2050726f696e206120746f72746f7220636f6d6d6f646f2c20766568006963756c61206a7573746f2061742c2074696e636964756e74207361706965006e2e2043757261626974757220657569736d6f642076697665727261207268006f6e6375732e204e756e6320766172697573206f726369206e6563206d617300736120766976657272612c2065676574206c7563747573206c616375732075006c7472696365732e204375726162697475722063757273757320656c69742000646f6c6f722e20467573636520616c6971756574206f726e6172652065726f00732c20612067726176696461206578206d616c6573756164612076656c2e20004e616d206163206d61676e6120636f6e7365717561742c2076617269757320006d61757269732065752c206665726d656e74756d206c696265726f2e0a0a500072616573656e7420657420646f6c6f722074656d706f72206475692074696e00636964756e742064696374756d2e2050656c6c656e746573717565206d617800696d757320697073756d20657520656765737461732074656d7075732e2046007573636520616c697175616d20696d7065726469657420616e74652065742000626c616e6469742e204d61757269732068656e647265726974206c6f626f7200746973206c616f726565742e2041656e65616e20706f72746120766f6c75740070617420697073756d2c206120736f6c6c696369747564696e20617263752000756c6c616d636f72706572206e6f6e2e205365642076617269757320706c6100636572617420656e696d206575207072657469756d2e20496e206a7573746f0020617263752c20656c656d656e74756d20757420616c69717565742065752c00206c616f72656574206964206c656f2e20496e7465676572207365642061720063752061206469616d206c75637475732072686f6e6375732e20557420656700657420636f6e677565206d657475732c2069642072757472756d206c6563740075732e0a0a4d6f726269207665686963756c6120616363756d73616e206e6900736c2c20617420706f727461206c616375732066617563696275732065676500742e2053757370656e64697373652076756c707574617465206d69206e6f6e0020766f6c757470617420666575676961742e2051756973717565206469637400756d20706f72747469746f72206f64696f2073697420616d657420636f6e670075652e2041656e65616e20657569736d6f64207072657469756d20656c69740020706f72747469746f722066696e696275732e204d616563656e617320736500642076756c7075746174652072697375732e2041656e65616e2065726f732000656e696d2c2076656e656e6174697320696420636f6e73657175617420612c002072686f6e637573206f726e6172652073656d2e20517569737175652062690062656e64756d20766f6c757470617420616e74652c20616320706f7375657200652073617069656e207375736369706974206566666963697475722e204e75006c6c61206f726e617265206e696268206163206d61757269732076756c707500746174652c206e6f6e207068617265747261206469616d2076697665727261002e20436c61737320617074656e742074616369746920736f63696f73717520006164206c69746f726120746f727175656e742070657220636f6e7562696120006e6f737472612c2070657220696e636570746f732068696d656e61656f732e002050726f696e20617420766573746962756c756d2076656c69742e205365640020766976657272612076656e656e61746973206d692c207574206d616c65730075616461206e756c6c612e2044756973207068617265747261206964206e6900626820617420636f6e6775652e20536564206c6163696e69612065726f73200061206572617420766976657272612c20612074696e636964756e742061756700756520616363756d73616e2e2050656c6c656e746573717565206c6f626f720074697320616363756d73616e2073656d2c2065676574206d616c65737561640061206e756c6c61206665726d656e74756d2073697420616d65742e20496e2000616363756d73616e206c616f72656574206e69736c2076697461652066657500676961742e20416c697175616d206572617420766f6c75747061742e0a0a440075697320696420616e7465206c6967756c612e2050686173656c6c75732073006167697474697320706c61636572617420706f73756572652e204d61656365006e61732076697461652076697665727261206c616375732c206d6f6c6c697300206d616c657375616461206c65637475732e2050656c6c656e7465737175650020696e20657374206c6163696e69612c20656c656d656e74756d206e756e630020656765742c2070656c6c656e746573717565206a7573746f2e20517569730071756520636f6e67756520747572706973206e6f6e206f64696f20626c616e00646974207361676974746973206772617669646120657420697073756d2e20004e756c6c616d206c6f626f72746973206e6571756520616320656c69742063006f6e76616c6c697320616363756d73616e2073697420616d65742070756c7600696e6172206d617373612e20446f6e656320657520636f6d6d6f646f20616e0074652c2073697420616d657420756c6c616d636f7270657220646f6c6f722e002044756973206d6175726973206c6967756c612c20656c656d656e74756d200061742066617563696275732061632c20616c697175616d20696e2066656c6900732e205072616573656e74206c6f626f727469732065782073697420616d650074206e69736c20756c74726963696573206c6163696e69612e20566976616d00757320617563746f722c2073656d207175697320766573746962756c756d20007363656c657269737175652c2073617069656e206e69736c2072757472756d00206c696265726f2c2073697420616d657420696e74657264756d206e69736c00206a7573746f207669746165206c65637475732e20566976616d757320696d0070657264696574206e756c6c6120657520657261742076656e656e61746973002c20736564206d6f6c657374696520646f6c6f72207665686963756c612e2000517569737175652076656c2061726375207365642073656d2073656d70657200206375727375732e2050656c6c656e746573717565206d617474697320656c00656966656e64207269737573206574206d6f6c6c69732e205574206c6f626f00727469732c2065737420736564206665726d656e74756d2073656d7065722c002075726e612072697375732064617069627573206475692c20612074656d70007573206d6175726973206e69736c206174206469616d2e20566976616d757300206469676e697373696d20666163696c6973697320636f6e7365637465747500722e20496e20706f737565726520736f6c6c696369747564696e20656c656d00656e74756d2e0a0a457469616d20697073756d206573742c206d616c65737500616461206120666575676961742073697420616d65742c206d6f6c65737469006520656765742066656c69732e2041656e65616e2074656d70757320667269006e67696c6c61206469616d20696e20616c697175616d2e20446f6e6563207300697420616d65742072757472756d206469616d2e2050686173656c6c75732000756c6c616d636f72706572206d617474697320616363756d73616e2e205375007370656e646973736520616c6971756574207669746165206e6973692061630020766f6c75747061742e2050726f696e207075727573206d61757269732c2000696d706572646965742073697420616d657420647569206e6f6e2c20766568006963756c6120637572737573206f7263692e20446f6e65632065742074656c006c7573206574206d6574757320766573746962756c756d20656c656d656e7400756d206163206d6f6c6c6973206a7573746f2e2050656c6c656e74657371750065206c6967756c61206e69736c2c20616c697175616d206163206c6967756c006120706f73756572652c20656c656d656e74756d2068656e64726572697420006d61757269732e204d617572697320666163696c697369732066656c69732000696e2072757472756d20696163756c69732e204e756e632066657567696174002073656d20612068656e6472657269742072757472756d2e20496e746567650072206d6f6c65737469652064696374756d2066696e696275732e2041656e6500616e206e656320766f6c7574706174206c6967756c612e205175697371756500206d617373612070757275732c20706861726574726120757420696163756c006973207365642c20706f72747469746f7220616320616e74652e20416c69710075616d206d6173736120656e696d2c2076756c707574617465206e6563206d00692069642c20756c6c616d636f72706572206665756769617420747572706900732e0a0a4e756e63207669766572726120647569206c6f72656d2c207369740020616d657420656666696369747572206d65747573207375736369706974200076656c2e20566573746962756c756d2073697420616d657420706f7274746900746f722065782e205574206d616c657375616461206c6563747573206e656300206d65747573206672696e67696c6c612c206e65632073656d706572207572006e61206d616c6573756164612e20557420756c6c616d636f72706572206e69007369206174206e69736c20696d706572646965742070756c76696e61722e2000566573746962756c756d2065726f7320646f6c6f722c20766f6c757470617400206964206f64696f2069642c2074656d70757320636f6e76616c6c6973207200697375732e2043726173206575206661756369627573206c696265726f2e200050656c6c656e74657371756520696163756c697320766573746962756c756d0020646f6c6f72206964206566666963697475722e2046757363652061206e75006e6320717569732075726e61206469676e697373696d20646170696275732e002050726f696e2076656c20696163756c69732073656d2c20617420636f6e7600616c6c6973206475692e20496e2069642066656c69732074656c6c75732e2000446f6e6563207068617265747261206d6f6c657374696520617263752c206100206d616c6573756164612065737420677261766964612069642e0a0a517569007371756520616c6971756574206c6967756c61207574206f72636920706f7300756572652c207365642074696e636964756e74206d61676e6120756c74726900636965732e204d616563656e61732073697420616d657420756c6c616d636f0072706572207475727069732e20536564206e6563206d6f6c657374696520710075616d2e20566976616d7573206d617474697320636f6e64696d656e74756d00206f7263692c206e6f6e206375727375732066656c69732074656d707573200065752e2053656420656765742072697375732075726e612e20566976616d750073206f726e61726520756c6c616d636f72706572206172637520616320616c0069717565742e205072616573656e74206d616c6573756164612070756c7669006e6172206c65637475732c2073697420616d65742064696374756d20726973007573206d616c6573756164612061742e204e756c6c612061206d616c65737500616461206c65637475732c2065676573746173206d616c657375616461206600656c69732e20496e20696420696e74657264756d206e756e632e20496e74650067657220666163696c69736973206469676e697373696d20616e74652071750069732070686172657472612e0a0a446f6e65632070656c6c656e7465737175006520656e696d20766974616520616e746520756c7472696365732c2061742000657569736d6f64206d617373612066696e696275732e20517569737175652000636f6e67756520756c7472696369657320706f72747469746f722e204375720061626974757220756c7472696369657320626c616e64697420637572737573002e204675736365206567657420647569206375727375732c2070686172657400726120617263752076656c2c20706c6163657261742070757275732e204372006173206e6563206d6175726973206c656f2e204e616d207072657469756d20007072657469756d20766f6c75747061742e2050686173656c6c7573206e65710075652074656c6c75732c206672696e67696c6c612073697420616d65742066006163696c6973697320717569732c20616363756d73616e207363656c65726900737175652073656d2e204e756e632076697461652066656c69732073656420006d6173736120756c747269636965732064617069627573206e6f6e2065752000656e696d2e20496e20706f72747469746f722074656d706f72206e69736c2c00206567657420666163696c697369732075726e612066696e69627573207669007461652e205365642070656c6c656e746573717565206e656320747572706900732075742073656d7065722e205072616573656e74206566666963697475720020656c656966656e64206f64696f2e0a0a4e756c6c6120617563746f722063006f6e64696d656e74756d206e756c6c612e204d616563656e6173206d616c65007375616461206d61757269732061206c6967756c6120756c7472696365732000636f6d6d6f646f2065742076656c206469616d2e2053757370656e64697373006520696e74657264756d2074696e636964756e74206c6967756c612c20612000626962656e64756d206d6920696163756c697320612e20536564206d616c65007375616461206d657475732076656c206c696265726f206469676e69737369006d2c2073697420616d657420636f6e677565207175616d2074696e63696475006e742e204375726162697475722066696e696275732074696e636964756e74002073616769747469732e20517569737175652073617069656e20656e696d2c0020736f64616c6573206163206469616d20612c206469676e697373696d206c006163696e69612074656c6c75732e20446f6e65632065666669636974757220006c616375732072686f6e637573206672696e67696c6c6120636f6d6d6f646f002e20496e20696420656c69742076656c206c6f72656d20736167697474697300206f726e6172652e204372617320757420646f6c6f72206c6967756c612e200053656420656c656966656e64206c6563747573207661726975732066696e69006275732072757472756d2e204675736365206e65632061756775652061206a007573746f207661726975732074656d706f7220736564207669746165206c6f0072656d2e204d6175726973206174206c696265726f20696e2065737420637500727375732064696374756d2075742076697461652065726f732e205068617300656c6c75732072757472756d2c206c656374757320766974616520696e7465007264756d20626c616e6469742c206c6f72656d2075726e61207669766572720061206d617373612c2071756973207363656c657269737175652066656c697300206c6563747573206574206f64696f2e204d617572697320666163696c6973006973206c656f207475727069732c20696d70657264696574206665756769610074206475692074656d706f722073697420616d65742e0a0a4d616563656e6100732061206c656f2061756775652e20437572616269747572206e6f6e2069700073756d2073697420616d657420656c6974206c616f726565742076656e656e00617469732065676574206e6f6e206d61676e612e204375726162697475722000616c697175616d20696163756c697320706f72747469746f722e2053656420006163206c6f72656d206120646f6c6f7220616c6971756574206c7563747573002e2050726f696e206c6163696e696120697073756d20616e74652c207369740020616d657420696d70657264696574206c6563747573206469676e69737369006d20656765742e20566573746962756c756d20656666696369747572207369007420616d65742073656d207175697320736f64616c65732e20566976616d7500732070756c76696e6172207068617265747261206e69736c2076697461652000616363756d73616e2e204475697320696e74657264756d20636f6e67756520007661726975732e20446f6e65632061207361676974746973206e6973692c20007175697320656c656d656e74756d206475692e20536564206c756374757320006c616f72656574206c656f206567657420756c7472696365732e0a0a446f6e006563206120617567756520656765737461732c2076756c70757461746520650073742076656c2c206c616f72656574206c616375732e20416c697175616d2000646f6c6f7220646f6c6f722c20706c61636572617420696e2065676573746100732073697420616d65742c20616c69717565742061206f7263692e20496e200076756c70757461746520626c616e64697420656c69742c2068656e6472657200697420636f6d6d6f646f2075726e6120626962656e64756d2065752e2045740069616d20617567756520616e74652c206d6f6c65737469652071756973206f0064696f2065752c2074656d70757320636f6d6d6f646f206e6962682e20557400206d6174746973206c6163696e69612073617069656e2075742064617069620075732e20457469616d20636f6e736571756174206e6f6e206f64696f207175006973206375727375732e204e756e6320616c697175657420626962656e6475006d20646f6c6f722065752073656d7065722e20566976616d7573206163206d00692073697420616d65742061726375206c6163696e69612072757472756d200073697420616d65742061206e756c6c612e2050686173656c6c75732065726100742072697375732c206c75637475732065676574206c6f72656d207669746100652c206d616c65737561646120626962656e64756d206d657475732e204e61006d206964206d617474697320656e696d2c206665756769617420736167697400746973206d657475732e2050686173656c6c7573206c7563747573207475720070697320657261742c20657420766172697573206d61676e612072686f6e630075732069642e0a0a4372617320766172697573207361676974746973206f6400696f20757420677261766964612e20536564206f726e61726520706f727461002076756c7075746174652e20496e746567657220706f7375657265206172630075206c6f72656d2c206964207363656c657269737175652073656d206566660069636974757220612e205365642076656c20617563746f7220697073756d2e002050656c6c656e7465737175652069642065726f73206574206c6f72656d2000616363756d73616e20616363756d73616e206567657420717569732065726f00732e204e756e632063757273757320636f6e64696d656e74756d206d692c20006e65632066617563696275732070757275732070756c76696e6172207068610072657472612e205365642073656420736f64616c6573206e756e632e204675007363652070756c76696e617220756c747269636573206d692c206964207275007472756d206d69206672696e67696c6c612061632e2053656420697073756d00207175616d2c20756c74726963696573207669746165206c6163696e6961200076697461652c206665726d656e74756d206e6f6e206d61757269732e20507200616573656e74206461706962757320756c6c616d636f72706572206c696775006c612c206567657420756c6c616d636f727065722073656d2064617069627500732065752e2046757363652073697420616d657420766573746962756c756d00206c616375732e205072616573656e74207365642074726973746971756520006c616375732c2076656c2070756c76696e6172206573742e0a0a467573636500206e6563206e6571756520646f6c6f722e20566573746962756c756d20616c00697175616d206c6967756c612075742064696374756d2073656d7065722e2000457469616d206d616c657375616461206d65747573206567657420656c69740020636f6e64696d656e74756d20636f6e7365717561742e2053757370656e64006973736520736167697474697320656e696d207175616d2c20696e20756c7400726963696573206c656f206461706962757320717569732e2050656c6c656e007465737175652063757273757320766172697573206e6973692c2076656c2000736167697474697320656c6974206d6178696d7573206e6f6e2e205375737000656e646973736520746f72746f72206f64696f2c207068617265747261207600656c206475692061632c20656c656d656e74756d2076756c707574617465200074656c6c75732e20416c697175616d20696420666163696c69736973206578002e2044756973206e6563206672696e67696c6c61206e69736c2e2046757363006520736564206672696e67696c6c612065782e204675736365207574206d610075726973206574207175616d207669766572726120696e74657264756d2061002061742065726f732e20416c697175616d20616363756d73616e2065726174002075742074656c6c7573206469676e697373696d20696163756c6973207365006420657420746f72746f722e2050726f696e20736564206175677565207369007420616d6574206d657475732072757472756d206772617669646120696e200076656c206e69736c2e20496e746567657220706f73756572652061726375200069642065726f73206665726d656e74756d2074656d706f722e0a0a55742075006c74726963657320697073756d206f7263692e204d61757269732061756374006f72206d6178696d75732072697375732c20717569732066696e6962757320006e756c6c612065666669636974757220696e2e204e616d20756c74726963650073206e6571756520616320657820666163696c697369732c20696e2074656d00707573206c6967756c61206c6f626f727469732e204372617320706861726500747261206c6f72656d20696e74657264756d206e657175652068656e6472650072697420617563746f722e2050686173656c6c7573206e6f6e207275747275006d206c696265726f2c20617420736f64616c657320697073756d2e20496e2000756c6c616d636f72706572206578206c65637475732c2073697420616d657400207068617265747261206e756c6c6120636f6e76616c6c69732072686f6e630075732e2053757370656e6469737365206e6f6e20656c6974206c6f72656d2e00205072616573656e7420756c6c616d636f72706572206e756c6c612076656c0020637572737573206469676e697373696d2e2041656e65616e20736f64616c00657320746f72746f72206f64696f2c20617420656c656966656e64206c696700756c61206469676e697373696d2073697420616d65742e2044756973207665006c20736f6c6c696369747564696e2074656c6c75732e204d616563656e61730020717569732070656c6c656e746573717565206475692e204d6175726973200071756973207361676974746973206e756e632e20447569732072757472756d00206d616c657375616461206c6967756c612065752070756c76696e61722e0a000a41656e65616e206772617669646120706f727461207175616d20736564200070656c6c656e7465737175652e2050656c6c656e7465737175652076657374006962756c756d20626962656e64756d207472697374697175652e2056657374006962756c756d20696e206572617420656e696d2e2050726f696e2065726f7300206f7263692c2072686f6e63757320616320616c697175616d206e6f6e2c20007072657469756d2061206f7263692e20566573746962756c756d2074656d700075732c2076656c6974206d616c657375616461206c6163696e69612064617000696275732c2075726e61206c6f72656d206672696e67696c6c61206d61737300612c20696e206d6178696d757320656e696d20656e696d206574206e69736c002e204e616d207669766572726120636f6e64696d656e74756d206c6967756c006120696e20696d706572646965742e20536564207175697320656c656d656e0074756d206a7573746f2e204e756c6c61206f726e61726520636f6e73656374006574757220656e696d2061742074696e636964756e742e20457469616d207300697420616d6574206c616f7265657420697073756d2e0a0a457469616d2066006163696c697369732065737420706f72747469746f722c2066696e69627573002066656c69732065742c207375736369706974206c65637475732e2041656e0065616e20706c616365726174206567657374617320616c69717565742e204d00617572697320657420656e696d206c65637475732e204d616563656e6173200070656c6c656e746573717565206d6f6c6c6973206d692064696374756d2063006f6e6775652e205072616573656e742076656c2066656c6973206c616f72650065742c20636f6e7365637465747572206e756c6c61206e6f6e2c2066657567006961742074656c6c75732e2053656420616c697175616d2076656c697420730065642073656d20706c616365726174207361676974746973206174207369740020616d6574206c696265726f2e2051756973717565206d6174746973207275007472756d20656e696d2c2073656420656c656d656e74756d2076656c69742e002050686173656c6c7573206e6f6e206c616f72656574206f64696f2e204375007261626974757220656c656966656e64206f64696f2073697420616d65742000756c7472696369657320756c6c616d636f727065722e20496e20656765742000726973757320756c7472696365732c207665686963756c61206c65637475730020696e2c20616c6971756574207475727069732e0a0a50686173656c6c757300206e6f6e206d6574757320617563746f722c20636f6e736563746574757220006e69736c2061742c207361676974746973207175616d2e205072616573656e007420746f72746f722074656c6c75732c2074656d706f72206e6f6e207068610072657472612069642c207661726975732061742070757275732e2053656420006120636f6e64696d656e74756d206e6962682e205072616573656e74206c65006f206e756e632c20756c6c616d636f72706572207665686963756c612076650073746962756c756d2074696e636964756e742c206665726d656e74756d2075007420616e74652e20496e206f726e617265206c61637573206e6f6e206c69620065726f20736f6c6c696369747564696e2c2065752066657567696174206e75006c6c6120626c616e6469742e2050656c6c656e74657371756520686162697400616e74206d6f726269207472697374697175652073656e656374757320657400206e65747573206574206d616c6573756164612066616d6573206163207475007270697320656765737461732e204e756e632065676574206e756e63207369007420616d6574206d617572697320706861726574726120766573746962756c00756d20657520766974616520656e696d2e20496e20766f6c7574706174207300617069656e2065676574206c65637475732074696e636964756e7420766f6c0075747061742e20416c697175616d2073656420766976657272612075726e61002e204675736365206c6563747573206d657475732c20756c747269636573200076656c20657569736d6f642065742c20616c69717565742073656420746f7200746f722e2050686173656c6c757320626c616e6469742070656c6c656e7465007371756520756c747269636965732e204f72636920766172697573206e6174006f7175652070656e617469627573206574206d61676e697320646973207061007274757269656e74206d6f6e7465732c206e6173636574757220726964696300756c7573206d75732e204e756c6c61206469676e697373696d2c2076656c690074207175697320666163696c697369732072686f6e6375732c206e756c6c61002066656c697320747269737469717565206d61757269732c20657520636f6d006d6f646f206c656f206f726369206174206e6973692e20467573636520636f006e736563746574757220746f72746f7220657420706861726574726120766500686963756c612e204e756e63207665686963756c612c206d65747573207369007420616d657420657569736d6f642064696374756d2c20646f6c6f72206d650074757320616363756d73616e206573742c20696e20696163756c6973206d6100737361206c696265726f206e6f6e206c65637475732e0a0a496e2061742063006f6e736571756174207475727069732e204675736365206d69206e756c6c61002c206672696e67696c6c61207574207661726975732076697461652c2074720069737469717565206174206e6973692e204e756c6c61206964206d69206572006f732e204d6f726269206469616d20616e74652c2076656e656e617469732000696e2073757363697069742076656c2c2074696e636964756e7420766974610065206f64696f2e204d61757269732068656e647265726974206e6f6e20617200637520696420636f6e73656374657475722e205072616573656e7420616c69007175616d206e756e632076656c206d61676e61207665686963756c6120616c0069717565742e204e616d20636f6e7365637465747572206e756c6c612071750069732075726e6120696163756c697320756c6c616d636f727065722070656c006c656e74657371756520657420617263752e20496e7465676572206163206c00616f726565742076656c69742e2050656c6c656e7465737175652075742061006e7465207175616d2e20566976616d75732061206d6174746973206c656f2c002069642074656d707573206d692e204675736365207363656c657269737175006520646170696275732070757275732073656420616c697175616d2e0a0a4600757363652076656c20656e696d2070656c6c656e7465737175652c20656c65006d656e74756d206469616d2065752c2076756c7075746174652076656c6974002e204e756e63206c696265726f2074656c6c75732c20656c656d656e74756d00206964207175616d2073697420616d65742c20617563746f7220706f7274740069746f722070757275732e204c6f72656d20697073756d20646f6c6f72207300697420616d65742c20636f6e73656374657475722061646970697363696e670020656c69742e20457469616d206d6f6c6573746965206e756e6320736f6461006c657320636f6d6d6f646f20696163756c69732e204e616d20717569732065006c69742061206c696265726f20616c697175657420636f6e64696d656e7475006d207669746165206163206d692e20457469616d20756c7472696365732075006c74726963696573206d61676e6120766974616520706f73756572652e2056006976616d757320757420657569736d6f642076656c69742e20437261732073006f64616c6573206c6163696e6961206d61676e612c2071756973206665726d00656e74756d20657261742064696374756d2073697420616d65742e204675730063652074696e636964756e74206c696265726f206574206e657175652074720069737469717565206375727375732e204372617320616320646f6c6f72206c006967756c612e2050726f696e206567657420696d70657264696574206d6175007269732e20416c697175616d206469616d20646f6c6f722c20666163696c69007369732076656c206e69626820656765742c20636f6e7365717561742076650073746962756c756d206c696265726f2e204375726162697475722076756c700075746174652066617563696275732061756775652065676574207375736369007069742e204e756e632074696e636964756e742074656c6c7573207574206d006f6c6c6973206d6178696d75732e2050726f696e20766573746962756c756d00206c616f726565742073617069656e2c206e6563206672696e67696c6c6120006e6973692074656d70757320696e2e0a0a566573746962756c756d20616e74006520697073756d207072696d697320696e206661756369627573206f72636900206c756374757320657420756c74726963657320706f73756572652063756200696c69612063757261653b20566573746962756c756d20666163696c69736900732c20707572757320657520706f7375657265206c6163696e69612c2070750072757320657374206c616f72656574206e69736c2c206e656320766f6c75740070617420616e746520657261742076697665727261206e756c6c612e204e75006c6c6120666163696c6973692e20496e206e656320706f727461206d65747500732e20446f6e656320666163696c6973697320646f6c6f722073697420616d006574206f64696f20616c697175616d2c206567657420706f72747469746f720020697073756d2076756c7075746174652e204d61757269732076656e656e6100746973206d61676e61206575206578206f726e6172652c20696420736f6c6c00696369747564696e20616e746520636f6e6775652e2050656c6c656e746573007175652075726e61206f7263692c20756c747269636965732076697461652000706f73756572652075742c20756c74726963657320717569732074656c6c7500732e20536564206e6f6e20656c656966656e64206d692c20657520747269730074697175652073656d2e2041656e65616e2074656d707573206d61737361200065752067726176696461206d616c6573756164612e2050726f696e206e6563002076756c707574617465206e756e632e204e756e63206d616c657375616461002c206469616d206e6f6e20636f6d6d6f646f2064696374756d2c207175616d00206e69736c2074696e636964756e74206c616375732c2073697420616d6574002066657567696174206c6f72656d206e756c6c61206e656320697073756d2e000a0a4d617572697320736564206d6574757320617420646f6c6f7220636f6e0064696d656e74756d20636f6e73657175617420616363756d73616e2061632000646f6c6f722e2053757370656e6469737365206c756374757320626c616e640069742065782c20617420656c656d656e74756d206d692064696374756d206500752e20416c697175616d2074696e636964756e7420656c656d656e74756d20006d61676e6120766974616520616c69717565742e20446f6e656320696e206f00726e617265206d61757269732e20496e206c6163696e69612073697420616d006574206e756c6c61207669746165206665726d656e74756d2e20446f6e656300206e6563206665726d656e74756d2075726e612c206174206672696e67696c006c612076656c69742e20416c697175616d206572617420766f6c7574706174002e20566573746962756c756d2073656420747572706973206e657175652e2000496e74656765722076656c207375736369706974207475727069732e2053650064206e656320636f6e64696d656e74756d206e657175652e2041656e65616e0020636f6e76616c6c697320766f6c757470617420706f73756572652e205068006173656c6c7573206c6f626f72746973206c6967756c612076656c2072686f006e637573206c616f726565742e2041656e65616e2065676574206573742069006163756c69732c2076656e656e61746973206f64696f2075742c206469637400756d2074656c6c75732e2044756973207669746165206572617420766974610065206e69736920637572737573206d61747469732e204e756e6320626c616e006469742070656c6c656e7465737175652072697375732c206c7563747573200074696e636964756e74206d61676e6120706f7274612061632e204372617320007669766572726120616c697175657420706f73756572652e0a0a4c6f72656d0020697073756d20646f6c6f722073697420616d65742c20636f6e7365637465007475722061646970697363696e6720656c69742e204e756c6c616d20657520006c61637573206c65637475732e20467573636520612074656c6c7573206c61006375732e20496e74657264756d206574206d616c6573756164612066616d65007320616320616e746520697073756d207072696d697320696e206661756369006275732e204e756c6c616d2070656c6c656e746573717565206c6f72656d20007175616d2c2076656c2074656d706f7220746f72746f72207072657469756d002076697461652e20566573746962756c756d20736f6c6c696369747564696e002071756973206d692061632072757472756d2e20496e746567657220646967006e697373696d206c696265726f20616c697175616d206672696e67696c6c610020616363756d73616e2e20446f6e656320666163696c697369732064756920006e6f6e206c656f2074656d707573206c75637475732e20536564206d616c65007375616461207665686963756c6120756c7472696365732e20557420616e74006520616e74652c20616c69717565742073697420616d657420736f6c6c69630069747564696e2066696e696275732c20626c616e64697420756c747269636500732061756775652e20536564206e6563206e69736920717569732076656c69007420636f6e64696d656e74756d20677261766964612e2041656e65616e2061006c697175657420657569736d6f64206475692c207574207665686963756c610020697073756d2066617563696275732065752e0a0a46757363652076656c6900742073617069656e2c2073656d706572206574206469676e697373696d207600656c2c20696163756c69732069642076656c69742e205072616573656e7420006e6f6e206e69736c206567657420616e746520736f6c6c696369747564696e002072757472756d206e6563206e6563206573742e205365642076697665727200612066656c6973206e69736c2c206e65632065676573746173206573742073006f64616c65732065742e204e616d20636f6e67756520617567756520737573006369706974206578206c616f7265657420706f72747469746f722e2046757300636520626962656e64756d20697073756d206e657175652c206163206d617800696d757320646f6c6f72206672696e67696c6c612075742e2043757261626900747572206120636f6e736571756174206c6967756c612e204e616d20766f6c00757470617420636f6e736571756174206c696265726f20657520626c616e640069742e204e616d20696e74657264756d2074656c6c7573207574206f64696f0020636f6e736571756174206f726e6172652e204e756c6c6120666163696c690073692e204d616563656e6173206c756374757320616e74652065676574206f0064696f20636f6e64696d656e74756d206672696e67696c6c612e20496e7465006765722065676574206d61676e612073697420616d6574206d61676e6120660065726d656e74756d20677261766964612e0a0a4d6f72626920736f64616c6500732076656c6974206e6973692c2061206d6178696d75732064756920656c65006966656e64206e6f6e2e204d61757269732070757275732065726f732c2061007563746f722075742066696e6962757320656765742c20756c7472696369650073207175697320657261742e2041656e65616e207361676974746973207475007270697320696e206f72636920706f7274612c20696420706861726574726100206578206566666963697475722e20467573636520617420636f6e6775652000657261742e20566573746962756c756d206c756374757320656e696d20666500726d656e74756d206c656f2064696374756d207472697374697175652e2044006f6e6563206e65632066656c69732073697420616d65742064756920706f7200747469746f7220656c656d656e74756d2e205072616573656e74206c616f72006565742c2066656c6973207669746165207472697374697175652062696265006e64756d2c206c6f72656d206e6962682070656c6c656e746573717565207300617069656e2c20736564207363656c65726973717565206c6f72656d206e690062682076656c2073656d2e204675736365206e6f6e2076656e656e6174697300206e657175652e20446f6e6563207363656c65726973717565206469676e69007373696d20726973757320696420706f7274612e0a0a53757370656e6469730073652072686f6e637573206c696265726f2076656c2066656c6973206c616300696e69612074656d7075732e2046757363652064696374756d206e657175650020736564206e69626820677261766964612c20626962656e64756d206c6f62006f727469732075726e6120616c69717565742e204375726162697475722065007420657569736d6f6420656e696d2e2050656c6c656e74657371756520696d0070657264696574206175677565206c6f72656d2c2075742068656e64726572006974206e657175652073656d7065722076656c2e2050686173656c6c75732000636f6d6d6f646f20647569206e6f6e206c6f626f727469732076656e656e61007469732e20437261732076697665727261207361676974746973206e69736c002c207669746165206c6f626f72746973206d6574757320756c747269636965007320696e2e20416c697175616d207669746165206469676e697373696d207000757275732c206661756369627573207072657469756d2072697375732e20500072616573656e74206163206d61676e6120617563746f722c206d616c65737500616461206e756c6c61206c6f626f727469732c20636f6d6d6f646f20647569002e205072616573656e7420617420746f72746f7220697073756d2e204675730063652074656d7075732c2066656c697320696e20616363756d73616e206661007563696275732c206c696265726f20656e696d206d6f6c6c697320656e696d002c20696420656c656d656e74756d206d657475732070757275732061206d6100676e612e204375726162697475722073697420616d657420636f6e64696d65006e74756d2075726e612e20496e2075726e612066656c69732c20636f6e6469006d656e74756d207669746165206e756c6c612065752c20706f73756572652000636f6e64696d656e74756d206e6962682e2050656c6c656e746573717565200067726176696461206f64696f20656c69742c2076656c20616c69717565742000726973757320636f6e7365637465747572206e6f6e2e204d616563656e6173002074656d706f722c206d61676e6120616320706861726574726120616c69710075616d2c20616e7465206c6967756c612066657567696174207175616d2c20006575206d6174746973206e756c6c61206e69736c206e6f6e206d617373612e000a0a496e746567657220756c74726963657320736f64616c6573206a757374006f2e20416c697175616d20626962656e64756d207068617265747261207269007375732c2061632076697665727261206e69736920616363756d73616e207500742e20457469616d2067726176696461206665726d656e74756d206d692069006e207363656c657269737175652e20467573636520696e74657264756d2c20006c656f207175697320626962656e64756d206d61747469732c206a7573746f00206d65747573206672696e67696c6c6120656c69742c20616320706c6163650072617420747572706973206469616d206661756369627573206e69736c2e2000457469616d206c616f72656574206c696265726f206c6f72656d2c2076656c002074656d707573206f64696f206469676e697373696d2065742e204e756c6c006120666163696c6973692e20496e74656765722064617069627573206d6f6c00657374696520656e696d2c2061632074696e636964756e742073617069656e0020636f6e76616c6c69732075742e2043726173206d6f6c6c697320636f6e73006563746574757220666163696c697369732e2043757261626974757220747200697374697175652c20726973757320706f72747469746f722076756c7075740061746520756c7472696365732c206c6f72656d2073656d206469676e69737300696d206e657175652c20657520706f72747469746f72206d61676e61206e69007369207669746165207475727069732e20446f6e656320636f6e7365717561007420657374206575206469616d20666575676961742c2076656c2076657374006962756c756d206469616d206c6163696e69612e20457469616d20756c74720069636573206c65637475732073697420616d6574206f726369207361676974007469732c2076656c20616c69717565742065726f73206c6163696e69612e2000496e74656765722070686172657472612c206172637520657520626c616e640069742064696374756d2c2076656c6974206f64696f20636f6d6d6f646f206f0064696f2c20757420636f6e7365717561742074656c6c7573207175616d206e006563206a7573746f2e2053656420656666696369747572207365642066656c0069732061206d6178696d75732e204e756c6c616d20656c656966656e6420730063656c65726973717565206c6f72656d2c20696e206d6f6c65737469652074006f72746f72206d616c6573756164612076697461652e20457469616d20636f006e64696d656e74756d2c20617567756520657420696163756c69732064617000696275732c206469616d206172637520706f72747469746f722075726e612c0020616320636f6e76616c6c6973206d61676e61206175677565207365642064006f6c6f722e2050686173656c6c75732076656c206f64696f2070757275732e000a0a457469616d20656c656966656e64206469676e697373696d206e697369002066657567696174206c6163696e69612e2051756973717565206574206c6100637573207669746165206172637520706f73756572652074656d7075732e20004e616d20636f6e73657175617420657820696e206172637520756c747269630065732c2076656c2076656e656e61746973206e756e63206672696e67696c6c00612e20496e7465676572206575206a7573746f206964206e6962682062696200656e64756d2072757472756d2e20457469616d207363656c657269737175650020747572706973206c656f2c2061632074696e636964756e74207175616d200064696374756d2065752e204475697320636f6e73657175617420636f6e67750065206a7573746f2c206469676e697373696d20626962656e64756d207361700069656e20656c656966656e6420656765742e204d616563656e617320646967006e697373696d206d6173736120757420626c616e646974206c6163696e6961002e2050726f696e2066657567696174206e756e6320736564206c6f72656d2000616c697175616d2070756c76696e61722e20416c697175616d207661726975007320616e7465207365642073617069656e206469676e697373696d2c206574002064696374756d2073617069656e20696e74657264756d2e2041656e65616e00206574206c656f2061756775652e2053656420756c74726963696573207469006e636964756e742065726f732c2073656420706f727461206d6175726973200066696e69627573206e65632e0a0a53757370656e6469737365206e6563206c006f72656d206c696265726f2e204d616563656e6173206e6563206c6967756c0061206e6f6e20657820626c616e6469742073757363697069742e2050656c6c00656e746573717565206c616375732072697375732c206f726e6172652061200063757273757320656765742c2074656d706f72207669746165206e69736c2e00204375726162697475722072757472756d20766f6c757470617420657820610020706c6163657261742e204d6f726269206d616c6573756164612074656c6c0075732065752061726375206d6f6c6573746965206d61747469732e2045746900616d207363656c6572697371756520636f6d6d6f646f2061756775652c20710075697320636f6d6d6f646f2076656c697420656c656966656e642069642e20004d617572697320617563746f72207669746165206d657475732071756973200076656e656e617469732e2050726f696e20626962656e64756d206661756369006275732074656c6c75732c20736f6c6c696369747564696e20696d7065726400696574206e69736920766f6c75747061742076656c2e20446f6e656320666100756369627573206d6f6c6573746965207175616d2c206574206672696e6769006c6c61206469616d2e0a0a446f6e656320696d706572646965742065726174002061206e6973692066696e696275732c207574206469676e697373696d206e0069736920666163696c697369732e204e756c6c6120696163756c697320757400207175616d20616c69717565742068656e6472657269742e2050656c6c656e0074657371756520757420656c656966656e64206e657175652e20446f6e656300206575206c6563747573206574206c656f20696e74657264756d2074696e63006964756e742e204e616d20756c74726963657320656c6974206e6973692c200065676574206d6178696d7573207269737573206672696e67696c6c612071750069732e205365642076656c206e69736920617420747572706973207275747200756d2074696e636964756e742e204e756c6c6120636f6e677565206572617400206c6f72656d2c207365642066696e69627573206c6163757320616c6971750065742065742e2050656c6c656e746573717565207574207175616d20696e20006f72636920736f64616c65732074656d706f72207574206575206e65717565002e2051756973717565206d616c65737561646120736167697474697320726900737573206e6f6e2076656e656e617469732e204e756e632066696e696275730020756c74726963696573206e69626820706f737565726520636f6e7365637400657475722e20496e7465676572206e6563206c6967756c61206e756e632e20005574206e6563206d617373612076656c206c6967756c612074726973746971007565206665726d656e74756d20696e2065752074656c6c75732e0a0a4d61750072697320736f64616c6573206469616d2069642066656c6973206c616f72650065742c207175697320736f6c6c696369747564696e2074757270697320756c006c616d636f727065722e204e756c6c6120636f6d6d6f646f2c207361706965006e20657420756c6c616d636f7270657220736f6c6c696369747564696e2c200073656d206c6563747573206672696e67696c6c61207175616d2c2061742070006c6163657261742065782065726f732075742073617069656e2e20496e206f0064696f206e6973692c207661726975732073697420616d657420646f6c6f72002076656c2c20756c74726963657320706c6163657261742074656c6c75732e0020557420646f6c6f72206d692c2073656d706572206e6f6e206d6178696d7500732076656c2c2070756c76696e61722061742066656c69732e20457469616d00207269737573206e756c6c612c20656666696369747572206174206c6f7265006d206c6f626f727469732c20706f72746120656c656966656e64206c6f7265006d2e20566976616d757320617420636f6e64696d656e74756d2065726f732e00204475697320657420696163756c6973206d692c20766974616520636f6e73006563746574757220617263752e20496e2065726f73206d61757269732c207400656d706f7220717569732070656c6c656e74657371756520696e2c207068610072657472612076656c206c65637475732e204d6f72626920706f7274612c20006c696265726f20617420736f64616c657320656c656966656e642c206c6163007573206c6f72656d20626962656e64756d206f64696f2c206e656320706f7200747469746f72206c65637475732074656c6c75732076656c2073656d2e204e00756c6c61207363656c657269737175652065742075726e61206575206469630074756d2e205574206f726e617265206d61747469732074656d7075732e2055007420626c616e646974206f64696f2061206d61737361206d6178696d75732c00206e6563206d616c657375616461206c696265726f2066617563696275732e000a0a5574206d6178696d757320756c7472696369657320747269737469717500652e20457469616d206163206469616d206174206e756c6c61206c75637475007320756c6c616d636f7270657220696e20657520656c69742e2053656420650074206d617373612076656c206e6962682072686f6e6375732074696e63696400756e742e2053656420636f6e677565207363656c657269737175652074656d007075732e205175697371756520766f6c7574706174206d61737361206c6f7200656d2c2076656c2072757472756d20656e696d20636f6e64696d656e74756d00206e65632e20416c697175616d2074757270697320646f6c6f722c2065666600696369747572207365642064696374756d20616c697175616d2c206d617474006973206964206c616375732e204d616563656e61732066657567696174206e006973692071756973206d6178696d757320636f6e76616c6c69732e0a0a536500642074696e636964756e74207574206a7573746f2076697461652066696e69006275732e204d617572697320626c616e6469742065726174206e756e632c2000766974616520616363756d73616e2061726375206672696e67696c6c612071007569732e2053656420756c7472696365732074696e636964756e7420646961006d2073697420616d657420626962656e64756d2e20416c697175616d20666100756369627573206c61637573206567657420766573746962756c756d206865006e6472657269742e204e756c6c616d20766172697573206e6563206e657175006520657420656c656966656e642e2053656420766974616520747572706973002065742074757270697320656c656966656e642074656d706f722e2050656c006c656e74657371756520766573746962756c756d206172637520612065756900736d6f64206d61747469732e205072616573656e74206e6563207269737573002073697420616d6574207475727069732064617069627573207375736369700069742e20446f6e656320626962656e64756d2074656d707573206d6920696e002072757472756d2e20566573746962756c756d206d61737361206d65747573002c20696d7065726469657420657520736f64616c657320717569732c2061630063756d73616e2076656e656e6174697320617263752e20496e206e6f6e2070006f7375657265206c696265726f2c2076656c2073757363697069742075726e00612e0a0a53757370656e64697373652073617069656e206d657475732c207000756c76696e6172206e6563206c61637573206d6f6c65737469652c20656765007374617320766573746962756c756d2065782e20566573746962756c756d200074656d706f7220616e7465206e6563206e756e632074696e636964756e742000666163696c697369732e20457469616d20626962656e64756d2c20616e74650020696e207072657469756d20636f6e6775652c206d61737361206c6f72656d00206c6f626f727469732065782c206e65632072686f6e63757320746f72746f0072206d61757269732061632070757275732e20496e2072686f6e637573207600756c707574617465206d61676e6120617420657569736d6f642e204d61656300656e61732076656c206c616f72656574206a7573746f2c20696e206c616369006e6961206f64696f2e2050656c6c656e74657371756520616c697175657420006c616375732061632076656e656e61746973206c75637475732e20496e7465007264756d206574206d616c6573756164612066616d657320616320616e74650020697073756d207072696d697320696e2066617563696275732e205175697300717565206c6163696e6961207072657469756d2075726e6120736f64616c650073206d6178696d75732e20496e7465676572206469676e697373696d20707200657469756d206d6f6c6c69732e20536564206c656374757320656c69742c2000616c697175616d2061206469616d2069642c20646170696275732076617269007573206c6967756c612e204d6f726269206c6163696e696120736f64616c650073206c6f72656d2c20696420616c697175616d206e69736c20706f73756572006520656765742e0a0a41656e65616e2070686172657472612c2074656c6c750073206163206469676e697373696d20656765737461732c206175677565206500737420656c656d656e74756d2066656c69732c2076656c206c6f626f7274690073206e69736920656e696d20636f6d6d6f646f207475727069732e205375730070656e6469737365206e756e63207475727069732c206c6f626f727469732000736564206d61757269732069642c20706f72746120736f6c6c69636974756400696e206a7573746f2e2050726f696e20656c656d656e74756d206d6175726900732073697420616d6574206f72636920696e74657264756d2074696e63696400756e742e2053656420706f7274612075726e612066656c69732c206964207600656e656e617469732073617069656e207363656c657269737175652065742e0020566976616d7573206461706962757320706f72747469746f72206a757374006f2c206964206d6f6c6573746965206e69736c20696163756c69732074696e00636964756e742e20496e206d6174746973206d61757269732073697420616d00657420636f6e76616c6c697320756c747269636965732e20446f6e65632063006f6d6d6f646f2065676573746173206572617420766974616520617563746f00722e204e756c6c616d2066657567696174206d61676e61206573742c2065740020706f72747469746f72206573742074656d706f722061632e20416c69717500616d20766172697573206d69206575206c61637573206d61747469732c207300697420616d6574207375736369706974206e69736920736f64616c65732e200041656e65616e2065742068656e6472657269742076656c69742c20696e2070006c616365726174206e6973692e20446f6e656320717569732076656c697420006d692e20457469616d20706c61636572617420657261742076656c2065726f0073206672696e67696c6c6120636f6d6d6f646f2e0a0a50686173656c6c757300207669746165206475692066656c69732e205072616573656e7420707265740069756d206d6174746973206e657175652c2065676574206672696e67696c6c00612066656c69732074656d706f722061742e204372617320617563746f7220006e69736c206e65632073656d206c6f626f72746973206d61747469732e205000656c6c656e746573717565206d61747469732074696e636964756e74207465006d7075732e2050726f696e206c616f726565742073656d206120766f6c7574007061742072686f6e6375732e204d6f726269206575206d6175726973207369007420616d65742072697375732074696e636964756e74206f726e6172652e200041656e65616e20756c6c616d636f72706572206c61637573206e6f6e206e75006e6320696d706572646965742c20657420656c656966656e642074656c6c75007320706c6163657261742e2043726173206574206d6920696e206469616d20006567657374617320706c616365726174206e6f6e2073697420616d6574206c0065637475732e20416c697175616d20696163756c6973207075727573206c6f00626f727469732c207363656c657269737175652065726f7320656765742c200076617269757320646f6c6f722e2043757261626974757220737573636970690074206e6571756520736564206567657374617320636f6e7365717561742e2000496e2076656c20616c697175616d206d657475732c206c756374757320636f006d6d6f646f206e6962682e2053656420636f6e7365717561742070756c7669006e6172206d692c20736167697474697320616c69717565742065726f73206d006178696d75732076756c7075746174652e2055742065742074656d70757320006c616375732e0a0a53757370656e646973736520706f74656e74692e2044750069732076656c2076756c707574617465206d61757269732c20757420736f6c006c696369747564696e206d692e20446f6e65632076656c20616c697175616d00206c6967756c612c20656765742072686f6e6375732074656c6c75732e20500072616573656e74206e65632065726f732076697461652065726f732076756c0070757461746520617563746f722e204e756e632073757363697069742c206d00617572697320696420696e74657264756d20756c6c616d636f727065722c2000746f72746f72206a7573746f20646170696275732073617069656e2c20766900746165206c6163696e6961206c656f2075726e612076697665727261206e690062682e205175697371756520626962656e64756d20617563746f722065726f00732c206964206d6174746973206d617373612064696374756d20612e20557400206964206d69206e69736c2e20566573746962756c756d206575206c756374007573206c616375732e20446f6e65632061206d6178696d75732066656c6973002e0a0a446f6e65632073656d206e69736c2c20756c7472696365732061207400656c6c75732075742c2070656c6c656e74657371756520666163696c6973690073206e756c6c612e205365642065742073617069656e2075742065726f732000636f6e64696d656e74756d20706f72747469746f722e204675736365207369007420616d6574206d657475732065782e20496e20612065782073697420616d0065742074656c6c75732070756c76696e617220636f6e73657175617420612000696420656e696d2e204d616563656e617320756c6c616d636f727065722073006f64616c6573207475727069732c207175697320756c6c616d636f72706572002065726f7320636f6e7365717561742065742e20496e746567657220736f6400616c6573206573742073697420616d657420616e74652074656d7075732c2000696420616c69717565742066656c69732072757472756d2e204c6f72656d2000697073756d20646f6c6f722073697420616d65742c20636f6e7365637465740075722061646970697363696e6720656c69742e204d616563656e61732069640020747572706973207669746165206573742076656e656e6174697320656c65006d656e74756d2e0a0a446f6e656320696163756c697320677261766964612000636f6e73656374657475722e20457469616d20657569736d6f642065726f7300206567657420766573746962756c756d206672696e67696c6c612e20496e2000706f7274612c206572617420766974616520656c656d656e74756d2067726100766964612c20747572706973206c6f72656d206d6f6c6573746965206e696200682c20696420706861726574726120746f72746f72206d65747573206c616300696e6961207475727069732e204d6175726973207072657469756d2076617200697573207475727069732c2065742063757273757320657820766976657272006120717569732e20536564206d616c657375616461206c656f206574206d61007373612074656d707573206c6163696e69612e204e756e632073697420616d00657420656e696d2073656d2e20446f6e65632076656c206772617669646120007175616d2c2076656e656e61746973207665686963756c6120657261742e0a000a496e206e6f6e206c61637573206d616c6573756164612c206d6178696d750073206e696268206e65632c20636f6e73656374657475722076656c69742e20004e756c6c61206575206772617669646120746f72746f722e2050686173656c006c757320696e74657264756d206665726d656e74756d207661726975732e20004d6f726269207661726975732076656c697420696e206c6163757320736365006c65726973717565206d616c6573756164612e2050686173656c6c75732073007573636970697420616c697175616d2065726f7320696e20747269737469710075652e20566573746962756c756d2061632075726e61206e756e632e204d610075726973207072657469756d20746f72746f72206469616d2c206120667269006e67696c6c61206c65637475732074656d7075732061632e0a0a4d6f7262690020696d70657264696574206d6f6c6c697320646f6c6f722c206e65632065660066696369747572207175616d20616c697175657420612e20566976616d757300206c75637475732070757275732076656c206e69736c20657569736d6f642000706f72747469746f722061632076697461652074656c6c75732e2043726173002073757363697069742074726973746971756520707572757320757420736300656c657269737175652e2050656c6c656e7465737175652073697420616d65007420656c6974206964206c696265726f206665726d656e74756d20736f6461006c65732e204e756c6c616d20636f6e76616c6c6973206c6967756c6120696e00207175616d207072657469756d2c20696420616c6971756574206e6962682000636f6e7365717561742e204e756c6c6120666163696c6973692e2041656e6500616e206f726369206c696265726f2c2068656e647265726974207574206c6f0072656d2076656c2c20706f72747469746f7220706f72747469746f72206c69006265726f2e20557420696420616363756d73616e206d617373612e20536564002073617069656e206c656f2c2074696e636964756e74207072657469756d200061756775652076697461652c207669766572726120766f6c7574706174207300617069656e2e204d6f726269206d6f6c6c6973206f7263692073656420756c0074726963657320636f6e64696d656e74756d2e204372617320616363756d7300616e20736167697474697320696d706572646965742e204e616d2074656d70006f7220766573746962756c756d207475727069732c20636f6e64696d656e7400756d2074656d706f72206f64696f20656c656d656e74756d2076656c2e2056006573746962756c756d20737573636970697420616e7465206120617263752000616363756d73616e2c2076656c20636f6e677565206d61757269732067726100766964612e0a0a50686173656c6c757320766f6c7574706174206d6175726900732065676574206c696265726f206c616f7265657420616c697175616d2e2000566573746962756c756d207269737573206e69736c2c2074656d7075732061007420766f6c75747061742076697461652c2074696e636964756e74207669740061652065726f732e20416c697175616d2076656e656e6174697320616e74650020626c616e64697420707572757320666575676961742c206120616c69717500616d20616e746520626962656e64756d2e2050726f696e20696e7465726475006d20697073756d206e6962682c2076656c20706f7274612066656c69732065007569736d6f642065742e20457469616d20717569732074656c6c757320646f006c6f722e2044756973206964206c616f72656574206f64696f2c20657420630075727375732072697375732e2053757370656e6469737365206c616f726565007420646f6c6f72206575206e756c6c6120666575676961742c20736564206600657567696174206e756c6c6120626c616e6469742e20416c697175616d2071007569732061726375207175697320617567756520756c7472696365732069610063756c69732e20446f6e65632069642065726f73206e6f6e206e6973692061006363756d73616e206f726e6172652076656c20757420657261742e205365640020636f6d6d6f646f206c756374757320616e746520717569732070756c7669006e61722e205072616573656e7420616c697175616d206d6f6c6c6973207075007275732072686f6e63757320636f6e7365717561742e2055742076697461650020636f6e6775652072697375732e20496e206d6f6c6c6973206120707572750073206964206c6163696e69612e0a0a467573636520616c697175616d206175006775652073697420616d6574206a7573746f2070656c6c656e746573717565002c20756c6c616d636f7270657220706f7274612064756920696163756c6973002e2050726f696e20656765737461732076756c707574617465206e69736c2c002076656c20637572737573206d6173736120706f72747469746f722061742e0020536564206e6f6e2074656c6c75732076656c206e756c6c6120626c616e6400697420666163696c697369732e204d616563656e6173206572617420656e69006d2c20736f64616c65732061206c6163696e69612076656c2c20616c697175006574207574206e756c6c612e20496e74656765722066656c69732061726375002c20736f64616c65732076656c2066617563696275732073697420616d6574002c20766573746962756c756d2065676574206c6f72656d2e204e756c6c61200076697665727261206f64696f206163206e756e63206c75637475732c2065750020706c6163657261742074656c6c757320616c697175616d2e204d6f72626900206e65632073656d20657520616e746520706f737565726520736f6c6c69630069747564696e2e204e756c6c6120616363756d73616e20636f6e7365637465007475722065737420766974616520756c747269636965732e20447569732066006163696c69736973207363656c65726973717565206d61757269732c206e6f006e20636f6e64696d656e74756d2064756920766f6c757470617420696e2e0a000a4d617572697320717569732066696e6962757320656e696d2e204e756e630020656765742065726f7320616c69717565742c206d6178696d7573206c6f7200656d206e6f6e2c2070656c6c656e746573717565206a7573746f2e204d6f720062692065676574206e756e6320696420726973757320657569736d6f642062006c616e6469742076656c20612072697375732e204d6175726973206120736f0064616c65732074656c6c75732e2043757261626974757220626c616e64697400206174206e756e63206174206566666963697475722e204475697320657520006c696265726f206e656320647569206d6174746973206d6178696d75732e200053656420636f6e7365717561742065726174206d61757269732c2075742070006f727461206c6563747573206665756769617420717569732e2056657374690062756c756d2076656c2074656c6c7573206e65632073617069656e20636f6e006775652076656e656e617469732e20446f6e656320706c6163657261742075006c747269636573206d692e204675736365206c7563747573206e6f6e206d610075726973206163206375727375732e204e756c6c612065676574206d61676e006120766974616520747572706973206d616c6573756164612076697665727200612e2050656c6c656e746573717565206174206c6563747573206964206d6100676e612064617069627573206d61747469732076697461652061207175616d002e0a0a496e206572617420657261742c20696d7065726469657420757420710075616d206e65632c20756c6c616d636f727065722072757472756d20747572007069732e204d6f72626920706c61636572617420656c6974206174206e697300692070656c6c656e74657371756520706c6163657261742e2050726f696e20007669766572726120736f6c6c696369747564696e206375727375732e204675007363652076656e656e6174697320626c616e646974206e69736c207365642000636f6e6775652e204675736365206d6f6c65737469652c2075726e61207665006c20636f6e76616c6c69732072686f6e6375732c20656c6974206d657475730020657569736d6f642065782c2071756973207665686963756c61206d6173730061207075727573206163206475692e2041656e65616e206e6f6e206c6163750073207665686963756c612c20656c656966656e6420656c697420736f64616c0065732c207661726975732073617069656e2e20536564206e756c6c61206a750073746f2c206665726d656e74756d20706f72747469746f722076697665727200612075742c20706f727461206567657420656e696d2e2050656c6c656e7465007371756520636f6e736563746574757220736167697474697320747572706900732c206174206375727375732064756920706f737565726520696e2e20517500697371756520612073757363697069742065726f732e20457469616d20616c0069717565742c20646f6c6f722061742064696374756d2072686f6e6375732c00206d692065737420756c6c616d636f727065722072697375732c2061207469006e636964756e742074757270697320746f72746f72206e6f6e206e6962682e002053656420636f6d6d6f646f206469616d206163206f72636920766f6c7574007061742c207669746165206c6f626f72746973206d61676e6120706f7375650072652e204475697320636f6d6d6f646f20656c697420696420657820766172006975732c206567657420706f737565726520697073756d20617563746f722e0020467573636520756c74726963696573206f64696f20657520636f6e6775650020616c69717565742e2055742071756973206573742070756c76696e61722c002076756c707574617465206c65637475732076756c7075746174652c20636f006e7365717561742073617069656e2e0a0a446f6e656320636f6e76616c6c690073206d61757269732074656d7075732076617269757320617563746f722e2000416c697175616d207472697374697175652064696374756d2070757275732c0020696420677261766964612075726e6120616c69717565742075742e2056690076616d75732065752076656e656e6174697320616e74652c206d6178696d7500732074696e636964756e74206f7263692e20557420617420616c697175616d00206c6f72656d2e20416c697175616d206e6f6e206c61637573206e756c6c61002e204d6f72626920766974616520656666696369747572206d617373612c200076697461652072686f6e63757320657261742e2041656e65616e206e6f6e2000657261742071756973206d617572697320657569736d6f6420626c616e646900742e205574207669746165206e756c6c612073697420616d65742074656c6c007573206567657374617320636f6e7365717561742e205574206c696265726f00206c65637475732c20626c616e6469742070756c76696e6172207375736369007069742065752c20636f6e7365637465747572207669746165207361706965006e2e2043757261626974757220706f727461206e756e632066656c69732c2000717569732070656c6c656e746573717565206c656f206469676e697373696d002061742e204d6f7262692076656c20696163756c6973206e6962682e20446f006e65632074696e636964756e742065737420657520696d706572646965742000706f72747469746f722e20566573746962756c756d20696e207475727069730020746f72746f722e0a0a50726f696e2076697461652061726375206e696268002e205072616573656e74206573742073617069656e2c2074696e636964756e007420617420617263752076697461652c2076656e656e6174697320736f6c6c00696369747564696e20746f72746f722e2050656c6c656e7465737175652066006163696c697369732c206f64696f20696e2074726973746971756520736f6400616c65732c20657374206e6571756520657569736d6f6420697073756d2c2000657520656c656d656e74756d206f726369206e65717565207669746165206c00696265726f2e20446f6e65632074656d706f72206c696265726f20696e206c00656f20636f6d6d6f646f2c2075742076756c707574617465206d61676e6120006c616f726565742e204d616563656e61732072757472756d20656c656d656e0074756d20766f6c75747061742e20536564206d6f6c65737469652c206d657400757320657520656c656d656e74756d20616363756d73616e2c2073656d20710075616d20636f6e76616c6c6973206c696265726f2c206e6f6e206d616c6573007561646120616e7465206c61637573206c6f626f7274697320746f72746f72002e205365642076656c697420646f6c6f722c20636f6e73656374657475722000617563746f7220616c697175657420696e2c206f726e617265206575207361007069656e2e204e756c6c61206574206c65637475732061207075727573207300656d706572206d61747469732e204e756c6c616d206d617474697320656c65006966656e64206d6f6c65737469652e0a0a4d6175726973206c6f626f72746900732065726174206c616375732c20757420766573746962756c756d20617567007565207072657469756d2065752e20446f6e65632065742073656d70657220006d61757269732c2073697420616d65742067726176696461206c6563747573002e20447569732076656e656e61746973206d69206f7263692c2061206566660069636974757220646f6c6f7220617563746f722069642e204e756c6c61206e006f6e2075726e612075742065726174207665686963756c612074696e63696400756e74207574206964206a7573746f2e2041656e65616e206c6163696e69610020657374206964206c7563747573206d616c6573756164612e205574206f72006e61726520647569207175697320636f6e736563746574757220707265746900756d2e20496e206163206a7573746f206163206e756c6c61207669766572720061207665686963756c612e2053757370656e646973736520696e2076657374006962756c756d206d657475732c206120736f64616c6573206c6f72656d2e20004d6f726269206e6f6e206c6967756c612076697461652074656c6c7573206600696e69627573207363656c6572697371756520617420696e20616e74652e20005175697371756520696e2073656d70657220646f6c6f722e20457469616d20006d6f6c6c69732c206d6574757320696420766f6c75747061742073656d706500722c206d61737361206e65717565206c6163696e69612073656d2c20696e2000656666696369747572206c656374757320656c6974207574206e756e632e200050726f696e206c6163696e6961206c6f72656d2071756973207475727069730020756c7472696365732c20757420666175636962757320646f6c6f7220656c00656966656e642e20446f6e6563206c6f626f7274697320697073756d20657500206572617420616c69717565742c2065752065676573746173206c6967756c006120656c656d656e74756d2e205072616573656e742069642065726f73206600696e696275732c206d6f6c6c69732074757270697320696e2c206d6f6c6c690073207175616d2e2050686173656c6c757320626c616e64697420636f6d6d6f00646f206e756e6320696e20626c616e6469742e204e616d207175697320726900737573207574206469616d206c6f626f727469732073616769747469732e0a000a50726f696e20766f6c75747061742074656d7075732072757472756d2e200050726f696e20696d7065726469657420626c616e6469742073617069656e20007175697320706c6163657261742e204e756c6c6120706f73756572652064750069206964206f64696f20657569736d6f642c20696420696163756c6973207500726e6120646170696275732e20446f6e65632070656c6c656e74657371756500206d617373612069642076697665727261206c616f726565742e204e756c6c00616d2071756973206c6163757320636f6e76616c6c69732c20626c616e64690074206c656f206e6f6e2c20616c697175616d206c696265726f2e2053656420006461706962757320617567756520696e2075726e612070686172657472612c002061742073656d706572206c656374757320706c6163657261742e205365640020756c74726963657320726973757320696420696163756c69732074656d700075732e20496e7465676572206665726d656e74756d2c2072697375732065740020636f6e736563746574757220636f6e6775652c206e756e63206573742069006163756c69732072697375732c20706f73756572652076656e656e61746973002065726f7320616e74652076656c2070757275732e20496e7465676572206c006163696e69612074656c6c7573207669766572726120726973757320736167006974746973206672696e67696c6c612e2043726173206e6f6e20697073756d002071756973206e65717565207669766572726120666163696c69736973206e006f6e20736564206475692e20467573636520636f6d6d6f646f20656c65696600656e64206a7573746f207175697320636f6e6775652e0a0a566976616d757300207363656c657269737175652074696e636964756e74206e756e6320646967006e697373696d20636f6e64696d656e74756d2e2051756973717565206172630075206e69736c2c20756c6c616d636f72706572206e6563206c65637475732000717569732c20636f6e67756520616363756d73616e20657261742e2043757200616269747572207574206e697369207475727069732e20496e20766974616500206573742071756973206d657475732074656d70757320766573746962756c00756d206575206e656320617263752e2055742073656d206a7573746f2c20660065756769617420657520636f6e73657175617420656765742c20756c6c616d00636f72706572206567657420697073756d2e205072616573656e7420707265007469756d206d6174746973206c656f2c20677261766964612068656e64726500726974206c696265726f2065666669636974757220656765742e204d61656300656e617320626c616e646974206e696268206469616d2c206e6563206c616300696e69612061726375206c6163696e69612065742e0a0a4675736365207469006e636964756e7420746f72746f722066656c69732e20536564206469616d20006e6962682c20637572737573206e6563206461706962757320656765742c20006f726e61726520656666696369747572206d692e20446f6e65632069642074006f72746f72207669746165206d692064696374756d20766573746962756c75006d2e2050726f696e206964206c696265726f20616c697175616d2076656c6900742074656d706f7220696d706572646965742073697420616d657420766974006165206c616375732e20437261732073697420616d65742065782068656e640072657269742c206672696e67696c6c6120617567756520696e2c206c616f7200656574206f7263692e204d616563656e6173206c61637573206d657475732c0020656c656966656e6420736564206d657475732075742c20657569736d6f640020657569736d6f642076656c69742e20496e746567657220696e2061636375006d73616e206d692e0a0a41656e65616e20696163756c69732076656c206a750073746f20756c7472696369657320766f6c75747061742e204372617320636f006e73656374657475722c2065726f73206e6f6e20756c6c616d636f727065720020696163756c69732c2076656c6974206578207665686963756c612076656c0069742c2073697420616d657420696163756c6973206a7573746f206469616d00206567657420657261742e20496e74656765722066696e6962757320736f6400616c6573206d617373612073697420616d6574206d616c6573756164612e2000496e2072686f6e6375732073617069656e206964207175616d207669766572007261207665686963756c612e20496e20686163206861626974617373652070006c617465612064696374756d73742e20446f6e656320616320706f7274746900746f72206e657175652c2073656420656666696369747572206c6967756c61002e20446f6e6563206567657420616c697175616d206c616375732c206e6f6e00207665686963756c61206e69736c2e2053656420706c616365726174206d61007474697320636f6e76616c6c69732e20496e746567657220736f64616c6573002c206e69736c2061207665686963756c61206469676e697373696d2c207665006c69742074656c6c7573206566666963697475722070757275732c20612076006573746962756c756d206f64696f206c61637573206964206469616d2e204e00756c6c616d20766974616520626c616e64697420656c69742e20507261657300656e742074696e636964756e74206c656374757320656c69742c206e6f6e200074656d707573206e69736c20677261766964612076697461652e204e756c6c0061206469616d2070757275732c206c616f7265657420766974616520656765007374617320696e2c20636f6e7365637465747572206574206d61757269732e002053656420766172697573206d6f6c6c697320656c656d656e74756d2e204e00616d2073697420616d6574206d61676e6120677261766964612c2068656e6400726572697420697073756d206e6f6e2c2074656d7075732073656d2e204d61006563656e6173206469676e697373696d206d6f6c6c69732072686f6e637573002e205365642066656c6973206e69736c2c2073656d7065722061742074656c006c75732065742c206d616c65737561646120616c697175616d20697073756d002e0a0a496e74656765722073757363697069742076656c6974206964207365006d206665726d656e74756d2c207175697320756c7472696365732073656d200074696e636964756e742e2041656e65616e2076656c20646f6c6f72206e6563002074757270697320656c656d656e74756d207363656c657269737175652e200050726f696e206f64696f20746f72746f722c20616c697175657420656765740020696d7065726469657420717569732c20736f6c6c696369747564696e20690064206c616375732e2050656c6c656e74657371756520656e696d20656c6974002c207375736369706974206964207175616d206e65632c206375727375732000616c697175616d2065726f732e20446f6e656320626962656e64756d207369007420616d6574206d657475732071756973207363656c657269737175652e20004e756e6320616320747572706973206a7573746f2e2053656420706c6163650072617420746f72746f72206e6563206c6163757320736f6c6c69636974756400696e207363656c657269737175652e2050686173656c6c7573207669746165002063757273757320657261742c20616320756c7472696369657320746f7274006f722e0a0a43726173206d616c6573756164612067726176696461206a757300746f2076656c207661726975732e204e756c6c616d206c616f7265657420690064206d617572697320696e20646170696275732e20437572616269747572200073757363697069742065782065676574207361676974746973206c7563747500732e20447569732071756973207669766572726120656c69742c20717569730020756c6c616d636f72706572206e756e632e204d617572697320656c65696600656e642c206d6173736120696e20626962656e64756d20616363756d73616e002c206578206e69736920766573746962756c756d206469616d2c2075742069006163756c697320647569206f72636920736564207475727069732e204e756c006c6120626962656e64756d2c2076656c697420657520636f6e76616c6c6973002073656d7065722c206d65747573206e69736c20706f7375657265206175670075652c2068656e64726572697420696163756c69732073617069656e20717500616d206574206469616d2e2050726f696e2076656c206e69736c206175677500652e20566976616d75732076656e656e61746973206d657475732073656420006d617572697320706f73756572652c20612068656e64726572697420656e69006d20766976657272612e204475697320636f6d6d6f646f206172637520657400206d61676e6120756c7472696365732070656c6c656e7465737175652e204e00616d20696e206c696265726f2076656e656e617469732c2076657374696275006c756d206175677565206c6163696e69612c20766172697573206c6f72656d002e20457469616d206574206c7563747573206c616375732e205175697371750065206d6f6c65737469652c206e69626820617420756c747269636573206d6100747469732c206c616375732075726e6120636f6e76616c6c6973206e756c6c00612c20696e206d616c657375616461206e756c6c61206c6563747573206e6f006e206469616d2e20457469616d206567657420697073756d206d61676e612e002050686173656c6c75732066656c6973207175616d2c20626962656e64756d002073697420616d657420726973757320717569732c20677261766964612065007569736d6f642066656c69732e0a0a46757363652076656e656e617469732000696e74657264756d20656c69742c20717569732072757472756d206f7263690020706f7375657265206e6f6e2e20496e20656c656966656e6420657374207100756973206469616d20666163696c697369732c206163206d616c65737561640061206d61737361206f726e6172652e204c6f72656d20697073756d20646f6c006f722073697420616d65742c20636f6e7365637465747572206164697069730063696e6720656c69742e205365642063757273757320616c697175616d206f0064696f2076656c2073757363697069742e2050656c6c656e74657371756520006163206c696265726f206163206572617420616c6971756574207361676974007469732e204d616563656e617320616e7465206c616375732c207363656c6500726973717565206574207472697374697175652076697461652c20656666690063697475722065676574207175616d2e2050686173656c6c7573207275747200756d20656c69742061756775652c2071756973206c6163696e6961206f726300692074696e636964756e74206e65632e20496e20636f6e736563746574757200206964206f726369206575207363656c657269737175652e2050656c6c656e0074657371756520616c69717565742074656d707573206f64696f207574207600756c7075746174652e2051756973717565206c696265726f206e69736c2c200072757472756d2061742073617069656e206e65632c206c616f726565742074007269737469717565206a7573746f2e2043726173206c6163696e6961206e690062682069642065726f732072757472756d207363656c657269737175652e20004e756e63206e6f6e206d6175726973206f7263692e204e616d20696d70657200646965742064617069627573206a7573746f2e20496e2076656c206c616375007320706f72747469746f722c207661726975732072697375732075742c2061006c697175616d20746f72746f722e2043757261626974757220696e206d65740075732076656c2065782076656e656e6174697320706f7274612e0a0a5375730070656e6469737365207365642070756c76696e6172206573742e205068617300656c6c7573206e6563206d6920656c656966656e642c20666575676961742000617263752061742c20706f72747469746f72206e6973692e204475697320650067657420626c616e6469742065782e20437261732061206475692065726f73002e20496e74657264756d206574206d616c6573756164612066616d65732061006320616e746520697073756d207072696d697320696e206661756369627573002e20496e2073656d206c696265726f2c20766f6c757470617420656765742000647569207365642c2070656c6c656e746573717565206c7563747573206578002e20536564206574206c656f20656765742065726f7320696e74657264756d00206d6178696d75732e2050686173656c6c7573206e6f6e206d6f6c657374690065206c65637475732c206e6f6e207665686963756c61206c65637475732e2000446f6e656320656666696369747572206d616c657375616461206d6175726900732c2065676574207472697374697175652073656d206c6f626f727469732000612e204e616d2074656c6c75732075726e612c2072686f6e63757320666572006d656e74756d20737573636970697420717569732c20696d70657264696574002071756973206f7263692e20557420637572737573206572617420766974610065206665726d656e74756d20666163696c697369732e204e756e632075742000626c616e646974206c6f72656d2e20566573746962756c756d2074656c6c750073206469616d2c20636f6e67756520657520706f73756572652075742c206c006f626f7274697320612073656d2e204e756c6c616d206163206f726369206e006f6e2075726e6120656c656966656e6420696d706572646965742e0a0a507200616573656e74207669746165206e69736c206672696e67696c6c612c207375007363697069742065726174207365642c20656c656d656e74756d207269737500732e20446f6e656320696420756c74726963696573206f64696f2e2050726f00696e206d6174746973206d61757269732061206d61737361206d6178696d750073207472697374697175652e2050686173656c6c7573206567657420706f730075657265206e6962682e2050686173656c6c757320736564206d657475732000657420657820636f6d6d6f646f20766f6c75747061742e2041656e65616e20006c6163696e69612c206175677565206e6f6e2065666669636974757220636f006e6775652c206d617373612073656d2076697665727261206469616d2c20710075697320706f737565726520647569206c6f72656d2061206c6f72656d2e2000496e2076756c7075746174652064756920657520656c6974207375736369700069742074656d706f722e204372617320696d70657264696574206d6175726900732073656420657820637572737573206c616f726565742e20566976616d750073206e65717565206573742c20666163696c6973697320717569732066656c00697320717569732c20706f72747469746f7220706f72747469746f72206e75006e632e204675736365206e6f6e206c6f626f72746973206c6f72656d2e0a0a004d616563656e617320766f6c75747061742066617563696275732074656c6c00757320756c747269636965732070756c76696e61722e2050686173656c6c750073206120706f72747469746f7220617263752e20446f6e65632076756c7075007461746520656e696d207475727069732c20612074696e636964756e7420640069616d2074656d706f722065752e20446f6e656320736f6c6c69636974756400696e2c206578207669746165206c756374757320766573746962756c756d2c00206e69736c20616e746520756c6c616d636f72706572206d692c2061742075006c7472696369657320656e696d20646f6c6f722073656420656c69742e20500072616573656e74206d6f6c6c697320656666696369747572207269737573200071756973207072657469756d2e20566573746962756c756d2071756973206600696e69627573206475692c2065676574206f726e617265206c65637475732e0020457469616d2065676574206a7573746f20766573746962756c756d2c2062006c616e6469742073656d20696e2c206d6178696d75732065726f732e0a0a5000686173656c6c7573206120697073756d206575206d69206375727375732073006f64616c6573206e656320736564206e6973692e2044756973206672696e6700696c6c6120657374206163206c6967756c612070756c76696e61722067726100766964612e2050726f696e207669766572726120616363756d73616e207365006d2c2076656c2072757472756d206e69736c20636f6e736571756174207665006c2e204e756e63206672696e67696c6c61206d657475732076656c206661750063696275732074656d706f722e205072616573656e7420636f6e73656374650074757220646170696275732061756775652c206574207363656c6572697371007565206c656374757320636f6e64696d656e74756d206e65632e204e756e630020616363756d73616e2c2075726e61206e6f6e20706c61636572617420756c007472696365732c206d617572697320617567756520736f6c6c69636974756400696e20616e74652c2073697420616d657420616c697175616d206c61637573002076656c69742061632074656c6c75732e205365642076656e656e61746973002c2074656c6c7573206e656320617563746f7220646170696275732c206c6f0072656d2073617069656e2073656d70657220657261742c206575207669766500727261207175616d2075726e61207669746165206c6f72656d2e204d61656300656e6173207375736369706974206e756e63207574206d6f6c657374696520006d61747469732e20416c697175616d20766974616520657374206469676e69007373696d2064756920656c656d656e74756d20617563746f722e0a0a4d6f72006269206e756c6c61206c616375732c2073656d7065722073697420616d6574002066656c69732065742c2076756c707574617465206d616c65737561646120006475692e2050726f696e20656765742065726f73206c65637475732e20446f006e65632074696e636964756e7420656c69742076656c20736f6c6c69636974007564696e2073616769747469732e2050726f696e206163206d6f6c6573746900652073656d2e2053757370656e646973736520696163756c69732076657374006962756c756d2073656d206574206d61747469732e2050726f696e206c6f62006f72746973206c616f72656574206469616d2c2073656420706f737565726500206573742074656d706f722065742e2053656420696e20746f72746f7220710075697320657820696d70657264696574206c6163696e69612071756973206e006563206c6f72656d2e204d616563656e617320636f6e76616c6c69732065660066696369747572206f7263692c20657420706f72747469746f72206e69736c0020666163696c69736973206e6f6e2e205365642068656e647265726974207600656e656e617469732066656c697320666175636962757320656c656d656e7400756d2e204d6f7262692061632064756920736f64616c65732c2070656c6c65006e74657371756520697073756d2076656c2c20736f64616c65732076656c6900742e20457469616d20656e696d206c6f72656d2c2076656e656e6174697320006163206c616375732065742c2065676573746173206d616c65737561646120006c65637475732e20416c697175616d20736f64616c6573206e6962682065660066696369747572206c656374757320616c697175616d20766573746962756c00756d206e6f6e2061206f64696f2e204d61757269732069642066617563696200757320656c69742c2073656d70657220706f72747469746f72206e756c6c61002e204675736365206f726e6172652c206a7573746f20696e20766568696375006c6120636f6d6d6f646f2c206c61637573206c6163757320636f6e677565200074656c6c75732c20757420666175636962757320697073756d207269737573002061206e756c6c612e20457469616d207669766572726120707572757320710075616d2c2076656c20706f72747469746f72206d6574757320696d70657264006965742065752e204d6f72626920636f6e76616c6c697320636f6e73657175006174206475692e0a0a4d61757269732074726973746971756520617263752000717569732072686f6e6375732064696374756d2e204e756e6320646f6c6f7200206c696265726f2c206d6178696d757320617420656e696d2075742c2067720061766964612072686f6e637573207175616d2e20566573746962756c756d20006d61747469732074696e636964756e7420666163696c697369732e20467573006365206e756c6c612061756775652c206567657374617320736564206c616300696e69612076697461652c206d616c657375616461206163206e756c6c612e00204d617572697320696163756c6973207072657469756d206c616375732c2000612066696e696275732075726e6120706f73756572652061632e204d6f7262006920696e74657264756d20666175636962757320657261742c2061206c616f0072656574206d61676e6120626c616e64697420612e2043726173206e656320006d61676e612071756973206c61637573206567657374617320696163756c6900732e0a0a4c6f72656d20697073756d20646f6c6f722073697420616d65742c0020636f6e73656374657475722061646970697363696e6720656c69742e2055007420756c74726963696573206f726369207175616d2c2073697420616d65740020656c656966656e6420616e7465206672696e67696c6c61206e65632e205000726f696e20616c697175616d20696e2074656c6c757320677261766964612000636f6e76616c6c69732e2050726f696e2072757472756d20636f6e7365717500617420656e696d20736564206d616c6573756164612e2041656e65616e206500676573746173206d657475732076697461652073656d20636f6e64696d656e0074756d2073757363697069742e2053757370656e6469737365206172637520006475692c206772617669646120696e2065726f732065742c206d61747469730020616c69717565742074656c6c75732e20496e74656765722070656c6c656e0074657371756520616e74652066696e69627573206d692072757472756d2061006c697175616d2e20496e7465676572206d6174746973206469616d2073656400206665756769617420696d706572646965742e2046757363652069642062690062656e64756d206d617373612e20496e74656765722061742074656d7075730020656e696d2e20416c697175616d206574206d6f6c6c6973206d61676e612e000a0a5365642073656d70657220656c656d656e74756d206d61737361206e6f006e20766976657272612e205365642073697420616d6574206d61676e612065007420697073756d207472697374697175652076756c7075746174652e205065006c6c656e74657371756520696e206c696265726f2073656d2e205375737065006e646973736520736f64616c65732074656d706f722061756775652074696e00636964756e7420666163696c697369732e204d616563656e6173207363656c006572697371756520697073756d20617420666575676961742064696374756d002e204d616563656e61732076656c2075726e6120736564206d657475732075006c74726963696573206d6f6c6c69732e204e756c6c61206c6f72656d206d6100757269732c2073757363697069742065676574206172637520696e2c207275007472756d2072757472756d206d617373612e204d616563656e61732061632000696d7065726469657420656c69742c207365642073757363697069742069700073756d2e2050726f696e206d6f6c6573746965206d6173736120617263752c00206120636f6e64696d656e74756d206f64696f20756c747269636573207369007420616d65742e205072616573656e742072686f6e637573206578207075720075732c2073656420706c616365726174206e756e63206f726e617265206574002e2050686173656c6c75732061206e696268206d616c6573756164612c2075006c6c616d636f72706572206e69736c2061742c2070656c6c656e74657371750065206c6f72656d2e2050686173656c6c7573206c6f72656d20697073756d2c0020756c6c616d636f727065722075742076756c70757461746520616c6971750065742c207661726975732065676574206c6f72656d2e0a0a4d6175726973200068656e6472657269742074696e636964756e74207175616d20616320696e7400657264756d2e20496e206120697073756d206e6f6e207175616d206d617869006d75732066696e696275732e20536564206f64696f2065782c206c6163696e00696120766974616520697073756d2073616769747469732c20766568696375006c6120656765737461732072697375732e204e756c6c616d20616320656c65006966656e6420646f6c6f722c20657520706f72747469746f722074656c6c7500732e204d616563656e617320746f72746f722076656c69742c20636f6e6469006d656e74756d20696420656e696d2076656c2c20657569736d6f64206f726e006172652072697375732e20416c697175616d206964206c6f72656d20696e7400657264756d2c20616c697175616d20707572757320696e2c20706861726574007261206a7573746f2e205574207669746165206c656f206469616d2e204e75006c6c6120656c656d656e74756d206e756e63206d657475732c206e65632076006172697573206f64696f2066696e69627573206e65632e20457469616d207100756973206e69736c20696e74657264756d2c20766f6c757470617420646f6c006f722065742c2072686f6e637573206e6962682e204d616563656e6173206e006f6e2072757472756d2061756775652c20657520656c656966656e64206d69002e20446f6e6563206c6f626f7274697320616e7465207669746165206175670075652070686172657472612c206174206c6163696e696120746f72746f7220007072657469756d2e0a0a4d616563656e61732061742074656d706f72206d6100676e612c20696e20737573636970697420656e696d2e204e756c6c6120656c00656d656e74756d2072757472756d2065782c206567657420736f64616c657300206e756c6c6120636f6e76616c6c69732076697461652e20566976616d757300206469676e697373696d2c2065726f7320657520656c656d656e74756d2073006f6c6c696369747564696e2c206c6f72656d20647569206c7563747573207300617069656e2c206163206d617474697320646f6c6f7220656e696d2073757300636970697420656c69742e204e756c6c61206567657420696d7065726469650074206d657475732e2043757261626974757220636f6e64696d656e74756d200061207075727573207363656c6572697371756520756c7472696365732e2041006c697175616d206c696265726f206d692c20766573746962756c756d206574002074656d706f722065752c2070686172657472612073697420616d65742065006c69742e20557420696420616c697175616d206c696265726f2e0a0a5365640020636f6e7365637465747572206c65637475732066696e69627573206c656300747573206f726e61726520706f7274612e20447569732073656420636f6e670075652073617069656e2c20757420696d7065726469657420656e696d2e205300656420656c656d656e74756d20696163756c6973206c6967756c612c206e6f006e2076656e656e617469732073617069656e206c75637475732069642e2053006564206566666963697475722c20616e7465207669746165206d6f6c657374006965206566666963697475722c20656c697420697073756d20636f6e64696d00656e74756d20697073756d2c2076656c206d6f6c6c6973206d61676e61206f0064696f207669746165206c616375732e2053757370656e64697373652065670065737461732073656d206f64696f2c20696e20766573746962756c756d206e0069736c20706f72747469746f722076656c2e20496e2074696e636964756e74002c206d657475732061206c6f626f7274697320756c7472696365732c2069700073756d206d6574757320766573746962756c756d206e756c6c612c2061742000696d7065726469657420746f72746f72206e6571756520736564206d692e20004d617572697320617420616e746520616e74652e20566573746962756c756d0020637572737573207665686963756c6120756c7472696365732e204d6f72620069206c7563747573206120657374206e656320696d706572646965742e20550074206e6f6e2075726e61206672696e67696c6c612c2065676573746173206d00657475732065752c2064696374756d20656c69742e20496e2064696374756d00207075727573206964206c656374757320616c69717565742074656d706f72002e20416c697175616d206572617420766f6c75747061742e204e616d206175006775652066656c69732c20696d70657264696574206174206d61676e61206e0065632c2070656c6c656e746573717565207661726975732074656c6c75732e000a0a4d616563656e617320656765742065782070656c6c656e746573717565002c20656c656d656e74756d206469616d2061742c20656c656966656e642064006f6c6f722e204e756c6c616d20626962656e64756d2065726f73206e65632000646f6c6f7220646170696275732c206174207361676974746973206573742000636f6e64696d656e74756d2e205072616573656e74206e6f6e2068656e647200657269742065726f732e204d616563656e617320636f6e736571756174206d006173736120766974616520647569207665686963756c612c20757420756c740072696365732072697375732073656d7065722e2053757370656e646973736500206461706962757320616e746520646f6c6f722c206120626962656e64756d002076656c69742074726973746971756520696e2e204d616563656e6173206e00656320696163756c697320656e696d2e20566573746962756c756d2073656400206f64696f2064696374756d2c20766573746962756c756d206f64696f2065006765742c20656c656966656e64206d657475732e204d617572697320616320006c696265726f20736564206c656f2070756c76696e617220636f6e76616c6c0069732e2044756973207665686963756c61206f72636920656c69742e2056650073746962756c756d206566666963697475722065676573746173206578206100206f726e6172652e2051756973717565206f726e617265206e6962682063750072737573206d6f6c65737469652070656c6c656e7465737175652e0a0a446f006e65632074696e636964756e7420666575676961742073757363697069742e0020566573746962756c756d20756c6c616d636f7270657220646f6c6f72206e006f6e206c6967756c6120766573746962756c756d2c20612070756c76696e610072206e756e6320636f6e7365717561742e20416c697175616d2070756c7669006e6172207661726975732074656c6c757320657520617563746f722e204d6100757269732076697665727261207665686963756c612065782c2076697461650020616c697175616d20617263752064696374756d2069642e205175697371750065207068617265747261207669746165206d61676e6120696e206f726e617200652e20566573746962756c756d207072657469756d207363656c6572697371007565206f64696f20696420636f6e73656374657475722e204e756c6c61207300656420656e696d207574207175616d20636f6e736563746574757220747269007374697175652e0a0a4e756c6c616d206f64696f206d61757269732c20666500756769617420657520666575676961742075742c20706f737565726520766900746165206d61676e612e205365642076697461652073656d70657220747572007069732c2073697420616d6574207363656c65726973717565206e756c6c61002e20517569737175652074656d707573206e6f6e206d692073656420706f7200747469746f722e2050726f696e206c656f2065782c20706f73756572652065007520656765737461732076656c2c206d6f6c657374696520736564206d65740075732e204e616d20747269737469717565206c616375732065742069707375006d206d6178696d757320756c747269636965732e204e756c6c616d20706f7300756572652073697420616d65742073617069656e206d6f6c65737469652075006c6c616d636f727065722e204d6f72626920656765737461732c20657261740020616320626c616e6469742064696374756d2c2073617069656e206e69736c002066696e69627573206e6973692c2073656420656666696369747572206c6500637475732073656d20657520697073756d2e2050686173656c6c7573206c65006f2061756775652c2076756c70757461746520706c616365726174206175670075652065752c2074656d706f722074696e636964756e74206c6f72656d2e200046757363652073697420616d65742073656d70657220746f72746f722e0a0a0053757370656e646973736520706f74656e74692e204d616563656e6173206900642064617069627573207475727069732c206e6f6e2076756c707574617465002065782e204e756c6c616d2072757472756d206c6967756c61206e65632072006973757320737573636970697420766f6c75747061742e20416c697175616d00206c7563747573206e657175652073697420616d65742061726375207472690073746971756520766f6c75747061742e205365642076697461652066656c690073206c6f72656d2e20416c697175616d20706c61636572617420656c656d65006e74756d2073617069656e2c2076697461652076756c7075746174652072690073757320766f6c757470617420696e2e204d616563656e6173207669746165002064756920657261742e2050686173656c6c7573206672696e67696c6c61200073617069656e2073656420647569207665686963756c612c207661726975730020636f6e736563746574757220616e746520736f6c6c696369747564696e2e00204372617320696163756c69732c2073617069656e20696e74657264756d2000696d70657264696574206566666963697475722c20647569206d6175726973002070756c76696e617220697073756d2c2061742076656e656e61746973206e0069736c206f64696f2071756973207175616d2e204e756e63206566666963690074757220636f6e73656374657475722073656d7065722e204e756c6c616d2000706f7375657265206e756c6c612072686f6e6375732070756c76696e61722000756c747269636965732e204e756e632074656c6c757320617263752c206865006e64726572697420736f6c6c696369747564696e206469616d207669746165002c2068656e6472657269742066696e696275732065782e0a0a536564206c6f00626f72746973206d6174746973206c6967756c612c20766974616520636f6e0076616c6c6973206c656f2064617069627573206e6f6e2e204d616563656e610073207669746165206c61637573206575206e69736c20617563746f7220656c00656d656e74756d206e6563207669746165206c65637475732e204d61656365006e6173207669746165206f726369207669746165206d6920756c6c616d636f007270657220706f72747469746f72206964206c6f626f72746973206e69736c002e20446f6e6563206964206d617572697320697073756d2e20416c69717561006d206572617420766f6c75747061742e20566976616d7573206c6f626f7274006973206e696268207574206573742076756c7075746174652066657567696100742e20496e7465676572206c696265726f207175616d2c20756c74726963650073206174206f7263692061742c20636f6e677565206665726d656e74756d20006d617373612e20457469616d2069642065726f7320696163756c69732c2063006f6e64696d656e74756d206f7263692074696e636964756e742c206d617474006973206d657475732e204d616563656e617320756c747269636573207369740020616d657420646f6c6f722069642070656c6c656e7465737175652e2056650073746962756c756d20706f727461206d6178696d7573206e69736c2c20696e002066696e6962757320746f72746f7220766f6c75747061742075742e2055740020677261766964612c20646f6c6f7220756c7472696365732068656e6472650072697420666575676961742c20656e696d2073656d20696e74657264756d20006c6967756c612c20616320656666696369747572206572617420656c697420006964206c6f72656d2e20496e2073697420616d657420756c6c616d636f7270006572206c6f72656d2e0a0a50686173656c6c7573206c6967756c612075726e00612c20636f6e736571756174206574206c756374757320612c206f726e617200652065742061756775652e20566573746962756c756d20657420616e746520006174206c6163757320626962656e64756d20696d706572646965742e2045740069616d2074757270697320617263752c2063757273757320766974616520760069766572726120612c2068656e64726572697420766974616520617263752e002050726f696e206f726e617265206d6175726973207574206d61676e61206d006f6c6573746965206d61747469732e20446f6e65632074656d706f72206c6500637475732071756973206d617373612076756c70757461746520696e7465720064756d2e2050726f696e206575206c6967756c61206469616d2e204d61656300656e6173206461706962757320747572706973206c65637475732c2075742000666163696c6973697320656c6974206469676e697373696d2075742e204e75006e6320626c616e646974206f726369206120616e746520666163696c69736900732c20617420636f6e76616c6c69732066656c697320666163696c69736973002e20437572616269747572207375736369706974206d692061206c69626572006f20706f73756572652c2071756973206f726e617265206a7573746f2076690076657272612e2050656c6c656e746573717565206861626974616e74206d6f00726269207472697374697175652073656e6563747573206574206e6574757300206574206d616c6573756164612066616d6573206163207475727069732065006765737461732e204e756c6c612070756c76696e6172207363656c6572697300717565206d61676e612c2065676574206c6f626f72746973206e6962682063006f6d6d6f646f2061742e20447569732065676574207661726975732066656c0069732c20636f6e64696d656e74756d20706c616365726174206c6563747573002e20416c697175616d20617563746f722074656d706f722075726e61206575002070756c76696e61722e204d6f726269206375727375732074656d706f7220006e657175652c206e6f6e20626c616e64697420646f6c6f7220666163696c690073697320656765742e2053656420736564206c6f626f727469732073656d2e000a0a4d617572697320756c7472696369657320656c69742075726e612c207600656c20616c697175657420707572757320617563746f722076697461652e20005072616573656e742076697665727261206f64696f2074656c6c75732c20710075697320706f7375657265206e756c6c6120616c69717565742061742e204c006f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7300656374657475722061646970697363696e6720656c69742e20437572616269007475722065676574206d65747573206174206c6967756c6120656c65696665006e6420706861726574726120696e206d616c657375616461206475692e20440075697320636f6e7365637465747572206469616d2075742066657567696174002072757472756d2e20566976616d757320657569736d6f64206e69736c207600656c206d6178696d75732073616769747469732e20496e20636f6d6d6f646f002073697420616d6574206c6f72656d2065742074696e636964756e742e205500742070656c6c656e746573717565206e756c6c61206e6f6e206d61757269730020636f6e64696d656e74756d2c2069642076756c707574617465206f64696f0020626c616e6469742e2053757370656e6469737365206e6f6e20707265746900756d206d61757269732c206e65632074696e636964756e742073617069656e002e0a0a4675736365206461706962757320657569736d6f6420747572706973002c20757420656c656d656e74756d20656e696d20657569736d6f64206e6f6e002e204e616d2061206e6962682074656c6c75732e2050656c6c656e7465737100756520696163756c697320746f72746f722073656420706f72747469746f720020636f6e64696d656e74756d2e204375726162697475722066617563696275007320747572706973206d6178696d75732c2076656e656e6174697320616e740065207365642c206d6f6c6c69732072697375732e205365642074656d70757300206d61676e612065676574206e756e6320706f72747469746f722c206174200072757472756d207175616d20636f6d6d6f646f2e20496e746567657220626c00616e646974207661726975732074656c6c75732073697420616d6574207275007472756d2e2050726f696e206d6f6c6c697320747269737469717565206e6500717565207365642074656d7075732e204475697320706c6163657261742c20006f7263692069642064696374756d20766573746962756c756d2c206c696775006c6120646f6c6f7220766f6c7574706174206c656f2c2076697461652066610075636962757320656e696d206e756c6c6120717569732065782e20437261730020666175636962757320657374206573742c2073697420616d65742061636300756d73616e206c6163757320696d706572646965742069642e204e616d206d0061747469732c206e756e6320736564206469676e697373696d20706c616365007261742c206d617373612075726e6120696163756c69732076656c69742c200071756973206c7563747573206469616d206a7573746f206575206e6973692e0020416c697175616d206572617420766f6c75747061742e0a0a50656c6c656e00746573717565206e6571756520617263752c20636f6e677565206e6f6e2061007567756520717569732c2074726973746971756520696e74657264756d206e00756e632e2050726f696e20646f6c6f7220746f72746f722c206461706962750073207365642070656c6c656e74657371756520612c2072757472756d206567006574206e6973692e20437261732065742074656d7075732074656c6c75732e00204e756c6c6120706f72747469746f722c206e69736920657520617563746f0072207661726975732c206572617420746f72746f722072757472756d20747500727069732c206e6f6e2068656e64726572697420616e7465206e6571756520007574206573742e20416c697175616d2076756c7075746174652076656c69740020766974616520657569736d6f6420656765737461732e20496e7465676572002072757472756d206d6f6c6c697320617263752c20757420756c7472696369006573206a7573746f206d6f6c6c697320656765742e20457469616d206174200066696e6962757320656e696d2c206574206d6174746973206d61757269732e00204d616563656e617320696e20616c69717565742061756775652e204e616d0020756c74726963657320656c656d656e74756d20617263752076656c20616c00697175616d2e20566573746962756c756d20696e206c6967756c6120747269007374697175652c206661756369627573206f64696f20656765742c206c6f62006f72746973206a7573746f2e204d6f726269206575206e756e63207369742000616d657420726973757320636f6e73657175617420616c697175657420736500642061632065782e20496e2068656e64726572697420756c7472696369657300206c6967756c612c2071756973207375736369706974206c6563747573206400696374756d2065752e20536564206c616f7265657420636f6e67756520756c007472696365732e2050686173656c6c7573207375736369706974206d6173730061206120666163696c6973697320696d706572646965742e0a0a44756973200074696e636964756e742065726f732071756973206772617669646120766172006975732e2053757370656e6469737365206e6f6e206475692070757275732e0020496e74657264756d206574206d616c6573756164612066616d65732061630020616e746520697073756d207072696d697320696e2066617563696275732e0020446f6e65632061742070756c76696e61722066656c69732e20446f6e656300206e656320616c697175616d2065726f732c2064696374756d20626962656e0064756d20617263752e20496e206e656320646f6c6f722066696e696275732c00207072657469756d206c6967756c612065742c20636f6e736571756174206500782e20496e206861632068616269746173736520706c61746561206469637400756d73742e20457469616d2074656c6c757320656e696d2c20696e7465726400756d2073656d70657220697073756d20736f64616c65732c206772617669640061206672696e67696c6c6120646f6c6f722e204e756c6c61206c6163696e690061206a7573746f20736f6c6c696369747564696e206c616f72656574206d6f006c65737469652e20457469616d20616320766573746962756c756d20717561006d2c20696420657569736d6f6420697073756d2e205574206174206772617600696461206c6f72656d2e2053757370656e646973736520696e74657264756d0020656c656966656e64206c65637475732c2065752073656d7065722070757200757320766f6c757470617420612e0a0a55742076656c20617567756520756c007472696365732c2074696e636964756e74206d6173736120612c20736167690074746973206e69736c2e2050726f696e206567657420616e746520616c69710075616d2c206f726e6172652061756775652070656c6c656e7465737175652c0020646170696275732070757275732e20496e206574206d657475732061726300752e2050656c6c656e74657371756520616c697175616d20626c616e6469740020617263752071756973207472697374697175652e204d617572697320746f0072746f72206d617373612c206d6178696d75732071756973207661726975730020612c20706f72747469746f7220636f6e73656374657475722073656d2e200050726f696e207665686963756c6120707572757320657420696163756c69730020636f6e73656374657475722e20557420736f6c6c696369747564696e206600696e6962757320657820696e20656c656d656e74756d2e204f7263692076610072697573206e61746f7175652070656e617469627573206574206d61676e690073206469732070617274757269656e74206d6f6e7465732c206e6173636574007572207269646963756c7573206d75732e205072616573656e74206e65632000696d70657264696574206d61676e612e205574206d616c65737561646120690064207075727573206e656320766573746962756c756d2e2053757370656e64006973736520616363756d73616e2065726174206c656f2c20696e20666175630069627573206469616d20696163756c69732073697420616d65742e20447569007320736f6c6c696369747564696e206c6563747573207175697320656e696d00206c6163696e696120657569736d6f642076656c2075742061756775652e0a000a416c697175616d20756c7472696369657320636f6e76616c6c6973207465006c6c75732c206964206567657374617320656c69742073616769747469732000696e2e204372617320706f72747469746f72206e6973692065676574207361007069656e20636f6e76616c6c697320706f73756572652e204d6175726973200067726176696461206e65717565207669746165206c696265726f20637572730075732c20696420636f6e736571756174206e657175652072686f6e6375732e0020496e746567657220616c69717565742065676574206e696268206163207000686172657472612e204e756c6c616d20696163756c6973206e69736c206665006c69732c207175697320696d70657264696574206e756c6c6120756c74726900636573207365642e205175697371756520747269737469717565206c61637500732061742072686f6e63757320706f7274612e204e616d20616320636f6e6400696d656e74756d2075726e612e20536564206e656320706f72747469746f7200206e6962682e205365642067726176696461206d61676e612069642070757200757320706f737565726520766573746962756c756d206e6f6e20736564206e006973692e20566573746962756c756d2061726375207475727069732c2069610063756c69732076656c20636f6e7365717561742069642c206c6f626f72746900732073697420616d65742065782e205072616573656e742071756973207465006d706f722061756775652e204e756c6c61206567657420656e696d20656c65006966656e642c2074696e636964756e74206c696265726f2073697420616d6500742c206d6174746973206e6973692e20446f6e65632064756920657261742c002070756c76696e61722076656c207075727573206e65632c20666163696c69007369732066696e69627573206c6f72656d2e204e756c6c616d20756c7472690063657320707572757320766573746962756c756d20636f6d6d6f646f20616c00697175616d2e0a0a4f72636920766172697573206e61746f7175652070656e00617469627573206574206d61676e6973206469732070617274757269656e7400206d6f6e7465732c206e61736365747572207269646963756c7573206d7573002e204e756e6320626c616e646974206e756c6c612072697375732c2076656c0020736f64616c6573206c6f72656d206f726e6172652061632e20496e746567006572206e6f6e20646f6c6f7220626962656e64756d2c206f726e6172652074006f72746f7220656765742c20756c7472696369657320697073756d2e204165006e65616e2066696e69627573206469676e697373696d206f726e6172652e20004d61757269732074656d7075732c206572617420617420626962656e64756d0020617563746f722c206c656f20656c6974206c6163696e6961206f64696f2c002061742074656d7075732061726375206475692071756973206573742e20500072616573656e74206672696e67696c6c61206c6f72656d206d616c6573756100646120706f72747469746f7220696d706572646965742e20496e7465726475006d206574206d616c6573756164612066616d657320616320616e74652069700073756d207072696d697320696e2066617563696275732e204d6f7262692076006974616520666163696c69736973206c6f72656d2c20766974616520636f6e0073657175617420697073756d2e20457469616d20696420656c656d656e7475006d20657261742e204e616d20646f6c6f72206c656f2c2074656d706f722061006320657820717569732c206469676e697373696d206665726d656e74756d2000616e74652e0a0a446f6e65632061206e756c6c612072697375732e204d6175007269732066617563696275732c206e756e63206163206d6178696d7573207600656e656e617469732c206d61676e612076656c6974207072657469756d2061006e74652c206e6f6e206665726d656e74756d20656c6974206d617572697320006e6f6e206e756e632e20446f6e65632068656e6472657269742075726e61200061742074656c6c757320636f6e76616c6c69732c2061632066617563696275007320656c6974206c6f626f727469732e204e756c6c616d20626962656e6475006d20656c656966656e64206d61676e612073697420616d657420696e7465720064756d2e20496e20696e20736f64616c657320746f72746f722c206e6f6e20006c6f626f72746973206d692e205072616573656e742076656c2073656d206100206f64696f2076656e656e6174697320666163696c697369732e2056657374006962756c756d206163206d6f6c657374696520646f6c6f722c206174206669006e69627573206e6973692e0a0a566573746962756c756d20616e74652069700073756d207072696d697320696e206661756369627573206f726369206c75630074757320657420756c74726963657320706f737565726520637562696c6961002063757261653b2046757363652061632074656d70757320617263752c2076006974616520696163756c6973206e657175652e2055742061206e69736c207500742076656c697420636f6e73657175617420636f6e64696d656e74756d207600697461652065676574206e6962682e2044756973206574206d61676e612061006c69717565742c20636f6e76616c6c697320656c69742069642c20756c6c61006d636f72706572206d692e20566976616d757320696d70657264696574206600656c6973207175697320636f6e7365717561742072757472756d2e204d6f7200626920757420617263752073697420616d657420617567756520636f6e677500652074696e636964756e742e2053757370656e64697373652061206d617474006973206f7263692e204e756e6320656765737461732c2076656c69742073650064206469676e697373696d2073656d7065722c20656c6974206d61757269730020626962656e64756d206e657175652c206567657420616c697175616d206e00697369206e65717565206120616e74652e204e616d2066657567696174206e006571756520646f6c6f722e20566573746962756c756d20616e74652069707300756d207072696d697320696e206661756369627573206f726369206c75637400757320657420756c74726963657320706f737565726520637562696c6961200063757261653b20557420696e20636f6e736563746574757220646f6c6f722e002051756973717565206e6f6e20636f6e677565206e657175652e0a0a4e756c006c61207363656c657269737175652c206e65717565206567657420636f6e7600616c6c697320626962656e64756d2c206c6f72656d206d65747573207068610072657472612070757275732c2073656420626c616e6469742065726174206100726375206575206e6973692e204d617572697320706c616365726174206d6100737361206575206e6571756520766f6c75747061742c2073697420616d6574002076697665727261207269737573207363656c657269737175652e20496e200076656c20766573746962756c756d206e756c6c612e20416c697175616d207200686f6e6375732061632061756775652076656c2076756c7075746174652e20004d6175726973207669746165206469616d20696d706572646965742c20766f006c7574706174206e6962682065752c206661756369627573206d657475732e0020457469616d2070656c6c656e74657371756520747572706973206964206e0069626820636f6e73657175617420736f6c6c696369747564696e2e204e756e00632065676574206a7573746f2070756c76696e6172206d65747573207275740072756d206c75637475732073697420616d65742061206d657475732e204e75006c6c6120666163696c6973692e2053757370656e646973736520657520617500677565206c65637475732e2053757370656e646973736520736f6c6c69636900747564696e20657569736d6f64207661726975732e2050686173656c6c75730020616e746520657261742c20666175636962757320696420746f72746f7220006e65632c207363656c6572697371756520766172697573206e756e632e0a0a00457469616d206672696e67696c6c6120766f6c7574706174206d692c20706f00737565726520766573746962756c756d206c6967756c6120756c7472696365007320696e2e20446f6e6563207665686963756c612074757270697320717569007320756c74726963696573207661726975732e20446f6e65632073656d7065007220616e746520657261742c20616320666575676961742074656c6c75732000626962656e64756d2069642e20446f6e656320697073756d206e69736c2c200070756c76696e6172206e6563207175616d20696e2c20736f6c6c69636974750064696e20696e74657264756d20656e696d2e20566976616d7573206c616f72006565742074656c6c75732065676574206f72636920636f6e64696d656e7475006d207363656c657269737175652e2050726f696e20657420666175636962750073206f64696f2c206163206566666963697475722061756775652e2055742000696e74657264756d20747269737469717565206475692074656d7075732070006f7274612e20416c697175616d206672696e67696c6c6120707572757320760069746165206e6962682074656d706f7220626962656e64756d2e205175697300717565206574207361676974746973206f7263692c2061742074656d706f72002076656c69742e205365642066696e696275732073617069656e20657420740075727069732073656d7065722c206e6f6e206d6f6c6573746965206e756e6300206c75637475732e20536564206a7573746f206e6973692c20736f6c6c69630069747564696e20696e20697073756d20696e2c206665726d656e74756d20700072657469756d206f64696f2e204e756c6c6120757420766f6c7574706174200073656d2e0a0a436c61737320617074656e742074616369746920736f63696f00737175206164206c69746f726120746f727175656e742070657220636f6e7500626961206e6f737472612c2070657220696e636570746f732068696d656e6100656f732e204e756c6c61206e6f6e206f726369206d692e2056657374696275006c756d207361676974746973206f72636920657520636f6e64696d656e7475006d20636f6e6775652e20446f6e656320736564206d61676e612070656c6c65006e7465737175652c20706c61636572617420697073756d207365642c20616c00697175616d2073656d2e2043757261626974757220696d706572646965742000617567756520657420656c697420706c6163657261742c2061742070756c7600696e617220617263752066617563696275732e20566573746962756c756d2000666575676961742c20697073756d20617420756c747269636573206d6f6c6500737469652c206e65717565206f64696f20656c656966656e642076656c6974002c2061742065676573746173206f72636920647569206574206573742e2049006e7465676572207574206a7573746f206c65637475732e204e756c6c616d20006665756769617420696e74657264756d206f726369206e656320617563746f00722e0a0a446f6e656320616c697175657420616363756d73616e206d61737300612c20766974616520666163696c697369732072697375732e20467573636500207072657469756d206e756e63206e6f6e20636f6e73657175617420656c65006d656e74756d2e204d616563656e617320636f6e64696d656e74756d20736300656c6572697371756520706f72747469746f722e204f7263692076617269750073206e61746f7175652070656e617469627573206574206d61676e697320640069732070617274757269656e74206d6f6e7465732c206e6173636574757220007269646963756c7573206d75732e204d6175726973206e6563207075727573002066617563696275732c2074656d707573206469616d206e65632c20756c74007269636573206f7263692e2041656e65616e2066617563696275732c207361007069656e20757420706f72747469746f7220616c69717565742c206e756e6300206572617420636f6e6775652061756775652c2071756973206469676e69730073696d2073656d20697073756d206574206469616d2e2053757370656e646900737365206772617669646120657569736d6f6420697073756d2c206120696d0070657264696574206e756c6c6120636f6e7365717561742061632e2050726f00696e207175697320636f6e73657175617420697073756d2c20696e20737573006369706974206e657175652e204e616d207669746165207669766572726120006c656f2e2041656e65616e20756c74726963657320706c6163657261742062006c616e6469742e20496e7465676572206e6571756520617263752c2066616300696c697369732073697420616d6574206f726369207365642c2076657374690062756c756d206672696e67696c6c6120746f72746f722e2050656c6c656e740065737175652066657567696174206575206c6967756c612065676574206c6f00626f727469732e20536564206575206d6f6c6c69732065782c20696e206461007069627573206c616375732e20467573636520616c697175616d2c206e657100756520636f6e73657175617420666163696c6973697320706c616365726174002c20697073756d206f72636920696163756c6973206a7573746f2c20696d700065726469657420706f7375657265206d61676e61206f64696f206e6563207500726e612e20437572616269747572206d6f6c6c69732c20657820696e2066610063696c6973697320766f6c75747061742c206e697369206a7573746f20656c00656966656e64206c696265726f2c20612070656c6c656e7465737175652065006e696d206d61676e612071756973206e6962682e204d617572697320756c7400726963696573206469616d2065676574206c616375732070756c76696e6172002c20657420636f6e64696d656e74756d206e6962682073656d7065722e0a0a00566976616d757320746f72746f72207175616d2c20616c697175657420696e00206e756e632075742c206f726e61726520756c74726963696573206e65717500652e2050656c6c656e74657371756520637572737573206163206a7573746f0020766974616520756c747269636965732e20446f6e65632065676574206e6900736c2071756973206f726369206772617669646120766f6c75747061742065007420696420656e696d2e2053656420706f72747469746f72206c616375732000717569732073656d20756c74726963657320666163696c6973697320757420006567657420656e696d2e20416c697175616d20696163756c6973206572617400206e6563206d617373612072686f6e6375732068656e6472657269742e2041006c697175616d206f726e6172652070686172657472612075726e612065752000617563746f722e20566976616d7573206964206469616d206120617567756500206567657374617320636f6e6775652e205072616573656e742068656e647200657269742073617069656e20696e206f72636920636f6e6775652c20656765007420636f6e6775652073617069656e20696d706572646965742e205365642000617563746f7220657374206163206c7563747573206c6163696e69612e2049006e7465676572206e65717565206e657175652c20656c656966656e64207665006c206c656f2069642c20626962656e64756d20756c6c616d636f72706572200073656d2e20566573746962756c756d2076656c20666163696c6973697320650073742e20536564207175697320766f6c7574706174207475727069732e0a0a004e616d206d6174746973206d6f6c6573746965206d61676e612c2076697461006520636f6e736571756174206d657475732e204e616d206d6178696d75732000657569736d6f6420656c6974206e6563206f726e6172652e204e756c6c6120006d6f6c6c697320696420707572757320717569732074656d706f722e205065006c6c656e7465737175652072686f6e63757320656765737461732066657567006961742e204475697320756c74726963657320656c6974207574206c6f7265006d2070756c76696e617220736f6c6c696369747564696e2e2043757261626900747572206672696e67696c6c612076756c7075746174652076656e656e61740069732e204d61757269732074656d706f7220617563746f722075726e612e0a000a496e206861632068616269746173736520706c617465612064696374756d0073742e204d616563656e617320617563746f72206d61747469732062696265006e64756d2e20566573746962756c756d2074656d7075732072686f6e63757300206c65637475732c2069642072686f6e637573206e69736c206d6178696d7500732061742e204475697320766172697573206672696e67696c6c6120617567007565206e656320666163696c697369732e204e756c6c6120696163756c69730020612070757275732065676574206665726d656e74756d2e20457469616d20006e6563207361676974746973206f7263692e205072616573656e74206d6174007469732066656c69732072697375732e204e616d206567657420656c656d65006e74756d206c6967756c612e20436c61737320617074656e74207461636974006920736f63696f737175206164206c69746f726120746f727175656e74207000657220636f6e75626961206e6f737472612c2070657220696e636570746f73002068696d656e61656f732e2050686173656c6c75732065676573746173207000757275732070656c6c656e7465737175652c2070656c6c656e746573717565002076656c6974206e6f6e2c206772617669646120656c69742e0a0a53656420006e6f6e2074656d7075732070757275732e2053757370656e6469737365207000756c76696e6172206d65747573206e657175652c206e6f6e207472697374690071756520697073756d20706f727461206e6f6e2e205574206567657420747500727069732074696e636964756e742c2074656d706f722073656d2071756973002c2076656e656e61746973206d61676e612e20566573746962756c756d20690064206d6178696d75732072697375732e204475697320616c69717565742070006f73756572652066656c697320696e20706c6163657261742e2051756973710075652076656c6974206f64696f2c20656666696369747572206174206d617300736120612c20747269737469717565206f726e61726520646f6c6f722e204e00756c6c616d206567657374617320706c61636572617420647569207574207300656d7065722e20416c697175616d20717569732073617069656e206d65747500732e204475697320656c656d656e74756d2c2065726174206e656320626c61006e6469742072686f6e6375732c2065726f7320656e696d207363656c65726900737175652061756775652c206e656320766976657272612065726f73206c65006f206575206c656f2e204d6f7262692073656420666163696c69736973206a007573746f2e20566976616d75732073697420616d6574206d61676e61206865006e647265726974206c656f206772617669646120617563746f722e0a0a4e75006e632063757273757320616c6971756574206f64696f2e204e756e632069610063756c69732065742074757270697320617420756c747269636965732e204e00616d2076756c70757461746520656e696d2065676574207075727573207465006d707573206f726e6172652e204e756c6c616d20636f6e736571756174206d006f6c6573746965206469616d2c20766974616520756c747269636573206e6900626820706f72747469746f722065742e20566573746962756c756d20766f6c007574706174207574206c6f72656d20656765742070656c6c656e746573717500652e204e616d2064617069627573206c696265726f206d692e2050656c6c65006e7465737175652074696e636964756e74206e696268206e657175652c20610020696e74657264756d206c6f72656d20636f6e6775652076656e656e61746900732e2050686173656c6c757320696e2073656d206574206d617373612066610075636962757320616363756d73616e2074696e636964756e742076656c206e006962682e0a0a4e756c6c61206d616c657375616461206e69736c206e69736c002c206575206d6f6c657374696520697073756d206d6f6c6c69732065676574002e20416c697175616d2076756c70757461746520707572757320736564206c006967756c6120736167697474697320616c69717565742e20496e20616c69710075616d206469616d20677261766964612072757472756d2070756c76696e6100722e20496e206d616c6573756164612075726e612065676574206f726e6172006520656765737461732e20566573746962756c756d20766974616520736365006c65726973717565206573742c206567657420766573746962756c756d206f007263692e2050656c6c656e746573717565206672696e67696c6c61206d616c0065737561646120706f73756572652e204e756c6c6120696e74657264756d20006c656f207669746165207072657469756d20706f73756572652e204e616d20006d6f6c6c69732065726f73207365642074656c6c7573206d6174746973207300616769747469732e0a0a53757370656e646973736520636f6e64696d656e7400756d206c6563747573206574206c6f72656d20657569736d6f6420637572730075732e204d6175726973206172637520617263752c2072757472756d20636f006e73657175617420707572757320696e2c206567657374617320696163756c006973206c696265726f2e204d6f726269207068617265747261206d6178696d007573206d617373612c206567657420626c616e64697420747572706973207000756c76696e61722065742e204d6175726973206e656320646f6c6f72207665006e656e617469732c2070656c6c656e746573717565206d61676e612069642c0020617563746f722075726e612e204d616563656e617320766976657272612000706f72747469746f72206e6973692c2076656c20756c74726963696573206500726174206375727375732061742e20467573636520636f6e6775652074656c006c75732076697461652073617069656e20747269737469717565206665726d00656e74756d2e20446f6e656320696d706572646965742073656d206e6f6e20006d617572697320756c7472696365732076656e656e617469732e20437261730020756c747269636573206c6f72656d206c656f2e2053656420736564207665006e656e61746973206e657175652c2076697461652065676573746173206665006c69732e205072616573656e7420617420616e746520706f7274612c20636f006e64696d656e74756d206c65637475732076697461652c20706f7274746974006f72206e657175652e204e616d2074656c6c7573206c616375732c20747269007374697175652074656d706f72206e756c6c61206e65632c20706c6163657200617420626962656e64756d2061756775652e204e756c6c616d20657569736d006f642076697665727261206f7263692c206575206772617669646120656e69006d20636f6e64696d656e74756d20626962656e64756d2e2053757370656e6400697373652065676574206c6f72656d20766974616520697073756d20706c610063657261742070656c6c656e74657371756520696420636f6d6d6f646f206f0064696f2e204675736365206d61747469732075726e61207574206475692063006f6d6d6f646f2c206e656320636f6d6d6f646f20647569207068617265747200612e0a0a496e206861632068616269746173736520706c61746561206469630074756d73742e204e616d206a7573746f206e6962682c207665686963756c61002061206c6967756c612065752c206d617474697320656c656966656e64206c006967756c612e205175697371756520656765742074757270697320612061750067756520747269737469717565206665726d656e74756d2e204e756c6c616d00207669746165206c61637573206d6f6c65737469652c207363656c65726973007175652061756775652061742c20656c656966656e64206e69736c2e204e75006c6c61206d61676e612065726f732c20636f6e76616c6c697320736564206f0064696f207363656c657269737175652c206c6f626f7274697320636f6e7661006c6c6973206e6962682e204e616d206174207361676974746973206175677500652c20657520766172697573206c6967756c612e204e756c6c616d20706f730075657265206d6178696d7573206e697369206e656320616c69717565742e2000457469616d207363656c657269737175652071756973206469616d20656765007420656765737461732e205072616573656e7420756c7472696369657320730063656c65726973717565206d69206e656320626962656e64756d2e2056657300746962756c756d20616c697175616d2074656c6c75732076656c206a757374006f206c616f726565742c207574207072657469756d2073656d206f726e617200652e204e616d20616e7465206e6962682c2066696e69627573206e6563207300617069656e20612c2076656e656e6174697320636f6e677565207269737573002e20496e2076656c206e65717565206120656e696d20636f6e7365637465740075722070656c6c656e7465737175652e20566976616d757320636f6e76616c006c697320657374207574206e756c6c6120736167697474697320706f7375650072652e2050656c6c656e74657371756520626962656e64756d20736f64616c00657320697073756d2065742068656e6472657269742e0a0a536564207269730075732066656c69732c20736f6c6c696369747564696e206575206d6f6c6573007469652065742c20657569736d6f6420656765742065782e20457469616d200065676574206e756c6c61206e6962682e2043726173206772617669646120610020746f72746f722076697665727261207661726975732e2050686173656c6c0075732066696e696275732c2073617069656e20657420616c697175616d2075006c7472696365732c206d61757269732065726f7320706f72747469746f72200065726f732c20616320636f6e677565206c656f206573742065676574206d6100757269732e20536564206e756e632076656c69742c2065676573746173207300656420656c69742065752c20657569736d6f64206d6178696d7573207361700069656e2e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b2000566573746962756c756d206c656f206a7573746f2c20636f6d6d6f646f2071007569732076756c7075746174652061742c20736f6c6c696369747564696e200073697420616d6574206573742e205365642070756c76696e61722c2076656c00697420736564206469676e697373696d20766976657272612c206d617373610020646f6c6f722073656d706572206c6f72656d2c206e6f6e206d6f6c657374006965206d6175726973206f64696f2065742070757275732e204d616563656e006173206c6f626f7274697320696e74657264756d206e756e63207574206d6f006c65737469652e20536564206d6f6c6c697320636f6d6d6f646f2076656e65006e617469732e20496e74657264756d206574206d616c657375616461206661006d657320616320616e746520697073756d207072696d697320696e206661750063696275732e2055742073656420617263752076656c69742e204d617572690073206175677565206e756c6c612c206f726e617265206e656320616c697175006574207365642c20636f6d6d6f646f20696e206475692e0a0a496e74656765007220736f6c6c696369747564696e2075726e612065676574206e756c6c61200070686172657472612c206e6f6e20766172697573206e657175652070756c7600696e61722e204e756c6c61207574206c656374757320736564206d61757269007320756c6c616d636f7270657220706f7274612e2051756973717565206e650063206469616d207472697374697175652c2064617069627573206c65637475007320612c20616c697175616d206e6962682e2043757261626974757220616c006971756574206d6f6c6c69732073617069656e207574206d6f6c6573746965002e2050686173656c6c7573207361676974746973206e69736c20766974616500206d6178696d75732066617563696275732e20446f6e6563206d6178696d750073206120647569206575207661726975732e20457469616d2072686f6e6375007320746f72746f722076656c206e756e63206665726d656e74756d2070756c0076696e617220736564206e656320657261742e20416c697175616d20757420006c656f206e6f6e206e69736920646170696275732076756c7075746174652e0020496e746567657220616363756d73616e20636f6e6775652072686f6e637500732e2055742076756c707574617465206f64696f20656c69742c20707265740069756d2073656d7065722065726174207375736369706974206e65632e205300757370656e6469737365206d6174746973207475727069732076656c206572006f732070756c76696e617220756c7472696365732072757472756d207369740020616d657420616e74652e204475697320656c656966656e64206d6178696d00757320617567756520696e207363656c657269737175652e20446f6e656320006e6f6e20746f72746f722073697420616d657420657261742066617563696200757320616c69717565742e205365642074656d70757320747269737469717500652072697375732c207072657469756d20747269737469717565206475692000636f6e76616c6c69732065752e0a0a50686173656c6c757320616c69717561006d20747572706973206174206c656f20706f73756572652c207365642061630063756d73616e206e69736c2074656d7075732e204d616563656e6173207669007461652073617069656e206a7573746f2e2050686173656c6c75732074656d00707573206672696e67696c6c612070656c6c656e7465737175652e2050656c006c656e74657371756520617420646f6c6f72206964206d6175726973206c61006f7265657420637572737573206e6f6e2071756973206d657475732e204475006973206163206d69206e6f6e2074656c6c7573206461706962757320706f7200747469746f72206e6f6e206574206c6967756c612e20457469616d20736f6400616c65732069642074757270697320696e20756c747269636965732e205365006420616e7465206c616375732c2068656e64726572697420757420706f7274007469746f722075742c206665726d656e74756d207669746165206c656f2e0a000a4372617320706861726574726120616e746520616e74652c2076756c7075007461746520666575676961742072697375732066617563696275732065676500742e2050726f696e2073697420616d65742074656c6c75732072686f6e637500732c207665686963756c61206469616d206e6f6e2c206567657374617320650073742e2043726173207669746165206c696265726f206e657175652e20446f006e656320697073756d2066656c69732c20696e74657264756d2076656c20650067657374617320656765742c20616c6971756574206e65632065726f732e2000446f6e6563206e697369206d617373612c20766573746962756c756d207665006c20656e696d2065742c206461706962757320636f6e67756520697073756d002e205072616573656e7420647569206573742c20636f6e67756520766974610065206d6f6c657374696520717569732c206d616c657375616461206567657400206469616d2e20457469616d206e6f6e2076697665727261206f7263692e2000566573746962756c756d206d6f6c6c69732065726f73206174206c65637475007320706f72747469746f7220756c6c616d636f727065722e20496e2066657500676961742066656c6973206e656320657820756c7472696365732c2073656400206665726d656e74756d206a7573746f2066696e696275732e204475697320006e6f6e20706f7375657265206e657175652c20657420636f6e73657175617400206f7263692e20416c697175616d206575206a7573746f20756c747269636500732c2076656e656e6174697320746f72746f722061632c2072757472756d2000656e696d2e0a0a496e7465676572206469676e697373696d207175616d20650075206d61757269732066696e6962757320666163696c697369732e204d617500726973206c6163696e6961206a7573746f206c65637475732c2076656c206c007563747573207175616d20766f6c757470617420766f6c75747061742e20550074206e6f6e206f726369206e756c6c612e2041656e65616e20617563746f72002073617069656e206120726973757320656c656d656e74756d206d616c657300756164612e204e616d2065676574206c6563747573206c696265726f2e2041006c697175616d20697073756d206d617373612c20736f6c6c69636974756469006e20616320696163756c697320612c206d6178696d757320657520747572700069732e204d616563656e61732076656c206e756e632076656c2065726f732000766f6c7574706174207472697374697175652076697461652061742065782e002043757261626974757220657420656e696d206d6f6c6c69732c20707265740069756d20646f6c6f7220717569732c2068656e647265726974206c61637573002e20496e2074656d70757320657569736d6f6420646f6c6f722c206964206400696374756d206d657475732072757472756d20717569732e0a0a43757261620069747572207072657469756d206c6f626f72746973207363656c65726973710075652e204d61757269732076656c206d69206120697073756d20766568696300756c61207363656c657269737175652e204e756c6c6120666163696c697369002e20446f6e656320636f6e736571756174206f64696f206120657261742075006c6c616d636f7270657220666163696c697369732e2044756973206d617373006120656e696d2c20756c74726963696573206e6f6e2075726e612071756973002c20657569736d6f64207072657469756d20746f72746f722e20457469616d002068656e647265726974206c656374757320766974616520656c656d656e7400756d2076756c7075746174652e20496e74657264756d206574206d616c657300756164612066616d657320616320616e746520697073756d207072696d69730020696e2066617563696275732e20536564206f64696f206d61676e612c2063006f6e73656374657475722073697420616d657420706f727461207669746165002c20766976657272612061206d61676e612e20437261732065752069707375006d20656c656966656e64206f64696f20766976657272612072757472756d20006574206e6f6e206c6f72656d2e20517569737175652071756973206c656f2000757420726973757320756c6c616d636f72706572207375736369706974207600656c206e6563206469616d2e20467573636520646170696275732065726f7300206e6f6e206e69736c2066617563696275732c20657420656666696369747500722073656d20706c6163657261742e20566573746962756c756d20616e74650020697073756d207072696d697320696e206661756369627573206f72636920006c756374757320657420756c74726963657320706f73756572652063756269006c69612063757261653b20416c697175616d2069642073656d206163206c6f0072656d20706f72747469746f72206c616f7265657420616320717569732065006c69742e0a0a446f6e65632076656c20646f6c6f72206d6178696d75732c20006d6f6c6c6973206d61676e612073697420616d65742c207068617265747261002076656c69742e2041656e65616e2070656c6c656e74657371756520737573006369706974206c6563747573206174207665686963756c612e20446f6e656300206e6563206661756369627573206469616d2e204e616d20656765742064750069206575206d6175726973206461706962757320616c697175616d206469630074756d206575206d61757269732e20446f6e6563206c6563747573206d65740075732c206d6f6c657374696520636f6e73657175617420756c747269636965007320656765742c206c616f72656574206e6563206475692e20446f6e656320006575206c656374757320717569732076656c697420656c656d656e74756d2000657569736d6f642e204d616563656e617320626962656e64756d206c61637500732073697420616d657420736f6c6c696369747564696e206c6163696e6961002e0a0a5175697371756520737573636970697420706f73756572652070757200757320636f6e64696d656e74756d20706f7274612e20457469616d2068656e00647265726974207574206c696265726f20696e2072757472756d2e204e756c006c616d20756c74726963696573206c696265726f20657420647569206c6f62006f72746973206672696e67696c6c612e20496e746567657220757420656c690074206d61676e612e2051756973717565207665686963756c61206d6f6c6c690073206c656f2c206964207665686963756c61206d61676e6120616c6971756500742075742e20457469616d206e6f6e20706f72747469746f72206e69736c2c002073697420616d65742076756c707574617465206469616d2e2050726f696e00206e6571756520657261742c20737573636970697420656765742066656c69007320696e2c20677261766964612066696e69627573207175616d2e205068610073656c6c7573206d617474697320746f72746f722072697375732c2075742000656c656d656e74756d206d6574757320737573636970697420626962656e6400756d2e0a0a4e756c6c616d207175616d2065782c20706f72746120696e2070007572757320696e2c206d6f6c65737469652074726973746971756520646f6c006f722e20457469616d207472697374697175652072697375732076656c206c0061637573206672696e67696c6c612c206174206c75637475732075726e612000616c697175616d2e20416c697175616d2065752066656c69732066657567690061742c20696163756c6973206c6f72656d2073697420616d65742c2070756c0076696e617220697073756d2e204e616d2076697461652074696e636964756e0074206d61676e612e204d617572697320756c6c616d636f727065722c206d650074757320636f6e64696d656e74756d20736f64616c657320756c6c616d636f00727065722c2073656d2074656c6c757320636f6e7365637465747572206c6500637475732c2061742074656d7075732073617069656e206d6175726973207600656e656e61746973206d61757269732e2041656e65616e2076657374696275006c756d20646f6c6f722065782c2076656c2076697665727261206e69626820006d6178696d7573207365642e20457469616d20636f6d6d6f646f206d616c65007375616461206f7263692e204e616d20616363756d73616e206469616d206e006563206e756e6320766f6c7574706174206566666963697475722e20467573006365207072657469756d20697073756d206c656f2c207175697320696e7465007264756d206172637520736f6c6c696369747564696e20656765742e205065006c6c656e746573717565206d617474697320617420697073756d206567657400207072657469756d2e0a0a536564206c656f206d692c207068617265747261002073697420616d657420696d706572646965742065752c2074696e63696475006e7420657420746f72746f722e2055742071756973207072657469756d206d0061676e612c20657520616c697175657420697073756d2e2050726f696e2061006320756c74726963657320697073756d2c2076656c206d6f6c6573746965200073617069656e2e20457469616d20736f64616c6573206e6571756520616320006f726e6172652070686172657472612e204d6f7262692071756973206175670075652073697420616d65742075726e6120706c6163657261742070756c7669006e61722e204375726162697475722076617269757320666163696c69736973002072697375732c206964207375736369706974207175616d20696d7065726400696574206d616c6573756164612e20416c697175616d20646170696275732c0020697073756d2076656c20636f6e64696d656e74756d206d61747469732c20006c6967756c6120657374206375727375732074656c6c75732c20657520696e0074657264756d20616e7465206c656f206e6f6e20616e74652e204e756c6c6100207175616d206e6973692c20706f737565726520657420616363756d73616e0020696e74657264756d2c2076756c707574617465206e6f6e2070757275732e00204e756e632076617269757320696d706572646965742066656c6973206e65006320696e74657264756d2e2050726f696e2076656e656e617469732061206c006967756c6120657420636f6e73656374657475722e2050686173656c6c757300206e65632065726f73206d6f6c6c69732c20756c7472696369657320656c690074206e6f6e2c206c6163696e6961206d692e2053757370656e646973736520006c6967756c6120617263752c206665726d656e74756d20617420617563746f007220717569732c20656c656966656e64207669746165206e69736c2e0a0a53006564206665726d656e74756d20707572757320696e206f64696f2070756c7600696e61722c20766573746962756c756d20656c656966656e64206573742063006f6d6d6f646f2e2046757363652076617269757320736564207475727069730020696e20666575676961742e20557420616320666163696c69736973206f6400696f2e20557420766f6c757470617420697073756d20646f6c6f722c20696e0020657569736d6f6420646f6c6f7220696e74657264756d2069642e20536564002073617069656e206573742c20696d70657264696574206575206f726e6172006520656765742c2074656d70757320656765742066656c69732e205068617300656c6c75732070656c6c656e7465737175652c206e756c6c61207369742061006d65742066696e6962757320677261766964612c207175616d206e69736c200064696374756d206a7573746f2c2073697420616d6574206672696e67696c6c0061206469616d206c616375732065676574206573742e20566573746962756c00756d20626c616e646974206d617572697320696e20616e7465206d6178696d00757320766f6c75747061742e2050656c6c656e74657371756520686162697400616e74206d6f726269207472697374697175652073656e656374757320657400206e65747573206574206d616c6573756164612066616d6573206163207475007270697320656765737461732e20566573746962756c756d2066656c6973200072697375732c2073616769747469732076656c20636f6d6d6f646f20736564002c20706f72746120617563746f722073656d2e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d616563656e6173206e65006320706f72747469746f722066656c69732e20446f6e656320656c656d656e0074756d2073656d206e756c6c612e0a0a416c697175616d20656c656d656e7400756d206575206c6f72656d206964206c75637475732e204e756e6320617420006e696268206573742e205072616573656e7420666175636962757320766172006975732065726174206e656320706f73756572652e204e756c6c616d20717500616d206c616375732c20766f6c7574706174206e6563206c616f7265657420006e6f6e2c20706f7375657265206163206c6967756c612e2050726f696e2071007569732065676573746173206e69736c2c20736564206c7563747573206665006c69732e204e756c6c61207072657469756d207175616d206e65632066696e006962757320656c656966656e642e20457469616d206d617572697320656e69006d2c2072686f6e6375732076656c206d616c657375616461207365642c2063006f6e64696d656e74756d2076697665727261206c696265726f2e20416c69710075616d207175616d2073656d2c2072757472756d2061742073617069656e20006e65632c206c616f7265657420666163696c69736973207475727069732e20004e616d206e65632074656d707573206573742e204d616563656e617320766100726975732c206e69626820617420636f6e73656374657475722074656d707500732c206e756e63206c6f72656d206672696e67696c6c6120617263752c2069006d706572646965742072757472756d206e69736c206475692061206175677500652e205072616573656e7420706c6163657261742073617069656e2073656400206d69206d6f6c6c697320666163696c697369732061206e6563207075727500732e205072616573656e7420736f6c6c696369747564696e2066656c697320006d617373612c2076656c206d6174746973206c656f2068656e647265726974002061632e2053757370656e646973736520657569736d6f642064696374756d002074696e636964756e742e0a0a416c697175616d2064617069627573206c6f0072656d20657520736f64616c65732066617563696275732e204e756c6c612000747269737469717565206f64696f2065742072697375732064696374756d2c0020756c74726963696573206c6f626f72746973206c6967756c61207361676900747469732e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e204e756e632074656d7075732076656c206572617420766974610065206c6163696e69612e204e756c6c6120696e20656765737461732065726f00732e204e756c6c616d2076656c20646f6c6f722076656c2076656c69742070006c6163657261742076756c70757461746520696e20736564206c616375732e0020416c697175616d206c6f626f7274697320616e746520696e2074656c6c75007320696163756c69732c206120636f6d6d6f646f207175616d20616363756d0073616e2e2050726f696e2066657567696174206c6967756c61206964206e75006e632076756c70757461746520646170696275732e20457469616d20707265007469756d207669746165206475692073697420616d657420616c697175616d002e2041656e65616e206c6f626f727469732072757472756d206e6973692c2000612074656d7075732065726f7320666163696c697369732069642e204d617500726973206e6f6e2061726375206174206e6973692076697665727261206375007273757320657520616320646f6c6f722e0a0a4e756e6320696e206f64696f00206d692e204e616d206d617474697320736564206c6967756c61207369742000616d65742074656d706f722e20496e74656765722064696374756d207269730075732066617563696275732c2076656e656e6174697320616e74652065752c0020756c747269636573206d61757269732e20446f6e6563206e656320636f6e0064696d656e74756d2065782e2053656420666163696c69736973206f64696f00206475692c207669746165206672696e67696c6c61206d61757269732061750063746f72206e6f6e2e20496e74657264756d206574206d616c657375616461002066616d657320616320616e746520697073756d207072696d697320696e200066617563696275732e2053757370656e646973736520717569732074656c6c007573206c616f726565742c20756c7472696365732073656d206e65632c20730063656c6572697371756520656c69742e20536564207363656c65726973717500652065737420766f6c75747061742c20636f6e64696d656e74756d20616e74006520612c2076656e656e61746973206d617373612e204d6f726269206e65630020617563746f72206c65637475732c206163207072657469756d206e696268002e204675736365207363656c65726973717565206d61737361206e6f6e206300757273757320706f7274612e20566573746962756c756d206d65747573207000757275732c20636f6e736571756174206964206672696e67696c6c6120612c002074656d707573207068617265747261206c65637475732e2056657374696200756c756d20736f64616c6573206c6f626f7274697320756c7472696365732e000a0a4e616d2073697420616d657420626c616e646974206573742e204675730063652073697420616d65742074696e636964756e7420646f6c6f722e20446f006e65632076656c206e697369206c616375732e204d617572697320706f7375006572652075726e6120616320656c656966656e6420616c69717565742e205300757370656e6469737365206661756369627573206665726d656e74756d206c00696265726f2c20616320617563746f72206d617373612068656e647265726900742074656d706f722e20467573636520706f72747469746f72206172637520006163206c656374757320626962656e64756d20636f6d6d6f646f2e205365640020617563746f72206575206f64696f2076656c20616c69717565742e20436c0061737320617074656e742074616369746920736f63696f737175206164206c0069746f726120746f727175656e742070657220636f6e75626961206e6f73740072612c2070657220696e636570746f732068696d656e61656f732e2056697600616d7573206574206c756374757320656e696d2e20566573746962756c756d002074656d706f7220616e746520736564206d61747469732064696374756d2e002051756973717565207068617265747261206172637520656765742075726e006120756c74726963657320617563746f722e204d6f72626920656c65696665006e6420636f6e736571756174206d692069642068656e6472657269742e20460075736365206d617474697320616e746520636f6e64696d656e74756d20706f00737565726520736f64616c65732e20437572616269747572206c6f626f72740069732075726e612073697420616d6574206d61747469732065676573746173002e204d6175726973206665756769617420656c69742074656c6c75732c2075006c7472696369657320696d70657264696574206469616d2074656d707573200076656c2e0a0a566573746962756c756d206672696e67696c6c6120747269730074697175652075726e6120657520706f7274612e2050726f696e206665756700696174206e69736c207475727069732c207574206c6f626f727469732072690073757320696d706572646965742061742e2050686173656c6c7573207369740020616d657420616c69717565742066656c69732c20766974616520706f737500657265206d692e20416c697175616d2073616769747469732076617269757300206e696268206e6563206f726e6172652e2050656c6c656e746573717565200074696e636964756e742076697461652065737420657520616c697175616d2e00204475697320696163756c697320757420617263752073656420656c656d65006e74756d2e20467573636520616363756d73616e2c20646f6c6f72206e6f6e002074656d70757320616363756d73616e2c20646f6c6f72207175616d2061750063746f72206e657175652c2071756973206f726e61726520616e7465206c65006f2069642070757275732e2050686173656c6c75732073656420656c65696600656e6420656c69742e204372617320657520706f737565726520616e74652e0020496e20616e7465206c6f72656d2c2070686172657472612073697420616d00657420766573746962756c756d207365642c2072686f6e637573206964206a007573746f2e2055742074656d707573206469676e697373696d20766568696300756c612e204d616563656e6173206d61757269732076656c69742c2065676500737461732073697420616d6574207661726975732076697461652c2066616300696c697369732073697420616d6574206c6967756c612e0a0a4d6175726973002067726176696461206c656f2073697420616d6574206f7263692076656e65006e617469732c207574206d6178696d75732073617069656e20636f6e736571007561742e204d6f726269206e6563206f7263692065782e20566976616d757300207665686963756c61206469676e697373696d20707572757320736564207400696e636964756e742e20467573636520657569736d6f64206e6f6e20656e69006d20657420636f6d6d6f646f2e205072616573656e7420766f6c757470617400206d6f6c6573746965206f726e6172652e20566976616d757320636f6e6469006d656e74756d2076656c697420656c656d656e74756d2c207072657469756d00207475727069732065752c20626c616e6469742072697375732e204675736300652070656c6c656e746573717565206d6178696d7573206e697369206163200073656d7065722e20416c697175616d20757420657569736d6f642076656c6900742c2073656420656c656d656e74756d206c6f72656d2e204d616563656e610073206964207269737573206e6f6e206d61737361206772617669646120636f006d6d6f646f2e204e756c6c616d20696e20707572757320696420656c69742000666163696c6973697320636f6e6775652e2041656e65616e20636f6e677565002076756c707574617465206c616f726565742e20416c697175616d20656765007420656c69742074656c6c75732e205175697371756520737573636970697400207175616d206163206d6173736120626962656e64756d2065676573746173002e20416c697175616d2071756973206578206e6f6e2076656c697420736365006c6572697371756520756c6c616d636f727065722069642065676574206d6100676e612e2041656e65616e20612073656d206e6f6e2065726174206c6f626f007274697320636f6e6775652e0a0a43726173206e6f6e20647569206f64696f002e205175697371756520766f6c7574706174207363656c657269737175652000697073756d206174207661726975732e20536564206f726e6172652073656d00207365642076656e656e6174697320636f6e7365717561742e204475697320006f726e6172652076656e656e61746973206d6f6c6c69732e2053656420657800206e657175652c2065666669636974757220626962656e64756d20706c616300657261742065742c20736f6c6c696369747564696e2076656c206f7263692e0020496e7465676572206e696268206e657175652c20666163696c6973697320006e6f6e206d61757269732076656c2c20636f6e73656374657475722074726900737469717565206e756c6c612e204e756e632073697420616d657420706861007265747261206c656f2e204e756c6c616d206c656f206f7263692c20696d70006572646965742073697420616d657420696e74657264756d20717569732c2000696163756c6973206575206e69736c2e20416c697175616d2073656420747200697374697175652073656d2c206e6563206c6f626f7274697320746f72746f00722e204d616563656e617320736f64616c6573207075727573206e65632061006c697175616d20706f72747469746f722e20447569732075742066656c69730020657261742e0a0a437261732061206d6173736120696d706572646965742c0020616363756d73616e2072697375732069642c207375736369706974206e75006e632e20446f6e65632073656d70657220656e696d206575206d61676e612000636f6e7365717561742074696e636964756e742e2053757370656e64697373006520636f6e736571756174206c6563747573207669746165206d657475732000616c6971756574206c616f726565742e20436c61737320617074656e74207400616369746920736f63696f737175206164206c69746f726120746f72717565006e742070657220636f6e75626961206e6f737472612c2070657220696e63650070746f732068696d656e61656f732e20446f6e656320696e74657264756d20006469616d206174206e69626820616363756d73616e2c20657420617563746f0072206d61737361206c6163696e69612e20467573636520696420657820766900746165207269737573206c616f7265657420706f72746120636f6e64696d65006e74756d206567657420656e696d2e2050686173656c6c7573206c656374750073206f64696f2c20666163696c6973697320612074656d707573207365642c0020736f64616c6573206575206475692e204e616d20696e206d616c65737561006461206f64696f2e205175697371756520706c61636572617420697073756d002076656e656e617469732072697375732074656d707573206661756369627500732e2050656c6c656e74657371756520656c656d656e74756d20646f6c6f72002071756973206672696e67696c6c612074656d7075732e20457469616d207400696e636964756e7420766172697573206c6f72656d20696e206f726e617265002e204e616d206120656c656d656e74756d206f7263692e2050686173656c6c0075732067726176696461206e69736c20657520656c697420756c74726963690065732c20657420626962656e64756d2074656c6c75732066696e696275732e000a0a4372617320626c616e6469742070756c76696e6172206d657475732c2000616320696e74657264756d2066656c6973206d6178696d757320626962656e0064756d2e2041656e65616e20626962656e64756d20696d706572646965742000636f6e64696d656e74756d2e204e616d206e6f6e206c61637573206c696775006c612e20517569737175652073656420766573746962756c756d207361706900656e2e20536564207665686963756c612074696e636964756e74206c656f200071756973206c6163696e69612e20536564206c61637573206c6f72656d2c2000756c747269636573206e6563206c6f72656d207365642c20706c6163657261007420766f6c7574706174206d657475732e205365642075742073656d207369007420616d657420746f72746f7220756c747269636573207375736369706974002076656c206174207475727069732e0a0a5574207669746165206175677565002073697420616d657420656c69742070756c76696e61722068656e64726572006974206e65632061206c6967756c612e20446f6e656320706f727461206e6900736920636f6d6d6f646f20616e7465207665686963756c612073656d706572002e2055742066696e696275732c20707572757320757420666175636962757300206d6f6c6c69732c2066656c6973206e65717565206d616c65737561646120006e6962682c2061632076656e656e61746973206e756c6c612076656c69742000612066656c69732e204d617572697320677261766964612c206c6967756c6100206964206c6163696e696120766976657272612c206a7573746f206c69626500726f20766172697573206c6967756c612c2073697420616d657420706f72740061206c6f72656d206c696265726f2061206d657475732e20416c697175616d0020756c6c616d636f72706572206d61757269732073617069656e2c2061206700726176696461207075727573207363656c6572697371756520717569732e20004e756c6c616d2072757472756d20746f72746f722073697420616d6574206f0064696f20656666696369747572207072657469756d2e2044756973206c616f0072656574206566666963697475722076656c69742c20612073656d706572200066656c69732e2050726f696e206e696268206c616375732c20637572737573002073697420616d6574206c656374757320717569732c2065666669636974750072207665686963756c61206475692e20446f6e65632061726375206c656f2c002072757472756d2075742063757273757320696e2c207363656c6572697371007565206574206c616375732e204d616563656e61732074696e636964756e740020617263752061206e6571756520666575676961742c2076656c206469637400756d206e69736c2073656d7065722e20446f6e6563206e756e632076656c6900742c20636f6d6d6f646f20696420746f72746f722076697461652c20616c690071756574206661756369627573206c6f72656d2e2041656e65616e2076617200697573206d61747469732073617069656e2065676574206d6f6c6c69732e2000446f6e65632076697461652075726e6120756c6c616d636f727065722c20640069676e697373696d20656e696d2076697461652c20766573746962756c756d00206d657475732e2050686173656c6c757320636f6e7365637465747572206500726f7320696d706572646965742c20677261766964612065726f732069642c00206d6f6c6c69732076656c69742e0a0a5574206163206c6163757320636f6e0076616c6c69732c207665686963756c61206e6571756520717569732c2065660066696369747572206f7263692e205574206d69206c616375732c206566666900636974757220657420736f6c6c696369747564696e2075742c206661756369006275732073697420616d657420616e74652e2053656420636f6e64696d656e0074756d206567657420656c697420617420677261766964612e20457469616d00206e6563206e69736c2073656420656e696d20706f72746120706c616365720061742e205072616573656e74206672696e67696c6c6120736167697474697300206c656f2c2076656c2074656d706f72206f64696f206d6f6c6c69732076690076657272612e20566573746962756c756d2066696e69627573206a7573746f002072697375732c2065752073656d706572206475692066696e69627573206100632e204d617572697320706c616365726174206c6563747573206e6973692c00206e6f6e20766573746962756c756d20746f72746f72206d6174746973206100632e204e756c6c61206e656320626962656e64756d207175616d2e0a0a53650064206574206469616d2065676574206c696265726f2070756c76696e617220006672696e67696c6c6120756c74726963696573206964207475727069732e20005072616573656e7420657520656e696d206672696e67696c6c612c20706c61006365726174206172637520696e2c20766573746962756c756d206e65717565002e20457469616d207665686963756c6120657261742064696374756d206e6900626820657569736d6f6420736f6c6c696369747564696e2e20507261657365006e74206e65632074757270697320616c69717565742c206c6f626f7274697300206c656f20717569732c207665686963756c61207175616d2e205068617365006c6c75732073656420626962656e64756d206e6973692e204d616563656e61007320696420646f6c6f72206567657420616e746520626c616e6469742064610070696275732e20446f6e656320656c656d656e74756d20736564206e696268002065752073616769747469732e20467573636520636f6e6775652073656d20006c6f72656d2c206e6f6e206672696e67696c6c61206f64696f20617563746f007220612e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b20004d616563656e61732073656420636f6e7365637465747572206a7573746f2e0020536564206566666963697475722061207175616d2073697420616d657420006d6178696d75732e0a0a416c697175616d20636f6d6d6f646f20616e746520006574206d6f6c657374696520706f72747469746f722e204d616563656e61730020766f6c7574706174206e69736c207363656c657269737175652c206c6f62006f72746973206d61757269732061632c2064696374756d206d617373612e200050686173656c6c7573206d616c657375616461206c6163696e6961206f6469006f2069642066696e696275732e204d616563656e61732061206d61676e6120006f64696f2e20467573636520697073756d2075726e612c2073616769747469007320666175636962757320616e7465207365642c20756c747269636573206400617069627573206d61757269732e2053757370656e6469737365207574206f0064696f20717569732073656d206461706962757320616c697175616d20696e0020696420646f6c6f722e205574206d61747469732071756973206f64696f20007669746165206c6f626f727469732e20416c697175616d20616320746f7274006f72206163206d657475732073656d70657220766976657272612e20416c69007175616d206e65632064696374756d206d617373612c2076656c2073757363006970697420656c69742e2044756973207365642073656d206575206e6962680020636f6e736563746574757220696163756c69732076656c207574206175670075652e2044756973207669746165206c75637475732075726e612e204e616d00206e756c6c61206e6962682c20626c616e6469742073697420616d6574207300656d7065722076697461652c206d6f6c6c6973206c6f626f72746973206e75006e632e2053656420757420666175636962757320746f72746f722c20656765007420696163756c6973206f7263692e20496e206120626c616e64697420647500692c206174207068617265747261206d657475732e20457469616d2068656e00647265726974206c696265726f207669746165206c656374757320737573630069706974206f726e6172652e2051756973717565206d6174746973206c6163007573206174207068617265747261207661726975732e0a0a4d616563656e61007320666163696c6973697320656c697420756c74726963657320707265746900756d206c6f626f727469732e2046757363652076656c20766573746962756c00756d20657261742e20457469616d206175677565206d617373612c20666575006769617420766974616520657261742061632c206c6f626f7274697320766f006c7574706174206d61676e612e20446f6e6563206d616c6573756164612073006564206c6967756c6120717569732066696e696275732e204e756c6c616d20006566666963697475722076697665727261206475692c206e6f6e2076657374006962756c756d20746f72746f7220696e74657264756d2076656c2e2050726f00696e20616e7465206573742c20626c616e64697420696e207363656c65726900737175652073697420616d65742c20756c74726963696573206e6563206572006f732e205365642065726174206e69736c2c2067726176696461206574207400656d706f722065742c206665726d656e74756d2073697420616d6574206578002e2053656420656666696369747572206d6920766974616520657569736d6f0064206672696e67696c6c612e2053757370656e646973736520656765742061007563746f72206e6962682e20446f6e6563206e656320706861726574726120006f64696f2c2068656e64726572697420636f6e64696d656e74756d20646f6c006f722e0a0a4d6f72626920696d706572646965742c206469616d206e6563200076756c7075746174652072757472756d2c20746f72746f72206c6f72656d2000696e74657264756d20616e74652c207669746165206375727375732074757200706973206f64696f206e6f6e206d61676e612e20446f6e6563206c616f7265006574207669746165206d61676e612073697420616d657420617563746f722e00204372617320617563746f72206e69736c2071756973207661726975732063006f6d6d6f646f2e204d6175726973206174206c6163696e6961206e756c6c61002e20566573746962756c756d20666575676961742073656d206174206d61730073612066617563696275732064696374756d2e2046757363652076656c207300617069656e2073697420616d6574206a7573746f2073757363697069742061006363756d73616e2075742076656c206f7263692e204e756c6c612066616369006c6973692e204e756c6c616d20736f6c6c696369747564696e20737573636900706974206e6973692c20657520616363756d73616e206d6574757320636f6e00736563746574757220766573746962756c756d2e2051756973717565207465006c6c7573206d657475732c2073656d7065722074656d707573206d657475730020717569732c2064696374756d20656c656d656e74756d2066656c69732e200053757370656e646973736520636f6e76616c6c697320707572757320616320006c61637573207072657469756d2c20616320616c697175657420657374206600696e696275732e2050656c6c656e74657371756520626962656e64756d20700075727573206d61676e612c2073697420616d657420637572737573206e65710075652066657567696174206e6f6e2e2043757261626974757220696e206d610078696d7573206a7573746f2e2041656e65616e20696163756c6973206c616300696e69612072686f6e6375732e0a0a536564206672696e67696c6c61207365006d206163206d61737361206d616c6573756164612c206d617474697320696d0070657264696574207175616d2073757363697069742e2043726173206c616300696e69612061632065782076697461652072757472756d2e20536564206578002066656c69732c20706f727461206e656320617263752061632c2066696e6900627573206c7563747573207475727069732e204475697320697073756d206c00696265726f2c20696e74657264756d20757420696e74657264756d2075742c0020656c656d656e74756d206163206a7573746f2e204d6f7262692074726973007469717565206c6f626f7274697320706c6163657261742e2050656c6c656e007465737175652074696e636964756e742074656d70757320656e696d2061740020636f6e6775652e204e756c6c61206d61747469732074696e636964756e7400206e6973692c2061742072686f6e63757320616e746520656c656966656e64002068656e6472657269742e204e756c6c616d2064696374756d20706861726500747261206475692e20566573746962756c756d206c75637475732065737420007574206175677565207472697374697175652c2073697420616d657420656c00656d656e74756d2074656c6c757320656c656966656e642e20496e746567650072206e6563206f726e617265206a7573746f2c207175697320706f72746120006469616d2e2051756973717565206e6f6e206e697369206e6f6e206c6f7265006d2070756c76696e617220706f73756572652061206567657420656c69742e00205365642065676574206c6163696e69612073656d2e2050686173656c6c750073206e6f6e206e756c6c612074656d7075732c207363656c6572697371756500206c696265726f2076656c2c207068617265747261206e6962682e0a0a5375007370656e6469737365206469676e697373696d20636f6e67756520657374200069642070686172657472612e20447569732076697461652066656c69732069006e206c656374757320666163696c6973697320706861726574726120736564002061632070757275732e2050656c6c656e7465737175652076656e656e617400697320706c616365726174206d61757269732c206120626962656e64756d20006d6175726973206566666963697475722076697461652e204d6f7262692065006666696369747572206d65747573206575207363656c65726973717565206600617563696275732e20566573746962756c756d20616e746520697073756d20007072696d697320696e206661756369627573206f726369206c75637475732000657420756c74726963657320706f737565726520637562696c6961206375720061653b2041656e65616e20696e74657264756d20666163696c6973697320710075616d20717569732066617563696275732e20566573746962756c756d2061006e746520697073756d207072696d697320696e206661756369627573206f72006369206c756374757320657420756c74726963657320706f73756572652063007562696c69612063757261653b205072616573656e74206c6f626f7274697300206d61676e612071756973206e697369206d616c657375616461206d617869006d75732071756973206e6f6e206c6f72656d2e20437572616269747572206e006f6e206e756c6c612073697420616d657420657261742074696e636964756e007420666163696c6973697320617420657420746f72746f722e204d6f72626900206964206175677565207669766572726120697073756d2070756c76696e610072207363656c657269737175652071756973206e65632076656c69742e204e00616d2076656c206f64696f20636f6d6d6f646f2c20706f72746120617263750020696e2c20666163696c697369732073617069656e2e204e756e63207369740020616d65742076656e656e6174697320657261742c206174206c616f72656500742061756775652e20446f6e656320617563746f722070757275732071756900732074656d706f7220666575676961742e20496e2071756973206c6f72656d002065676574206e756e63206c6163696e696120646170696275732e20446f6e00656320696163756c6973206573742076656c2072686f6e63757320616c69710075616d2e0a0a4d6f726269206d61676e61206f64696f2c2076656e656e61740069732076697461652073656d2069642c20646170696275732074656d70757300206e756e632e204d6f7262692066617563696275732074656d706f72206d610078696d75732e205175697371756520657520696d70657264696574206d6167006e612c20696420616c697175616d2075726e612e20446f6e6563207574206c00696265726f206475692e20457469616d206d6174746973206e756c6c6120710075697320617567756520696e74657264756d2c2061206d6f6c657374696520006f726369207472697374697175652e20446f6e6563206e656320756c6c616d00636f72706572206e6962682c2061742074696e636964756e74207075727573002e204475697320626c616e646974206e69626820756c74726963696573206f0072636920616363756d73616e20736f6c6c696369747564696e2e20446f6e6500632069642061756775652071756973206e65717565206c616f72656574206f00726e6172652e204e756e632072757472756d206a7573746f2075742065676500737461732068656e6472657269742e20437261732074656d70757320696e20006d617572697320612074696e636964756e742e0a0a557420706f7274746974006f722074656d70757320616c697175616d2e204d616563656e617320677261007669646120636f6e736571756174206d692c2065742074726973746971756500206c6f72656d20666575676961742073697420616d65742e20507261657365006e7420736564206d6178696d7573206f64696f2c206567657420636f6e736500637465747572206c616375732e20416c697175616d20647569206e65717565002c207669766572726120636f6e73657175617420636f6e6775652076656c2c0020636f6e736571756174206964206f7263692e2041656e65616e2066696e69006275732065782073656d706572206e69736c206d61747469732c207175697300206c756374757320656e696d206c6163696e69612e2050726f696e20696420006d61737361206d61757269732e20496e74656765722065752061726375206c006163696e6961206c656374757320657569736d6f64206c75637475732e2049006e20766f6c7574706174206e6f6e206d657475732073697420616d65742063006f6e76616c6c69732e204e616d206c6967756c61206d657475732c20666572006d656e74756d2065752074656c6c75732069642c20656c656966656e642076006172697573206e657175652e204675736365206175677565206c6f72656d2c0020706861726574726120612073656d2076656c2c20636f6e64696d656e7475006d206d617474697320646f6c6f722e2046757363652073656d706572206e6900736c20696e2075726e612073757363697069742c206567657420707265746900756d206a7573746f20736f6c6c696369747564696e2e0a0a496e7465676572002076697461652072686f6e637573206573742c207175697320626962656e6400756d2072697375732e20457469616d206d616c657375616461206175677565002065752074656d70757320636f6e76616c6c69732e205175697371756520710075697320656c697420666575676961742c20756c6c616d636f72706572206e0069626820696e2c206c7563747573206d617373612e2050686173656c6c75730020636f6e76616c6c69732073617069656e2076656c206c616375732074696e00636964756e742c206e656320657569736d6f64206573742070656c6c656e740065737175652e20416c697175616d20706f727461206a7573746f206120756c00747269636965732068656e6472657269742e204d6175726973206c756374750073206175677565206575206c656374757320646170696275732c2075742070006f72746120656c69742070656c6c656e7465737175652e20496e74656765720020736564206d61676e6120757420646f6c6f722074696e636964756e7420660072696e67696c6c61206964206174206475692e204d6f72626920656c65696600656e642072697375732073697420616d6574206d61676e612074656d707573002c207665686963756c61206c6f626f72746973206f72636920736f6c6c69630069747564696e2e204e616d2065742074656d706f72206d61676e612e204d6f007262692071756973207072657469756d2072697375732c2075742076656e65006e617469732074656c6c75732e204d617572697320706f72746120646f6c6f007220657420636f6e73656374657475722068656e6472657269742e204e616d002070656c6c656e7465737175652065676573746173206f64696f207472697300746971756520677261766964612e2050656c6c656e74657371756520696420006665726d656e74756d206469616d2e20496e20636f6e736563746574757220006d692076656c206c696265726f20657569736d6f642064696374756d2e2044006f6e656320736167697474697320616e7465206d617373612e20507261657300656e74206163206175677565206e657175652e0a0a536564206d6173736120007475727069732c20636f6e76616c6c69732065676574207665686963756c61ba020000002065752c20636f6e64696d656e74756d20736564206d657475732e205365640020636f6e64696d656e74756d20766f6c7574706174206573742c2076656c200070756c76696e6172206e69736920736f6c6c696369747564696e206e6f6e2e0020496e7465676572207574206d61676e6120657420746f72746f72206469630074756d20636f6e64696d656e74756d20696e20706f727461206573742e2049006e2073697420616d65742061756775652065782e204e756e632076657374690062756c756d206964206c616375732076656c2070756c76696e61722e205072006f696e2070756c76696e6172206d6173736120757420616e7465206d617869006d75732c207669746165206c7563747573207175616d20656765737461732e002044756973206d6178696d757320616e74652073697420616d6574206d616c00657375616461206469676e697373696d2e204675736365207574206c656f2000626c616e6469742c20666163696c69736973206d657475732061742c20636f006e736571756174206c696265726f2e20437261732076656e656e6174697320006e69736920656765742075726e61206665726d656e74756d2c206174206669006e69627573207175616d20696163756c69732e20517569737175652076656c00206c6f72656d2065782e2050726f696e206a7573746f2066656c69732c20730063656c6572697371756520736564206f64696f2069642c20666575676961740020736f6c6c696369747564696e207175616d2e20496e74656765722076617200697573206f7263692073697420616d65742076756c7075746174652068656e006472657269742e204d6f726269206d6178696d75732c2065726f73206e6f6e0020636f6e7365717561742066696e696275732c207175616d206e6962682075006c6c616d636f72706572206475692c20616320696e74657264756d2073656d0020616e746520766974616520746f72746f722e204375726162697475722076006974616520706861726574726120656e696d2e20437261732073757363697000697420636f6e677565206c656f2c20696e20736f6c6c696369747564696e20006e697369207472697374697175652061742e20566976616d757320706f7274007469746f7220746f72746f7220636f6e64696d656e74756d2c20696163756c006973206c6967756c612075742c207472697374697175652065726f732e0a0a00496e206575206c756374757320616e74652e204d6f726269206d6178696d7500732075726e61206e6f6e206c6967756c6120706f73756572652c206120766f006c7574706174206f7263692073616769747469732e204e616d20617420656c0069742065676574206d692066696e696275732073656d70657220756c747269006365732073656420616e74652e205072616573656e742065752073656d70650072206f7263692e204e616d2071756973206469616d206e65632065737420650066666963697475722073656d7065722e204d6f7262692073697420616d657400206f64696f2070656c6c656e746573717565206e69736c20626c616e6469740020736f64616c65732e20447569732067726176696461206964206c6f72656d0020657520616c69717565742e205365642065726f73207475727069732c207300757363697069742073697420616d657420736f64616c6573207365642c2066006163696c69736973206574206573742e204f72636920766172697573206e6100746f7175652070656e617469627573206574206d61676e697320646973207000617274757269656e74206d6f6e7465732c206e6173636574757220726964690063756c7573206d75732e20566976616d75732073656d7065722074656d706f0072207661726975732e20416c697175616d20696420616c697175616d20646900616d2e0a0a416c697175616d20746f72746f72206573742c206c7563747573002065752075726e6120717569732c2074656d7075732068656e6472657269740020617263752e20566573746962756c756d2073697420616d657420656c656d00656e74756d206c656f2e2053757370656e64697373652071756973206e756e006320612073617069656e2068656e64726572697420696d706572646965742e002053656420696e2065676573746173206c696265726f2e20446f6e65632063006f6e6775652073697420616d6574206e6571756520646170696275732065750069736d6f642e204675736365207363656c657269737175652076656c20707500727573206964207363656c657269737175652e2050726f696e2076656c2070006f72747469746f72206e69736c2e0a0a4d6f726269206964206475692065670065742074757270697320696163756c697320636f6e6775652e204e756c6c61006d20617563746f722c206c6967756c61206567657420636f6d6d6f646f20700072657469756d2c206c696265726f206e756c6c6120756c7472696369657320006f64696f2c2075742072757472756d2061726375206172637520696e206e690073692e204d61757269732065676574206c6163757320696e20657820766172006975732073616769747469732073656420696e20656c69742e204d617572690073206d6f6c6573746965206f64696f206574206f7263692070686172657472006120706c6163657261742e20496e746567657220696e20747572706973206500676574206c696265726f20636f6e7365637465747572206c6f626f7274697300206575206e6f6e206c616375732e204d616563656e61732064696374756d20006c656f2074656d707573206c61637573206d617474697320736f64616c6573002e20446f6e6563206a7573746f206f64696f2c2074696e636964756e7420610063206172637520656765742c20666175636962757320706f73756572652064006f6c6f722e205072616573656e742065676574206e756e63206e6563206665006c697320696e74657264756d2072686f6e6375732e20566573746962756c75006d20656c656d656e74756d206461706962757320636f6e7365637465747572002e2053757370656e6469737365206964206e756e63206d61747469732c206c007563747573206e6962682073697420616d65742c20636f6e64696d656e7475006d2065782e20496e7465676572206f726e6172652075726e6120766974616500206e697369206c7563747573206469676e697373696d2e2041656e65616e200074696e636964756e742068656e647265726974207269737573206e6f6e2061006363756d73616e2e204e756c6c6120617420736f64616c6573206e69736c2e0020496e74656765722068656e647265726974207669746165206d61676e61200076697461652073757363697069742e20437261732064617069627573206c65006374757320736564206c656f207363656c657269737175652073656d706572002e204d61757269732061207269737573206e756c6c612e0a0a5365642069610063756c69732c206c656f20757420766573746962756c756d206672696e6769006c6c612c2066656c69732073617069656e20636f6e76616c6c6973206c6563007475732c2076656c206c616f72656574207175616d206f7263692061206d6100757269732e204e756c6c616d20657520616363756d73616e2073617069656e002e2050656c6c656e746573717565206d617474697320736f64616c6573206d0061757269732c20757420636f6e64696d656e74756d206d61676e6120636f6e006775652076656c2e2041656e65616e20706f72747469746f72206e6973692000616320657261742066617563696275732073757363697069742e205068617300656c6c757320656c656d656e74756d2074696e636964756e74207175616d20006e656320636f6e64696d656e74756d2e204375726162697475722066696e6900627573206e756c6c612076656c206c6163696e696120696d70657264696574002e204d616563656e61732066657567696174206d617474697320646f6c6f72002c206e656320616363756d73616e20697073756d2074656d706f722075742e002050686173656c6c757320617563746f7220666163696c69736973207275740072756d2e20536564207669746165206d69206e6f6e206f64696f2070656c6c00656e74657371756520626c616e64697420696e2061206d61676e612e0a0a5300656420696e206469616d20636f6e6775652c20636f6d6d6f646f20746f7274006f7220612c20657569736d6f64206c6967756c612e20496e2061632065666600696369747572206e756e632c2076656c20756c6c616d636f727065722069700073756d2e20416c697175616d2076656c206469616d206665726d656e74756d002c20736f6c6c696369747564696e20617263752065742c20656c656d656e7400756d2073617069656e2e2043726173206c656f206d657475732c2072686f6e006375732071756973206d617373612065752c20677261766964612069616375006c697320657261742e2043757261626974757220756c747269636573207369007420616d657420656e696d20757420617563746f722e2041656e65616e20610074206175677565206163206a7573746f2074656d70757320626962656e6475006d2073656420696d7065726469657420746f72746f722e204e756c6c616d2000736564206d61757269732073617069656e2e20447569732070656c6c656e740065737175652075726e6120696e2066696e69627573206d6f6c65737469652e00205072616573656e74206e6f6e207072657469756d206d61676e612c206e650063206c6163696e696120746f72746f722e2050726f696e2066617563696275007320656c656d656e74756d206c6f72656d2c2072686f6e6375732076756c7000757461746520657820616c69717565742061632e0a0a416c697175616d207400696e636964756e7420617263752073617069656e2c20616c697175657420730075736369706974206c656f20656c656d656e74756d2076697461652e204372006173206d617474697320617263752076656c206f726e617265206665726d65006e74756d2e204d6f72626920636f6e76616c6c6973206e697369206d6f6c65007374696520657261742073656d7065722c20736564206c7563747573206e65007175652076756c7075746174652e2053757370656e6469737365206d616c650073756164612c20646f6c6f722076656c20756c74726963657320696d70657200646965742c206d69206e69626820756c74726963696573207475727069732c00206e6563207072657469756d206c696265726f20697073756d207669746165002072697375732e20416c697175616d20696e20636f6e677565206c61637573002c20666575676961742076756c7075746174652065726f732e20496e206c61006f72656574206e69626820696e2076756c7075746174652076657374696275006c756d2e205574206661756369627573206f726e617265206e756e63207369007420616d657420656c656966656e642e205072616573656e7420706c616365007261742073617069656e2076656c20656c69742074656d706f722062696265006e64756d2e204e756c6c612071756973207665686963756c6120617263752e002053757370656e646973736520736f64616c6573206c656f2061632075726e006120616c69717565742076756c7075746174652e20536564206d6f6c6c6973002c206c6163757320657520656c656966656e6420736f64616c65732c206d6100676e61206172637520766172697573206c656f2c20657520626c616e646974002066656c6973206572617420657420746f72746f722e205072616573656e74002074656d7075732073697420616d6574206d61676e61207669746165206f72006e6172652e20416c697175616d20656c656966656e642076656c206f64696f0020696420636f6e7365717561742e204d6175726973206574206e657175652000717569732073617069656e20706f737565726520756c74726963696573206500752073697420616d65742075726e612e20437261732072686f6e637573206500726f732076656c2073656d2070756c76696e61722066696e69627573206120006e6f6e2072697375732e0a0a536564206c6f626f72746973206f64696f20710075616d2c206e6f6e20637572737573206e756c6c6120616c697175616d206e006f6e2e20446f6e65632061726375206573742c20666163696c697369732069006e20666175636962757320612c2070686172657472612073697420616d657400206e69736c2e205175697371756520696163756c6973206c656f206e6f6e2000656c656d656e74756d20706c6163657261742e205365642076657374696275006c756d206c656f20616e74652c20616320636f6e76616c6c697320647569200073616769747469732069642e20496e20686163206861626974617373652070006c617465612064696374756d73742e20536564206d6f6c657374696520636f006e76616c6c69732066656c69732c20696e2070656c6c656e7465737175652000616e746520696e74657264756d20612e20566976616d757320706c6163657200617420656c656966656e6420616e74652e2050656c6c656e746573717565200073697420616d6574206f64696f207665686963756c612c207361676974746900732065737420656765742c20656c656d656e74756d206c6f72656d2e204d61007572697320656c6974206d61676e612c20636f6e6775652076656c2065726f0073206e65632c20696163756c6973206d616c65737561646120616e74652e2000566976616d757320696e20656666696369747572206f64696f2c20717569730020616c697175616d206e756c6c612e204e756c6c61207574206469676e69730073696d206475692e20496e206567657374617320666163696c69736973206c006f72656d2c206e6f6e20656c656d656e74756d20647569207665686963756c0061206e65632e204e756c6c61206d616c65737561646120706f72747469746f00722065782061206f726e6172652e204e756c6c61206e6f6e2076617269757300206f64696f2e2041656e65616e206e656320696d70657264696574207361700069656e2e20446f6e6563206e69736920617263752c2070756c76696e617220007072657469756d206d616c6573756164612061632c20706f72746120766974006165207175616d2e0a0a437572616269747572206d6f6c65737469652c206d006920696e74657264756d206c7563747573206375727375732c207269737573002073617069656e206c6f626f72746973206c656f2c206174206566666963690074757220617567756520656c6974207365642074656c6c75732e204e756e6300207375736369706974206c7563747573206e69736c2073697420616d65742000626962656e64756d2e20446f6e6563206e6f6e20637572737573207075727500732c206163206661756369627573206a7573746f2e2050726f696e2061756300746f7220766f6c7574706174206e756e632c20696e2074726973746971756500206e69736c20626962656e64756d2061742e2053757370656e6469737365200076656e656e61746973206e756e63206e69736c2c206e6563206772617669640061206c696265726f2074726973746971756520696e2e20517569737175652000706c6163657261742061206e69736c20616320706c6163657261742e204165006e65616e20756c74726963696573206c696265726f20696420697073756d200072686f6e6375732c2073697420616d657420616c697175616d20656e696d20006c75637475732e20447569732076656e656e6174697320646f6c6f72206574002074656c6c757320636f6e736571756174206c6f626f727469732e20446f6e00656320696e206469616d20706f73756572652c206665726d656e74756d207200697375732065742c2070756c76696e6172206e657175652e0a0a496e746567006572206e6563206e6962682065752074656c6c7573207072657469756d2069006e74657264756d206174206574206469616d2e204e756c6c612070656c6c65006e746573717565206f64696f20717569732065726f7320656765737461732000736f64616c65732e2043757261626974757220656765742074656d70757320006469616d2e2050656c6c656e74657371756520756c747269636965732061720063752065782c206120696d70657264696574206a7573746f20706f7375657200652076656c2e2050726f696e2076756c70757461746520736f64616c657320006d617373612061742070686172657472612e20496e7465676572206e6f6e20006d61737361207574206c6967756c6120666575676961742074656d7075732e0020517569737175652073616769747469732076656c206e756e6320757420740072697374697175652e2041656e65616e2075742074656d706f72206a757374006f2e20446f6e656320636f6e677565206e69736c20736564207175616d206d006f6c6573746965206d6f6c6c69732e204e756c6c616d20706c616365726174002c20747572706973206567657420677261766964612072757472756d2c206600656c69732076656c697420616c697175616d2065726f732c20696420656c65006d656e74756d206c6967756c612075726e6120696420657261742e204e756c006c61206e65632072686f6e6375732073656d2e205574206e656320766568690063756c612065782c2076656c2068656e647265726974206e657175652e2055007420706c6163657261742076656c69742076656c2076656c69742068656e640072657269742c207669746165206665726d656e74756d207269737573206d6f006c65737469652e0a0a4d6175726973206f726369206c65637475732c20696d0070657264696574207365642066696e69627573206e65632c20616c69717561006d2076656c206e6962682e20566573746962756c756d206672696e67696c6c006120616363756d73616e206e756e63206574206d6f6c65737469652e205574002065742065726174206a7573746f2e2050656c6c656e74657371756520677200617669646120617263752070757275732e2041656e65616e20696e206e6962006820766974616520617263752064696374756d2074696e636964756e74206900642065752066656c69732e205072616573656e7420657420656c697420696400206d6920636f6e736563746574757220616c697175616d2e2056657374696200756c756d20696e20656e696d2064696374756d2c20626962656e64756d206500726174206e6f6e2c20756c74726963696573206f64696f2e2050656c6c656e0074657371756520636f6e76616c6c6973206f726369206e6973692c206e65630020756c74726963696573206f64696f20706f73756572652073697420616d6500742e0a0a4d616563656e61732073697420616d6574206665726d656e74756d00206e69736c2e20566573746962756c756d20616e746520697073756d20707200696d697320696e206661756369627573206f726369206c75637475732065740020756c74726963657320706f737565726520637562696c6961206375726165003b205072616573656e74206174206e756e6320696e206d61676e6120636f6e00736571756174207363656c657269737175652e204d616563656e617320696e00207175616d207574206a7573746f2074696e636964756e7420617563746f72002e2050686173656c6c757320757420646f6c6f72206d657475732e20496e200073656d706572206d6920736564206c6f72656d207068617265747261207268006f6e6375732e204675736365206567657420657374206c616f726565742c20007361676974746973206c696265726f2073697420616d65742c206665756769006174206e6962682e204d6f72626920646170696275732075726e6120616320007175616d206665726d656e74756d2072686f6e6375732e20446f6e65632063006f6e76616c6c697320657569736d6f64206469676e697373696d2e204375720061626974757220757420747269737469717565206c6967756c612e0a0a536500642072757472756d2074696e636964756e74207472697374697175652e204e00756e63206d69207175616d2c20637572737573206574207665686963756c610020656765742c2074696e636964756e74206e6f6e20646f6c6f722e20446f6e00656320617563746f722066696e69627573206f726e6172652e204d6f72626900207665686963756c612c206e69736c2076656c20636f6d6d6f646f20706f7200747469746f722c20646f6c6f72206e756e6320736167697474697320646961006d2c20656765742066617563696275732073617069656e2065782076656c20006d61676e612e204375726162697475722076656c206c6967756c61207369740020616d6574206c6967756c6120646170696275732066696e696275732e2045007469616d2073697420616d6574206c6f72656d206c65637475732e204e756c006c616d206665726d656e74756d206e69736c206c696265726f2c207669746100652074696e636964756e74207075727573206c6163696e696120717569732e00204d6f726269207574206d6f6c657374696520697073756d2c206575206d6f006c6573746965206c6967756c612e2050686173656c6c7573206574206c656300747573206a7573746f2e20566976616d7573206578206d61676e612c20636f006e7365717561742076656c206a7573746f2076656c2c2074656d706f722061006c697175616d20616e74652e205365642066696e6962757320736564206d6100737361207175697320636f6d6d6f646f2e20446f6e656320696e206e69626800206e65632074656c6c757320636f6e677565206469676e697373696d206567006574207669746165206e756c6c612e204475697320656c656966656e642070006c616365726174207269737573206120706c6163657261742e204d617572690073206e6563206c65637475732068656e6472657269742c207361676974746900732076656c697420636f6e64696d656e74756d2c206567657374617320647500692e0a0a4e616d20696163756c69732076656c697420717569732075726e610020706f7274612073616769747469732e2041656e65616e20636f6d6d6f646f00206e69736c206e656320697073756d206c6f626f727469732c20626962656e0064756d2065666669636974757220656e696d20636f6e64696d656e74756d2e002050726f696e206172637520656c69742c206665726d656e74756d2075742000656765737461732061742c206c616f726565742076656c206e69736c2e2049006e746567657220626962656e64756d20747572706973207574206469616d20006665726d656e74756d2c2065752074656d707573206c656f206672696e6769006c6c612e204d616563656e61732076656c697420617263752c20636f6e6469006d656e74756d20696d7065726469657420657261742065742c206661756369006275732076756c707574617465206c65637475732e2043757261626974757200206d6574757320656e696d2c206672696e67696c6c6120757420666163696c00697369732061632c20616363756d73616e20696e20697073756d2e204e756c006c616d207665686963756c61206c6163696e6961206d617373612c2076656c00206661756369627573206f64696f20636f6e64696d656e74756d2061742e20004d617572697320706f72747469746f722065726f73206d61676e612c20757400206d6178696d75732074656c6c7573206665726d656e74756d2069642e2056006976616d7573207574206c6563747573206f726e6172652c20706f7274746900746f72206469616d20656765742c20756c6c616d636f72706572206e696268002e20447569732076656e656e617469732074656d706f7220657261742c207500742076617269757320657374206c6f626f727469732076656c2e205068617300656c6c757320736564206578206c65637475732e205365642076656c207361007069656e20616c697175616d2c20696e74657264756d206475692069642c2000656c656966656e64206f7263692e0a0a5072616573656e74206174206c6f62006f72746973206d657475732e204e616d2074656d707573207175616d20647500692c206e6563206c7563747573206d617373612074696e636964756e742061002e2050656c6c656e74657371756520616363756d73616e2076656c697420750074206175677565206d617474697320636f6e76616c6c69732e205574206567006573746173206f64696f20656e696d2c206163207669766572726120616e74006520636f6e76616c6c69732075742e2041656e65616e20696e2064756920610074207175616d206665726d656e74756d2072757472756d2e20566976616d750073206567657420636f6e76616c6c6973206c65637475732e20457469616d2000657569736d6f64206672696e67696c6c6120746f72746f722c206e65632069006e74657264756d206a7573746f206d61747469732065752e204e756c6c616d00206d6178696d7573206e696268206469616d2c206575206c6f626f7274697300206a7573746f207072657469756d2076697461652e2051756973717565207400696e636964756e7420646f6c6f722061742075726e6120636f6e64696d656e0074756d2c207669746165206d616c6573756164612065737420706f7274746900746f722e2050656c6c656e746573717565207669746165206475692065782e0020566976616d757320766f6c757470617420697073756d207574207475727000697320656c656d656e74756d20706f7274612e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d617572697320736564200066656c6973206e756c6c612e205072616573656e742076656c207269737573002076656c69742e0a0a446f6e656320706f727461206174206469616d207365006d70657220616c69717565742e2041656e65616e20637572737573206c6f7200656d206e6f6e2076617269757320636f6d6d6f646f2e20536564206e65717500652065726f732c20656666696369747572206e6563206469616d20696e2c20007472697374697175652076697665727261206469616d2e2053757370656e64006973736520746f72746f72206475692c20657569736d6f64206e6563206e75006c6c612061632c20616c697175657420756c74726963696573206c6f72656d002e2050686173656c6c757320636f6e7365637465747572206575206573742000616320656765737461732e204e756e6320757420656c697420696e2070757200757320616363756d73616e20657569736d6f642e2043726173206c656f206f007263692c20677261766964612076656c20626962656e64756d20656765742c0020636f6e76616c6c697320696e2072697375732e2046757363652065676574002073656d7065722073617069656e2e0a0a536564206d6f6c65737469652070006c616365726174206c6967756c61206e656320766976657272612e20496e2000617420656666696369747572206d61676e612e204e616d2066696e6962757300206c6f72656d20657420726973757320756c747269636965732c2076656c2000637572737573206e65717565207363656c657269737175652e20496e7465720064756d206574206d616c6573756164612066616d657320616320616e74652000697073756d207072696d697320696e2066617563696275732e205365642069006e20656765737461732065726f732e2041656e65616e2074656d706f722c20006e69626820636f6d6d6f646f20626962656e64756d206c75637475732c207600656c6974206e756e6320696e74657264756d206f7263692c2073697420616d0065742074656d707573206c656f207075727573207669746165207269737573002e20457469616d207669746165207269737573206e6962682e2056657374690062756c756d206d6f6c65737469652063757273757320616e74652c206567650074206c6163696e6961206c656f206d6f6c65737469652076656c2e0a0a5375007370656e646973736520757420677261766964612073617069656e2e2056650073746962756c756d20616363756d73616e206e756e6320696e2064617069620075732073656d7065722e204e756e632076656c2073656d706572207175616d002e2050656c6c656e746573717565206861626974616e74206d6f72626920740072697374697175652073656e6563747573206574206e65747573206574206d00616c6573756164612066616d6573206163207475727069732065676573746100732e204675736365206d6f6c6573746965206672696e67696c6c61206c6f7200656d2c207175697320747269737469717565206d61676e6120756c6c616d63006f727065722073697420616d65742e2043757261626974757220766974616500206c6f72656d207574206a7573746f206c616f72656574207665686963756c00612061742061206469616d2e2053757370656e646973736520616c69717565007420636f6e73656374657475722065782c20757420636f6e736563746574750072206e6571756520636f6e7365637465747572206e65632e20496e74656765007220766974616520636f6e64696d656e74756d20746f72746f722e204e756e0063207365642073757363697069742073617069656e2e2050686173656c6c75007320656c656d656e74756d20657569736d6f642076656c69742c2065676574002064696374756d20646f6c6f7220756c6c616d636f727065722065752e0a0a0050686173656c6c75732061742064756920697073756d2e204e756e63206c75006374757320617563746f72206e69736c20657520617563746f722e20446f6e00656320636f6e76616c6c69732061726375206c6163696e6961206578207361006769747469732c20736564206f726e61726520616e7465206f726e6172652e00204e616d2074696e636964756e74206a7573746f207475727069732c2073650064206d617474697320616e746520736f6c6c696369747564696e207365642e0020536564206f726e61726520697073756d206e6962682c2061632074656d70006f72206d61676e612076617269757320696e2e204e616d206672696e67696c006c61206d61676e61206d692c2075742065676573746173206c6f72656d207600617269757320696e2e20536564206575206c75637475732073617069656e2e0020496e74656765722076656c206469676e697373696d20656c69742c2061740020706c616365726174207475727069732e20446f6e656320696e206e69626800206964206a7573746f206c6f626f727469732064696374756d2e20446f6e650063207068617265747261206f726369206e656320636f6e76616c6c69732073006f6c6c696369747564696e2e0a0a50656c6c656e746573717565207369742000616d6574206672696e67696c6c612073656d2c2061632073757363697069740020656c69742e20446f6e656320612074726973746971756520697073756d2c00206e6f6e20756c7472696365732065726f732e205072616573656e7420616c00697175616d20697073756d206567657420626962656e64756d20766f6c7574007061742e20447569732073697420616d6574206469616d20626962656e6475006d2c20617563746f72206e69736920656765742c206d6f6c6c697320746f7200746f722e204d61757269732065742076656c69742075726e612e205574206600656c6973206c65637475732c207072657469756d207365642074656d707573002073697420616d65742c206d6f6c6c6973207669746165206c65637475732e00204d61757269732073697420616d6574206f7263692065752074656c6c75730020666163696c697369732074696e636964756e742e20447569732068656e640072657269742066656c69732061206e6571756520617563746f7220636f6e670075652e204d6f726269206c6967756c61206573742c2070656c6c656e746573007175652076656c2073616769747469732065742c20666175636962757320650067657420656e696d2e0a0a517569737175652064696374756d206e6973692000696420736f6c6c696369747564696e207072657469756d2e20496e7465726400756d206574206d616c6573756164612066616d657320616320616e74652069007073756d207072696d697320696e2066617563696275732e2053757370656e006469737365207665686963756c612076656e656e617469732072697375732c00206174207665686963756c61206c616375732072757472756d206e6f6e2e200050656c6c656e746573717565206861626974616e74206d6f72626920747269007374697175652073656e6563747573206574206e65747573206574206d616c006573756164612066616d65732061632074757270697320656765737461732e0020496e207075727573206d617373612c206d6f6c657374696520696e206e6900626820612c2076656e656e6174697320626c616e64697420656c69742e205000686173656c6c75732073617069656e206469616d2c2074696e636964756e740020736f64616c6573206469616d2076697461652c20636f6e67756520736167006974746973206f64696f2e2043757261626974757220657569736d6f64206e00656320616e746520736564207072657469756d2e2050656c6c656e74657371007565206d6f6c65737469652076617269757320656e696d2c206e6f6e20666100756369627573206c656f2073616769747469732061632e20437572616269740075722071756973206d61757269732071756973206c6967756c6120756c6c61006d636f72706572206d616c65737561646120736564206575206c6563747573002e0a0a53757370656e64697373652076656c206d61676e61206469676e69730073696d2c2064696374756d206e657175652073757363697069742c2062696200656e64756d206c616375732e205175697371756520717569732066656c69730020617263752e2050686173656c6c75732065726174206c656f2c2073656d7000657220617420646f6c6f7220656765742c2076656e656e617469732072686f006e6375732065782e2043726173206d6f6c6c6973206e696268207365642061007567756520736f64616c65732c2073697420616d6574206d6f6c6c6973207000757275732070686172657472612e2043726173206e6563206d69207175697300206c656f20696d7065726469657420616363756d73616e20757420696420710075616d2e204e616d206e69736c20656c69742c206f726e6172652065752075006c7472696365732076697461652c20706f72747469746f72206574206c696700756c612e2050656c6c656e746573717565207665686963756c6120656c69740020657420697073756d20636f6e7365717561742c206e6563206d6f6c6c6973002065737420696e74657264756d2e2055742074656d706f722063757273757300206d6f6c65737469652e204d61757269732074696e636964756e742061636300756d73616e206e756e6320696420696d706572646965742e20457469616d20006d616c6573756164612c206e6973692061632076756c7075746174652069610063756c69732c206e697369206f72636920706c616365726174206e756c6c61002c206e65632074696e636964756e742074656c6c757320656c69742071756900732075726e612e20457469616d206c61637573206d617373612c2068656e6400726572697420757420636f6d6d6f646f20612c20696e74657264756d20696400206e69736c2e20496e746567657220766974616520616e7465206672696e6700696c6c61206d692074696e636964756e7420636f6e73656374657475722e20004e756c6c6120636f6e7365637465747572206f726e61726520626962656e6400756d2e0a0a55742073697420616d657420657569736d6f642074656c6c7573002e2050656c6c656e746573717565207072657469756d2074696e636964756e0074206475692065752073656d7065722e205365642076656c2065726f73206e006f6e20646f6c6f7220696163756c697320696e74657264756d20736564207100756973206f7263692e20496e2073656d706572206c6f626f7274697320646900676e697373696d2e205365642066617563696275732066657567696174207000656c6c656e7465737175652e2050656c6c656e74657371756520736f6c6c69006369747564696e206f64696f20736564206c6563747573207361676974746900732c206e6f6e20756c7472696369657320697073756d2072757472756d2e200053656420736564206f726e6172652065782e0a0a5072616573656e7420766900746165206d6f6c6573746965207175616d2c20616320626c616e646974206f0064696f2e20457469616d2065676573746173206375727375732075726e612000696420657569736d6f642e204e616d20616c6971756574206172637520657500206c7563747573206c616f726565742e20457469616d20696d7065726469650074207175616d2076656c20636f6e73657175617420626c616e6469742e204d00617572697320696e74657264756d2c206469616d20766172697573206c616300696e696120616c69717565742c2076656c69742074656c6c757320706861720065747261206a7573746f2c20656765742073757363697069742075726e6120006e756c6c612071756973206c656f2e204e756c6c61206578206e69736c2c2000666175636962757320617420626c616e6469742061632c2063757273757320006120697073756d2e20566976616d75732071756973206469616d20636f6e670075652c20657569736d6f642075726e612073697420616d65742c206672696e0067696c6c6120646f6c6f722e204e616d206e6f6e206e756c6c6120636f6e67007565206c696265726f2074656d706f7220756c747269636965732e2050656c006c656e7465737175652070756c76696e61722073617069656e20766974616500206e756e63207363656c65726973717565206672696e67696c6c612e204675007363652068656e64726572697420656666696369747572206661756369627500732e20416c697175616d2070757275732061756775652c206c756374757320006e6f6e20636f6e76616c6c697320717569732c206d6178696d7573206e6f6e00206475692e0a0a446f6e65632070656c6c656e74657371756520657261742000657520657374206c6163696e696120616363756d73616e2e2050726f696e20006d6f6c6c69732073656d20646f6c6f722c206964206d6f6c6c6973206c656300747573207669766572726120696e2e204e756e632071756973206d6173736100207661726975732c206665726d656e74756d206c656f2076697461652c206c006f626f72746973206e657175652e205175697371756520756c6c616d636f7200706572206a7573746f20766974616520636f6e67756520656c656966656e64002e20457469616d206574206c61637573206573742e20496e7465676572207400757270697320617263752c20616363756d73616e2076656c20697073756d2000656765742c206d616c65737561646120756c6c616d636f72706572206a757300746f2e204d6175726973206e6f6e2065782074696e636964756e742c20756c00747269636573206c616375732061742c20626c616e646974206f64696f2e2000566573746962756c756d2067726176696461206e65632073617069656e206e006563206469676e697373696d2e2053757370656e64697373652074656d706f007220696e206e69736c2076656c206d6f6c6c69732e204d616563656e6173200067726176696461206c616375732074656c6c75732c20657420756c7472696300696573206e756c6c612074696e636964756e7420612e20416c697175616d20006572617420766f6c75747061742e20446f6e65632065726f73206c6563747500732c206469676e697373696d2069642073617069656e2061742c20706c6163006572617420666163696c697369732070757275732e20566976616d757320700072657469756d2c206d69206120756c6c616d636f727065722074696e63696400756e742c206475692074656c6c757320626c616e646974206d617373612c20006e65632066696e6962757320657374206e69736c2071756973206e6962682e0020467573636520646170696275732064756920696e20636f6e73656374657400757220706c6163657261742e20467573636520736f6c6c696369747564696e00206567657374617320657261742c2073697420616d657420616363756d7361006e206c656f2074696e636964756e7420696e2e204d6f7262692065666669630069747572206d61757269732069642064696374756d20666163696c69736973002e0a0a55742075726e61206d61676e612c20706f72747469746f722061632000656666696369747572206e6f6e2c20656666696369747572206174206d61730073612e2041656e65616e2073656420656c6974206e6f6e2065782073757363006970697420616363756d73616e2e20416c697175616d207669746165206c65006f2073616769747469732c2067726176696461206c6967756c612065742c200070756c76696e617220646f6c6f722e20457469616d20616320746f72746f7200206c6f72656d2e2050686173656c6c7573206567657374617320696163756c00697320677261766964612e204e756e63206e6f6e206e756e63206e6962682e0020566976616d757320766974616520617563746f722073617069656e2e20430072617320706f7375657265206e756c6c61206f64696f2c20657520706f727400612065782076656e656e6174697320612e204e616d207269737573206e65710075652c20657569736d6f642075742063757273757320656765742c2066617500636962757320736f6c6c696369747564696e20746f72746f722e2043757261006269747572207574206d65747573206e6f6e206469616d20617563746f72200074696e636964756e742e20496e7465676572206d616c65737561646120707200657469756d2076656e656e617469732e20566976616d75732072686f6e637500732074696e636964756e74206c6f72656d207175697320756c74726963696500732e2050686173656c6c7573206f726e6172652065726f732065742068656e0064726572697420636f6d6d6f646f2e0a0a4375726162697475722069616375006c697320636f6e7365717561742073656d20717569732070656c6c656e746500737175652e2050726f696e206d617474697320656e696d20696e2065737420007361676974746973207661726975732e204d6f726269206e65632074696e63006964756e742076656c69742c206575206469676e697373696d20657261742e0020416c697175616d206572617420766f6c75747061742e205072616573656e00742066696e696275732074656c6c757320696e2068656e6472657269742076006573746962756c756d2e20437572616269747572206d6f6c6c69732074656c006c7573206d692c206e6563206d616c6573756164612076656c6974207375730063697069742061742e205365642065726174206e657175652c207275747275006d20736564206665726d656e74756d2076656c2c2070656c6c656e74657371007565206e6f6e20616e74652e204e616d20736f64616c65732070756c76696e006172206c6f72656d2c2065742074696e636964756e74206d6173736120646900676e697373696d2061632e20457469616d206d61737361207175616d2c2076006f6c7574706174206574206c6f626f727469732073697420616d65742c207600656e656e6174697320696420656e696d2e0a0a446f6e656320706f72746120006e69736c20657520697073756d20706f72747469746f722c2065676574207000756c76696e6172206c6f72656d206d6178696d75732e205574206163206e6500717565206c6f72656d2e204e756c6c612061206c6f72656d2065676574206c00656f206d6f6c6c6973206469676e697373696d2e20566573746962756c756d0020696d706572646965742073656d706572206c65637475732e204e756c6c6100206574206469616d206574206e756c6c61206f726e61726520736f6c6c69630069747564696e2e2050726f696e206120746f72746f7220636f6d6d6f646f2c00207665686963756c61206a7573746f2061742c2074696e636964756e74207300617069656e2e2043757261626974757220657569736d6f642076697665727200612072686f6e6375732e204e756e6320766172697573206f726369206e656300206d6173736120766976657272612c2065676574206c7563747573206c616300757320756c7472696365732e20437572616269747572206375727375732065006c697420646f6c6f722e20467573636520616c6971756574206f726e617265002065726f732c20612067726176696461206578206d616c657375616461207600656c2e204e616d206163206d61676e6120636f6e7365717561742c2076617200697573206d61757269732065752c206665726d656e74756d206c696265726f002e0a0a5072616573656e7420657420646f6c6f722074656d706f7220647569002074696e636964756e742064696374756d2e2050656c6c656e74657371756500206d6178696d757320697073756d20657520656765737461732074656d707500732e20467573636520616c697175616d20696d7065726469657420616e74650020657420626c616e6469742e204d61757269732068656e647265726974206c006f626f72746973206c616f726565742e2041656e65616e20706f7274612076006f6c757470617420697073756d2c206120736f6c6c696369747564696e20610072637520756c6c616d636f72706572206e6f6e2e20536564207661726975730020706c61636572617420656e696d206575207072657469756d2e20496e206a007573746f20617263752c20656c656d656e74756d20757420616c6971756574002065752c206c616f72656574206964206c656f2e20496e7465676572207365006420617263752061206469616d206c75637475732072686f6e6375732e20550074206567657420636f6e677565206d657475732c2069642072757472756d20006c65637475732e0a0a4d6f726269207665686963756c6120616363756d7361006e206e69736c2c20617420706f727461206c616375732066617563696275730020656765742e2053757370656e64697373652076756c707574617465206d6900206e6f6e20766f6c757470617420666575676961742e2051756973717565200064696374756d20706f72747469746f72206f64696f2073697420616d65742000636f6e6775652e2041656e65616e20657569736d6f64207072657469756d2000656c697420706f72747469746f722066696e696275732e204d616563656e610073207365642076756c7075746174652072697375732e2041656e65616e206500726f7320656e696d2c2076656e656e6174697320696420636f6e7365717561007420612c2072686f6e637573206f726e6172652073656d2e20517569737175006520626962656e64756d20766f6c757470617420616e74652c20616320706f0073756572652073617069656e20737573636970697420656666696369747572002e204e756c6c61206f726e617265206e696268206163206d6175726973207600756c7075746174652c206e6f6e207068617265747261206469616d2076697600657272612e20436c61737320617074656e742074616369746920736f63696f00737175206164206c69746f726120746f727175656e742070657220636f6e7500626961206e6f737472612c2070657220696e636570746f732068696d656e6100656f732e2050726f696e20617420766573746962756c756d2076656c69742e002053656420766976657272612076656e656e61746973206d692c207574206d00616c657375616461206e756c6c612e204475697320706861726574726120690064206e69626820617420636f6e6775652e20536564206c6163696e6961206500726f732061206572617420766976657272612c20612074696e636964756e740020617567756520616363756d73616e2e2050656c6c656e746573717565206c006f626f7274697320616363756d73616e2073656d2c2065676574206d616c65007375616461206e756c6c61206665726d656e74756d2073697420616d65742e0020496e20616363756d73616e206c616f72656574206e69736c2076697461650020666575676961742e20416c697175616d206572617420766f6c7574706174002e0a0a4475697320696420616e7465206c6967756c612e2050686173656c6c00757320736167697474697320706c61636572617420706f73756572652e204d00616563656e61732076697461652076697665727261206c616375732c206d6f006c6c6973206d616c657375616461206c65637475732e2050656c6c656e7465007371756520696e20657374206c6163696e69612c20656c656d656e74756d20006e756e6320656765742c2070656c6c656e746573717565206a7573746f2e20005175697371756520636f6e67756520747572706973206e6f6e206f64696f2000626c616e64697420736167697474697320677261766964612065742069707300756d2e204e756c6c616d206c6f626f72746973206e6571756520616320656c00697420636f6e76616c6c697320616363756d73616e2073697420616d6574200070756c76696e6172206d617373612e20446f6e656320657520636f6d6d6f64006f20616e74652c2073697420616d657420756c6c616d636f7270657220646f006c6f722e2044756973206d6175726973206c6967756c612c20656c656d656e0074756d2061742066617563696275732061632c20616c697175616d20696e200066656c69732e205072616573656e74206c6f626f72746973206578207369740020616d6574206e69736c20756c74726963696573206c6163696e69612e2056006976616d757320617563746f722c2073656d20717569732076657374696275006c756d207363656c657269737175652c2073617069656e206e69736c207275007472756d206c696265726f2c2073697420616d657420696e74657264756d20006e69736c206a7573746f207669746165206c65637475732e20566976616d75007320696d70657264696574206e756c6c6120657520657261742076656e656e00617469732c20736564206d6f6c657374696520646f6c6f7220766568696375006c612e20517569737175652076656c2061726375207365642073656d207365006d706572206375727375732e2050656c6c656e746573717565206d61747469007320656c656966656e64207269737573206574206d6f6c6c69732e20557420006c6f626f727469732c2065737420736564206665726d656e74756d2073656d007065722c2075726e612072697375732064617069627573206475692c2061200074656d707573206d6175726973206e69736c206174206469616d2e2056697600616d7573206469676e697373696d20666163696c6973697320636f6e7365630074657475722e20496e20706f737565726520736f6c6c696369747564696e2000656c656d656e74756d2e0a0a457469616d20697073756d206573742c206d61006c657375616461206120666575676961742073697420616d65742c206d6f6c00657374696520656765742066656c69732e2041656e65616e2074656d70757300206672696e67696c6c61206469616d20696e20616c697175616d2e20446f6e0065632073697420616d65742072757472756d206469616d2e2050686173656c006c757320756c6c616d636f72706572206d617474697320616363756d73616e002e2053757370656e646973736520616c6971756574207669746165206e6973006920616320766f6c75747061742e2050726f696e207075727573206d6175720069732c20696d706572646965742073697420616d657420647569206e6f6e2c00207665686963756c6120637572737573206f7263692e20446f6e6563206574002074656c6c7573206574206d6574757320766573746962756c756d20656c65006d656e74756d206163206d6f6c6c6973206a7573746f2e2050656c6c656e74006573717565206c6967756c61206e69736c2c20616c697175616d206163206c006967756c6120706f73756572652c20656c656d656e74756d2068656e64726500726974206d61757269732e204d617572697320666163696c69736973206665006c697320696e2072757472756d20696163756c69732e204e756e632066657500676961742073656d20612068656e6472657269742072757472756d2e20496e007465676572206d6f6c65737469652064696374756d2066696e696275732e200041656e65616e206e656320766f6c7574706174206c6967756c612e205175690073717565206d617373612070757275732c2070686172657472612075742069006163756c6973207365642c20706f72747469746f7220616320616e74652e2000416c697175616d206d6173736120656e696d2c2076756c707574617465206e006563206d692069642c20756c6c616d636f72706572206665756769617420740075727069732e0a0a4e756e63207669766572726120647569206c6f72656d2c002073697420616d657420656666696369747572206d65747573207375736369007069742076656c2e20566573746962756c756d2073697420616d657420706f0072747469746f722065782e205574206d616c657375616461206c656374757300206e6563206d65747573206672696e67696c6c612c206e65632073656d706500722075726e61206d616c6573756164612e20557420756c6c616d636f7270650072206e697369206174206e69736c20696d706572646965742070756c76696e0061722e20566573746962756c756d2065726f7320646f6c6f722c20766f6c750074706174206964206f64696f2069642c2074656d70757320636f6e76616c6c0069732072697375732e2043726173206575206661756369627573206c69626500726f2e2050656c6c656e74657371756520696163756c69732076657374696200756c756d20646f6c6f72206964206566666963697475722e204675736365200061206e756e6320717569732075726e61206469676e697373696d2064617069006275732e2050726f696e2076656c20696163756c69732073656d2c2061742000636f6e76616c6c6973206475692e20496e2069642066656c69732074656c6c0075732e20446f6e6563207068617265747261206d6f6c65737469652061726300752c2061206d616c6573756164612065737420677261766964612069642e0a000a5175697371756520616c6971756574206c6967756c61207574206f7263690020706f73756572652c207365642074696e636964756e74206d61676e612075006c747269636965732e204d616563656e61732073697420616d657420756c6c00616d636f72706572207475727069732e20536564206e6563206d6f6c657374006965207175616d2e20566976616d7573206d617474697320636f6e64696d65006e74756d206f7263692c206e6f6e206375727375732066656c69732074656d007075732065752e2053656420656765742072697375732075726e612e2056690076616d7573206f726e61726520756c6c616d636f7270657220617263752061006320616c69717565742e205072616573656e74206d616c657375616461207000756c76696e6172206c65637475732c2073697420616d65742064696374756d00207269737573206d616c6573756164612061742e204e756c6c612061206d61006c657375616461206c65637475732c2065676573746173206d616c657375610064612066656c69732e20496e20696420696e74657264756d206e756e632e2000496e746567657220666163696c69736973206469676e697373696d20616e74006520717569732070686172657472612e0a0a446f6e65632070656c6c656e7400657371756520656e696d20766974616520616e746520756c7472696365732c0020617420657569736d6f64206d617373612066696e696275732e20517569730071756520636f6e67756520756c7472696369657320706f72747469746f722e002043757261626974757220756c7472696369657320626c616e64697420637500727375732e204675736365206567657420647569206375727375732c2070680061726574726120617263752076656c2c20706c616365726174207075727573002e2043726173206e6563206d6175726973206c656f2e204e616d20707265740069756d207072657469756d20766f6c75747061742e2050686173656c6c757300206e657175652074656c6c75732c206672696e67696c6c612073697420616d00657420666163696c6973697320717569732c20616363756d73616e20736365006c657269737175652073656d2e204e756e632076697461652066656c69732000736564206d6173736120756c747269636965732064617069627573206e6f6e0020657520656e696d2e20496e20706f72747469746f722074656d706f72206e0069736c2c206567657420666163696c697369732075726e612066696e69627500732076697461652e205365642070656c6c656e746573717565206e656320740075727069732075742073656d7065722e205072616573656e74206566666963006974757220656c656966656e64206f64696f2e0a0a4e756c6c612061756374006f7220636f6e64696d656e74756d206e756c6c612e204d616563656e617320006d616c657375616461206d61757269732061206c6967756c6120756c7472690063657320636f6d6d6f646f2065742076656c206469616d2e2053757370656e00646973736520696e74657264756d2074696e636964756e74206c6967756c61002c206120626962656e64756d206d6920696163756c697320612e2053656420006d616c657375616461206d657475732076656c206c696265726f206469676e00697373696d2c2073697420616d657420636f6e677565207175616d2074696e00636964756e742e204375726162697475722066696e696275732074696e63690064756e742073616769747469732e20517569737175652073617069656e2065006e696d2c20736f64616c6573206163206469616d20612c206469676e69737300696d206c6163696e69612074656c6c75732e20446f6e65632065666669636900747572206c616375732072686f6e637573206672696e67696c6c6120636f6d006d6f646f2e20496e20696420656c69742076656c206c6f72656d20736167690074746973206f726e6172652e204372617320757420646f6c6f72206c696775006c612e2053656420656c656966656e64206c656374757320766172697573200066696e696275732072757472756d2e204675736365206e6563206175677565002061206a7573746f207661726975732074656d706f722073656420766974610065206c6f72656d2e204d6175726973206174206c696265726f20696e2065730074206375727375732064696374756d2075742076697461652065726f732e200050686173656c6c75732072757472756d2c206c65637475732076697461652000696e74657264756d20626c616e6469742c206c6f72656d2075726e61207669007665727261206d617373612c2071756973207363656c65726973717565206600656c6973206c6563747573206574206f64696f2e204d61757269732066616300696c69736973206c656f207475727069732c20696d70657264696574206665007567696174206475692074656d706f722073697420616d65742e0a0a4d61650063656e61732061206c656f2061756775652e20437572616269747572206e6f006e20697073756d2073697420616d657420656c6974206c616f72656574207600656e656e617469732065676574206e6f6e206d61676e612e204375726162690074757220616c697175616d20696163756c697320706f72747469746f722e2000536564206163206c6f72656d206120646f6c6f7220616c6971756574206c7500637475732e2050726f696e206c6163696e696120697073756d20616e74652c002073697420616d657420696d70657264696574206c6563747573206469676e00697373696d20656765742e20566573746962756c756d20656666696369747500722073697420616d65742073656d207175697320736f64616c65732e2056690076616d75732070756c76696e6172207068617265747261206e69736c2076690074616520616363756d73616e2e204475697320696e74657264756d20636f6e00677565207661726975732e20446f6e65632061207361676974746973206e690073692c207175697320656c656d656e74756d206475692e20536564206c756300747573206c616f72656574206c656f206567657420756c7472696365732e0a000a446f6e6563206120617567756520656765737461732c2076756c70757461007465206573742076656c2c206c616f72656574206c616375732e20416c69710075616d20646f6c6f7220646f6c6f722c20706c61636572617420696e2065670065737461732073697420616d65742c20616c69717565742061206f7263692e0020496e2076756c70757461746520626c616e64697420656c69742c2068656e0064726572697420636f6d6d6f646f2075726e6120626962656e64756d206575002e20457469616d20617567756520616e74652c206d6f6c6573746965207175006973206f64696f2065752c2074656d70757320636f6d6d6f646f206e696268002e205574206d6174746973206c6163696e69612073617069656e2075742064006170696275732e20457469616d20636f6e736571756174206e6f6e206f6469006f2071756973206375727375732e204e756e6320616c69717565742062696200656e64756d20646f6c6f722065752073656d7065722e20566976616d757320006163206d692073697420616d65742061726375206c6163696e6961207275740072756d2073697420616d65742061206e756c6c612e2050686173656c6c75730020657261742072697375732c206c75637475732065676574206c6f72656d200076697461652c206d616c65737561646120626962656e64756d206d65747573002e204e616d206964206d617474697320656e696d2c206665756769617420730061676974746973206d657475732e2050686173656c6c7573206c7563747573002074757270697320657261742c20657420766172697573206d61676e61207200686f6e6375732069642e0a0a437261732076617269757320736167697474690073206f64696f20757420677261766964612e20536564206f726e6172652070006f7274612076756c7075746174652e20496e746567657220706f7375657265002061726375206c6f72656d2c206964207363656c657269737175652073656d002065666669636974757220612e205365642076656c20617563746f722069700073756d2e2050656c6c656e7465737175652069642065726f73206574206c6f0072656d20616363756d73616e20616363756d73616e20656765742071756973002065726f732e204e756e632063757273757320636f6e64696d656e74756d20006d692c206e65632066617563696275732070757275732070756c76696e6172002070686172657472612e205365642073656420736f64616c6573206e756e63002e2046757363652070756c76696e617220756c747269636573206d692c206900642072757472756d206d69206672696e67696c6c612061632e205365642069007073756d207175616d2c20756c74726963696573207669746165206c616369006e69612076697461652c206665726d656e74756d206e6f6e206d6175726973002e205072616573656e74206461706962757320756c6c616d636f7270657220006c6967756c612c206567657420756c6c616d636f727065722073656d2064610070696275732065752e2046757363652073697420616d65742076657374696200756c756d206c616375732e205072616573656e74207365642074726973746900717565206c616375732c2076656c2070756c76696e6172206573742e0a0a460075736365206e6563206e6571756520646f6c6f722e20566573746962756c75006d20616c697175616d206c6967756c612075742064696374756d2073656d700065722e20457469616d206d616c657375616461206d6574757320656765742000656c697420636f6e64696d656e74756d20636f6e7365717561742e205375730070656e646973736520736167697474697320656e696d207175616d2c20696e0020756c74726963696573206c656f206461706962757320717569732e205065006c6c656e7465737175652063757273757320766172697573206e6973692c200076656c20736167697474697320656c6974206d6178696d7573206e6f6e2e200053757370656e646973736520746f72746f72206f64696f2c207068617265740072612076656c206475692061632c20656c656d656e74756d2076756c707574006174652074656c6c75732e20416c697175616d20696420666163696c69736900732065782e2044756973206e6563206672696e67696c6c61206e69736c2e2000467573636520736564206672696e67696c6c612065782e20467573636520750074206d6175726973206574207175616d207669766572726120696e7465726400756d20612061742065726f732e20416c697175616d20616363756d73616e2000657261742075742074656c6c7573206469676e697373696d20696163756c6900732073656420657420746f72746f722e2050726f696e20736564206175677500652073697420616d6574206d657475732072757472756d20677261766964610020696e2076656c206e69736c2e20496e746567657220706f73756572652061007263752069642065726f73206665726d656e74756d2074656d706f722e0a0a00557420756c74726963657320697073756d206f7263692e204d61757269732000617563746f72206d6178696d75732072697375732c20717569732066696e6900627573206e756c6c612065666669636974757220696e2e204e616d20756c74007269636573206e6571756520616320657820666163696c697369732c20696e002074656d707573206c6967756c61206c6f626f727469732e204372617320700068617265747261206c6f72656d20696e74657264756d206e65717565206865006e64726572697420617563746f722e2050686173656c6c7573206e6f6e207200757472756d206c696265726f2c20617420736f64616c657320697073756d2e0020496e20756c6c616d636f72706572206578206c65637475732c207369742000616d6574207068617265747261206e756c6c6120636f6e76616c6c6973207200686f6e6375732e2053757370656e6469737365206e6f6e20656c6974206c6f0072656d2e205072616573656e7420756c6c616d636f72706572206e756c6c61002076656c20637572737573206469676e697373696d2e2041656e65616e2073006f64616c657320746f72746f72206f64696f2c20617420656c656966656e6400206c6967756c61206469676e697373696d2073697420616d65742e2044756900732076656c20736f6c6c696369747564696e2074656c6c75732e204d61656300656e617320717569732070656c6c656e746573717565206475692e204d6175007269732071756973207361676974746973206e756e632e2044756973207275007472756d206d616c657375616461206c6967756c612065752070756c76696e0061722e0a0a41656e65616e206772617669646120706f727461207175616d20007365642070656c6c656e7465737175652e2050656c6c656e7465737175652000766573746962756c756d20626962656e64756d207472697374697175652e2000566573746962756c756d20696e206572617420656e696d2e2050726f696e200065726f73206f7263692c2072686f6e63757320616320616c697175616d206e006f6e2c207072657469756d2061206f7263692e20566573746962756c756d200074656d7075732c2076656c6974206d616c657375616461206c6163696e69610020646170696275732c2075726e61206c6f72656d206672696e67696c6c6120006d617373612c20696e206d6178696d757320656e696d20656e696d20657420006e69736c2e204e616d207669766572726120636f6e64696d656e74756d206c006967756c6120696e20696d706572646965742e20536564207175697320656c00656d656e74756d206a7573746f2e204e756c6c61206f726e61726520636f6e00736563746574757220656e696d2061742074696e636964756e742e2045746900616d2073697420616d6574206c616f7265657420697073756d2e0a0a45746900616d20666163696c697369732065737420706f72747469746f722c2066696e00696275732066656c69732065742c207375736369706974206c65637475732e002041656e65616e20706c616365726174206567657374617320616c6971756500742e204d617572697320657420656e696d206c65637475732e204d61656365006e61732070656c6c656e746573717565206d6f6c6c6973206d69206469637400756d20636f6e6775652e205072616573656e742076656c2066656c6973206c00616f726565742c20636f6e7365637465747572206e756c6c61206e6f6e2c2000666575676961742074656c6c75732e2053656420616c697175616d2076656c006974207365642073656d20706c616365726174207361676974746973206174002073697420616d6574206c696265726f2e2051756973717565206d6174746900732072757472756d20656e696d2c2073656420656c656d656e74756d207665006c69742e2050686173656c6c7573206e6f6e206c616f72656574206f64696f002e2043757261626974757220656c656966656e64206f64696f207369742061006d657420756c7472696369657320756c6c616d636f727065722e20496e20650067657420726973757320756c7472696365732c207665686963756c61206c65006374757320696e2c20616c6971756574207475727069732e0a0a5068617365006c6c7573206e6f6e206d6574757320617563746f722c20636f6e736563746500747572206e69736c2061742c207361676974746973207175616d2e20507261006573656e7420746f72746f722074656c6c75732c2074656d706f72206e6f6e002070686172657472612069642c207661726975732061742070757275732e2000536564206120636f6e64696d656e74756d206e6962682e205072616573656e0074206c656f206e756e632c20756c6c616d636f72706572207665686963756c006120766573746962756c756d2074696e636964756e742c206665726d656e7400756d20757420616e74652e20496e206f726e617265206c61637573206e6f6e00206c696265726f20736f6c6c696369747564696e2c206575206665756769610074206e756c6c6120626c616e6469742e2050656c6c656e74657371756520680061626974616e74206d6f726269207472697374697175652073656e656374750073206574206e65747573206574206d616c6573756164612066616d6573206100632074757270697320656765737461732e204e756e632065676574206e756e00632073697420616d6574206d61757269732070686172657472612076657374006962756c756d20657520766974616520656e696d2e20496e20766f6c7574700061742073617069656e2065676574206c65637475732074696e636964756e740020766f6c75747061742e20416c697175616d207365642076697665727261200075726e612e204675736365206c6563747573206d657475732c20756c747269006365732076656c20657569736d6f642065742c20616c6971756574207365640020746f72746f722e2050686173656c6c757320626c616e6469742070656c6c00656e74657371756520756c747269636965732e204f7263692076617269757300206e61746f7175652070656e617469627573206574206d61676e697320646900732070617274757269656e74206d6f6e7465732c206e6173636574757220720069646963756c7573206d75732e204e756c6c61206469676e697373696d2c200076656c6974207175697320666163696c697369732072686f6e6375732c206e00756c6c612066656c697320747269737469717565206d61757269732c2065750020636f6d6d6f646f206c656f206f726369206174206e6973692e2046757363006520636f6e736563746574757220746f72746f7220657420706861726574720061207665686963756c612e204e756e63207665686963756c612c206d65747500732073697420616d657420657569736d6f642064696374756d2c20646f6c6f0072206d6574757320616363756d73616e206573742c20696e20696163756c690073206d61737361206c696265726f206e6f6e206c65637475732e0a0a496e2000617420636f6e736571756174207475727069732e204675736365206d69206e00756c6c612c206672696e67696c6c6120757420766172697573207669746165002c20747269737469717565206174206e6973692e204e756c6c61206964206d00692065726f732e204d6f726269206469616d20616e74652c2076656e656e610074697320696e2073757363697069742076656c2c2074696e636964756e7420007669746165206f64696f2e204d61757269732068656e647265726974206e6f006e206172637520696420636f6e73656374657475722e205072616573656e740020616c697175616d206e756e632076656c206d61676e61207665686963756c006120616c69717565742e204e616d20636f6e7365637465747572206e756c6c006120717569732075726e6120696163756c697320756c6c616d636f72706572002070656c6c656e74657371756520657420617263752e20496e746567657220006163206c616f726565742076656c69742e2050656c6c656e7465737175652000757420616e7465207175616d2e20566976616d75732061206d617474697320006c656f2c2069642074656d707573206d692e204675736365207363656c657200697371756520646170696275732070757275732073656420616c697175616d002e0a0a46757363652076656c20656e696d2070656c6c656e7465737175652c0020656c656d656e74756d206469616d2065752c2076756c707574617465207600656c69742e204e756e63206c696265726f2074656c6c75732c20656c656d65006e74756d206964207175616d2073697420616d65742c20617563746f722070006f72747469746f722070757275732e204c6f72656d20697073756d20646f6c006f722073697420616d65742c20636f6e7365637465747572206164697069730063696e6720656c69742e20457469616d206d6f6c6573746965206e756e632000736f64616c657320636f6d6d6f646f20696163756c69732e204e616d20717500697320656c69742061206c696265726f20616c697175657420636f6e64696d00656e74756d207669746165206163206d692e20457469616d20756c7472696300657320756c74726963696573206d61676e6120766974616520706f7375657200652e20566976616d757320757420657569736d6f642076656c69742e20437200617320736f64616c6573206c6163696e6961206d61676e612c207175697320006665726d656e74756d20657261742064696374756d2073697420616d65742e002046757363652074696e636964756e74206c696265726f206574206e657175006520747269737469717565206375727375732e204372617320616320646f6c006f72206c6967756c612e2050726f696e206567657420696d7065726469657400206d61757269732e20416c697175616d206469616d20646f6c6f722c2066610063696c697369732076656c206e69626820656765742c20636f6e7365717561007420766573746962756c756d206c696265726f2e20437572616269747572200076756c7075746174652066617563696275732061756775652065676574207300757363697069742e204e756e632074696e636964756e742074656c6c757320007574206d6f6c6c6973206d6178696d75732e2050726f696e2076657374696200756c756d206c616f726565742073617069656e2c206e6563206672696e6769006c6c61206e6973692074656d70757320696e2e0a0a566573746962756c756d0020616e746520697073756d207072696d697320696e20666175636962757320006f726369206c756374757320657420756c74726963657320706f73756572650020637562696c69612063757261653b20566573746962756c756d2066616369006c697369732c20707572757320657520706f7375657265206c6163696e6961002c20707572757320657374206c616f72656574206e69736c2c206e65632076006f6c757470617420616e746520657261742076697665727261206e756c6c61002e204e756c6c6120666163696c6973692e20496e206e656320706f72746120006d657475732e20446f6e656320666163696c6973697320646f6c6f72207369007420616d6574206f64696f20616c697175616d2c206567657420706f7274740069746f7220697073756d2076756c7075746174652e204d6175726973207665006e656e61746973206d61676e61206575206578206f726e6172652c2069642000736f6c6c696369747564696e20616e746520636f6e6775652e2050656c6c65006e7465737175652075726e61206f7263692c20756c747269636965732076690074616520706f73756572652075742c20756c7472696365732071756973207400656c6c75732e20536564206e6f6e20656c656966656e64206d692c20657520007472697374697175652073656d2e2041656e65616e2074656d707573206d61007373612065752067726176696461206d616c6573756164612e2050726f696e00206e65632076756c707574617465206e756e632e204e756e63206d616c657300756164612c206469616d206e6f6e20636f6d6d6f646f2064696374756d2c20007175616d206e69736c2074696e636964756e74206c616375732c207369742000616d65742066657567696174206c6f72656d206e756c6c61206e65632069700073756d2e0a0a4d617572697320736564206d6574757320617420646f6c6f720020636f6e64696d656e74756d20636f6e73657175617420616363756d73616e0020616320646f6c6f722e2053757370656e6469737365206c75637475732062006c616e6469742065782c20617420656c656d656e74756d206d69206469637400756d2065752e20416c697175616d2074696e636964756e7420656c656d656e0074756d206d61676e6120766974616520616c69717565742e20446f6e65632000696e206f726e617265206d61757269732e20496e206c6163696e6961207369007420616d6574206e756c6c61207669746165206665726d656e74756d2e2044006f6e6563206e6563206665726d656e74756d2075726e612c20617420667269006e67696c6c612076656c69742e20416c697175616d206572617420766f6c7500747061742e20566573746962756c756d2073656420747572706973206e65710075652e20496e74656765722076656c20737573636970697420747572706973002e20536564206e656320636f6e64696d656e74756d206e657175652e204165006e65616e20636f6e76616c6c697320766f6c757470617420706f7375657265002e2050686173656c6c7573206c6f626f72746973206c6967756c612076656c002072686f6e637573206c616f726565742e2041656e65616e2065676574206500737420696163756c69732c2076656e656e61746973206f64696f2075742c200064696374756d2074656c6c75732e2044756973207669746165206572617420007669746165206e69736920637572737573206d61747469732e204e756e632000626c616e6469742070656c6c656e7465737175652072697375732c206c7563007475732074696e636964756e74206d61676e6120706f7274612061632e204300726173207669766572726120616c697175657420706f73756572652e0a0a4c006f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7300656374657475722061646970697363696e6720656c69742e204e756c6c616d00206575206c61637573206c65637475732e20467573636520612074656c6c750073206c616375732e20496e74657264756d206574206d616c657375616461200066616d657320616320616e746520697073756d207072696d697320696e206600617563696275732e204e756c6c616d2070656c6c656e746573717565206c6f0072656d207175616d2c2076656c2074656d706f7220746f72746f7220707265007469756d2076697461652e20566573746962756c756d20736f6c6c69636974007564696e2071756973206d692061632072757472756d2e20496e746567657200206469676e697373696d206c696265726f20616c697175616d206672696e6700696c6c6120616363756d73616e2e20446f6e656320666163696c697369732000647569206e6f6e206c656f2074656d707573206c75637475732e2053656420006d616c657375616461207665686963756c6120756c7472696365732e2055740020616e746520616e74652c20616c69717565742073697420616d657420736f006c6c696369747564696e2066696e696275732c20626c616e64697420756c740072696365732061756775652e20536564206e6563206e6973692071756973200076656c697420636f6e64696d656e74756d20677261766964612e2041656e6500616e20616c697175657420657569736d6f64206475692c20757420766568690063756c6120697073756d2066617563696275732065752e0a0a4675736365200076656c69742073617069656e2c2073656d706572206574206469676e69737300696d2076656c2c20696163756c69732069642076656c69742e20507261657300656e74206e6f6e206e69736c206567657420616e746520736f6c6c69636974007564696e2072757472756d206e6563206e6563206573742e205365642076690076657272612066656c6973206e69736c2c206e65632065676573746173206500737420736f64616c65732065742e204e616d20636f6e67756520617567756500207375736369706974206578206c616f7265657420706f72747469746f722e0020467573636520626962656e64756d20697073756d206e657175652c20616300206d6178696d757320646f6c6f72206672696e67696c6c612075742e2043750072616269747572206120636f6e736571756174206c6967756c612e204e616d0020766f6c757470617420636f6e736571756174206c696265726f2065752062006c616e6469742e204e616d20696e74657264756d2074656c6c757320757420006f64696f20636f6e736571756174206f726e6172652e204e756c6c612066610063696c6973692e204d616563656e6173206c756374757320616e7465206567006574206f64696f20636f6e64696d656e74756d206672696e67696c6c612e2000496e74656765722065676574206d61676e612073697420616d6574206d6167006e61206665726d656e74756d20677261766964612e0a0a4d6f72626920736f0064616c65732076656c6974206e6973692c2061206d6178696d7573206475690020656c656966656e64206e6f6e2e204d61757269732070757275732065726f00732c20617563746f722075742066696e6962757320656765742c20756c7472006963696573207175697320657261742e2041656e65616e207361676974746900732074757270697320696e206f72636920706f7274612c20696420706861720065747261206578206566666963697475722e20467573636520617420636f6e0067756520657261742e20566573746962756c756d206c756374757320656e69006d206665726d656e74756d206c656f2064696374756d20747269737469717500652e20446f6e6563206e65632066656c69732073697420616d6574206475690020706f72747469746f7220656c656d656e74756d2e205072616573656e7420006c616f726565742c2066656c6973207669746165207472697374697175652000626962656e64756d2c206c6f72656d206e6962682070656c6c656e746573710075652073617069656e2c20736564207363656c65726973717565206c6f7265006d206e6962682076656c2073656d2e204675736365206e6f6e2076656e656e0061746973206e657175652e20446f6e6563207363656c6572697371756520640069676e697373696d20726973757320696420706f7274612e0a0a5375737065006e64697373652072686f6e637573206c696265726f2076656c2066656c697300206c6163696e69612074656d7075732e2046757363652064696374756d206e006571756520736564206e69626820677261766964612c20626962656e64756d00206c6f626f727469732075726e6120616c69717565742e204375726162697400757220657420657569736d6f6420656e696d2e2050656c6c656e7465737175006520696d70657264696574206175677565206c6f72656d2c2075742068656e00647265726974206e657175652073656d7065722076656c2e2050686173656c006c757320636f6d6d6f646f20647569206e6f6e206c6f626f72746973207665006e656e617469732e2043726173207669766572726120736167697474697320006e69736c2c207669746165206c6f626f72746973206d6574757320756c747200696369657320696e2e20416c697175616d207669746165206469676e69737300696d2070757275732c206661756369627573207072657469756d207269737500732e205072616573656e74206163206d61676e6120617563746f722c206d61006c657375616461206e756c6c61206c6f626f727469732c20636f6d6d6f646f00206475692e205072616573656e7420617420746f72746f7220697073756d2e002046757363652074656d7075732c2066656c697320696e20616363756d7361006e2066617563696275732c206c696265726f20656e696d206d6f6c6c69732000656e696d2c20696420656c656d656e74756d206d65747573207075727573200061206d61676e612e204375726162697475722073697420616d657420636f6e0064696d656e74756d2075726e612e20496e2075726e612066656c69732c2063006f6e64696d656e74756d207669746165206e756c6c612065752c20706f73750065726520636f6e64696d656e74756d206e6962682e2050656c6c656e746573007175652067726176696461206f64696f20656c69742c2076656c20616c69710075657420726973757320636f6e7365637465747572206e6f6e2e204d61656300656e61732074656d706f722c206d61676e612061632070686172657472612000616c697175616d2c20616e7465206c6967756c61206665756769617420717500616d2c206575206d6174746973206e756c6c61206e69736c206e6f6e206d61007373612e0a0a496e746567657220756c74726963657320736f64616c657320006a7573746f2e20416c697175616d20626962656e64756d207068617265747200612072697375732c2061632076697665727261206e69736920616363756d7300616e2075742e20457469616d2067726176696461206665726d656e74756d20006d6920696e207363656c657269737175652e20467573636520696e7465726400756d2c206c656f207175697320626962656e64756d206d61747469732c206a007573746f206d65747573206672696e67696c6c6120656c69742c2061632070006c61636572617420747572706973206469616d206661756369627573206e6900736c2e20457469616d206c616f72656574206c696265726f206c6f72656d2c002076656c2074656d707573206f64696f206469676e697373696d2065742e20004e756c6c6120666163696c6973692e20496e7465676572206461706962757300206d6f6c657374696520656e696d2c2061632074696e636964756e74207361007069656e20636f6e76616c6c69732075742e2043726173206d6f6c6c69732000636f6e736563746574757220666163696c697369732e2043757261626974750072207472697374697175652c20726973757320706f72747469746f72207675006c70757461746520756c7472696365732c206c6f72656d2073656d20646967006e697373696d206e657175652c20657520706f72747469746f72206d61676e0061206e697369207669746165207475727069732e20446f6e656320636f6e7300657175617420657374206575206469616d20666575676961742c2076656c2000766573746962756c756d206469616d206c6163696e69612e20457469616d2000756c747269636573206c65637475732073697420616d6574206f726369207300616769747469732c2076656c20616c69717565742065726f73206c6163696e0069612e20496e74656765722070686172657472612c20617263752065752062006c616e6469742064696374756d2c2076656c6974206f64696f20636f6d6d6f00646f206f64696f2c20757420636f6e7365717561742074656c6c757320717500616d206e6563206a7573746f2e205365642065666669636974757220736564002066656c69732061206d6178696d75732e204e756c6c616d20656c65696665006e64207363656c65726973717565206c6f72656d2c20696e206d6f6c65737400696520746f72746f72206d616c6573756164612076697461652e2045746961006d20636f6e64696d656e74756d2c20617567756520657420696163756c69730020646170696275732c206469616d206172637520706f72747469746f72207500726e612c20616320636f6e76616c6c6973206d61676e61206175677565207300656420646f6c6f722e2050686173656c6c75732076656c206f64696f207075007275732e0a0a457469616d20656c656966656e64206469676e697373696d20006e6973692066657567696174206c6163696e69612e205175697371756520650074206c61637573207669746165206172637520706f73756572652074656d700075732e204e616d20636f6e73657175617420657820696e206172637520756c007472696365732c2076656c2076656e656e61746973206e756e63206672696e0067696c6c612e20496e7465676572206575206a7573746f206964206e6962680020626962656e64756d2072757472756d2e20457469616d207363656c657269007371756520747572706973206c656f2c2061632074696e636964756e7420710075616d2064696374756d2065752e204475697320636f6e7365717561742063006f6e677565206a7573746f2c206469676e697373696d20626962656e64756d002073617069656e20656c656966656e6420656765742e204d616563656e617300206469676e697373696d206d6173736120757420626c616e646974206c616300696e69612e2050726f696e2066657567696174206e756e6320736564206c6f0072656d20616c697175616d2070756c76696e61722e20416c697175616d207600617269757320616e7465207365642073617069656e206469676e697373696d002c2065742064696374756d2073617069656e20696e74657264756d2e204165006e65616e206574206c656f2061756775652e2053656420756c74726963696500732074696e636964756e742065726f732c2073656420706f727461206d6175007269732066696e69627573206e65632e0a0a53757370656e6469737365206e006563206c6f72656d206c696265726f2e204d616563656e6173206e6563206c006967756c61206e6f6e20657820626c616e6469742073757363697069742e200050656c6c656e746573717565206c616375732072697375732c206f726e6172006520612063757273757320656765742c2074656d706f72207669746165206e0069736c2e204375726162697475722072757472756d20766f6c757470617420006578206120706c6163657261742e204d6f726269206d616c657375616461200074656c6c75732065752061726375206d6f6c6573746965206d61747469732e0020457469616d207363656c6572697371756520636f6d6d6f646f206175677500652c207175697320636f6d6d6f646f2076656c697420656c656966656e64200069642e204d617572697320617563746f72207669746165206d657475732071007569732076656e656e617469732e2050726f696e20626962656e64756d206600617563696275732074656c6c75732c20736f6c6c696369747564696e20696d0070657264696574206e69736920766f6c75747061742076656c2e20446f6e650063206661756369627573206d6f6c6573746965207175616d2c20657420667200696e67696c6c61206469616d2e0a0a446f6e656320696d706572646965742000657261742061206e6973692066696e696275732c207574206469676e69737300696d206e69736920666163696c697369732e204e756c6c6120696163756c690073207574207175616d20616c69717565742068656e6472657269742e205065006c6c656e74657371756520757420656c656966656e64206e657175652e2044006f6e6563206575206c6563747573206574206c656f20696e74657264756d200074696e636964756e742e204e616d20756c74726963657320656c6974206e690073692c2065676574206d6178696d7573207269737573206672696e67696c6c006120717569732e205365642076656c206e69736920617420747572706973200072757472756d2074696e636964756e742e204e756c6c6120636f6e677565200065726174206c6f72656d2c207365642066696e69627573206c616375732061006c69717565742065742e2050656c6c656e746573717565207574207175616d0020696e206f72636920736f64616c65732074656d706f72207574206575206e00657175652e2051756973717565206d616c65737561646120736167697474690073207269737573206e6f6e2076656e656e617469732e204e756e632066696e006962757320756c74726963696573206e69626820706f737565726520636f6e0073656374657475722e20496e7465676572206e6563206c6967756c61206e75006e632e205574206e6563206d617373612076656c206c6967756c612074726900737469717565206665726d656e74756d20696e2065752074656c6c75732e0a000a4d617572697320736f64616c6573206469616d2069642066656c6973206c00616f726565742c207175697320736f6c6c696369747564696e207475727069007320756c6c616d636f727065722e204e756c6c6120636f6d6d6f646f2c207300617069656e20657420756c6c616d636f7270657220736f6c6c69636974756400696e2c2073656d206c6563747573206672696e67696c6c61207175616d2c2000617420706c6163657261742065782065726f732075742073617069656e2e2000496e206f64696f206e6973692c207661726975732073697420616d65742064006f6c6f722076656c2c20756c74726963657320706c6163657261742074656c006c75732e20557420646f6c6f72206d692c2073656d706572206e6f6e206d610078696d75732076656c2c2070756c76696e61722061742066656c69732e2045007469616d207269737573206e756c6c612c2065666669636974757220617420006c6f72656d206c6f626f727469732c20706f72746120656c656966656e6420006c6f72656d2e20566976616d757320617420636f6e64696d656e74756d206500726f732e204475697320657420696163756c6973206d692c2076697461652000636f6e736563746574757220617263752e20496e2065726f73206d6175726900732c2074656d706f7220717569732070656c6c656e74657371756520696e2c002070686172657472612076656c206c65637475732e204d6f72626920706f720074612c206c696265726f20617420736f64616c657320656c656966656e642c00206c61637573206c6f72656d20626962656e64756d206f64696f2c206e65630020706f72747469746f72206c65637475732074656c6c75732076656c207365006d2e204e756c6c61207363656c657269737175652065742075726e61206575002064696374756d2e205574206f726e617265206d61747469732074656d707500732e20557420626c616e646974206f64696f2061206d61737361206d617869006d75732c206e6563206d616c657375616461206c696265726f206661756369006275732e0a0a5574206d6178696d757320756c7472696369657320747269730074697175652e20457469616d206163206469616d206174206e756c6c61206c00756374757320756c6c616d636f7270657220696e20657520656c69742e2053006564206574206d617373612076656c206e6962682072686f6e637573207469006e636964756e742e2053656420636f6e677565207363656c65726973717565002074656d7075732e205175697371756520766f6c7574706174206d6173736100206c6f72656d2c2076656c2072757472756d20656e696d20636f6e64696d65006e74756d206e65632e20416c697175616d2074757270697320646f6c6f722c0020656666696369747572207365642064696374756d20616c697175616d2c20006d6174746973206964206c616375732e204d616563656e6173206665756769006174206e6973692071756973206d6178696d757320636f6e76616c6c69732e000a0a5365642074696e636964756e74207574206a7573746f207669746165200066696e696275732e204d617572697320626c616e6469742065726174206e75006e632c20766974616520616363756d73616e2061726375206672696e67696c006c6120717569732e2053656420756c7472696365732074696e636964756e7400206469616d2073697420616d657420626962656e64756d2e20416c69717561006d206661756369627573206c61637573206567657420766573746962756c75006d2068656e6472657269742e204e756c6c616d20766172697573206e656320006e6571756520657420656c656966656e642e2053656420766974616520747500727069732065742074757270697320656c656966656e642074656d706f722e002050656c6c656e74657371756520766573746962756c756d206172637520610020657569736d6f64206d61747469732e205072616573656e74206e6563207200697375732073697420616d6574207475727069732064617069627573207375007363697069742e20446f6e656320626962656e64756d2074656d707573206d006920696e2072757472756d2e20566573746962756c756d206d61737361206d00657475732c20696d7065726469657420657520736f64616c65732071756973002c20616363756d73616e2076656e656e6174697320617263752e20496e206e006f6e20706f7375657265206c696265726f2c2076656c207375736369706974002075726e612e0a0a53757370656e64697373652073617069656e206d65747500732c2070756c76696e6172206e6563206c61637573206d6f6c65737469652c00206567657374617320766573746962756c756d2065782e2056657374696275006c756d2074656d706f7220616e7465206e6563206e756e632074696e63696400756e7420666163696c697369732e20457469616d20626962656e64756d2c2000616e746520696e207072657469756d20636f6e6775652c206d61737361206c006f72656d206c6f626f727469732065782c206e65632072686f6e6375732074006f72746f72206d61757269732061632070757275732e20496e2072686f6e630075732076756c707574617465206d61676e6120617420657569736d6f642e20004d616563656e61732076656c206c616f72656574206a7573746f2c20696e20006c6163696e6961206f64696f2e2050656c6c656e74657371756520616c697100756574206c616375732061632076656e656e61746973206c75637475732e2000496e74657264756d206574206d616c6573756164612066616d65732061632000616e746520697073756d207072696d697320696e2066617563696275732e200051756973717565206c6163696e6961207072657469756d2075726e6120736f0064616c6573206d6178696d75732e20496e7465676572206469676e69737369006d207072657469756d206d6f6c6c69732e20536564206c656374757320656c0069742c20616c697175616d2061206469616d2069642c20646170696275732000766172697573206c6967756c612e204d6f726269206c6163696e696120736f0064616c6573206c6f72656d2c20696420616c697175616d206e69736c20706f00737565726520656765742e0a0a41656e65616e2070686172657472612c207400656c6c7573206163206469676e697373696d20656765737461732c206175670075652065737420656c656d656e74756d2066656c69732c2076656c206c6f62006f72746973206e69736920656e696d20636f6d6d6f646f207475727069732e002053757370656e6469737365206e756e63207475727069732c206c6f626f720074697320736564206d61757269732069642c20706f72746120736f6c6c69630069747564696e206a7573746f2e2050726f696e20656c656d656e74756d206d0061757269732073697420616d6574206f72636920696e74657264756d207469006e636964756e742e2053656420706f7274612075726e612066656c69732c200069642076656e656e617469732073617069656e207363656c65726973717565002065742e20566976616d7573206461706962757320706f72747469746f7220006a7573746f2c206964206d6f6c6573746965206e69736c20696163756c6973002074696e636964756e742e20496e206d6174746973206d6175726973207369007420616d657420636f6e76616c6c697320756c747269636965732e20446f6e00656320636f6d6d6f646f206567657374617320657261742076697461652061007563746f722e204e756c6c616d2066657567696174206d61676e6120657374002c20657420706f72747469746f72206573742074656d706f722061632e2041006c697175616d20766172697573206d69206575206c61637573206d6174746900732c2073697420616d6574207375736369706974206e69736920736f64616c0065732e2041656e65616e2065742068656e6472657269742076656c69742c2000696e20706c616365726174206e6973692e20446f6e65632071756973207665006c6974206d692e20457469616d20706c61636572617420657261742076656c002065726f73206672696e67696c6c6120636f6d6d6f646f2e0a0a5068617365006c6c7573207669746165206475692066656c69732e205072616573656e7420007072657469756d206d6174746973206e657175652c2065676574206672696e0067696c6c612066656c69732074656d706f722061742e20437261732061756300746f72206e69736c206e65632073656d206c6f626f72746973206d6174746900732e2050656c6c656e746573717565206d61747469732074696e636964756e00742074656d7075732e2050726f696e206c616f726565742073656d20612076006f6c75747061742072686f6e6375732e204d6f726269206575206d6175726900732073697420616d65742072697375732074696e636964756e74206f726e610072652e2041656e65616e20756c6c616d636f72706572206c61637573206e6f006e206e756e6320696d706572646965742c20657420656c656966656e64207400656c6c757320706c6163657261742e2043726173206574206d6920696e20640069616d206567657374617320706c616365726174206e6f6e2073697420616d006574206c65637475732e20416c697175616d20696163756c697320707572750073206c6f626f727469732c207363656c657269737175652065726f732065670065742c2076617269757320646f6c6f722e2043757261626974757220737573006369706974206e6571756520736564206567657374617320636f6e736571750061742e20496e2076656c20616c697175616d206d657475732c206c75637475007320636f6d6d6f646f206e6962682e2053656420636f6e736571756174207000756c76696e6172206d692c20736167697474697320616c6971756574206572006f73206d6178696d75732076756c7075746174652e2055742065742074656d00707573206c616375732e0a0a53757370656e646973736520706f74656e7469002e20447569732076656c2076756c707574617465206d61757269732c2075740020736f6c6c696369747564696e206d692e20446f6e65632076656c20616c69007175616d206c6967756c612c20656765742072686f6e6375732074656c6c7500732e205072616573656e74206e65632065726f732076697461652065726f73002076756c70757461746520617563746f722e204e756e63207375736369706900742c206d617572697320696420696e74657264756d20756c6c616d636f72700065722c20746f72746f72206a7573746f20646170696275732073617069656e002c207669746165206c6163696e6961206c656f2075726e61207669766572720061206e6962682e205175697371756520626962656e64756d20617563746f72002065726f732c206964206d6174746973206d617373612064696374756d2061002e205574206964206d69206e69736c2e20566573746962756c756d20657520006c7563747573206c616375732e20446f6e65632061206d6178696d7573206600656c69732e0a0a446f6e65632073656d206e69736c2c20756c7472696365730020612074656c6c75732075742c2070656c6c656e7465737175652066616369006c69736973206e756c6c612e205365642065742073617069656e207574206500726f7320636f6e64696d656e74756d20706f72747469746f722e204675736300652073697420616d6574206d657475732065782e20496e2061206578207369007420616d65742074656c6c75732070756c76696e617220636f6e73657175610074206120696420656e696d2e204d616563656e617320756c6c616d636f727000657220736f64616c6573207475727069732c207175697320756c6c616d636f00727065722065726f7320636f6e7365717561742065742e20496e74656765720020736f64616c6573206573742073697420616d657420616e74652074656d700075732c20696420616c69717565742066656c69732072757472756d2e204c6f0072656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365006374657475722061646970697363696e6720656c69742e204d616563656e61007320696420747572706973207669746165206573742076656e656e617469730020656c656d656e74756d2e0a0a446f6e656320696163756c697320677261760069646120636f6e73656374657475722e20457469616d20657569736d6f64200065726f73206567657420766573746962756c756d206672696e67696c6c612e0020496e20706f7274612c206572617420766974616520656c656d656e74756d0020677261766964612c20747572706973206c6f72656d206d6f6c657374696500206e6962682c20696420706861726574726120746f72746f72206d6574757300206c6163696e6961207475727069732e204d6175726973207072657469756d0020766172697573207475727069732c2065742063757273757320657820766900766572726120717569732e20536564206d616c657375616461206c656f20650074206d617373612074656d707573206c6163696e69612e204e756e63207369007420616d657420656e696d2073656d2e20446f6e65632076656c206772617600696461207175616d2c2076656e656e61746973207665686963756c612065720061742e0a0a496e206e6f6e206c61637573206d616c6573756164612c206d610078696d7573206e696268206e65632c20636f6e73656374657475722076656c0069742e204e756c6c61206575206772617669646120746f72746f722e205068006173656c6c757320696e74657264756d206665726d656e74756d20766172690075732e204d6f726269207661726975732076656c697420696e206c6163757300207363656c65726973717565206d616c6573756164612e2050686173656c6c00757320737573636970697420616c697175616d2065726f7320696e20747269007374697175652e20566573746962756c756d2061632075726e61206e756e63002e204d6175726973207072657469756d20746f72746f72206469616d2c206100206672696e67696c6c61206c65637475732074656d7075732061632e0a0a4d006f72626920696d70657264696574206d6f6c6c697320646f6c6f722c206e65006320656666696369747572207175616d20616c697175657420612e2056697600616d7573206c75637475732070757275732076656c206e69736c2065756973006d6f6420706f72747469746f722061632076697461652074656c6c75732e2000437261732073757363697069742074726973746971756520707572757320750074207363656c657269737175652e2050656c6c656e746573717565207369740020616d657420656c6974206964206c696265726f206665726d656e74756d2000736f64616c65732e204e756c6c616d20636f6e76616c6c6973206c6967756c006120696e207175616d207072657469756d2c20696420616c6971756574206e0069626820636f6e7365717561742e204e756c6c6120666163696c6973692e200041656e65616e206f726369206c696265726f2c2068656e64726572697420750074206c6f72656d2076656c2c20706f72747469746f7220706f72747469746f0072206c696265726f2e20557420696420616363756d73616e206d617373612e00205365642073617069656e206c656f2c2074696e636964756e7420707265740069756d2061756775652076697461652c207669766572726120766f6c7574700061742073617069656e2e204d6f726269206d6f6c6c6973206f726369207365006420756c74726963657320636f6e64696d656e74756d2e20437261732061630063756d73616e20736167697474697320696d706572646965742e204e616d200074656d706f7220766573746962756c756d207475727069732c20636f6e6469006d656e74756d2074656d706f72206f64696f20656c656d656e74756d207665006c2e20566573746962756c756d20737573636970697420616e7465206120610072637520616363756d73616e2c2076656c20636f6e677565206d61757269730020677261766964612e0a0a50686173656c6c757320766f6c7574706174206d0061757269732065676574206c696265726f206c616f7265657420616c69717500616d2e20566573746962756c756d207269737573206e69736c2c2074656d7000757320617420766f6c75747061742076697461652c2074696e636964756e74002076697461652065726f732e20416c697175616d2076656e656e617469732000616e746520626c616e64697420707572757320666575676961742c20612061006c697175616d20616e746520626962656e64756d2e2050726f696e20696e7400657264756d20697073756d206e6962682c2076656c20706f7274612066656c00697320657569736d6f642065742e20457469616d20717569732074656c6c75007320646f6c6f722e2044756973206964206c616f72656574206f64696f2c20006574206375727375732072697375732e2053757370656e6469737365206c61006f7265657420646f6c6f72206575206e756c6c6120666575676961742c20730065642066657567696174206e756c6c6120626c616e6469742e20416c69717500616d20717569732061726375207175697320617567756520756c7472696365007320696163756c69732e20446f6e65632069642065726f73206e6f6e206e6900736920616363756d73616e206f726e6172652076656c20757420657261742e002053656420636f6d6d6f646f206c756374757320616e74652071756973207000756c76696e61722e205072616573656e7420616c697175616d206d6f6c6c6900732070757275732072686f6e63757320636f6e7365717561742e2055742076006974616520636f6e6775652072697375732e20496e206d6f6c6c6973206120007075727573206964206c6163696e69612e0a0a467573636520616c69717561006d2061756775652073697420616d6574206a7573746f2070656c6c656e746500737175652c20756c6c616d636f7270657220706f727461206475692069616300756c69732e2050726f696e20656765737461732076756c707574617465206e0069736c2c2076656c20637572737573206d6173736120706f72747469746f72002061742e20536564206e6f6e2074656c6c75732076656c206e756c6c612062006c616e64697420666163696c697369732e204d616563656e617320657261740020656e696d2c20736f64616c65732061206c6163696e69612076656c2c2061006c6971756574207574206e756c6c612e20496e74656765722066656c69732000617263752c20736f64616c65732076656c206661756369627573207369742000616d65742c20766573746962756c756d2065676574206c6f72656d2e204e75006c6c612076697665727261206f64696f206163206e756e63206c7563747573002c20657520706c6163657261742074656c6c757320616c697175616d2e204d006f726269206e65632073656d20657520616e746520706f737565726520736f006c6c696369747564696e2e204e756c6c6120616363756d73616e20636f6e7300656374657475722065737420766974616520756c747269636965732e20447500697320666163696c69736973207363656c65726973717565206d6175726973002c206e6f6e20636f6e64696d656e74756d2064756920766f6c75747061742000696e2e0a0a4d617572697320717569732066696e6962757320656e696d2e20004e756e6320656765742065726f7320616c69717565742c206d6178696d757300206c6f72656d206e6f6e2c2070656c6c656e746573717565206a7573746f2e00204d6f7262692065676574206e756e6320696420726973757320657569736d006f6420626c616e6469742076656c20612072697375732e204d617572697320006120736f64616c65732074656c6c75732e2043757261626974757220626c61006e646974206174206e756e63206174206566666963697475722e204475697300206575206c696265726f206e656320647569206d6174746973206d6178696d0075732e2053656420636f6e7365717561742065726174206d61757269732c2000757420706f727461206c6563747573206665756769617420717569732e2056006573746962756c756d2076656c2074656c6c7573206e65632073617069656e0020636f6e6775652076656e656e617469732e20446f6e656320706c6163657200617420756c747269636573206d692e204675736365206c7563747573206e6f006e206d6175726973206163206375727375732e204e756c6c61206567657420006d61676e6120766974616520747572706973206d616c6573756164612076690076657272612e2050656c6c656e746573717565206174206c656374757320690064206d61676e612064617069627573206d6174746973207669746165206120007175616d2e0a0a496e206572617420657261742c20696d7065726469657420007574207175616d206e65632c20756c6c616d636f727065722072757472756d00207475727069732e204d6f72626920706c61636572617420656c697420617400206e6973692070656c6c656e74657371756520706c6163657261742e205072006f696e207669766572726120736f6c6c696369747564696e20637572737573002e2046757363652076656e656e6174697320626c616e646974206e69736c200073656420636f6e6775652e204675736365206d6f6c65737469652c2075726e00612076656c20636f6e76616c6c69732072686f6e6375732c20656c6974206d006574757320657569736d6f642065782c2071756973207665686963756c6120006d61737361207075727573206163206475692e2041656e65616e206e6f6e20006c61637573207665686963756c612c20656c656966656e6420656c69742073006f64616c65732c207661726975732073617069656e2e20536564206e756c6c0061206a7573746f2c206665726d656e74756d20706f72747469746f722076690076657272612075742c20706f727461206567657420656e696d2e2050656c6c00656e74657371756520636f6e736563746574757220736167697474697320740075727069732c206174206375727375732064756920706f737565726520696e002e205175697371756520612073757363697069742065726f732e2045746961006d20616c69717565742c20646f6c6f722061742064696374756d2072686f6e006375732c206d692065737420756c6c616d636f727065722072697375732c2000612074696e636964756e742074757270697320746f72746f72206e6f6e206e006962682e2053656420636f6d6d6f646f206469616d206163206f7263692076006f6c75747061742c207669746165206c6f626f72746973206d61676e612070006f73756572652e204475697320636f6d6d6f646f20656c697420696420657800207661726975732c206567657420706f737565726520697073756d2061756300746f722e20467573636520756c74726963696573206f64696f20657520636f006e67756520616c69717565742e2055742071756973206573742070756c7669006e61722c2076756c707574617465206c65637475732076756c707574617465002c20636f6e7365717561742073617069656e2e0a0a446f6e656320636f6e7600616c6c6973206d61757269732074656d707573207661726975732061756374006f722e20416c697175616d207472697374697175652064696374756d207075007275732c20696420677261766964612075726e6120616c6971756574207574002e20566976616d75732065752076656e656e6174697320616e74652c206d610078696d75732074696e636964756e74206f7263692e20557420617420616c69007175616d206c6f72656d2e20416c697175616d206e6f6e206c61637573206e00756c6c612e204d6f72626920766974616520656666696369747572206d61730073612c2076697461652072686f6e63757320657261742e2041656e65616e20006e6f6e20657261742071756973206d617572697320657569736d6f6420626c00616e6469742e205574207669746165206e756c6c612073697420616d6574200074656c6c7573206567657374617320636f6e7365717561742e205574206c69006265726f206c65637475732c20626c616e6469742070756c76696e6172207300757363697069742065752c20636f6e7365637465747572207669746165207300617069656e2e2043757261626974757220706f727461206e756e632066656c0069732c20717569732070656c6c656e746573717565206c656f206469676e69007373696d2061742e204d6f7262692076656c20696163756c6973206e696268002e20446f6e65632074696e636964756e742065737420657520696d706572640069657420706f72747469746f722e20566573746962756c756d20696e207475007270697320746f72746f722e0a0a50726f696e207669746165206172637520006e6962682e205072616573656e74206573742073617069656e2c2074696e63006964756e7420617420617263752076697461652c2076656e656e617469732000736f6c6c696369747564696e20746f72746f722e2050656c6c656e7465737100756520666163696c697369732c206f64696f20696e207472697374697175650020736f64616c65732c20657374206e6571756520657569736d6f642069707300756d2c20657520656c656d656e74756d206f726369206e6571756520766974006165206c696265726f2e20446f6e65632074656d706f72206c696265726f2000696e206c656f20636f6d6d6f646f2c2075742076756c707574617465206d6100676e61206c616f726565742e204d616563656e61732072757472756d20656c00656d656e74756d20766f6c75747061742e20536564206d6f6c65737469652c00206d6574757320657520656c656d656e74756d20616363756d73616e2c207300656d207175616d20636f6e76616c6c6973206c696265726f2c206e6f6e206d00616c65737561646120616e7465206c61637573206c6f626f7274697320746f0072746f722e205365642076656c697420646f6c6f722c20636f6e73656374650074757220617563746f7220616c697175657420696e2c206f726e617265206500752073617069656e2e204e756c6c61206574206c65637475732061207075720075732073656d706572206d61747469732e204e756c6c616d206d61747469730020656c656966656e64206d6f6c65737469652e0a0a4d6175726973206c6f62006f727469732065726174206c616375732c20757420766573746962756c756d00206175677565207072657469756d2065752e20446f6e65632065742073656d00706572206d61757269732c2073697420616d65742067726176696461206c6500637475732e20447569732076656e656e61746973206d69206f7263692c2061002065666669636974757220646f6c6f7220617563746f722069642e204e756c006c61206e6f6e2075726e612075742065726174207665686963756c61207469006e636964756e74207574206964206a7573746f2e2041656e65616e206c616300696e696120657374206964206c7563747573206d616c6573756164612e20550074206f726e61726520647569207175697320636f6e736563746574757220700072657469756d2e20496e206163206a7573746f206163206e756c6c61207669007665727261207665686963756c612e2053757370656e646973736520696e2000766573746962756c756d206d657475732c206120736f64616c6573206c6f7200656d2e204d6f726269206e6f6e206c6967756c612076697461652074656c6c0075732066696e69627573207363656c6572697371756520617420696e20616e0074652e205175697371756520696e2073656d70657220646f6c6f722e2045740069616d206d6f6c6c69732c206d6574757320696420766f6c7574706174207300656d7065722c206d61737361206e65717565206c6163696e69612073656d2c0020696e20656666696369747572206c656374757320656c6974207574206e75006e632e2050726f696e206c6163696e6961206c6f72656d2071756973207475007270697320756c7472696365732c20757420666175636962757320646f6c6f007220656c656966656e642e20446f6e6563206c6f626f727469732069707375006d206575206572617420616c69717565742c2065752065676573746173206c006967756c6120656c656d656e74756d2e205072616573656e74206964206572006f732066696e696275732c206d6f6c6c69732074757270697320696e2c206d006f6c6c6973207175616d2e2050686173656c6c757320626c616e6469742063006f6d6d6f646f206e756e6320696e20626c616e6469742e204e616d207175690073207269737573207574206469616d206c6f626f72746973207361676974740069732e0a0a50726f696e20766f6c75747061742074656d707573207275747200756d2e2050726f696e20696d7065726469657420626c616e646974207361700069656e207175697320706c6163657261742e204e756c6c6120706f73756572006520647569206964206f64696f20657569736d6f642c20696420696163756c0069732075726e6120646170696275732e20446f6e65632070656c6c656e74650073717565206d617373612069642076697665727261206c616f726565742e20004e756c6c616d2071756973206c6163757320636f6e76616c6c69732c20626c00616e646974206c656f206e6f6e2c20616c697175616d206c696265726f2e2000536564206461706962757320617567756520696e2075726e61207068617265007472612c2061742073656d706572206c656374757320706c6163657261742e002053656420756c74726963657320726973757320696420696163756c6973200074656d7075732e20496e7465676572206665726d656e74756d2c2072697375007320657420636f6e736563746574757220636f6e6775652c206e756e63206500737420696163756c69732072697375732c20706f73756572652076656e656e00617469732065726f7320616e74652076656c2070757275732e20496e746567006572206c6163696e69612074656c6c7573207669766572726120726973757300207361676974746973206672696e67696c6c612e2043726173206e6f6e2069007073756d2071756973206e65717565207669766572726120666163696c6973006973206e6f6e20736564206475692e20467573636520636f6d6d6f646f2065006c656966656e64206a7573746f207175697320636f6e6775652e0a0a56697600616d7573207363656c657269737175652074696e636964756e74206e756e6300206469676e697373696d20636f6e64696d656e74756d2e2051756973717565002061726375206e69736c2c20756c6c616d636f72706572206e6563206c65630074757320717569732c20636f6e67756520616363756d73616e20657261742e0020437572616269747572207574206e697369207475727069732e20496e20760069746165206573742071756973206d657475732074656d7075732076657374006962756c756d206575206e656320617263752e2055742073656d206a757374006f2c206665756769617420657520636f6e73657175617420656765742c2075006c6c616d636f72706572206567657420697073756d2e205072616573656e7400207072657469756d206d6174746973206c656f2c2067726176696461206865006e647265726974206c696265726f2065666669636974757220656765742e20004d616563656e617320626c616e646974206e696268206469616d2c206e656300206c6163696e69612061726375206c6163696e69612065742e0a0a4675736300652074696e636964756e7420746f72746f722066656c69732e2053656420640069616d206e6962682c20637572737573206e656320646170696275732065670065742c206f726e61726520656666696369747572206d692e20446f6e65632000696420746f72746f72207669746165206d692064696374756d2076657374690062756c756d2e2050726f696e206964206c696265726f20616c697175616d200076656c69742074656d706f7220696d706572646965742073697420616d657400207669746165206c616375732e20437261732073697420616d6574206578200068656e6472657269742c206672696e67696c6c6120617567756520696e2c20006c616f72656574206f7263692e204d616563656e6173206c61637573206d65007475732c20656c656966656e6420736564206d657475732075742c2065756900736d6f6420657569736d6f642076656c69742e20496e746567657220696e2000616363756d73616e206d692e0a0a41656e65616e20696163756c6973207665006c206a7573746f20756c7472696369657320766f6c75747061742e20437261007320636f6e73656374657475722c2065726f73206e6f6e20756c6c616d636f007270657220696163756c69732c2076656c6974206578207665686963756c61002076656c69742c2073697420616d657420696163756c6973206a7573746f20006469616d206567657420657261742e20496e74656765722066696e696275730020736f64616c6573206d617373612073697420616d6574206d616c657375610064612e20496e2072686f6e6375732073617069656e206964207175616d207600697665727261207665686963756c612e20496e20686163206861626974617300736520706c617465612064696374756d73742e20446f6e656320616320706f0072747469746f72206e657175652c2073656420656666696369747572206c690067756c612e20446f6e6563206567657420616c697175616d206c616375732c00206e6f6e207665686963756c61206e69736c2e2053656420706c61636572610074206d617474697320636f6e76616c6c69732e20496e746567657220736f6400616c65732c206e69736c2061207665686963756c61206469676e697373696d002c2076656c69742074656c6c7573206566666963697475722070757275732c00206120766573746962756c756d206f64696f206c6163757320696420646961006d2e204e756c6c616d20766974616520626c616e64697420656c69742e20500072616573656e742074696e636964756e74206c656374757320656c69742c20006e6f6e2074656d707573206e69736c20677261766964612076697461652e20004e756c6c61206469616d2070757275732c206c616f7265657420766974616500206567657374617320696e2c20636f6e7365637465747572206574206d6175007269732e2053656420766172697573206d6f6c6c697320656c656d656e7475006d2e204e616d2073697420616d6574206d61676e6120677261766964612c200068656e64726572697420697073756d206e6f6e2c2074656d7075732073656d002e204d616563656e6173206469676e697373696d206d6f6c6c69732072686f006e6375732e205365642066656c6973206e69736c2c2073656d706572206174002074656c6c75732065742c206d616c65737561646120616c697175616d2069007073756d2e0a0a496e74656765722073757363697069742076656c6974206900642073656d206665726d656e74756d2c207175697320756c747269636573200073656d2074696e636964756e742e2041656e65616e2076656c20646f6c6f7200206e65632074757270697320656c656d656e74756d207363656c65726973710075652e2050726f696e206f64696f20746f72746f722c20616c697175657420006567657420696d7065726469657420717569732c20736f6c6c69636974756400696e206964206c616375732e2050656c6c656e74657371756520656e696d2000656c69742c207375736369706974206964207175616d206e65632c206375720073757320616c697175616d2065726f732e20446f6e656320626962656e6475006d2073697420616d6574206d657475732071756973207363656c65726973710075652e204e756e6320616320747572706973206a7573746f2e205365642070006c61636572617420746f72746f72206e6563206c6163757320736f6c6c69630069747564696e207363656c657269737175652e2050686173656c6c7573207600697461652063757273757320657261742c20616320756c747269636965732000746f72746f722e0a0a43726173206d616c657375616461206772617669646100206a7573746f2076656c207661726975732e204e756c6c616d206c616f7265006574206964206d617572697320696e20646170696275732e20437572616269007475722073757363697069742065782065676574207361676974746973206c0075637475732e20447569732071756973207669766572726120656c69742c20007175697320756c6c616d636f72706572206e756e632e204d61757269732065006c656966656e642c206d6173736120696e20626962656e64756d2061636375006d73616e2c206578206e69736920766573746962756c756d206469616d2c2000757420696163756c697320647569206f72636920736564207475727069732e00204e756c6c6120626962656e64756d2c2076656c697420657520636f6e7661006c6c69732073656d7065722c206d65747573206e69736c20706f7375657265002061756775652c2068656e64726572697420696163756c6973207361706965006e207175616d206574206469616d2e2050726f696e2076656c206e69736c200061756775652e20566976616d75732076656e656e61746973206d657475732000736564206d617572697320706f73756572652c20612068656e6472657269740020656e696d20766976657272612e204475697320636f6d6d6f646f206172630075206574206d61676e6120756c7472696365732070656c6c656e746573717500652e204e616d20696e206c696265726f2076656e656e617469732c2076657300746962756c756d206175677565206c6163696e69612c20766172697573206c006f72656d2e20457469616d206574206c7563747573206c616375732e205175006973717565206d6f6c65737469652c206e69626820617420756c74726963650073206d61747469732c206c616375732075726e6120636f6e76616c6c697320006e756c6c612c20696e206d616c657375616461206e756c6c61206c656374750073206e6f6e206469616d2e20457469616d206567657420697073756d206d6100676e612e2050686173656c6c75732066656c6973207175616d2c2062696265006e64756d2073697420616d657420726973757320717569732c20677261766900646120657569736d6f642066656c69732e0a0a46757363652076656e656e610074697320696e74657264756d20656c69742c20717569732072757472756d20006f72636920706f7375657265206e6f6e2e20496e20656c656966656e6420650073742071756973206469616d20666163696c697369732c206163206d616c65007375616461206d61737361206f726e6172652e204c6f72656d20697073756d0020646f6c6f722073697420616d65742c20636f6e7365637465747572206164006970697363696e6720656c69742e205365642063757273757320616c69717500616d206f64696f2076656c2073757363697069742e2050656c6c656e74657300717565206163206c696265726f206163206572617420616c6971756574207300616769747469732e204d616563656e617320616e7465206c616375732c20730063656c65726973717565206574207472697374697175652076697461652c20006566666963697475722065676574207175616d2e2050686173656c6c7573200072757472756d20656c69742061756775652c2071756973206c6163696e696100206f7263692074696e636964756e74206e65632e20496e20636f6e736563740065747572206964206f726369206575207363656c657269737175652e205065006c6c656e74657371756520616c69717565742074656d707573206f64696f200075742076756c7075746174652e2051756973717565206c696265726f206e6900736c2c2072757472756d2061742073617069656e206e65632c206c616f726500657420747269737469717565206a7573746f2e2043726173206c6163696e690061206e6962682069642065726f732072757472756d207363656c65726973710075652e204e756e63206e6f6e206d6175726973206f7263692e204e616d2069006d706572646965742064617069627573206a7573746f2e20496e2076656c20006c6163757320706f72747469746f722c20766172697573207269737573207500742c20616c697175616d20746f72746f722e2043757261626974757220696e00206d657475732076656c2065782076656e656e6174697320706f7274612e0a000a53757370656e6469737365207365642070756c76696e6172206573742e200050686173656c6c7573206e6563206d6920656c656966656e642c20666575670069617420617263752061742c20706f72747469746f72206e6973692e204475006973206567657420626c616e6469742065782e2043726173206120647569200065726f732e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e20496e2073656d206c696265726f2c20766f6c757470617420650067657420647569207365642c2070656c6c656e746573717565206c7563747500732065782e20536564206574206c656f20656765742065726f7320696e7465007264756d206d6178696d75732e2050686173656c6c7573206e6f6e206d6f6c006573746965206c65637475732c206e6f6e207665686963756c61206c6563740075732e20446f6e656320656666696369747572206d616c657375616461206d0061757269732c2065676574207472697374697175652073656d206c6f626f720074697320612e204e616d2074656c6c75732075726e612c2072686f6e63757300206665726d656e74756d20737573636970697420717569732c20696d70657200646965742071756973206f7263692e20557420637572737573206572617420007669746165206665726d656e74756d20666163696c697369732e204e756e630020757420626c616e646974206c6f72656d2e20566573746962756c756d207400656c6c7573206469616d2c20636f6e67756520657520706f7375657265207500742c206c6f626f7274697320612073656d2e204e756c6c616d206163206f72006369206e6f6e2075726e6120656c656966656e6420696d706572646965742e000a0a5072616573656e74207669746165206e69736c206672696e67696c6c61002c2073757363697069742065726174207365642c20656c656d656e74756d200072697375732e20446f6e656320696420756c74726963696573206f64696f2e002050726f696e206d6174746973206d61757269732061206d61737361206d610078696d7573207472697374697175652e2050686173656c6c757320656765740020706f7375657265206e6962682e2050686173656c6c757320736564206d650074757320657420657820636f6d6d6f646f20766f6c75747061742e2041656e0065616e206c6163696e69612c206175677565206e6f6e206566666963697475007220636f6e6775652c206d617373612073656d207669766572726120646961006d2c207175697320706f737565726520647569206c6f72656d2061206c6f7200656d2e20496e2076756c7075746174652064756920657520656c6974207375007363697069742074656d706f722e204372617320696d70657264696574206d0061757269732073656420657820637572737573206c616f726565742e2056690076616d7573206e65717565206573742c20666163696c697369732071756973002066656c697320717569732c20706f72747469746f7220706f72747469746f0072206e756e632e204675736365206e6f6e206c6f626f72746973206c6f7265006d2e0a0a4d616563656e617320766f6c7574706174206661756369627573200074656c6c757320756c747269636965732070756c76696e61722e205068617300656c6c7573206120706f72747469746f7220617263752e20446f6e6563207600756c70757461746520656e696d207475727069732c20612074696e63696475006e74206469616d2074656d706f722065752e20446f6e656320736f6c6c69630069747564696e2c206578207669746165206c75637475732076657374696275006c756d2c206e69736c20616e746520756c6c616d636f72706572206d692c2000617420756c7472696369657320656e696d20646f6c6f722073656420656c6900742e205072616573656e74206d6f6c6c697320656666696369747572207269007375732071756973207072657469756d2e20566573746962756c756d2071750069732066696e69627573206475692c2065676574206f726e617265206c6563007475732e20457469616d2065676574206a7573746f20766573746962756c75006d2c20626c616e6469742073656d20696e2c206d6178696d75732065726f73002e0a0a50686173656c6c7573206120697073756d206575206d69206375727300757320736f64616c6573206e656320736564206e6973692e204475697320660072696e67696c6c6120657374206163206c6967756c612070756c76696e61720020677261766964612e2050726f696e207669766572726120616363756d7361006e2073656d2c2076656c2072757472756d206e69736c20636f6e736571756100742076656c2e204e756e63206672696e67696c6c61206d657475732076656c002066617563696275732074656d706f722e205072616573656e7420636f6e73006563746574757220646170696275732061756775652c206574207363656c6500726973717565206c656374757320636f6e64696d656e74756d206e65632e20004e756e6320616363756d73616e2c2075726e61206e6f6e20706c6163657261007420756c7472696365732c206d617572697320617567756520736f6c6c69630069747564696e20616e74652c2073697420616d657420616c697175616d206c00616375732076656c69742061632074656c6c75732e205365642076656e656e00617469732c2074656c6c7573206e656320617563746f722064617069627573002c206c6f72656d2073617069656e2073656d70657220657261742c206575200076697665727261207175616d2075726e61207669746165206c6f72656d2e20004d616563656e6173207375736369706974206e756e63207574206d6f6c657300746965206d61747469732e20416c697175616d2076697461652065737420640069676e697373696d2064756920656c656d656e74756d20617563746f722e0a000a4d6f726269206e756c6c61206c616375732c2073656d706572207369742000616d65742066656c69732065742c2076756c707574617465206d616c65737500616461206475692e2050726f696e20656765742065726f73206c6563747573002e20446f6e65632074696e636964756e7420656c69742076656c20736f6c6c00696369747564696e2073616769747469732e2050726f696e206163206d6f6c0065737469652073656d2e2053757370656e646973736520696163756c69732000766573746962756c756d2073656d206574206d61747469732e2050726f696e00206c6f626f72746973206c616f72656574206469616d2c2073656420706f730075657265206573742074656d706f722065742e2053656420696e20746f7274006f72207175697320657820696d70657264696574206c6163696e6961207175006973206e6563206c6f72656d2e204d616563656e617320636f6e76616c6c69007320656666696369747572206f7263692c20657420706f72747469746f7220006e69736c20666163696c69736973206e6f6e2e205365642068656e647265720069742076656e656e617469732066656c697320666175636962757320656c65006d656e74756d2e204d6f7262692061632064756920736f64616c65732c207000656c6c656e74657371756520697073756d2076656c2c20736f64616c6573200076656c69742e20457469616d20656e696d206c6f72656d2c2076656e656e6100746973206163206c616375732065742c2065676573746173206d616c65737500616461206c65637475732e20416c697175616d20736f64616c6573206e6962006820656666696369747572206c656374757320616c697175616d2076657374006962756c756d206e6f6e2061206f64696f2e204d61757269732069642066610075636962757320656c69742c2073656d70657220706f72747469746f72206e00756c6c612e204675736365206f726e6172652c206a7573746f20696e20766500686963756c6120636f6d6d6f646f2c206c61637573206c6163757320636f6e006775652074656c6c75732c20757420666175636962757320697073756d207200697375732061206e756c6c612e20457469616d207669766572726120707572007573207175616d2c2076656c20706f72747469746f72206d6574757320696d00706572646965742065752e204d6f72626920636f6e76616c6c697320636f6e00736571756174206475692e0a0a4d61757269732074726973746971756520610072637520717569732072686f6e6375732064696374756d2e204e756e632064006f6c6f72206c696265726f2c206d6178696d757320617420656e696d207574002c20677261766964612072686f6e637573207175616d2e2056657374696275006c756d206d61747469732074696e636964756e7420666163696c697369732e00204675736365206e756c6c612061756775652c20656765737461732073656400206c6163696e69612076697461652c206d616c657375616461206163206e75006c6c612e204d617572697320696163756c6973207072657469756d206c61630075732c20612066696e696275732075726e6120706f73756572652061632e20004d6f72626920696e74657264756d20666175636962757320657261742c206100206c616f72656574206d61676e6120626c616e64697420612e204372617320006e6563206d61676e612071756973206c6163757320656765737461732069610063756c69732e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f862b093fd6807e033db6b24db5485814f79a98c7e241432e95c2e327042f821f24f4a59315cf4e881205f472e99835729977ab0aa9da85a334c2935e670bd44e9b734481fc5ab72859c76f741008a92c2836932af9e60697b6319f3454a141154fcd583f862b091a6c5d19e50b1b85ae2ef07477160381babf00f0906f5219ce09dee2e00d7d347cb0586d90b491637cdb1715e62d152b0a660592b94033f9c5f7987005fa5d1f84435585ddaaf4b3adc0a198b983f2ae007db73b90067a96ec214b24d7b9820b9"`; -exports[`eip4844 > w/ prepareTransactionRequest 1`] = `"0x03fa04018df8b701820311843b9aca008501a786b06a8252089400000000000000000000000000000000000000008080c08504a817c800f842a0012580b7683c14cc7540be305587b0eec4e7ec739094213ca080e2526c9237c4a001243c18a024c835cce144b3b6b0eb878b7820c7c7b7d9feff80080d76519c4580a028ed3b21ce03c2f45a2cf15bb267515e8754b9ffd55cd6d58f6e3539757f1b04a0179545ec99d8bf2be5a847c664766743a725d67940fa144e1b05c0c3b9693d94fa040008ba020000004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e0073656374657475722061646970697363696e6720656c69742e20557420756c0074726963696573206f726369207175616d2c2073697420616d657420656c65006966656e6420616e7465206672696e67696c6c61206e65632e2050726f696e0020616c697175616d20696e2074656c6c7573206772617669646120636f6e7600616c6c69732e2050726f696e2072757472756d20636f6e7365717561742065006e696d20736564206d616c6573756164612e2041656e65616e206567657374006173206d657475732076697461652073656d20636f6e64696d656e74756d200073757363697069742e2053757370656e64697373652061726375206475692c00206772617669646120696e2065726f732065742c206d617474697320616c6900717565742074656c6c75732e20496e74656765722070656c6c656e7465737100756520616e74652066696e69627573206d692072757472756d20616c69717500616d2e20496e7465676572206d6174746973206469616d2073656420666575006769617420696d706572646965742e20467573636520696420626962656e6400756d206d617373612e20496e74656765722061742074656d70757320656e69006d2e20416c697175616d206574206d6f6c6c6973206d61676e612e0a0a536500642073656d70657220656c656d656e74756d206d61737361206e6f6e2076690076657272612e205365642073697420616d6574206d61676e612065742069700073756d207472697374697175652076756c7075746174652e2050656c6c656e0074657371756520696e206c696265726f2073656d2e2053757370656e64697300736520736f64616c65732074656d706f722061756775652074696e63696475006e7420666163696c697369732e204d616563656e6173207363656c657269730071756520697073756d20617420666575676961742064696374756d2e204d61006563656e61732076656c2075726e6120736564206d6574757320756c7472690063696573206d6f6c6c69732e204e756c6c61206c6f72656d206d6175726973002c2073757363697069742065676574206172637520696e2c2072757472756d002072757472756d206d617373612e204d616563656e617320616320696d706500726469657420656c69742c2073656420737573636970697420697073756d2e002050726f696e206d6f6c6573746965206d6173736120617263752c20612063006f6e64696d656e74756d206f64696f20756c7472696365732073697420616d0065742e205072616573656e742072686f6e6375732065782070757275732c200073656420706c616365726174206e756e63206f726e6172652065742e205068006173656c6c75732061206e696268206d616c6573756164612c20756c6c616d00636f72706572206e69736c2061742c2070656c6c656e746573717565206c6f0072656d2e2050686173656c6c7573206c6f72656d20697073756d2c20756c6c00616d636f727065722075742076756c70757461746520616c69717565742c20007661726975732065676574206c6f72656d2e0a0a4d61757269732068656e640072657269742074696e636964756e74207175616d20616320696e7465726475006d2e20496e206120697073756d206e6f6e207175616d206d6178696d7573200066696e696275732e20536564206f64696f2065782c206c6163696e69612076006974616520697073756d2073616769747469732c207665686963756c612065006765737461732072697375732e204e756c6c616d20616320656c656966656e006420646f6c6f722c20657520706f72747469746f722074656c6c75732e204d00616563656e617320746f72746f722076656c69742c20636f6e64696d656e7400756d20696420656e696d2076656c2c20657569736d6f64206f726e617265200072697375732e20416c697175616d206964206c6f72656d20696e7465726475006d2c20616c697175616d20707572757320696e2c207068617265747261206a007573746f2e205574207669746165206c656f206469616d2e204e756c6c612000656c656d656e74756d206e756e63206d657475732c206e65632076617269750073206f64696f2066696e69627573206e65632e20457469616d207175697320006e69736c20696e74657264756d2c20766f6c757470617420646f6c6f72206500742c2072686f6e637573206e6962682e204d616563656e6173206e6f6e207200757472756d2061756775652c20657520656c656966656e64206d692e20446f006e6563206c6f626f7274697320616e7465207669746165206175677565207000686172657472612c206174206c6163696e696120746f72746f7220707265740069756d2e0a0a4d616563656e61732061742074656d706f72206d61676e612c0020696e20737573636970697420656e696d2e204e756c6c6120656c656d656e0074756d2072757472756d2065782c206567657420736f64616c6573206e756c006c6120636f6e76616c6c69732076697461652e20566976616d757320646967006e697373696d2c2065726f7320657520656c656d656e74756d20736f6c6c69006369747564696e2c206c6f72656d20647569206c7563747573207361706965006e2c206163206d617474697320646f6c6f7220656e696d2073757363697069007420656c69742e204e756c6c61206567657420696d70657264696574206d65007475732e2043757261626974757220636f6e64696d656e74756d206120707500727573207363656c6572697371756520756c7472696365732e20416c69717500616d206c696265726f206d692c20766573746962756c756d2065742074656d00706f722065752c2070686172657472612073697420616d657420656c69742e0020557420696420616c697175616d206c696265726f2e0a0a53656420636f6e007365637465747572206c65637475732066696e69627573206c656374757320006f726e61726520706f7274612e20447569732073656420636f6e677565207300617069656e2c20757420696d7065726469657420656e696d2e205365642065006c656d656e74756d20696163756c6973206c6967756c612c206e6f6e207665006e656e617469732073617069656e206c75637475732069642e2053656420650066666963697475722c20616e7465207669746165206d6f6c657374696520650066666963697475722c20656c697420697073756d20636f6e64696d656e7475006d20697073756d2c2076656c206d6f6c6c6973206d61676e61206f64696f20007669746165206c616375732e2053757370656e64697373652065676573746100732073656d206f64696f2c20696e20766573746962756c756d206e69736c2000706f72747469746f722076656c2e20496e2074696e636964756e742c206d65007475732061206c6f626f7274697320756c7472696365732c20697073756d20006d6574757320766573746962756c756d206e756c6c612c20617420696d706500726469657420746f72746f72206e6571756520736564206d692e204d61757200697320617420616e746520616e74652e20566573746962756c756d2063757200737573207665686963756c6120756c7472696365732e204d6f726269206c750063747573206120657374206e656320696d706572646965742e205574206e6f006e2075726e61206672696e67696c6c612c2065676573746173206d65747573002065752c2064696374756d20656c69742e20496e2064696374756d20707572007573206964206c656374757320616c69717565742074656d706f722e20416c00697175616d206572617420766f6c75747061742e204e616d206175677565200066656c69732c20696d70657264696574206174206d61676e61206e65632c200070656c6c656e746573717565207661726975732074656c6c75732e0a0a4d61006563656e617320656765742065782070656c6c656e7465737175652c20656c00656d656e74756d206469616d2061742c20656c656966656e6420646f6c6f72002e204e756c6c616d20626962656e64756d2065726f73206e656320646f6c6f007220646170696275732c2061742073616769747469732065737420636f6e6400696d656e74756d2e205072616573656e74206e6f6e2068656e647265726974002065726f732e204d616563656e617320636f6e736571756174206d617373610020766974616520647569207665686963756c612c20757420756c747269636500732072697375732073656d7065722e2053757370656e646973736520646170006962757320616e746520646f6c6f722c206120626962656e64756d2076656c0069742074726973746971756520696e2e204d616563656e6173206e65632069006163756c697320656e696d2e20566573746962756c756d20736564206f6469006f2064696374756d2c20766573746962756c756d206f64696f20656765742c0020656c656966656e64206d657475732e204d6175726973206163206c69626500726f20736564206c656f2070756c76696e617220636f6e76616c6c69732e200044756973207665686963756c61206f72636920656c69742e2056657374696200756c756d2065666669636974757220656765737461732065782061206f726e006172652e2051756973717565206f726e617265206e6962682063757273757300206d6f6c65737469652070656c6c656e7465737175652e0a0a446f6e6563200074696e636964756e7420666575676961742073757363697069742e2056657300746962756c756d20756c6c616d636f7270657220646f6c6f72206e6f6e206c006967756c6120766573746962756c756d2c20612070756c76696e6172206e75006e6320636f6e7365717561742e20416c697175616d2070756c76696e617220007661726975732074656c6c757320657520617563746f722e204d6175726973002076697665727261207665686963756c612065782c20766974616520616c69007175616d20617263752064696374756d2069642e205175697371756520706800617265747261207669746165206d61676e6120696e206f726e6172652e2056006573746962756c756d207072657469756d207363656c65726973717565206f0064696f20696420636f6e73656374657475722e204e756c6c61207365642065006e696d207574207175616d20636f6e736563746574757220747269737469710075652e0a0a4e756c6c616d206f64696f206d61757269732c20666575676961007420657520666575676961742075742c20706f737565726520766974616520006d61676e612e205365642076697461652073656d706572207475727069732c002073697420616d6574207363656c65726973717565206e756c6c612e2051750069737175652074656d707573206e6f6e206d692073656420706f7274746974006f722e2050726f696e206c656f2065782c20706f73756572652065752065670065737461732076656c2c206d6f6c657374696520736564206d657475732e20004e616d20747269737469717565206c6163757320657420697073756d206d610078696d757320756c747269636965732e204e756c6c616d20706f7375657265002073697420616d65742073617069656e206d6f6c657374696520756c6c616d00636f727065722e204d6f72626920656765737461732c20657261742061632000626c616e6469742064696374756d2c2073617069656e206e69736c2066696e0069627573206e6973692c2073656420656666696369747572206c6563747573002073656d20657520697073756d2e2050686173656c6c7573206c656f206175006775652c2076756c70757461746520706c616365726174206175677565206500752c2074656d706f722074696e636964756e74206c6f72656d2e204675736300652073697420616d65742073656d70657220746f72746f722e0a0a5375737000656e646973736520706f74656e74692e204d616563656e6173206964206461007069627573207475727069732c206e6f6e2076756c7075746174652065782e00204e756c6c616d2072757472756d206c6967756c61206e65632072697375730020737573636970697420766f6c75747061742e20416c697175616d206c756300747573206e657175652073697420616d65742061726375207472697374697100756520766f6c75747061742e205365642076697461652066656c6973206c6f0072656d2e20416c697175616d20706c61636572617420656c656d656e74756d002073617069656e2c2076697461652076756c7075746174652072697375732000766f6c757470617420696e2e204d616563656e6173207669746165206475690020657261742e2050686173656c6c7573206672696e67696c6c61207361706900656e2073656420647569207665686963756c612c2076617269757320636f6e00736563746574757220616e746520736f6c6c696369747564696e2e20437261007320696163756c69732c2073617069656e20696e74657264756d20696d7065007264696574206566666963697475722c20647569206d61757269732070756c0076696e617220697073756d2c2061742076656e656e61746973206e69736c20006f64696f2071756973207175616d2e204e756e63206566666963697475722000636f6e73656374657475722073656d7065722e204e756c6c616d20706f737500657265206e756c6c612072686f6e6375732070756c76696e617220756c74720069636965732e204e756e632074656c6c757320617263752c2068656e6472650072697420736f6c6c696369747564696e206469616d2076697461652c206865006e6472657269742066696e696275732065782e0a0a536564206c6f626f7274006973206d6174746973206c6967756c612c20766974616520636f6e76616c6c006973206c656f2064617069627573206e6f6e2e204d616563656e617320766900746165206c61637573206575206e69736c20617563746f7220656c656d656e0074756d206e6563207669746165206c65637475732e204d616563656e617320007669746165206f726369207669746165206d6920756c6c616d636f727065720020706f72747469746f72206964206c6f626f72746973206e69736c2e20446f006e6563206964206d617572697320697073756d2e20416c697175616d20657200617420766f6c75747061742e20566976616d7573206c6f626f72746973206e00696268207574206573742076756c70757461746520666575676961742e2049006e7465676572206c696265726f207175616d2c20756c74726963657320617400206f7263692061742c20636f6e677565206665726d656e74756d206d61737300612e20457469616d2069642065726f7320696163756c69732c20636f6e6469006d656e74756d206f7263692074696e636964756e742c206d6174746973206d00657475732e204d616563656e617320756c7472696365732073697420616d65007420646f6c6f722069642070656c6c656e7465737175652e2056657374696200756c756d20706f727461206d6178696d7573206e69736c2c20696e2066696e006962757320746f72746f7220766f6c75747061742075742e2055742067726100766964612c20646f6c6f7220756c7472696365732068656e6472657269742000666575676961742c20656e696d2073656d20696e74657264756d206c696775006c612c20616320656666696369747572206572617420656c6974206964206c006f72656d2e20496e2073697420616d657420756c6c616d636f72706572206c006f72656d2e0a0a50686173656c6c7573206c6967756c612075726e612c2063006f6e736571756174206574206c756374757320612c206f726e617265206574002061756775652e20566573746962756c756d20657420616e7465206174206c006163757320626962656e64756d20696d706572646965742e20457469616d200074757270697320617263752c2063757273757320766974616520766976657200726120612c2068656e64726572697420766974616520617263752e2050726f00696e206f726e617265206d6175726973207574206d61676e61206d6f6c657300746965206d61747469732e20446f6e65632074656d706f72206c6563747573002071756973206d617373612076756c70757461746520696e74657264756d2e002050726f696e206575206c6967756c61206469616d2e204d616563656e617300206461706962757320747572706973206c65637475732c2075742066616369006c6973697320656c6974206469676e697373696d2075742e204e756e632062006c616e646974206f726369206120616e746520666163696c697369732c2061007420636f6e76616c6c69732066656c697320666163696c697369732e2043750072616269747572207375736369706974206d692061206c696265726f20706f0073756572652c2071756973206f726e617265206a7573746f2076697665727200612e2050656c6c656e746573717565206861626974616e74206d6f72626920007472697374697175652073656e6563747573206574206e6574757320657420006d616c6573756164612066616d6573206163207475727069732065676573740061732e204e756c6c612070756c76696e6172207363656c6572697371756520006d61676e612c2065676574206c6f626f72746973206e69626820636f6d6d6f00646f2061742e20447569732065676574207661726975732066656c69732c2000636f6e64696d656e74756d20706c616365726174206c65637475732e20416c00697175616d20617563746f722074656d706f722075726e612065752070756c0076696e61722e204d6f726269206375727375732074656d706f72206e65717500652c206e6f6e20626c616e64697420646f6c6f7220666163696c697369732000656765742e2053656420736564206c6f626f727469732073656d2e0a0a4d61007572697320756c7472696369657320656c69742075726e612c2076656c2061006c697175657420707572757320617563746f722076697461652e20507261650073656e742076697665727261206f64696f2074656c6c75732c20717569732000706f7375657265206e756c6c6120616c69717565742061742e204c6f72656d0020697073756d20646f6c6f722073697420616d65742c20636f6e7365637465007475722061646970697363696e6720656c69742e20437572616269747572200065676574206d65747573206174206c6967756c6120656c656966656e642070006861726574726120696e206d616c657375616461206475692e20447569732000636f6e7365637465747572206469616d2075742066657567696174207275740072756d2e20566976616d757320657569736d6f64206e69736c2076656c206d006178696d75732073616769747469732e20496e20636f6d6d6f646f207369740020616d6574206c6f72656d2065742074696e636964756e742e205574207065006c6c656e746573717565206e756c6c61206e6f6e206d617572697320636f6e0064696d656e74756d2c2069642076756c707574617465206f64696f20626c61006e6469742e2053757370656e6469737365206e6f6e207072657469756d206d0061757269732c206e65632074696e636964756e742073617069656e2e0a0a460075736365206461706962757320657569736d6f64207475727069732c2075740020656c656d656e74756d20656e696d20657569736d6f64206e6f6e2e204e61006d2061206e6962682074656c6c75732e2050656c6c656e7465737175652069006163756c697320746f72746f722073656420706f72747469746f7220636f6e0064696d656e74756d2e204375726162697475722066617563696275732074750072706973206d6178696d75732c2076656e656e6174697320616e746520736500642c206d6f6c6c69732072697375732e205365642074656d707573206d6167006e612065676574206e756e6320706f72747469746f722c206174207275747200756d207175616d20636f6d6d6f646f2e20496e746567657220626c616e64690074207661726975732074656c6c75732073697420616d65742072757472756d002e2050726f696e206d6f6c6c697320747269737469717565206e6571756520007365642074656d7075732e204475697320706c6163657261742c206f726369002069642064696374756d20766573746962756c756d2c206c6967756c612064006f6c6f7220766f6c7574706174206c656f2c2076697461652066617563696200757320656e696d206e756c6c6120717569732065782e20437261732066617500636962757320657374206573742c2073697420616d657420616363756d7361006e206c6163757320696d706572646965742069642e204e616d206d6174746900732c206e756e6320736564206469676e697373696d20706c6163657261742c00206d617373612075726e6120696163756c69732076656c69742c207175697300206c7563747573206469616d206a7573746f206575206e6973692e20416c69007175616d206572617420766f6c75747061742e0a0a50656c6c656e74657371007565206e6571756520617263752c20636f6e677565206e6f6e2061756775650020717569732c2074726973746971756520696e74657264756d206e756e632e002050726f696e20646f6c6f7220746f72746f722c206461706962757320736500642070656c6c656e74657371756520612c2072757472756d2065676574206e006973692e20437261732065742074656d7075732074656c6c75732e204e756c006c6120706f72747469746f722c206e69736920657520617563746f7220766100726975732c206572617420746f72746f722072757472756d20747572706973002c206e6f6e2068656e64726572697420616e7465206e6571756520757420650073742e20416c697175616d2076756c7075746174652076656c69742076697400616520657569736d6f6420656765737461732e20496e7465676572207275740072756d206d6f6c6c697320617263752c20757420756c74726963696573206a007573746f206d6f6c6c697320656765742e20457469616d2061742066696e690062757320656e696d2c206574206d6174746973206d61757269732e204d61650063656e617320696e20616c69717565742061756775652e204e616d20756c7400726963657320656c656d656e74756d20617263752076656c20616c69717561006d2e20566573746962756c756d20696e206c6967756c6120747269737469710075652c206661756369627573206f64696f20656765742c206c6f626f7274690073206a7573746f2e204d6f726269206575206e756e632073697420616d65740020726973757320636f6e73657175617420616c697175657420736564206163002065782e20496e2068656e64726572697420756c74726963696573206c696700756c612c2071756973207375736369706974206c6563747573206469637475006d2065752e20536564206c616f7265657420636f6e67756520756c747269630065732e2050686173656c6c7573207375736369706974206d6173736120612000666163696c6973697320696d706572646965742e0a0a447569732074696e63006964756e742065726f7320717569732067726176696461207661726975732e002053757370656e6469737365206e6f6e206475692070757275732e20496e7400657264756d206574206d616c6573756164612066616d657320616320616e74006520697073756d207072696d697320696e2066617563696275732e20446f6e0065632061742070756c76696e61722066656c69732e20446f6e6563206e65630020616c697175616d2065726f732c2064696374756d20626962656e64756d2000617263752e20496e206e656320646f6c6f722066696e696275732c20707265007469756d206c6967756c612065742c20636f6e7365717561742065782e2049006e206861632068616269746173736520706c617465612064696374756d7374002e20457469616d2074656c6c757320656e696d2c20696e74657264756d207300656d70657220697073756d20736f64616c65732c206772617669646120667200696e67696c6c6120646f6c6f722e204e756c6c61206c6163696e6961206a750073746f20736f6c6c696369747564696e206c616f72656574206d6f6c6573740069652e20457469616d20616320766573746962756c756d207175616d2c2069006420657569736d6f6420697073756d2e205574206174206772617669646120006c6f72656d2e2053757370656e646973736520696e74657264756d20656c65006966656e64206c65637475732c2065752073656d7065722070757275732076006f6c757470617420612e0a0a55742076656c20617567756520756c747269630065732c2074696e636964756e74206d6173736120612c20736167697474697300206e69736c2e2050726f696e206567657420616e746520616c697175616d2c00206f726e6172652061756775652070656c6c656e7465737175652c2064617000696275732070757275732e20496e206574206d6574757320617263752e205000656c6c656e74657371756520616c697175616d20626c616e6469742061726300752071756973207472697374697175652e204d617572697320746f72746f7200206d617373612c206d6178696d757320717569732076617269757320612c2000706f72747469746f7220636f6e73656374657475722073656d2e2050726f69006e207665686963756c6120707572757320657420696163756c697320636f6e0073656374657475722e20557420736f6c6c696369747564696e2066696e696200757320657820696e20656c656d656e74756d2e204f7263692076617269757300206e61746f7175652070656e617469627573206574206d61676e697320646900732070617274757269656e74206d6f6e7465732c206e6173636574757220720069646963756c7573206d75732e205072616573656e74206e656320696d7065007264696574206d61676e612e205574206d616c65737561646120696420707500727573206e656320766573746962756c756d2e2053757370656e64697373650020616363756d73616e2065726174206c656f2c20696e20666175636962757300206469616d20696163756c69732073697420616d65742e204475697320736f006c6c696369747564696e206c6563747573207175697320656e696d206c616300696e696120657569736d6f642076656c2075742061756775652e0a0a416c69007175616d20756c7472696369657320636f6e76616c6c69732074656c6c7573002c206964206567657374617320656c697420736167697474697320696e2e20004372617320706f72747469746f72206e69736920656765742073617069656e0020636f6e76616c6c697320706f73756572652e204d6175726973206772617600696461206e65717565207669746165206c696265726f206375727375732c2000696420636f6e736571756174206e657175652072686f6e6375732e20496e74006567657220616c69717565742065676574206e696268206163207068617265007472612e204e756c6c616d20696163756c6973206e69736c2066656c69732c00207175697320696d70657264696574206e756c6c6120756c74726963657320007365642e205175697371756520747269737469717565206c61637573206174002072686f6e63757320706f7274612e204e616d20616320636f6e64696d656e0074756d2075726e612e20536564206e656320706f72747469746f72206e696200682e205365642067726176696461206d61676e612069642070757275732070006f737565726520766573746962756c756d206e6f6e20736564206e6973692e0020566573746962756c756d2061726375207475727069732c20696163756c6900732076656c20636f6e7365717561742069642c206c6f626f72746973207369007420616d65742065782e205072616573656e7420717569732074656d706f72002061756775652e204e756c6c61206567657420656e696d20656c656966656e00642c2074696e636964756e74206c696265726f2073697420616d65742c206d006174746973206e6973692e20446f6e65632064756920657261742c2070756c0076696e61722076656c207075727573206e65632c20666163696c69736973200066696e69627573206c6f72656d2e204e756c6c616d20756c7472696365732000707572757320766573746962756c756d20636f6d6d6f646f20616c69717561006d2e0a0a4f72636920766172697573206e61746f7175652070656e61746962007573206574206d61676e6973206469732070617274757269656e74206d6f6e007465732c206e61736365747572207269646963756c7573206d75732e204e75006e6320626c616e646974206e756c6c612072697375732c2076656c20736f6400616c6573206c6f72656d206f726e6172652061632e20496e7465676572206e006f6e20646f6c6f7220626962656e64756d2c206f726e61726520746f72746f007220656765742c20756c7472696369657320697073756d2e2041656e65616e002066696e69627573206469676e697373696d206f726e6172652e204d6175720069732074656d7075732c206572617420617420626962656e64756d2061756300746f722c206c656f20656c6974206c6163696e6961206f64696f2c206174200074656d7075732061726375206475692071756973206573742e20507261657300656e74206672696e67696c6c61206c6f72656d206d616c6573756164612070006f72747469746f7220696d706572646965742e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d6f7262692076697461650020666163696c69736973206c6f72656d2c20766974616520636f6e7365717500617420697073756d2e20457469616d20696420656c656d656e74756d2065720061742e204e616d20646f6c6f72206c656f2c2074656d706f722061632065780020717569732c206469676e697373696d206665726d656e74756d20616e7465002e0a0a446f6e65632061206e756c6c612072697375732e204d6175726973200066617563696275732c206e756e63206163206d6178696d75732076656e656e00617469732c206d61676e612076656c6974207072657469756d20616e74652c00206e6f6e206665726d656e74756d20656c6974206d6175726973206e6f6e20006e756e632e20446f6e65632068656e6472657269742075726e61206174207400656c6c757320636f6e76616c6c69732c20616320666175636962757320656c006974206c6f626f727469732e204e756c6c616d20626962656e64756d20656c00656966656e64206d61676e612073697420616d657420696e74657264756d2e0020496e20696e20736f64616c657320746f72746f722c206e6f6e206c6f626f0072746973206d692e205072616573656e742076656c2073656d2061206f6469006f2076656e656e6174697320666163696c697369732e20566573746962756c00756d206163206d6f6c657374696520646f6c6f722c2061742066696e6962750073206e6973692e0a0a566573746962756c756d20616e746520697073756d20007072696d697320696e206661756369627573206f726369206c75637475732000657420756c74726963657320706f737565726520637562696c6961206375720061653b2046757363652061632074656d70757320617263752c2076697461650020696163756c6973206e657175652e2055742061206e69736c207574207665006c697420636f6e73657175617420636f6e64696d656e74756d207669746165002065676574206e6962682e2044756973206574206d61676e6120616c6971750065742c20636f6e76616c6c697320656c69742069642c20756c6c616d636f7200706572206d692e20566976616d757320696d706572646965742066656c697300207175697320636f6e7365717561742072757472756d2e204d6f7262692075007420617263752073697420616d657420617567756520636f6e677565207469006e636964756e742e2053757370656e64697373652061206d6174746973206f007263692e204e756e6320656765737461732c2076656c69742073656420646900676e697373696d2073656d7065722c20656c6974206d61757269732062696200656e64756d206e657175652c206567657420616c697175616d206e69736920006e65717565206120616e74652e204e616d2066657567696174206e657175650020646f6c6f722e20566573746962756c756d20616e746520697073756d20700072696d697320696e206661756369627573206f726369206c75637475732065007420756c74726963657320706f737565726520637562696c6961206375726100653b20557420696e20636f6e736563746574757220646f6c6f722e205175690073717565206e6f6e20636f6e677565206e657175652e0a0a4e756c6c6120730063656c657269737175652c206e65717565206567657420636f6e76616c6c69007320626962656e64756d2c206c6f72656d206d65747573207068617265747200612070757275732c2073656420626c616e6469742065726174206172637520006575206e6973692e204d617572697320706c616365726174206d6173736120006575206e6571756520766f6c75747061742c2073697420616d6574207669760065727261207269737573207363656c657269737175652e20496e2076656c2000766573746962756c756d206e756c6c612e20416c697175616d2072686f6e630075732061632061756775652076656c2076756c7075746174652e204d617572006973207669746165206469616d20696d706572646965742c20766f6c757470006174206e6962682065752c206661756369627573206d657475732e2045746900616d2070656c6c656e74657371756520747572706973206964206e6962682000636f6e73657175617420736f6c6c696369747564696e2e204e756e63206567006574206a7573746f2070756c76696e6172206d657475732072757472756d20006c75637475732073697420616d65742061206d657475732e204e756c6c612000666163696c6973692e2053757370656e646973736520657520617567756520006c65637475732e2053757370656e646973736520736f6c6c69636974756469006e20657569736d6f64207661726975732e2050686173656c6c757320616e74006520657261742c20666175636962757320696420746f72746f72206e65632c00207363656c6572697371756520766172697573206e756e632e0a0a45746961006d206672696e67696c6c6120766f6c7574706174206d692c20706f73756572006520766573746962756c756d206c6967756c6120756c74726963657320696e002e20446f6e6563207665686963756c6120747572706973207175697320756c0074726963696573207661726975732e20446f6e65632073656d70657220616e00746520657261742c20616320666575676961742074656c6c75732062696265006e64756d2069642e20446f6e656320697073756d206e69736c2c2070756c7600696e6172206e6563207175616d20696e2c20736f6c6c696369747564696e2000696e74657264756d20656e696d2e20566976616d7573206c616f72656574200074656c6c75732065676574206f72636920636f6e64696d656e74756d20736300656c657269737175652e2050726f696e206574206661756369627573206f6400696f2c206163206566666963697475722061756775652e20557420696e7465007264756d20747269737469717565206475692074656d70757320706f727461002e20416c697175616d206672696e67696c6c6120707572757320766974616500206e6962682074656d706f7220626962656e64756d2e205175697371756520006574207361676974746973206f7263692c2061742074656d706f722076656c0069742e205365642066696e696275732073617069656e20657420747572706900732073656d7065722c206e6f6e206d6f6c6573746965206e756e63206c7563007475732e20536564206a7573746f206e6973692c20736f6c6c69636974756400696e20696e20697073756d20696e2c206665726d656e74756d20707265746900756d206f64696f2e204e756c6c6120757420766f6c75747061742073656d2e000a0a436c61737320617074656e742074616369746920736f63696f73717520006164206c69746f726120746f727175656e742070657220636f6e7562696120006e6f737472612c2070657220696e636570746f732068696d656e61656f732e00204e756c6c61206e6f6e206f726369206d692e20566573746962756c756d20007361676974746973206f72636920657520636f6e64696d656e74756d20636f006e6775652e20446f6e656320736564206d61676e612070656c6c656e746573007175652c20706c61636572617420697073756d207365642c20616c69717561006d2073656d2e2043757261626974757220696d706572646965742061756775006520657420656c697420706c6163657261742c2061742070756c76696e61720020617263752066617563696275732e20566573746962756c756d2066657567006961742c20697073756d20617420756c747269636573206d6f6c6573746965002c206e65717565206f64696f20656c656966656e642076656c69742c206174002065676573746173206f72636920647569206574206573742e20496e746567006572207574206a7573746f206c65637475732e204e756c6c616d20666575670069617420696e74657264756d206f726369206e656320617563746f722e0a0a00446f6e656320616c697175657420616363756d73616e206d617373612c2076006974616520666163696c697369732072697375732e20467573636520707265007469756d206e756e63206e6f6e20636f6e73657175617420656c656d656e7400756d2e204d616563656e617320636f6e64696d656e74756d207363656c657200697371756520706f72747469746f722e204f72636920766172697573206e6100746f7175652070656e617469627573206574206d61676e697320646973207000617274757269656e74206d6f6e7465732c206e6173636574757220726964690063756c7573206d75732e204d6175726973206e6563207075727573206661750063696275732c2074656d707573206469616d206e65632c20756c74726963650073206f7263692e2041656e65616e2066617563696275732c2073617069656e0020757420706f72747469746f7220616c69717565742c206e756e6320657261007420636f6e6775652061756775652c2071756973206469676e697373696d200073656d20697073756d206574206469616d2e2053757370656e646973736520006772617669646120657569736d6f6420697073756d2c206120696d7065726400696574206e756c6c6120636f6e7365717561742061632e2050726f696e20710075697320636f6e73657175617420697073756d2c20696e20737573636970690074206e657175652e204e616d2076697461652076697665727261206c656f2e002041656e65616e20756c74726963657320706c61636572617420626c616e640069742e20496e7465676572206e6571756520617263752c20666163696c69730069732073697420616d6574206f726369207365642c20766573746962756c75006d206672696e67696c6c6120746f72746f722e2050656c6c656e746573717500652066657567696174206575206c6967756c612065676574206c6f626f72740069732e20536564206575206d6f6c6c69732065782c20696e206461706962750073206c616375732e20467573636520616c697175616d2c206e657175652063006f6e73657175617420666163696c6973697320706c6163657261742c2069700073756d206f72636920696163756c6973206a7573746f2c20696d706572646900657420706f7375657265206d61676e61206f64696f206e65632075726e612e0020437572616269747572206d6f6c6c69732c20657820696e20666163696c690073697320766f6c75747061742c206e697369206a7573746f20656c65696665006e64206c696265726f2c20612070656c6c656e74657371756520656e696d20006d61676e612071756973206e6962682e204d617572697320756c7472696369006573206469616d2065676574206c616375732070756c76696e61722c2065740020636f6e64696d656e74756d206e6962682073656d7065722e0a0a56697661006d757320746f72746f72207175616d2c20616c697175657420696e206e756e00632075742c206f726e61726520756c74726963696573206e657175652e205000656c6c656e74657371756520637572737573206163206a7573746f2076697400616520756c747269636965732e20446f6e65632065676574206e69736c207100756973206f726369206772617669646120766f6c75747061742065742069640020656e696d2e2053656420706f72747469746f72206c616375732071756973002073656d20756c74726963657320666163696c6973697320757420656765740020656e696d2e20416c697175616d20696163756c69732065726174206e656300206d617373612072686f6e6375732068656e6472657269742e20416c69717500616d206f726e6172652070686172657472612075726e612065752061756374006f722e20566976616d7573206964206469616d206120617567756520656765007374617320636f6e6775652e205072616573656e742068656e647265726974002073617069656e20696e206f72636920636f6e6775652c206567657420636f006e6775652073617069656e20696d706572646965742e205365642061756374006f7220657374206163206c7563747573206c6163696e69612e20496e746567006572206e65717565206e657175652c20656c656966656e642076656c206c65006f2069642c20626962656e64756d20756c6c616d636f727065722073656d2e0020566573746962756c756d2076656c20666163696c69736973206573742e2000536564207175697320766f6c7574706174207475727069732e0a0a4e616d20006d6174746973206d6f6c6573746965206d61676e612c20766974616520636f006e736571756174206d657475732e204e616d206d6178696d75732065756973006d6f6420656c6974206e6563206f726e6172652e204e756c6c61206d6f6c6c00697320696420707572757320717569732074656d706f722e2050656c6c656e007465737175652072686f6e637573206567657374617320666575676961742e00204475697320756c74726963657320656c6974207574206c6f72656d207075006c76696e617220736f6c6c696369747564696e2e2043757261626974757220006672696e67696c6c612076756c7075746174652076656e656e617469732e20004d61757269732074656d706f7220617563746f722075726e612e0a0a496e20006861632068616269746173736520706c617465612064696374756d73742e20004d616563656e617320617563746f72206d617474697320626962656e64756d002e20566573746962756c756d2074656d7075732072686f6e637573206c6563007475732c2069642072686f6e637573206e69736c206d6178696d7573206174002e204475697320766172697573206672696e67696c6c61206175677565206e00656320666163696c697369732e204e756c6c6120696163756c69732061207000757275732065676574206665726d656e74756d2e20457469616d206e656320007361676974746973206f7263692e205072616573656e74206d6174746973200066656c69732072697375732e204e616d206567657420656c656d656e74756d00206c6967756c612e20436c61737320617074656e742074616369746920736f0063696f737175206164206c69746f726120746f727175656e74207065722063006f6e75626961206e6f737472612c2070657220696e636570746f732068696d00656e61656f732e2050686173656c6c75732065676573746173207075727573002070656c6c656e7465737175652c2070656c6c656e7465737175652076656c006974206e6f6e2c206772617669646120656c69742e0a0a536564206e6f6e200074656d7075732070757275732e2053757370656e64697373652070756c7669006e6172206d65747573206e657175652c206e6f6e207472697374697175652000697073756d20706f727461206e6f6e2e205574206567657420747572706973002074696e636964756e742c2074656d706f722073656d20717569732c207665006e656e61746973206d61676e612e20566573746962756c756d206964206d610078696d75732072697375732e204475697320616c697175657420706f7375650072652066656c697320696e20706c6163657261742e2051756973717565207600656c6974206f64696f2c20656666696369747572206174206d617373612061002c20747269737469717565206f726e61726520646f6c6f722e204e756c6c61006d206567657374617320706c616365726174206475692075742073656d706500722e20416c697175616d20717569732073617069656e206d657475732e20440075697320656c656d656e74756d2c2065726174206e656320626c616e646974002072686f6e6375732c2065726f7320656e696d207363656c65726973717565002061756775652c206e656320766976657272612065726f73206c656f20657500206c656f2e204d6f7262692073656420666163696c69736973206a7573746f002e20566976616d75732073697420616d6574206d61676e612068656e64726500726974206c656f206772617669646120617563746f722e0a0a4e756e63206300757273757320616c6971756574206f64696f2e204e756e6320696163756c6900732065742074757270697320617420756c747269636965732e204e616d207600756c70757461746520656e696d20656765742070757275732074656d70757300206f726e6172652e204e756c6c616d20636f6e736571756174206d6f6c657300746965206469616d2c20766974616520756c747269636573206e6962682070006f72747469746f722065742e20566573746962756c756d20766f6c757470610074207574206c6f72656d20656765742070656c6c656e7465737175652e204e00616d2064617069627573206c696265726f206d692e2050656c6c656e746573007175652074696e636964756e74206e696268206e657175652c206120696e7400657264756d206c6f72656d20636f6e6775652076656e656e617469732e205000686173656c6c757320696e2073656d206574206d617373612066617563696200757320616363756d73616e2074696e636964756e742076656c206e6962682e000a0a4e756c6c61206d616c657375616461206e69736c206e69736c2c20657500206d6f6c657374696520697073756d206d6f6c6c697320656765742e20416c00697175616d2076756c70757461746520707572757320736564206c6967756c006120736167697474697320616c69717565742e20496e20616c697175616d20006469616d20677261766964612072757472756d2070756c76696e61722e2049006e206d616c6573756164612075726e612065676574206f726e6172652065670065737461732e20566573746962756c756d207669746165207363656c6572690073717565206573742c206567657420766573746962756c756d206f7263692e002050656c6c656e746573717565206672696e67696c6c61206d616c6573756100646120706f73756572652e204e756c6c6120696e74657264756d206c656f20007669746165207072657469756d20706f73756572652e204e616d206d6f6c6c0069732065726f73207365642074656c6c7573206d6174746973207361676974007469732e0a0a53757370656e646973736520636f6e64696d656e74756d206c006563747573206574206c6f72656d20657569736d6f64206375727375732e20004d6175726973206172637520617263752c2072757472756d20636f6e7365710075617420707572757320696e2c206567657374617320696163756c6973206c00696265726f2e204d6f726269207068617265747261206d6178696d7573206d00617373612c206567657420626c616e646974207475727069732070756c7669006e61722065742e204d6175726973206e656320646f6c6f722076656e656e61007469732c2070656c6c656e746573717565206d61676e612069642c2061756300746f722075726e612e204d616563656e6173207669766572726120706f7274007469746f72206e6973692c2076656c20756c74726963696573206572617420006375727375732061742e20467573636520636f6e6775652074656c6c7573200076697461652073617069656e20747269737469717565206665726d656e7475006d2e20446f6e656320696d706572646965742073656d206e6f6e206d61757200697320756c7472696365732076656e656e617469732e204372617320756c74007269636573206c6f72656d206c656f2e20536564207365642076656e656e6100746973206e657175652c20766974616520656765737461732066656c69732e00205072616573656e7420617420616e746520706f7274612c20636f6e64696d00656e74756d206c65637475732076697461652c20706f72747469746f72206e00657175652e204e616d2074656c6c7573206c616375732c20747269737469710075652074656d706f72206e756c6c61206e65632c20706c6163657261742062006962656e64756d2061756775652e204e756c6c616d20657569736d6f64207600697665727261206f7263692c206575206772617669646120656e696d20636f006e64696d656e74756d20626962656e64756d2e2053757370656e6469737365002065676574206c6f72656d20766974616520697073756d20706c616365726100742070656c6c656e74657371756520696420636f6d6d6f646f206f64696f2e00204675736365206d61747469732075726e612075742064756920636f6d6d6f00646f2c206e656320636f6d6d6f646f206475692070686172657472612e0a0a00496e206861632068616269746173736520706c617465612064696374756d7300742e204e616d206a7573746f206e6962682c207665686963756c612061206c006967756c612065752c206d617474697320656c656966656e64206c6967756c00612e205175697371756520656765742074757270697320612061756775652000747269737469717565206665726d656e74756d2e204e756c6c616d20766974006165206c61637573206d6f6c65737469652c207363656c65726973717565200061756775652061742c20656c656966656e64206e69736c2e204e756c6c6120006d61676e612065726f732c20636f6e76616c6c697320736564206f64696f20007363656c657269737175652c206c6f626f7274697320636f6e76616c6c697300206e6962682e204e616d2061742073616769747469732061756775652c2065007520766172697573206c6967756c612e204e756c6c616d20706f737565726500206d6178696d7573206e697369206e656320616c69717565742e2045746961006d207363656c657269737175652071756973206469616d20656765742065670065737461732e205072616573656e7420756c74726963696573207363656c6500726973717565206d69206e656320626962656e64756d2e2056657374696275006c756d20616c697175616d2074656c6c75732076656c206a7573746f206c61006f726565742c207574207072657469756d2073656d206f726e6172652e204e00616d20616e7465206e6962682c2066696e69627573206e6563207361706965006e20612c2076656e656e6174697320636f6e6775652072697375732e20496e002076656c206e65717565206120656e696d20636f6e7365637465747572207000656c6c656e7465737175652e20566976616d757320636f6e76616c6c69732000657374207574206e756c6c6120736167697474697320706f73756572652e200050656c6c656e74657371756520626962656e64756d20736f64616c65732069007073756d2065742068656e6472657269742e0a0a536564207269737573206600656c69732c20736f6c6c696369747564696e206575206d6f6c6573746965200065742c20657569736d6f6420656765742065782e20457469616d206567657400206e756c6c61206e6962682e20437261732067726176696461206120746f7200746f722076697665727261207661726975732e2050686173656c6c7573206600696e696275732c2073617069656e20657420616c697175616d20756c747269006365732c206d61757269732065726f7320706f72747469746f722065726f73002c20616320636f6e677565206c656f206573742065676574206d6175726973002e20536564206e756e632076656c69742c2065676573746173207365642065006c69742065752c20657569736d6f64206d6178696d75732073617069656e2e0020566573746962756c756d20616e746520697073756d207072696d69732069006e206661756369627573206f726369206c756374757320657420756c7472690063657320706f737565726520637562696c69612063757261653b2056657374006962756c756d206c656f206a7573746f2c20636f6d6d6f646f2071756973200076756c7075746174652061742c20736f6c6c696369747564696e207369742000616d6574206573742e205365642070756c76696e61722c2076656c69742073006564206469676e697373696d20766976657272612c206d6173736120646f6c006f722073656d706572206c6f72656d2c206e6f6e206d6f6c6573746965206d006175726973206f64696f2065742070757275732e204d616563656e6173206c006f626f7274697320696e74657264756d206e756e63207574206d6f6c6573740069652e20536564206d6f6c6c697320636f6d6d6f646f2076656e656e61746900732e20496e74657264756d206574206d616c6573756164612066616d65732000616320616e746520697073756d207072696d697320696e206661756369627500732e2055742073656420617263752076656c69742e204d617572697320617500677565206e756c6c612c206f726e617265206e656320616c697175657420730065642c20636f6d6d6f646f20696e206475692e0a0a496e746567657220736f006c6c696369747564696e2075726e612065676574206e756c6c61207068617200657472612c206e6f6e20766172697573206e657175652070756c76696e6172002e204e756c6c61207574206c656374757320736564206d617572697320756c006c616d636f7270657220706f7274612e2051756973717565206e656320646900616d207472697374697175652c2064617069627573206c656374757320612c0020616c697175616d206e6962682e2043757261626974757220616c697175650074206d6f6c6c69732073617069656e207574206d6f6c65737469652e205068006173656c6c7573207361676974746973206e69736c207669746165206d617800696d75732066617563696275732e20446f6e6563206d6178696d757320612000647569206575207661726975732e20457469616d2072686f6e63757320746f0072746f722076656c206e756e63206665726d656e74756d2070756c76696e61007220736564206e656320657261742e20416c697175616d207574206c656f20006e6f6e206e69736920646170696275732076756c7075746174652e20496e74006567657220616363756d73616e20636f6e6775652072686f6e6375732e205500742076756c707574617465206f64696f20656c69742c207072657469756d200073656d7065722065726174207375736369706974206e65632e205375737065006e6469737365206d6174746973207475727069732076656c2065726f73207000756c76696e617220756c7472696365732072757472756d2073697420616d65007420616e74652e204475697320656c656966656e64206d6178696d75732061007567756520696e207363656c657269737175652e20446f6e6563206e6f6e2000746f72746f722073697420616d657420657261742066617563696275732061006c69717565742e205365642074656d70757320747269737469717565207269007375732c207072657469756d207472697374697175652064756920636f6e7600616c6c69732065752e0a0a50686173656c6c757320616c697175616d2074750072706973206174206c656f20706f73756572652c2073656420616363756d7300616e206e69736c2074656d7075732e204d616563656e6173207669746165200073617069656e206a7573746f2e2050686173656c6c75732074656d70757320006672696e67696c6c612070656c6c656e7465737175652e2050656c6c656e7400657371756520617420646f6c6f72206964206d6175726973206c616f726565007420637572737573206e6f6e2071756973206d657475732e204475697320610063206d69206e6f6e2074656c6c7573206461706962757320706f7274746974006f72206e6f6e206574206c6967756c612e20457469616d20736f64616c6573002069642074757270697320696e20756c747269636965732e2053656420616e007465206c616375732c2068656e64726572697420757420706f72747469746f00722075742c206665726d656e74756d207669746165206c656f2e0a0a437261007320706861726574726120616e746520616e74652c2076756c70757461746500206665756769617420726973757320666175636962757320656765742e205000726f696e2073697420616d65742074656c6c75732072686f6e6375732c20760065686963756c61206469616d206e6f6e2c2065676573746173206573742e200043726173207669746165206c696265726f206e657175652e20446f6e65632000697073756d2066656c69732c20696e74657264756d2076656c20656765737400617320656765742c20616c6971756574206e65632065726f732e20446f6e650063206e697369206d617373612c20766573746962756c756d2076656c20656e00696d2065742c206461706962757320636f6e67756520697073756d2e20507200616573656e7420647569206573742c20636f6e677565207669746165206d6f006c657374696520717569732c206d616c657375616461206567657420646961006d2e20457469616d206e6f6e2076697665727261206f7263692e2056657374006962756c756d206d6f6c6c69732065726f73206174206c656374757320706f0072747469746f7220756c6c616d636f727065722e20496e2066657567696174002066656c6973206e656320657820756c7472696365732c2073656420666572006d656e74756d206a7573746f2066696e696275732e2044756973206e6f6e2000706f7375657265206e657175652c20657420636f6e736571756174206f726300692e20416c697175616d206575206a7573746f20756c7472696365732c207600656e656e6174697320746f72746f722061632c2072757472756d20656e696d002e0a0a496e7465676572206469676e697373696d207175616d206575206d6100757269732066696e6962757320666163696c697369732e204d617572697320006c6163696e6961206a7573746f206c65637475732c2076656c206c756374750073207175616d20766f6c757470617420766f6c75747061742e205574206e6f006e206f726369206e756c6c612e2041656e65616e20617563746f72207361700069656e206120726973757320656c656d656e74756d206d616c657375616461002e204e616d2065676574206c6563747573206c696265726f2e20416c69717500616d20697073756d206d617373612c20736f6c6c696369747564696e2061630020696163756c697320612c206d6178696d7573206575207475727069732e20004d616563656e61732076656c206e756e632076656c2065726f7320766f6c750074706174207472697374697175652076697461652061742065782e204375720061626974757220657420656e696d206d6f6c6c69732c207072657469756d2000646f6c6f7220717569732c2068656e647265726974206c616375732e20496e002074656d70757320657569736d6f6420646f6c6f722c206964206469637475006d206d657475732072757472756d20717569732e0a0a43757261626974757200207072657469756d206c6f626f72746973207363656c657269737175652e20004d61757269732076656c206d69206120697073756d207665686963756c6120007363656c657269737175652e204e756c6c6120666163696c6973692e20446f006e656320636f6e736571756174206f64696f2061206572617420756c6c616d00636f7270657220666163696c697369732e2044756973206d6173736120656e00696d2c20756c74726963696573206e6f6e2075726e6120717569732c2065750069736d6f64207072657469756d20746f72746f722e20457469616d2068656e00647265726974206c656374757320766974616520656c656d656e74756d207600756c7075746174652e20496e74657264756d206574206d616c657375616461002066616d657320616320616e746520697073756d207072696d697320696e200066617563696275732e20536564206f64696f206d61676e612c20636f6e7365006374657475722073697420616d657420706f7274612076697461652c2076690076657272612061206d61676e612e204372617320657520697073756d20656c00656966656e64206f64696f20766976657272612072757472756d206574206e006f6e206c6f72656d2e20517569737175652071756973206c656f2075742072006973757320756c6c616d636f727065722073757363697069742076656c206e006563206469616d2e20467573636520646170696275732065726f73206e6f6e00206e69736c2066617563696275732c20657420656666696369747572207365006d20706c6163657261742e20566573746962756c756d20616e74652069707300756d207072696d697320696e206661756369627573206f726369206c75637400757320657420756c74726963657320706f737565726520637562696c6961200063757261653b20416c697175616d2069642073656d206163206c6f72656d2000706f72747469746f72206c616f72656574206163207175697320656c69742e000a0a446f6e65632076656c20646f6c6f72206d6178696d75732c206d6f6c6c006973206d61676e612073697420616d65742c2070686172657472612076656c0069742e2041656e65616e2070656c6c656e74657371756520737573636970690074206c6563747573206174207665686963756c612e20446f6e6563206e656300206661756369627573206469616d2e204e616d20656765742064756920657500206d6175726973206461706962757320616c697175616d2064696374756d20006575206d61757269732e20446f6e6563206c6563747573206d657475732c20006d6f6c657374696520636f6e73657175617420756c747269636965732065670065742c206c616f72656574206e6563206475692e20446f6e6563206575206c00656374757320717569732076656c697420656c656d656e74756d2065756973006d6f642e204d616563656e617320626962656e64756d206c61637573207369007420616d657420736f6c6c696369747564696e206c6163696e69612e0a0a510075697371756520737573636970697420706f73756572652070757275732063006f6e64696d656e74756d20706f7274612e20457469616d2068656e64726572006974207574206c696265726f20696e2072757472756d2e204e756c6c616d2000756c74726963696573206c696265726f20657420647569206c6f626f7274690073206672696e67696c6c612e20496e746567657220757420656c6974206d6100676e612e2051756973717565207665686963756c61206d6f6c6c6973206c65006f2c206964207665686963756c61206d61676e6120616c6971756574207574002e20457469616d206e6f6e20706f72747469746f72206e69736c2c207369740020616d65742076756c707574617465206469616d2e2050726f696e206e657100756520657261742c20737573636970697420656765742066656c697320696e002c20677261766964612066696e69627573207175616d2e2050686173656c6c007573206d617474697320746f72746f722072697375732c20757420656c656d00656e74756d206d6574757320737573636970697420626962656e64756d2e0a000a4e756c6c616d207175616d2065782c20706f72746120696e2070757275730020696e2c206d6f6c65737469652074726973746971756520646f6c6f722e2000457469616d207472697374697175652072697375732076656c206c6163757300206672696e67696c6c612c206174206c75637475732075726e6120616c69710075616d2e20416c697175616d2065752066656c697320666575676961742c2000696163756c6973206c6f72656d2073697420616d65742c2070756c76696e61007220697073756d2e204e616d2076697461652074696e636964756e74206d6100676e612e204d617572697320756c6c616d636f727065722c206d657475732000636f6e64696d656e74756d20736f64616c657320756c6c616d636f72706572002c2073656d2074656c6c757320636f6e7365637465747572206c6563747573002c2061742074656d7075732073617069656e206d61757269732076656e656e0061746973206d61757269732e2041656e65616e20766573746962756c756d2000646f6c6f722065782c2076656c2076697665727261206e696268206d617869006d7573207365642e20457469616d20636f6d6d6f646f206d616c65737561640061206f7263692e204e616d20616363756d73616e206469616d206e6563206e00756e6320766f6c7574706174206566666963697475722e20467573636520700072657469756d20697073756d206c656f2c207175697320696e74657264756d00206172637520736f6c6c696369747564696e20656765742e2050656c6c656e00746573717565206d617474697320617420697073756d206567657420707265007469756d2e0a0a536564206c656f206d692c207068617265747261207369740020616d657420696d706572646965742065752c2074696e636964756e742065007420746f72746f722e2055742071756973207072657469756d206d61676e61002c20657520616c697175657420697073756d2e2050726f696e20616320756c0074726963657320697073756d2c2076656c206d6f6c6573746965207361706900656e2e20457469616d20736f64616c6573206e65717565206163206f726e610072652070686172657472612e204d6f7262692071756973206175677565207300697420616d65742075726e6120706c6163657261742070756c76696e61722e00204375726162697475722076617269757320666163696c69736973207269730075732c206964207375736369706974207175616d20696d7065726469657420006d616c6573756164612e20416c697175616d20646170696275732c2069707300756d2076656c20636f6e64696d656e74756d206d61747469732c206c696775006c6120657374206375727375732074656c6c75732c20657520696e7465726400756d20616e7465206c656f206e6f6e20616e74652e204e756c6c6120717561006d206e6973692c20706f737565726520657420616363756d73616e20696e7400657264756d2c2076756c707574617465206e6f6e2070757275732e204e756e00632076617269757320696d706572646965742066656c6973206e656320696e0074657264756d2e2050726f696e2076656e656e617469732061206c6967756c006120657420636f6e73656374657475722e2050686173656c6c7573206e6563002065726f73206d6f6c6c69732c20756c7472696369657320656c6974206e6f006e2c206c6163696e6961206d692e2053757370656e6469737365206c696775006c6120617263752c206665726d656e74756d20617420617563746f722071750069732c20656c656966656e64207669746165206e69736c2e0a0a53656420660065726d656e74756d20707572757320696e206f64696f2070756c76696e6172002c20766573746962756c756d20656c656966656e642065737420636f6d6d6f00646f2e20467573636520766172697573207365642074757270697320696e2000666575676961742e20557420616320666163696c69736973206f64696f2e2000557420766f6c757470617420697073756d20646f6c6f722c20696e2065756900736d6f6420646f6c6f7220696e74657264756d2069642e20536564207361700069656e206573742c20696d70657264696574206575206f726e6172652065670065742c2074656d70757320656765742066656c69732e2050686173656c6c7500732070656c6c656e7465737175652c206e756c6c612073697420616d6574200066696e6962757320677261766964612c207175616d206e69736c206469637400756d206a7573746f2c2073697420616d6574206672696e67696c6c6120646900616d206c616375732065676574206573742e20566573746962756c756d2062006c616e646974206d617572697320696e20616e7465206d6178696d75732076006f6c75747061742e2050656c6c656e746573717565206861626974616e7420006d6f726269207472697374697175652073656e6563747573206574206e6574007573206574206d616c6573756164612066616d6573206163207475727069730020656765737461732e20566573746962756c756d2066656c6973207269737500732c2073616769747469732076656c20636f6d6d6f646f207365642c20706f0072746120617563746f722073656d2e20496e74657264756d206574206d616c006573756164612066616d657320616320616e746520697073756d207072696d00697320696e2066617563696275732e204d616563656e6173206e656320706f0072747469746f722066656c69732e20446f6e656320656c656d656e74756d200073656d206e756c6c612e0a0a416c697175616d20656c656d656e74756d20650075206c6f72656d206964206c75637475732e204e756e63206174206e69626800206573742e205072616573656e7420666175636962757320766172697573200065726174206e656320706f73756572652e204e756c6c616d207175616d206c00616375732c20766f6c7574706174206e6563206c616f72656574206e6f6e2c0020706f7375657265206163206c6967756c612e2050726f696e2071756973200065676573746173206e69736c2c20736564206c75637475732066656c69732e00204e756c6c61207072657469756d207175616d206e65632066696e696275730020656c656966656e642e20457469616d206d617572697320656e696d2c207200686f6e6375732076656c206d616c657375616461207365642c20636f6e6469006d656e74756d2076697665727261206c696265726f2e20416c697175616d20007175616d2073656d2c2072757472756d2061742073617069656e206e65632c00206c616f7265657420666163696c69736973207475727069732e204e616d20006e65632074656d707573206573742e204d616563656e617320766172697573002c206e69626820617420636f6e73656374657475722074656d7075732c206e00756e63206c6f72656d206672696e67696c6c6120617263752c20696d70657200646965742072757472756d206e69736c2064756920612061756775652e20500072616573656e7420706c6163657261742073617069656e20736564206d6920006d6f6c6c697320666163696c697369732061206e65632070757275732e20500072616573656e7420736f6c6c696369747564696e2066656c6973206d61737300612c2076656c206d6174746973206c656f2068656e6472657269742061632e002053757370656e646973736520657569736d6f642064696374756d2074696e00636964756e742e0a0a416c697175616d2064617069627573206c6f72656d2000657520736f64616c65732066617563696275732e204e756c6c612074726973007469717565206f64696f2065742072697375732064696374756d2c20756c7400726963696573206c6f626f72746973206c6967756c61207361676974746973002e20496e74657264756d206574206d616c6573756164612066616d65732061006320616e746520697073756d207072696d697320696e206661756369627573002e204e756e632074656d7075732076656c2065726174207669746165206c610063696e69612e204e756c6c6120696e20656765737461732065726f732e204e00756c6c616d2076656c20646f6c6f722076656c2076656c697420706c616365007261742076756c70757461746520696e20736564206c616375732e20416c69007175616d206c6f626f7274697320616e746520696e2074656c6c75732069610063756c69732c206120636f6d6d6f646f207175616d20616363756d73616e2e002050726f696e2066657567696174206c6967756c61206964206e756e63207600756c70757461746520646170696275732e20457469616d207072657469756d00207669746165206475692073697420616d657420616c697175616d2e204165006e65616e206c6f626f727469732072757472756d206e6973692c2061207465006d7075732065726f7320666163696c697369732069642e204d617572697320006e6f6e2061726375206174206e6973692076697665727261206375727375730020657520616320646f6c6f722e0a0a4e756e6320696e206f64696f206d692e00204e616d206d617474697320736564206c6967756c612073697420616d6574002074656d706f722e20496e74656765722064696374756d207269737573206600617563696275732c2076656e656e6174697320616e74652065752c20756c74007269636573206d61757269732e20446f6e6563206e656320636f6e64696d65006e74756d2065782e2053656420666163696c69736973206f64696f20647569002c207669746165206672696e67696c6c61206d617572697320617563746f7200206e6f6e2e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e2053757370656e646973736520717569732074656c6c7573206c00616f726565742c20756c7472696365732073656d206e65632c207363656c650072697371756520656c69742e20536564207363656c65726973717565206573007420766f6c75747061742c20636f6e64696d656e74756d20616e746520612c002076656e656e61746973206d617373612e204d6f726269206e65632061756300746f72206c65637475732c206163207072657469756d206e6962682e20467500736365207363656c65726973717565206d61737361206e6f6e206375727375007320706f7274612e20566573746962756c756d206d65747573207075727573002c20636f6e736571756174206964206672696e67696c6c6120612c2074656d00707573207068617265747261206c65637475732e20566573746962756c756d0020736f64616c6573206c6f626f7274697320756c7472696365732e0a0a4e61006d2073697420616d657420626c616e646974206573742e204675736365207300697420616d65742074696e636964756e7420646f6c6f722e20446f6e6563200076656c206e697369206c616375732e204d617572697320706f7375657265200075726e6120616320656c656966656e6420616c69717565742e205375737065006e6469737365206661756369627573206665726d656e74756d206c69626572006f2c20616320617563746f72206d617373612068656e647265726974207465006d706f722e20467573636520706f72747469746f722061726375206163206c00656374757320626962656e64756d20636f6d6d6f646f2e205365642061756300746f72206575206f64696f2076656c20616c69717565742e20436c6173732000617074656e742074616369746920736f63696f737175206164206c69746f72006120746f727175656e742070657220636f6e75626961206e6f737472612c200070657220696e636570746f732068696d656e61656f732e20566976616d757300206574206c756374757320656e696d2e20566573746962756c756d2074656d00706f7220616e746520736564206d61747469732064696374756d2e205175690073717565207068617265747261206172637520656765742075726e6120756c0074726963657320617563746f722e204d6f72626920656c656966656e642063006f6e736571756174206d692069642068656e6472657269742e20467573636500206d617474697320616e746520636f6e64696d656e74756d20706f73756572006520736f64616c65732e20437572616269747572206c6f626f72746973207500726e612073697420616d6574206d617474697320656765737461732e204d610075726973206665756769617420656c69742074656c6c75732c20756c747269006369657320696d70657264696574206469616d2074656d7075732076656c2e000a0a566573746962756c756d206672696e67696c6c6120747269737469717500652075726e6120657520706f7274612e2050726f696e206665756769617420006e69736c207475727069732c207574206c6f626f727469732072697375732000696d706572646965742061742e2050686173656c6c75732073697420616d65007420616c69717565742066656c69732c20766974616520706f737565726520006d692e20416c697175616d20736167697474697320766172697573206e69620068206e6563206f726e6172652e2050656c6c656e7465737175652074696e63006964756e742076697461652065737420657520616c697175616d2e20447569007320696163756c697320757420617263752073656420656c656d656e74756d002e20467573636520616363756d73616e2c20646f6c6f72206e6f6e2074656d0070757320616363756d73616e2c20646f6c6f72207175616d20617563746f7200206e657175652c2071756973206f726e61726520616e7465206c656f206964002070757275732e2050686173656c6c75732073656420656c656966656e642000656c69742e204372617320657520706f737565726520616e74652e20496e2000616e7465206c6f72656d2c2070686172657472612073697420616d65742076006573746962756c756d207365642c2072686f6e637573206964206a7573746f002e2055742074656d707573206469676e697373696d207665686963756c612e00204d616563656e6173206d61757269732076656c69742c2065676573746173002073697420616d6574207661726975732076697461652c20666163696c69730069732073697420616d6574206c6967756c612e0a0a4d6175726973206772610076696461206c656f2073697420616d6574206f7263692076656e656e61746900732c207574206d6178696d75732073617069656e20636f6e7365717561742e00204d6f726269206e6563206f7263692065782e20566976616d757320766568006963756c61206469676e697373696d207075727573207365642074696e63690064756e742e20467573636520657569736d6f64206e6f6e20656e696d2065740020636f6d6d6f646f2e205072616573656e7420766f6c7574706174206d6f6c006573746965206f726e6172652e20566976616d757320636f6e64696d656e7400756d2076656c697420656c656d656e74756d2c207072657469756d20747572007069732065752c20626c616e6469742072697375732e204675736365207065006c6c656e746573717565206d6178696d7573206e6973692061632073656d700065722e20416c697175616d20757420657569736d6f642076656c69742c207300656420656c656d656e74756d206c6f72656d2e204d616563656e617320696400207269737573206e6f6e206d61737361206772617669646120636f6d6d6f64006f2e204e756c6c616d20696e20707572757320696420656c69742066616369006c6973697320636f6e6775652e2041656e65616e20636f6e6775652076756c00707574617465206c616f726565742e20416c697175616d206567657420656c0069742074656c6c75732e205175697371756520737573636970697420717561006d206163206d6173736120626962656e64756d20656765737461732e20416c00697175616d2071756973206578206e6f6e2076656c6974207363656c657269007371756520756c6c616d636f727065722069642065676574206d61676e612e002041656e65616e20612073656d206e6f6e2065726174206c6f626f727469730020636f6e6775652e0a0a43726173206e6f6e20647569206f64696f2e20517500697371756520766f6c7574706174207363656c657269737175652069707375006d206174207661726975732e20536564206f726e6172652073656d20736564002076656e656e6174697320636f6e7365717561742e2044756973206f726e610072652076656e656e61746973206d6f6c6c69732e20536564206578206e65710075652c2065666669636974757220626962656e64756d20706c616365726174002065742c20736f6c6c696369747564696e2076656c206f7263692e20496e740065676572206e696268206e657175652c20666163696c69736973206e6f6e20006d61757269732076656c2c20636f6e73656374657475722074726973746971007565206e756c6c612e204e756e632073697420616d657420706861726574720061206c656f2e204e756c6c616d206c656f206f7263692c20696d70657264690065742073697420616d657420696e74657264756d20717569732c2069616375006c6973206575206e69736c2e20416c697175616d2073656420747269737469007175652073656d2c206e6563206c6f626f7274697320746f72746f722e204d00616563656e617320736f64616c6573207075727573206e656320616c69717500616d20706f72747469746f722e20447569732075742066656c69732065726100742e0a0a437261732061206d6173736120696d706572646965742c2061636300756d73616e2072697375732069642c207375736369706974206e756e632e2000446f6e65632073656d70657220656e696d206575206d61676e6120636f6e730065717561742074696e636964756e742e2053757370656e646973736520636f006e736571756174206c6563747573207669746165206d6574757320616c697100756574206c616f726565742e20436c61737320617074656e74207461636974006920736f63696f737175206164206c69746f726120746f727175656e74207000657220636f6e75626961206e6f737472612c2070657220696e636570746f73002068696d656e61656f732e20446f6e656320696e74657264756d206469616d00206174206e69626820616363756d73616e2c20657420617563746f72206d6100737361206c6163696e69612e20467573636520696420657820766974616520007269737573206c616f7265657420706f72746120636f6e64696d656e74756d00206567657420656e696d2e2050686173656c6c7573206c6563747573206f6400696f2c20666163696c6973697320612074656d707573207365642c20736f6400616c6573206575206475692e204e616d20696e206d616c657375616461206f0064696f2e205175697371756520706c61636572617420697073756d2076656e00656e617469732072697375732074656d7075732066617563696275732e205000656c6c656e74657371756520656c656d656e74756d20646f6c6f72207175690073206672696e67696c6c612074656d7075732e20457469616d2074696e63690064756e7420766172697573206c6f72656d20696e206f726e6172652e204e61006d206120656c656d656e74756d206f7263692e2050686173656c6c7573206700726176696461206e69736c20657520656c697420756c747269636965732c2000657420626962656e64756d2074656c6c75732066696e696275732e0a0a437200617320626c616e6469742070756c76696e6172206d657475732c2061632069006e74657264756d2066656c6973206d6178696d757320626962656e64756d2e002041656e65616e20626962656e64756d20696d7065726469657420636f6e6400696d656e74756d2e204e616d206e6f6e206c61637573206c6967756c612e2000517569737175652073656420766573746962756c756d2073617069656e2e2000536564207665686963756c612074696e636964756e74206c656f207175697300206c6163696e69612e20536564206c61637573206c6f72656d2c20756c74720069636573206e6563206c6f72656d207365642c20706c61636572617420766f006c7574706174206d657475732e205365642075742073656d2073697420616d00657420746f72746f7220756c7472696365732073757363697069742076656c00206174207475727069732e0a0a5574207669746165206175677565207369740020616d657420656c69742070756c76696e61722068656e647265726974206e0065632061206c6967756c612e20446f6e656320706f727461206e6973692063006f6d6d6f646f20616e7465207665686963756c612073656d7065722e205574002066696e696275732c207075727573207574206661756369627573206d6f6c006c69732c2066656c6973206e65717565206d616c657375616461206e696268002c2061632076656e656e61746973206e756c6c612076656c69742061206665006c69732e204d617572697320677261766964612c206c6967756c6120696420006c6163696e696120766976657272612c206a7573746f206c696265726f2076006172697573206c6967756c612c2073697420616d657420706f727461206c6f0072656d206c696265726f2061206d657475732e20416c697175616d20756c6c00616d636f72706572206d61757269732073617069656e2c2061206772617669006461207075727573207363656c6572697371756520717569732e204e756c6c00616d2072757472756d20746f72746f722073697420616d6574206f64696f2000656666696369747572207072657469756d2e2044756973206c616f7265657400206566666963697475722076656c69742c20612073656d7065722066656c6900732e2050726f696e206e696268206c616375732c20637572737573207369740020616d6574206c656374757320717569732c2065666669636974757220766500686963756c61206475692e20446f6e65632061726375206c656f2c207275740072756d2075742063757273757320696e2c207363656c6572697371756520650074206c616375732e204d616563656e61732074696e636964756e742061726300752061206e6571756520666575676961742c2076656c2064696374756d206e0069736c2073656d7065722e20446f6e6563206e756e632076656c69742c2063006f6d6d6f646f20696420746f72746f722076697461652c20616c697175657400206661756369627573206c6f72656d2e2041656e65616e2076617269757320006d61747469732073617069656e2065676574206d6f6c6c69732e20446f6e6500632076697461652075726e6120756c6c616d636f727065722c206469676e69007373696d20656e696d2076697461652c20766573746962756c756d206d65740075732e2050686173656c6c757320636f6e73656374657475722065726f732000696d706572646965742c20677261766964612065726f732069642c206d6f6c006c69732076656c69742e0a0a5574206163206c6163757320636f6e76616c6c0069732c207665686963756c61206e6571756520717569732c2065666669636900747572206f7263692e205574206d69206c616375732c206566666963697475007220657420736f6c6c696369747564696e2075742c206661756369627573200073697420616d657420616e74652e2053656420636f6e64696d656e74756d20006567657420656c697420617420677261766964612e20457469616d206e656300206e69736c2073656420656e696d20706f72746120706c6163657261742e20005072616573656e74206672696e67696c6c61207361676974746973206c656f002c2076656c2074656d706f72206f64696f206d6f6c6c69732076697665727200612e20566573746962756c756d2066696e69627573206a7573746f207269730075732c2065752073656d706572206475692066696e696275732061632e204d00617572697320706c616365726174206c6563747573206e6973692c206e6f6e0020766573746962756c756d20746f72746f72206d61747469732061632e204e00756c6c61206e656320626962656e64756d207175616d2e0a0a53656420657400206469616d2065676574206c696265726f2070756c76696e6172206672696e0067696c6c6120756c74726963696573206964207475727069732e20507261650073656e7420657520656e696d206672696e67696c6c612c20706c61636572610074206172637520696e2c20766573746962756c756d206e657175652e2045740069616d207665686963756c6120657261742064696374756d206e6962682065007569736d6f6420736f6c6c696369747564696e2e205072616573656e74206e0065632074757270697320616c69717565742c206c6f626f72746973206c656f0020717569732c207665686963756c61207175616d2e2050686173656c6c7573002073656420626962656e64756d206e6973692e204d616563656e61732069640020646f6c6f72206567657420616e746520626c616e6469742064617069627500732e20446f6e656320656c656d656e74756d20736564206e696268206575200073616769747469732e20467573636520636f6e6775652073656d206c6f7265006d2c206e6f6e206672696e67696c6c61206f64696f20617563746f7220612e0020566573746962756c756d20616e746520697073756d207072696d69732069006e206661756369627573206f726369206c756374757320657420756c7472690063657320706f737565726520637562696c69612063757261653b204d61656300656e61732073656420636f6e7365637465747572206a7573746f2e2053656400206566666963697475722061207175616d2073697420616d6574206d617869006d75732e0a0a416c697175616d20636f6d6d6f646f20616e7465206574206d006f6c657374696520706f72747469746f722e204d616563656e617320766f6c007574706174206e69736c207363656c657269737175652c206c6f626f7274690073206d61757269732061632c2064696374756d206d617373612e205068617300656c6c7573206d616c657375616461206c6163696e6961206f64696f206964002066696e696275732e204d616563656e61732061206d61676e61206f64696f002e20467573636520697073756d2075726e612c2073616769747469732066610075636962757320616e7465207365642c20756c747269636573206461706962007573206d61757269732e2053757370656e6469737365207574206f64696f2000717569732073656d206461706962757320616c697175616d20696e2069642000646f6c6f722e205574206d61747469732071756973206f64696f20766974610065206c6f626f727469732e20416c697175616d20616320746f72746f7220610063206d657475732073656d70657220766976657272612e20416c697175616d00206e65632064696374756d206d617373612c2076656c2073757363697069740020656c69742e2044756973207365642073656d206575206e69626820636f6e00736563746574757220696163756c69732076656c2075742061756775652e200044756973207669746165206c75637475732075726e612e204e616d206e756c006c61206e6962682c20626c616e6469742073697420616d65742073656d706500722076697461652c206d6f6c6c6973206c6f626f72746973206e756e632e200053656420757420666175636962757320746f72746f722c20656765742069610063756c6973206f7263692e20496e206120626c616e646974206475692c20610074207068617265747261206d657475732e20457469616d2068656e64726572006974206c696265726f207669746165206c656374757320737573636970697400206f726e6172652e2051756973717565206d6174746973206c6163757320610074207068617265747261207661726975732e0a0a4d616563656e61732066610063696c6973697320656c697420756c747269636573207072657469756d206c006f626f727469732e2046757363652076656c20766573746962756c756d2065007261742e20457469616d206175677565206d617373612c20666575676961740020766974616520657261742061632c206c6f626f7274697320766f6c757470006174206d61676e612e20446f6e6563206d616c65737561646120736564206c006967756c6120717569732066696e696275732e204e756c6c616d20656666690063697475722076697665727261206475692c206e6f6e20766573746962756c00756d20746f72746f7220696e74657264756d2076656c2e2050726f696e2061006e7465206573742c20626c616e64697420696e207363656c65726973717565002073697420616d65742c20756c74726963696573206e65632065726f732e20005365642065726174206e69736c2c20677261766964612065742074656d706f00722065742c206665726d656e74756d2073697420616d65742065782e205365006420656666696369747572206d6920766974616520657569736d6f6420667200696e67696c6c612e2053757370656e6469737365206567657420617563746f0072206e6962682e20446f6e6563206e6563207068617265747261206f64696f002c2068656e64726572697420636f6e64696d656e74756d20646f6c6f722e0a000a4d6f72626920696d706572646965742c206469616d206e65632076756c700075746174652072757472756d2c20746f72746f72206c6f72656d20696e7465007264756d20616e74652c207669746165206375727375732074757270697320006f64696f206e6f6e206d61676e612e20446f6e6563206c616f7265657420760069746165206d61676e612073697420616d657420617563746f722e20437261007320617563746f72206e69736c20717569732076617269757320636f6d6d6f00646f2e204d6175726973206174206c6163696e6961206e756c6c612e2056650073746962756c756d20666575676961742073656d206174206d61737361206600617563696275732064696374756d2e2046757363652076656c207361706965006e2073697420616d6574206a7573746f20737573636970697420616363756d0073616e2075742076656c206f7263692e204e756c6c6120666163696c697369002e204e756c6c616d20736f6c6c696369747564696e20737573636970697420006e6973692c20657520616363756d73616e206d6574757320636f6e73656374006574757220766573746962756c756d2e20517569737175652074656c6c757300206d657475732c2073656d7065722074656d707573206d657475732071756900732c2064696374756d20656c656d656e74756d2066656c69732e205375737000656e646973736520636f6e76616c6c6973207075727573206163206c6163750073207072657469756d2c20616320616c6971756574206573742066696e69620075732e2050656c6c656e74657371756520626962656e64756d20707572757300206d61676e612c2073697420616d657420637572737573206e65717565206600657567696174206e6f6e2e2043757261626974757220696e206d6178696d750073206a7573746f2e2041656e65616e20696163756c6973206c6163696e6961002072686f6e6375732e0a0a536564206672696e67696c6c612073656d20616300206d61737361206d616c6573756164612c206d617474697320696d7065726400696574207175616d2073757363697069742e2043726173206c6163696e6961002061632065782076697461652072757472756d2e205365642065782066656c0069732c20706f727461206e656320617263752061632c2066696e6962757320006c7563747573207475727069732e204475697320697073756d206c69626572006f2c20696e74657264756d20757420696e74657264756d2075742c20656c65006d656e74756d206163206a7573746f2e204d6f7262692074726973746971750065206c6f626f7274697320706c6163657261742e2050656c6c656e746573710075652074696e636964756e742074656d70757320656e696d20617420636f6e006775652e204e756c6c61206d61747469732074696e636964756e74206e697300692c2061742072686f6e63757320616e746520656c656966656e642068656e006472657269742e204e756c6c616d2064696374756d20706861726574726120006475692e20566573746962756c756d206c75637475732065737420757420610075677565207472697374697175652c2073697420616d657420656c656d656e0074756d2074656c6c757320656c656966656e642e20496e7465676572206e650063206f726e617265206a7573746f2c207175697320706f727461206469616d002e2051756973717565206e6f6e206e697369206e6f6e206c6f72656d207075006c76696e617220706f73756572652061206567657420656c69742e20536564002065676574206c6163696e69612073656d2e2050686173656c6c7573206e6f006e206e756c6c612074656d7075732c207363656c65726973717565206c69620065726f2076656c2c207068617265747261206e6962682e0a0a53757370656e006469737365206469676e697373696d20636f6e67756520657374206964207000686172657472612e20447569732076697461652066656c697320696e206c65006374757320666163696c6973697320706861726574726120736564206163200070757275732e2050656c6c656e7465737175652076656e656e617469732070006c616365726174206d61757269732c206120626962656e64756d206d617572006973206566666963697475722076697461652e204d6f7262692065666669630069747572206d65747573206575207363656c65726973717565206661756369006275732e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b200041656e65616e20696e74657264756d20666163696c69736973207175616d2000717569732066617563696275732e20566573746962756c756d20616e74652000697073756d207072696d697320696e206661756369627573206f726369206c00756374757320657420756c74726963657320706f737565726520637562696c0069612063757261653b205072616573656e74206c6f626f72746973206d6167006e612071756973206e697369206d616c657375616461206d6178696d7573200071756973206e6f6e206c6f72656d2e20437572616269747572206e6f6e206e00756c6c612073697420616d657420657261742074696e636964756e742066610063696c6973697320617420657420746f72746f722e204d6f72626920696420006175677565207669766572726120697073756d2070756c76696e617220736300656c657269737175652071756973206e65632076656c69742e204e616d207600656c206f64696f20636f6d6d6f646f2c20706f727461206172637520696e2c0020666163696c697369732073617069656e2e204e756e632073697420616d6500742076656e656e6174697320657261742c206174206c616f72656574206175006775652e20446f6e656320617563746f722070757275732071756973207465006d706f7220666575676961742e20496e2071756973206c6f72656d206567650074206e756e63206c6163696e696120646170696275732e20446f6e65632069006163756c6973206573742076656c2072686f6e63757320616c697175616d2e000a0a4d6f726269206d61676e61206f64696f2c2076656e656e61746973207600697461652073656d2069642c20646170696275732074656d707573206e756e00632e204d6f7262692066617563696275732074656d706f72206d6178696d7500732e205175697371756520657520696d70657264696574206d61676e612c2000696420616c697175616d2075726e612e20446f6e6563207574206c69626572006f206475692e20457469616d206d6174746973206e756c6c6120717569732000617567756520696e74657264756d2c2061206d6f6c6573746965206f72636900207472697374697175652e20446f6e6563206e656320756c6c616d636f7270006572206e6962682c2061742074696e636964756e742070757275732e20447500697320626c616e646974206e69626820756c74726963696573206f7263692000616363756d73616e20736f6c6c696369747564696e2e20446f6e6563206964002061756775652071756973206e65717565206c616f72656574206f726e617200652e204e756e632072757472756d206a7573746f2075742065676573746173002068656e6472657269742e20437261732074656d70757320696e206d61757200697320612074696e636964756e742e0a0a557420706f72747469746f72207400656d70757320616c697175616d2e204d616563656e617320677261766964610020636f6e736571756174206d692c20657420747269737469717565206c6f7200656d20666575676961742073697420616d65742e205072616573656e742073006564206d6178696d7573206f64696f2c206567657420636f6e736563746574007572206c616375732e20416c697175616d20647569206e657175652c20766900766572726120636f6e73657175617420636f6e6775652076656c2c20636f6e00736571756174206964206f7263692e2041656e65616e2066696e69627573200065782073656d706572206e69736c206d61747469732c2071756973206c75630074757320656e696d206c6163696e69612e2050726f696e206964206d6173730061206d61757269732e20496e74656765722065752061726375206c6163696e006961206c656374757320657569736d6f64206c75637475732e20496e20766f006c7574706174206e6f6e206d657475732073697420616d657420636f6e7661006c6c69732e204e616d206c6967756c61206d657475732c206665726d656e7400756d2065752074656c6c75732069642c20656c656966656e642076617269750073206e657175652e204675736365206175677565206c6f72656d2c2070686100726574726120612073656d2076656c2c20636f6e64696d656e74756d206d61007474697320646f6c6f722e2046757363652073656d706572206e69736c2069006e2075726e612073757363697069742c2065676574207072657469756d206a007573746f20736f6c6c696369747564696e2e0a0a496e7465676572207669740061652072686f6e637573206573742c207175697320626962656e64756d207200697375732e20457469616d206d616c657375616461206175677565206575200074656d70757320636f6e76616c6c69732e205175697371756520717569732000656c697420666575676961742c20756c6c616d636f72706572206e6962682000696e2c206c7563747573206d617373612e2050686173656c6c757320636f6e0076616c6c69732073617069656e2076656c206c616375732074696e63696475006e742c206e656320657569736d6f64206573742070656c6c656e746573717500652e20416c697175616d20706f727461206a7573746f206120756c74726963006965732068656e6472657269742e204d6175726973206c756374757320617500677565206575206c656374757320646170696275732c20757420706f7274610020656c69742070656c6c656e7465737175652e20496e74656765722073656400206d61676e6120757420646f6c6f722074696e636964756e74206672696e6700696c6c61206964206174206475692e204d6f72626920656c656966656e64200072697375732073697420616d6574206d61676e612074656d7075732c20766500686963756c61206c6f626f72746973206f72636920736f6c6c69636974756400696e2e204e616d2065742074656d706f72206d61676e612e204d6f726269200071756973207072657469756d2072697375732c2075742076656e656e61746900732074656c6c75732e204d617572697320706f72746120646f6c6f722065740020636f6e73656374657475722068656e6472657269742e204e616d2070656c006c656e7465737175652065676573746173206f64696f207472697374697175006520677261766964612e2050656c6c656e746573717565206964206665726d00656e74756d206469616d2e20496e20636f6e7365637465747572206d69207600656c206c696265726f20657569736d6f642064696374756d2e20446f6e65630020736167697474697320616e7465206d617373612e205072616573656e7420006163206175677565206e657175652e0a0a536564206d6173736120747572700069732c20636f6e76616c6c69732065676574207665686963756c612065752c0020636f6e64696d656e74756d20736564206d657475732e2053656420636f6e0064696d656e74756d20766f6c7574706174206573742c2076656c2070756c7600696e6172206e69736920736f6c6c696369747564696e206e6f6e2e20496e740065676572207574206d61676e6120657420746f72746f722064696374756d2000636f6e64696d656e74756d20696e20706f727461206573742e20496e207369007420616d65742061756775652065782e204e756e6320766573746962756c75006d206964206c616375732076656c2070756c76696e61722e2050726f696e200070756c76696e6172206d6173736120757420616e7465206d6178696d75732c00207669746165206c7563747573207175616d20656765737461732e204475690073206d6178696d757320616e74652073697420616d6574206d616c65737561006461206469676e697373696d2e204675736365207574206c656f20626c616e006469742c20666163696c69736973206d657475732061742c20636f6e73657100756174206c696265726f2e20437261732076656e656e61746973206e6973690020656765742075726e61206665726d656e74756d2c2061742066696e6962750073207175616d20696163756c69732e20517569737175652076656c206c6f7200656d2065782e2050726f696e206a7573746f2066656c69732c207363656c650072697371756520736564206f64696f2069642c206665756769617420736f6c006c696369747564696e207175616d2e20496e74656765722076617269757320006f7263692073697420616d65742076756c7075746174652068656e647265720069742e204d6f726269206d6178696d75732c2065726f73206e6f6e20636f6e007365717561742066696e696275732c207175616d206e69626820756c6c616d00636f72706572206475692c20616320696e74657264756d2073656d20616e74006520766974616520746f72746f722e204375726162697475722076697461650020706861726574726120656e696d2e20437261732073757363697069742063006f6e677565206c656f2c20696e20736f6c6c696369747564696e206e69736900207472697374697175652061742e20566976616d757320706f72747469746f007220746f72746f7220636f6e64696d656e74756d2c20696163756c6973206c006967756c612075742c207472697374697175652065726f732e0a0a496e20650075206c756374757320616e74652e204d6f726269206d6178696d7573207572006e61206e6f6e206c6967756c6120706f73756572652c206120766f6c757470006174206f7263692073616769747469732e204e616d20617420656c6974206500676574206d692066696e696275732073656d70657220756c747269636573200073656420616e74652e205072616573656e742065752073656d706572206f720063692e204e616d2071756973206469616d206e65632065737420656666696300697475722073656d7065722e204d6f7262692073697420616d6574206f6469006f2070656c6c656e746573717565206e69736c20626c616e64697420736f6400616c65732e20447569732067726176696461206964206c6f72656d2065752000616c69717565742e205365642065726f73207475727069732c207375736369007069742073697420616d657420736f64616c6573207365642c20666163696c0069736973206574206573742e204f72636920766172697573206e61746f717500652070656e617469627573206574206d61676e697320646973207061727475007269656e74206d6f6e7465732c206e61736365747572207269646963756c750073206d75732e20566976616d75732073656d7065722074656d706f7220766100726975732e20416c697175616d20696420616c697175616d206469616d2e0a000a416c697175616d20746f72746f72206573742c206c7563747573206575200075726e6120717569732c2074656d7075732068656e6472657269742061726300752e20566573746962756c756d2073697420616d657420656c656d656e7475006d206c656f2e2053757370656e64697373652071756973206e756e632061200073617069656e2068656e64726572697420696d706572646965742e205365640020696e2065676573746173206c696265726f2e20446f6e656320636f6e677500652073697420616d6574206e65717565206461706962757320657569736d6f00642e204675736365207363656c657269737175652076656c20707572757320006964207363656c657269737175652e2050726f696e2076656c20706f7274740069746f72206e69736c2e0a0a4d6f726269206964206475692065676574207400757270697320696163756c697320636f6e6775652e204e756c6c616d2061750063746f722c206c6967756c61206567657420636f6d6d6f646f20707265746900756d2c206c696265726f206e756c6c6120756c74726963696573206f64696f002c2075742072757472756d2061726375206172637520696e206e6973692e20004d61757269732065676574206c6163757320696e20657820766172697573200073616769747469732073656420696e20656c69742e204d6175726973206d6f006c6573746965206f64696f206574206f72636920706861726574726120706c006163657261742e20496e746567657220696e20747572706973206567657420006c696265726f20636f6e7365637465747572206c6f626f7274697320657520006e6f6e206c616375732e204d616563656e61732064696374756d206c656f200074656d707573206c61637573206d617474697320736f64616c65732e20446f006e6563206a7573746f206f64696f2c2074696e636964756e7420616320617200637520656765742c20666175636962757320706f737565726520646f6c6f72002e205072616573656e742065676574206e756e63206e65632066656c69732000696e74657264756d2072686f6e6375732e20566573746962756c756d20656c00656d656e74756d206461706962757320636f6e73656374657475722e205375007370656e6469737365206964206e756e63206d61747469732c206c756374750073206e6962682073697420616d65742c20636f6e64696d656e74756d206578002e20496e7465676572206f726e6172652075726e61207669746165206e69730069206c7563747573206469676e697373696d2e2041656e65616e2074696e63006964756e742068656e647265726974207269737573206e6f6e20616363756d0073616e2e204e756c6c6120617420736f64616c6573206e69736c2e20496e7400656765722068656e647265726974207669746165206d61676e61207669746100652073757363697069742e20437261732064617069627573206c65637475730020736564206c656f207363656c657269737175652073656d7065722e204d6100757269732061207269737573206e756c6c612e0a0a53656420696163756c6900732c206c656f20757420766573746962756c756d206672696e67696c6c612c002066656c69732073617069656e20636f6e76616c6c6973206c65637475732c002076656c206c616f72656574207175616d206f7263692061206d6175726973002e204e756c6c616d20657520616363756d73616e2073617069656e2e205065006c6c656e746573717565206d617474697320736f64616c6573206d6175726900732c20757420636f6e64696d656e74756d206d61676e6120636f6e677565200076656c2e2041656e65616e20706f72747469746f72206e6973692061632065007261742066617563696275732073757363697069742e2050686173656c6c75007320656c656d656e74756d2074696e636964756e74207175616d206e65632000636f6e64696d656e74756d2e204375726162697475722066696e6962757320006e756c6c612076656c206c6163696e696120696d706572646965742e204d61006563656e61732066657567696174206d617474697320646f6c6f722c206e65006320616363756d73616e20697073756d2074656d706f722075742e205068610073656c6c757320617563746f7220666163696c697369732072757472756d2e0020536564207669746165206d69206e6f6e206f64696f2070656c6c656e7465007371756520626c616e64697420696e2061206d61676e612e0a0a5365642069006e206469616d20636f6e6775652c20636f6d6d6f646f20746f72746f722061002c20657569736d6f64206c6967756c612e20496e2061632065666669636974007572206e756e632c2076656c20756c6c616d636f7270657220697073756d2e0020416c697175616d2076656c206469616d206665726d656e74756d2c20736f006c6c696369747564696e20617263752065742c20656c656d656e74756d207300617069656e2e2043726173206c656f206d657475732c2072686f6e637573200071756973206d617373612065752c206772617669646120696163756c69732000657261742e2043757261626974757220756c7472696365732073697420616d00657420656e696d20757420617563746f722e2041656e65616e20617420617500677565206163206a7573746f2074656d70757320626962656e64756d207365006420696d7065726469657420746f72746f722e204e756c6c616d2073656420006d61757269732073617069656e2e20447569732070656c6c656e746573717500652075726e6120696e2066696e69627573206d6f6c65737469652e20507261006573656e74206e6f6e207072657469756d206d61676e612c206e6563206c610063696e696120746f72746f722e2050726f696e20666175636962757320656c00656d656e74756d206c6f72656d2c2072686f6e6375732076756c7075746174006520657820616c69717565742061632e0a0a416c697175616d2074696e63690064756e7420617263752073617069656e2c20616c697175657420737573636900706974206c656f20656c656d656e74756d2076697461652e2043726173206d00617474697320617263752076656c206f726e617265206665726d656e74756d002e204d6f72626920636f6e76616c6c6973206e697369206d6f6c65737469650020657261742073656d7065722c20736564206c7563747573206e65717565200076756c7075746174652e2053757370656e6469737365206d616c657375616400612c20646f6c6f722076656c20756c74726963657320696d70657264696574002c206d69206e69626820756c74726963696573207475727069732c206e656300207072657469756d206c696265726f20697073756d207669746165207269730075732e20416c697175616d20696e20636f6e677565206c616375732c2066650075676961742076756c7075746174652065726f732e20496e206c616f7265650074206e69626820696e2076756c70757461746520766573746962756c756d2e00205574206661756369627573206f726e617265206e756e632073697420616d00657420656c656966656e642e205072616573656e7420706c616365726174200073617069656e2076656c20656c69742074656d706f7220626962656e64756d002e204e756c6c612071756973207665686963756c6120617263752e205375730070656e646973736520736f64616c6573206c656f2061632075726e6120616c0069717565742076756c7075746174652e20536564206d6f6c6c69732c206c610063757320657520656c656966656e6420736f64616c65732c206d61676e6120006172637520766172697573206c656f2c20657520626c616e6469742066656c006973206572617420657420746f72746f722e205072616573656e742074656d007075732073697420616d6574206d61676e61207669746165206f726e617265002e20416c697175616d20656c656966656e642076656c206f64696f2069642000636f6e7365717561742e204d6175726973206574206e657175652071756973002073617069656e20706f737565726520756c74726963696573206575207369007420616d65742075726e612e20437261732072686f6e6375732065726f73200076656c2073656d2070756c76696e61722066696e696275732061206e6f6e200072697375732e0a0a536564206c6f626f72746973206f64696f207175616d2c00206e6f6e20637572737573206e756c6c6120616c697175616d206e6f6e2e2000446f6e65632061726375206573742c20666163696c6973697320696e2066610075636962757320612c2070686172657472612073697420616d6574206e6973006c2e205175697371756520696163756c6973206c656f206e6f6e20656c656d00656e74756d20706c6163657261742e2053656420766573746962756c756d20006c656f20616e74652c20616320636f6e76616c6c697320647569207361676900747469732069642e20496e206861632068616269746173736520706c61746500612064696374756d73742e20536564206d6f6c657374696520636f6e76616c006c69732066656c69732c20696e2070656c6c656e74657371756520616e74650020696e74657264756d20612e20566976616d757320706c6163657261742065006c656966656e6420616e74652e2050656c6c656e746573717565207369742000616d6574206f64696f207665686963756c612c207361676974746973206573007420656765742c20656c656d656e74756d206c6f72656d2e204d61757269730020656c6974206d61676e612c20636f6e6775652076656c2065726f73206e6500632c20696163756c6973206d616c65737561646120616e74652e2056697661006d757320696e20656666696369747572206f64696f2c207175697320616c69007175616d206e756c6c612e204e756c6c61207574206469676e697373696d20006475692e20496e206567657374617320666163696c69736973206c6f72656d002c206e6f6e20656c656d656e74756d20647569207665686963756c61206e6500632e204e756c6c61206d616c65737561646120706f72747469746f72206578002061206f726e6172652e204e756c6c61206e6f6e20766172697573206f6469006f2e2041656e65616e206e656320696d706572646965742073617069656e2e0020446f6e6563206e69736920617263752c2070756c76696e617220707265740069756d206d616c6573756164612061632c20706f72746120766974616520710075616d2e0a0a437572616269747572206d6f6c65737469652c206d6920696e0074657264756d206c7563747573206375727375732c207269737573207361700069656e206c6f626f72746973206c656f2c206174206566666963697475722000617567756520656c6974207365642074656c6c75732e204e756e6320737573006369706974206c7563747573206e69736c2073697420616d65742062696265006e64756d2e20446f6e6563206e6f6e206375727375732070757275732c20610063206661756369627573206a7573746f2e2050726f696e20617563746f722000766f6c7574706174206e756e632c20696e20747269737469717565206e6973006c20626962656e64756d2061742e2053757370656e64697373652076656e65006e61746973206e756e63206e69736c2c206e65632067726176696461206c69006265726f2074726973746971756520696e2e205175697371756520706c616300657261742061206e69736c20616320706c6163657261742e2041656e65616e0020756c74726963696573206c696265726f20696420697073756d2072686f6e006375732c2073697420616d657420616c697175616d20656e696d206c7563740075732e20447569732076656e656e6174697320646f6c6f722065742074656c006c757320636f6e736571756174206c6f626f727469732e20446f6e65632069006e206469616d20706f73756572652c206665726d656e74756d207269737573002065742c2070756c76696e6172206e657175652e0a0a496e7465676572206e006563206e6962682065752074656c6c7573207072657469756d20696e7465720064756d206174206574206469616d2e204e756c6c612070656c6c656e74657300717565206f64696f20717569732065726f73206567657374617320736f6461006c65732e2043757261626974757220656765742074656d707573206469616d002e2050656c6c656e74657371756520756c747269636965732061726375206500782c206120696d70657264696574206a7573746f20706f7375657265207665006c2e2050726f696e2076756c70757461746520736f64616c6573206d61737300612061742070686172657472612e20496e7465676572206e6f6e206d6173730061207574206c6967756c6120666575676961742074656d7075732e2051756900737175652073616769747469732076656c206e756e6320757420747269737400697175652e2041656e65616e2075742074656d706f72206a7573746f2e2044006f6e656320636f6e677565206e69736c20736564207175616d206d6f6c657300746965206d6f6c6c69732e204e756c6c616d20706c6163657261742c2074750072706973206567657420677261766964612072757472756d2c2066656c6973002076656c697420616c697175616d2065726f732c20696420656c656d656e7400756d206c6967756c612075726e6120696420657261742e204e756c6c61206e0065632072686f6e6375732073656d2e205574206e6563207665686963756c61002065782c2076656c2068656e647265726974206e657175652e20557420706c006163657261742076656c69742076656c2076656c69742068656e647265726900742c207669746165206665726d656e74756d207269737573206d6f6c6573740069652e0a0a4d6175726973206f726369206c65637475732c20696d7065726400696574207365642066696e69627573206e65632c20616c697175616d207665006c206e6962682e20566573746962756c756d206672696e67696c6c612061630063756d73616e206e756e63206574206d6f6c65737469652e205574206574200065726174206a7573746f2e2050656c6c656e74657371756520677261766964006120617263752070757275732e2041656e65616e20696e206e6962682076690074616520617263752064696374756d2074696e636964756e74206964206575002066656c69732e205072616573656e7420657420656c6974206964206d692000636f6e736563746574757220616c697175616d2e20566573746962756c756d0020696e20656e696d2064696374756d2c20626962656e64756d206572617420006e6f6e2c20756c74726963696573206f64696f2e2050656c6c656e7465737100756520636f6e76616c6c6973206f726369206e6973692c206e656320756c7400726963696573206f64696f20706f73756572652073697420616d65742e0a0a004d616563656e61732073697420616d6574206665726d656e74756d206e6973006c2e20566573746962756c756d20616e746520697073756d207072696d69730020696e206661756369627573206f726369206c756374757320657420756c7400726963657320706f737565726520637562696c69612063757261653b20507200616573656e74206174206e756e6320696e206d61676e6120636f6e73657175006174207363656c657269737175652e204d616563656e617320696e20717561006d207574206a7573746f2074696e636964756e7420617563746f722e205068006173656c6c757320757420646f6c6f72206d657475732e20496e2073656d70006572206d6920736564206c6f72656d2070686172657472612072686f6e637500732e204675736365206567657420657374206c616f726565742c20736167690074746973206c696265726f2073697420616d65742c2066657567696174206e006962682e204d6f72626920646170696275732075726e61206163207175616d00206665726d656e74756d2072686f6e6375732e20446f6e656320636f6e7661006c6c697320657569736d6f64206469676e697373696d2e204375726162697400757220757420747269737469717565206c6967756c612e0a0a536564207275007472756d2074696e636964756e74207472697374697175652e204e756e6320006d69207175616d2c20637572737573206574207665686963756c612065676500742c2074696e636964756e74206e6f6e20646f6c6f722e20446f6e65632061007563746f722066696e69627573206f726e6172652e204d6f72626920766568006963756c612c206e69736c2076656c20636f6d6d6f646f20706f7274746974006f722c20646f6c6f72206e756e63207361676974746973206469616d2c2065006765742066617563696275732073617069656e2065782076656c206d61676e00612e204375726162697475722076656c206c6967756c612073697420616d650074206c6967756c6120646170696275732066696e696275732e20457469616d002073697420616d6574206c6f72656d206c65637475732e204e756c6c616d20006665726d656e74756d206e69736c206c696265726f2c207669746165207469006e636964756e74207075727573206c6163696e696120717569732e204d6f72006269207574206d6f6c657374696520697073756d2c206575206d6f6c657374006965206c6967756c612e2050686173656c6c7573206574206c656374757320006a7573746f2e20566976616d7573206578206d61676e612c20636f6e736571007561742076656c206a7573746f2076656c2c2074656d706f7220616c69717500616d20616e74652e205365642066696e6962757320736564206d6173736120007175697320636f6d6d6f646f2e20446f6e656320696e206e696268206e6563002074656c6c757320636f6e677565206469676e697373696d206567657420760069746165206e756c6c612e204475697320656c656966656e6420706c61636500726174207269737573206120706c6163657261742e204d6175726973206e650063206c65637475732068656e6472657269742c207361676974746973207665006c697420636f6e64696d656e74756d2c2065676573746173206475692e0a0a004e616d20696163756c69732076656c697420717569732075726e6120706f720074612073616769747469732e2041656e65616e20636f6d6d6f646f206e6973006c206e656320697073756d206c6f626f727469732c20626962656e64756d200065666669636974757220656e696d20636f6e64696d656e74756d2e2050726f00696e206172637520656c69742c206665726d656e74756d2075742065676573007461732061742c206c616f726565742076656c206e69736c2e20496e74656700657220626962656e64756d20747572706973207574206469616d206665726d00656e74756d2c2065752074656d707573206c656f206672696e67696c6c612e00204d616563656e61732076656c697420617263752c20636f6e64696d656e7400756d20696d7065726469657420657261742065742c206661756369627573200076756c707574617465206c65637475732e20437572616269747572206d657400757320656e696d2c206672696e67696c6c6120757420666163696c69736973002061632c20616363756d73616e20696e20697073756d2e204e756c6c616d20007665686963756c61206c6163696e6961206d617373612c2076656c20666175006369627573206f64696f20636f6e64696d656e74756d2061742e204d61757200697320706f72747469746f722065726f73206d61676e612c207574206d617800696d75732074656c6c7573206665726d656e74756d2069642e20566976616d007573207574206c6563747573206f726e6172652c20706f72747469746f7220006469616d20656765742c20756c6c616d636f72706572206e6962682e2044750069732076656e656e617469732074656d706f7220657261742c207574207661007269757320657374206c6f626f727469732076656c2e2050686173656c6c75007320736564206578206c65637475732e205365642076656c2073617069656e0020616c697175616d2c20696e74657264756d206475692069642c20656c65690066656e64206f7263692e0a0a5072616573656e74206174206c6f626f7274690073206d657475732e204e616d2074656d707573207175616d206475692c206e006563206c7563747573206d617373612074696e636964756e7420612e205065006c6c656e74657371756520616363756d73616e2076656c697420757420617500677565206d617474697320636f6e76616c6c69732e205574206567657374610073206f64696f20656e696d2c206163207669766572726120616e746520636f006e76616c6c69732075742e2041656e65616e20696e2064756920617420717500616d206665726d656e74756d2072757472756d2e20566976616d757320656700657420636f6e76616c6c6973206c65637475732e20457469616d2065756973006d6f64206672696e67696c6c6120746f72746f722c206e656320696e7465720064756d206a7573746f206d61747469732065752e204e756c6c616d206d617800696d7573206e696268206469616d2c206575206c6f626f72746973206a757300746f207072657469756d2076697461652e20517569737175652074696e63690064756e7420646f6c6f722061742075726e6120636f6e64696d656e74756d2c00207669746165206d616c6573756164612065737420706f72747469746f722e002050656c6c656e746573717565207669746165206475692065782e2056697600616d757320766f6c757470617420697073756d207574207475727069732065006c656d656e74756d20706f7274612e20496e74657264756d206574206d616c006573756164612066616d657320616320616e746520697073756d207072696d00697320696e2066617563696275732e204d6175726973207365642066656c690073206e756c6c612e205072616573656e742076656c2072697375732076656c0069742e0a0a446f6e656320706f727461206174206469616d2073656d7065720020616c69717565742e2041656e65616e20637572737573206c6f72656d206e006f6e2076617269757320636f6d6d6f646f2e20536564206e65717565206572006f732c20656666696369747572206e6563206469616d20696e2c20747269730074697175652076697665727261206469616d2e2053757370656e64697373650020746f72746f72206475692c20657569736d6f64206e6563206e756c6c61200061632c20616c697175657420756c74726963696573206c6f72656d2e205068006173656c6c757320636f6e7365637465747572206575206573742061632065006765737461732e204e756e6320757420656c697420696e2070757275732061006363756d73616e20657569736d6f642e2043726173206c656f206f7263692c0020677261766964612076656c20626962656e64756d20656765742c20636f6e0076616c6c697320696e2072697375732e20467573636520656765742073656d007065722073617069656e2e0a0a536564206d6f6c657374696520706c61636500726174206c6967756c61206e656320766976657272612e20496e2061742065006666696369747572206d61676e612e204e616d2066696e69627573206c6f7200656d20657420726973757320756c747269636965732c2076656c2063757273007573206e65717565207363656c657269737175652e20496e74657264756d20006574206d616c6573756164612066616d657320616320616e74652069707375006d207072696d697320696e2066617563696275732e2053656420696e2065670065737461732065726f732e2041656e65616e2074656d706f722c206e6962680020636f6d6d6f646f20626962656e64756d206c75637475732c2076656c697400206e756e6320696e74657264756d206f7263692c2073697420616d6574207400656d707573206c656f2070757275732076697461652072697375732e2045740069616d207669746165207269737573206e6962682e20566573746962756c75006d206d6f6c65737469652063757273757320616e74652c2065676574206c610063696e6961206c656f206d6f6c65737469652076656c2e0a0a53757370656e00646973736520757420677261766964612073617069656e2e2056657374696200756c756d20616363756d73616e206e756e6320696e2064617069627573207300656d7065722e204e756e632076656c2073656d706572207175616d2e205065006c6c656e746573717565206861626974616e74206d6f72626920747269737400697175652073656e6563747573206574206e65747573206574206d616c657300756164612066616d65732061632074757270697320656765737461732e20460075736365206d6f6c6573746965206672696e67696c6c61206c6f72656d2c20007175697320747269737469717565206d61676e6120756c6c616d636f72706500722073697420616d65742e20437572616269747572207669746165206c6f7200656d207574206a7573746f206c616f72656574207665686963756c61206174002061206469616d2e2053757370656e646973736520616c697175657420636f006e73656374657475722065782c20757420636f6e7365637465747572206e650071756520636f6e7365637465747572206e65632e20496e74656765722076690074616520636f6e64696d656e74756d20746f72746f722e204e756e6320736500642073757363697069742073617069656e2e2050686173656c6c757320656c00656d656e74756d20657569736d6f642076656c69742c2065676574206469630074756d20646f6c6f7220756c6c616d636f727065722065752e0a0a5068617300656c6c75732061742064756920697073756d2e204e756e63206c75637475730020617563746f72206e69736c20657520617563746f722e20446f6e65632063006f6e76616c6c69732061726375206c6163696e6961206578207361676974740069732c20736564206f726e61726520616e7465206f726e6172652e204e616d002074696e636964756e74206a7573746f207475727069732c20736564206d61007474697320616e746520736f6c6c696369747564696e207365642e2053656400206f726e61726520697073756d206e6962682c2061632074656d706f72206d0061676e612076617269757320696e2e204e616d206672696e67696c6c61206d0061676e61206d692c2075742065676573746173206c6f72656d207661726975007320696e2e20536564206575206c75637475732073617069656e2e20496e7400656765722076656c206469676e697373696d20656c69742c20617420706c61006365726174207475727069732e20446f6e656320696e206e69626820696420006a7573746f206c6f626f727469732064696374756d2e20446f6e656320706800617265747261206f726369206e656320636f6e76616c6c697320736f6c6c69006369747564696e2e0a0a50656c6c656e7465737175652073697420616d657400206672696e67696c6c612073656d2c20616320737573636970697420656c6900742e20446f6e656320612074726973746971756520697073756d2c206e6f6e0020756c7472696365732065726f732e205072616573656e7420616c69717561006d20697073756d206567657420626962656e64756d20766f6c75747061742e0020447569732073697420616d6574206469616d20626962656e64756d2c2061007563746f72206e69736920656765742c206d6f6c6c697320746f72746f722e00204d61757269732065742076656c69742075726e612e2055742066656c697300206c65637475732c207072657469756d207365642074656d707573207369740020616d65742c206d6f6c6c6973207669746165206c65637475732e204d6175007269732073697420616d6574206f7263692065752074656c6c75732066616300696c697369732074696e636964756e742e20447569732068656e647265726900742066656c69732061206e6571756520617563746f7220636f6e6775652e20004d6f726269206c6967756c61206573742c2070656c6c656e746573717565200076656c2073616769747469732065742c20666175636962757320656765742000656e696d2e0a0a517569737175652064696374756d206e6973692069642073006f6c6c696369747564696e207072657469756d2e20496e74657264756d20650074206d616c6573756164612066616d657320616320616e746520697073756d00207072696d697320696e2066617563696275732e2053757370656e646973730065207665686963756c612076656e656e617469732072697375732c20617420007665686963756c61206c616375732072757472756d206e6f6e2e2050656c6c00656e746573717565206861626974616e74206d6f72626920747269737469710075652073656e6563747573206574206e65747573206574206d616c657375610064612066616d65732061632074757270697320656765737461732e20496e20007075727573206d617373612c206d6f6c657374696520696e206e6962682061002c2076656e656e6174697320626c616e64697420656c69742e205068617365006c6c75732073617069656e206469616d2c2074696e636964756e7420736f6400616c6573206469616d2076697461652c20636f6e67756520736167697474690073206f64696f2e2043757261626974757220657569736d6f64206e65632061006e746520736564207072657469756d2e2050656c6c656e746573717565206d006f6c65737469652076617269757320656e696d2c206e6f6e20666175636962007573206c656f2073616769747469732061632e20437572616269747572207100756973206d61757269732071756973206c6967756c6120756c6c616d636f7200706572206d616c65737561646120736564206575206c65637475732e0a0a5300757370656e64697373652076656c206d61676e61206469676e697373696d2c002064696374756d206e657175652073757363697069742c20626962656e6475006d206c616375732e205175697371756520717569732066656c69732061726300752e2050686173656c6c75732065726174206c656f2c2073656d7065722061007420646f6c6f7220656765742c2076656e656e617469732072686f6e637573002065782e2043726173206d6f6c6c6973206e696268207365642061756775650020736f64616c65732c2073697420616d6574206d6f6c6c6973207075727573002070686172657472612e2043726173206e6563206d692071756973206c656f0020696d7065726469657420616363756d73616e207574206964207175616d2e00204e616d206e69736c20656c69742c206f726e61726520657520756c747269006365732076697461652c20706f72747469746f72206574206c6967756c612e002050656c6c656e746573717565207665686963756c6120656c69742065742000697073756d20636f6e7365717561742c206e6563206d6f6c6c6973206573740020696e74657264756d2e2055742074656d706f7220637572737573206d6f6c0065737469652e204d61757269732074696e636964756e7420616363756d7361006e206e756e6320696420696d706572646965742e20457469616d206d616c650073756164612c206e6973692061632076756c70757461746520696163756c6900732c206e697369206f72636920706c616365726174206e756c6c612c206e6500632074696e636964756e742074656c6c757320656c69742071756973207572006e612e20457469616d206c61637573206d617373612c2068656e6472657269007420757420636f6d6d6f646f20612c20696e74657264756d206964206e6973006c2e20496e746567657220766974616520616e7465206672696e67696c6c6100206d692074696e636964756e7420636f6e73656374657475722e204e756c6c006120636f6e7365637465747572206f726e61726520626962656e64756d2e0a000a55742073697420616d657420657569736d6f642074656c6c75732e205065006c6c656e746573717565207072657469756d2074696e636964756e7420647500692065752073656d7065722e205365642076656c2065726f73206e6f6e2064006f6c6f7220696163756c697320696e74657264756d20736564207175697320006f7263692e20496e2073656d706572206c6f626f72746973206469676e69730073696d2e2053656420666175636962757320666575676961742070656c6c65006e7465737175652e2050656c6c656e74657371756520736f6c6c69636974750064696e206f64696f20736564206c65637475732073616769747469732c206e006f6e20756c7472696369657320697073756d2072757472756d2e205365642000736564206f726e6172652065782e0a0a5072616573656e7420766974616520006d6f6c6573746965207175616d2c20616320626c616e646974206f64696f2e0020457469616d2065676573746173206375727375732075726e612069642065007569736d6f642e204e616d20616c69717565742061726375206575206c756300747573206c616f726565742e20457469616d20696d7065726469657420717500616d2076656c20636f6e73657175617420626c616e6469742e204d61757269007320696e74657264756d2c206469616d20766172697573206c6163696e69610020616c69717565742c2076656c69742074656c6c757320706861726574726100206a7573746f2c20656765742073757363697069742075726e61206e756c6c00612071756973206c656f2e204e756c6c61206578206e69736c2c2066617563006962757320617420626c616e6469742061632c2063757273757320612069700073756d2e20566976616d75732071756973206469616d20636f6e6775652c2000657569736d6f642075726e612073697420616d65742c206672696e67696c6c006120646f6c6f722e204e616d206e6f6e206e756c6c6120636f6e677565206c00696265726f2074656d706f7220756c747269636965732e2050656c6c656e740065737175652070756c76696e61722073617069656e207669746165206e756e0063207363656c65726973717565206672696e67696c6c612e204675736365200068656e647265726974206566666963697475722066617563696275732e2041006c697175616d2070757275732061756775652c206c7563747573206e6f6e2000636f6e76616c6c697320717569732c206d6178696d7573206e6f6e20647569002e0a0a446f6e65632070656c6c656e74657371756520657261742065752065007374206c6163696e696120616363756d73616e2e2050726f696e206d6f6c6c0069732073656d20646f6c6f722c206964206d6f6c6c6973206c656374757320007669766572726120696e2e204e756e632071756973206d6173736120766172006975732c206665726d656e74756d206c656f2076697461652c206c6f626f7200746973206e657175652e205175697371756520756c6c616d636f7270657220006a7573746f20766974616520636f6e67756520656c656966656e642e2045740069616d206574206c61637573206573742e20496e7465676572207475727069007320617263752c20616363756d73616e2076656c20697073756d2065676574002c206d616c65737561646120756c6c616d636f72706572206a7573746f2e20004d6175726973206e6f6e2065782074696e636964756e742c20756c74726963006573206c616375732061742c20626c616e646974206f64696f2e2056657374006962756c756d2067726176696461206e65632073617069656e206e656320640069676e697373696d2e2053757370656e64697373652074656d706f7220696e00206e69736c2076656c206d6f6c6c69732e204d616563656e6173206772617600696461206c616375732074656c6c75732c20657420756c7472696369657320006e756c6c612074696e636964756e7420612e20416c697175616d20657261740020766f6c75747061742e20446f6e65632065726f73206c65637475732c20640069676e697373696d2069642073617069656e2061742c20706c6163657261740020666163696c697369732070757275732e20566976616d757320707265746900756d2c206d69206120756c6c616d636f727065722074696e636964756e742c00206475692074656c6c757320626c616e646974206d617373612c206e6563200066696e6962757320657374206e69736c2071756973206e6962682e2046757300636520646170696275732064756920696e20636f6e73656374657475722070006c6163657261742e20467573636520736f6c6c696369747564696e20656765007374617320657261742c2073697420616d657420616363756d73616e206c65006f2074696e636964756e7420696e2e204d6f7262692065666669636974757200206d61757269732069642064696374756d20666163696c697369732e0a0a5500742075726e61206d61676e612c20706f72747469746f722061632065666669006369747572206e6f6e2c20656666696369747572206174206d617373612e200041656e65616e2073656420656c6974206e6f6e2065782073757363697069740020616363756d73616e2e20416c697175616d207669746165206c656f207361006769747469732c2067726176696461206c6967756c612065742c2070756c7600696e617220646f6c6f722e20457469616d20616320746f72746f72206c6f7200656d2e2050686173656c6c7573206567657374617320696163756c69732067007261766964612e204e756e63206e6f6e206e756e63206e6962682e2056697600616d757320766974616520617563746f722073617069656e2e20437261732000706f7375657265206e756c6c61206f64696f2c20657520706f727461206578002076656e656e6174697320612e204e616d207269737573206e657175652c2000657569736d6f642075742063757273757320656765742c2066617563696275007320736f6c6c696369747564696e20746f72746f722e2043757261626974750072207574206d65747573206e6f6e206469616d20617563746f722074696e63006964756e742e20496e7465676572206d616c65737561646120707265746975006d2076656e656e617469732e20566976616d75732072686f6e637573207469006e636964756e74206c6f72656d207175697320756c747269636965732e205000686173656c6c7573206f726e6172652065726f732065742068656e6472657200697420636f6d6d6f646f2e0a0a43757261626974757220696163756c69732000636f6e7365717561742073656d20717569732070656c6c656e746573717565002e2050726f696e206d617474697320656e696d20696e2065737420736167690074746973207661726975732e204d6f726269206e65632074696e636964756e00742076656c69742c206575206469676e697373696d20657261742e20416c69007175616d206572617420766f6c75747061742e205072616573656e74206669006e696275732074656c6c757320696e2068656e6472657269742076657374690062756c756d2e20437572616269747572206d6f6c6c69732074656c6c757320006d692c206e6563206d616c6573756164612076656c6974207375736369706900742061742e205365642065726174206e657175652c2072757472756d2073650064206665726d656e74756d2076656c2c2070656c6c656e746573717565206e006f6e20616e74652e204e616d20736f64616c65732070756c76696e6172206c006f72656d2c2065742074696e636964756e74206d61737361206469676e69730073696d2061632e20457469616d206d61737361207175616d2c20766f6c757400706174206574206c6f626f727469732073697420616d65742c2076656e656e006174697320696420656e696d2e0a0a446f6e656320706f727461206e69736c0020657520697073756d20706f72747469746f722c20656765742070756c7669006e6172206c6f72656d206d6178696d75732e205574206163206e6571756520006c6f72656d2e204e756c6c612061206c6f72656d2065676574206c656f206d006f6c6c6973206469676e697373696d2e20566573746962756c756d20696d70006572646965742073656d706572206c65637475732e204e756c6c6120657420006469616d206574206e756c6c61206f726e61726520736f6c6c69636974756400696e2e2050726f696e206120746f72746f7220636f6d6d6f646f2c20766568006963756c61206a7573746f2061742c2074696e636964756e74207361706965006e2e2043757261626974757220657569736d6f642076697665727261207268006f6e6375732e204e756e6320766172697573206f726369206e6563206d617300736120766976657272612c2065676574206c7563747573206c616375732075006c7472696365732e204375726162697475722063757273757320656c69742000646f6c6f722e20467573636520616c6971756574206f726e6172652065726f00732c20612067726176696461206578206d616c6573756164612076656c2e20004e616d206163206d61676e6120636f6e7365717561742c2076617269757320006d61757269732065752c206665726d656e74756d206c696265726f2e0a0a500072616573656e7420657420646f6c6f722074656d706f72206475692074696e00636964756e742064696374756d2e2050656c6c656e746573717565206d617800696d757320697073756d20657520656765737461732074656d7075732e2046007573636520616c697175616d20696d7065726469657420616e74652065742000626c616e6469742e204d61757269732068656e647265726974206c6f626f7200746973206c616f726565742e2041656e65616e20706f72746120766f6c75740070617420697073756d2c206120736f6c6c696369747564696e20617263752000756c6c616d636f72706572206e6f6e2e205365642076617269757320706c6100636572617420656e696d206575207072657469756d2e20496e206a7573746f0020617263752c20656c656d656e74756d20757420616c69717565742065752c00206c616f72656574206964206c656f2e20496e7465676572207365642061720063752061206469616d206c75637475732072686f6e6375732e20557420656700657420636f6e677565206d657475732c2069642072757472756d206c6563740075732e0a0a4d6f726269207665686963756c6120616363756d73616e206e6900736c2c20617420706f727461206c616375732066617563696275732065676500742e2053757370656e64697373652076756c707574617465206d69206e6f6e0020766f6c757470617420666575676961742e2051756973717565206469637400756d20706f72747469746f72206f64696f2073697420616d657420636f6e670075652e2041656e65616e20657569736d6f64207072657469756d20656c69740020706f72747469746f722066696e696275732e204d616563656e617320736500642076756c7075746174652072697375732e2041656e65616e2065726f732000656e696d2c2076656e656e6174697320696420636f6e73657175617420612c002072686f6e637573206f726e6172652073656d2e20517569737175652062690062656e64756d20766f6c757470617420616e74652c20616320706f7375657200652073617069656e207375736369706974206566666963697475722e204e75006c6c61206f726e617265206e696268206163206d61757269732076756c707500746174652c206e6f6e207068617265747261206469616d2076697665727261002e20436c61737320617074656e742074616369746920736f63696f73717520006164206c69746f726120746f727175656e742070657220636f6e7562696120006e6f737472612c2070657220696e636570746f732068696d656e61656f732e002050726f696e20617420766573746962756c756d2076656c69742e205365640020766976657272612076656e656e61746973206d692c207574206d616c65730075616461206e756c6c612e2044756973207068617265747261206964206e6900626820617420636f6e6775652e20536564206c6163696e69612065726f73200061206572617420766976657272612c20612074696e636964756e742061756700756520616363756d73616e2e2050656c6c656e746573717565206c6f626f720074697320616363756d73616e2073656d2c2065676574206d616c65737561640061206e756c6c61206665726d656e74756d2073697420616d65742e20496e2000616363756d73616e206c616f72656574206e69736c2076697461652066657500676961742e20416c697175616d206572617420766f6c75747061742e0a0a440075697320696420616e7465206c6967756c612e2050686173656c6c75732073006167697474697320706c61636572617420706f73756572652e204d61656365006e61732076697461652076697665727261206c616375732c206d6f6c6c697300206d616c657375616461206c65637475732e2050656c6c656e7465737175650020696e20657374206c6163696e69612c20656c656d656e74756d206e756e630020656765742c2070656c6c656e746573717565206a7573746f2e20517569730071756520636f6e67756520747572706973206e6f6e206f64696f20626c616e00646974207361676974746973206772617669646120657420697073756d2e20004e756c6c616d206c6f626f72746973206e6571756520616320656c69742063006f6e76616c6c697320616363756d73616e2073697420616d65742070756c7600696e6172206d617373612e20446f6e656320657520636f6d6d6f646f20616e0074652c2073697420616d657420756c6c616d636f7270657220646f6c6f722e002044756973206d6175726973206c6967756c612c20656c656d656e74756d200061742066617563696275732061632c20616c697175616d20696e2066656c6900732e205072616573656e74206c6f626f727469732065782073697420616d650074206e69736c20756c74726963696573206c6163696e69612e20566976616d00757320617563746f722c2073656d207175697320766573746962756c756d20007363656c657269737175652c2073617069656e206e69736c2072757472756d00206c696265726f2c2073697420616d657420696e74657264756d206e69736c00206a7573746f207669746165206c65637475732e20566976616d757320696d0070657264696574206e756c6c6120657520657261742076656e656e61746973002c20736564206d6f6c657374696520646f6c6f72207665686963756c612e2000517569737175652076656c2061726375207365642073656d2073656d70657200206375727375732e2050656c6c656e746573717565206d617474697320656c00656966656e64207269737573206574206d6f6c6c69732e205574206c6f626f00727469732c2065737420736564206665726d656e74756d2073656d7065722c002075726e612072697375732064617069627573206475692c20612074656d70007573206d6175726973206e69736c206174206469616d2e20566976616d757300206469676e697373696d20666163696c6973697320636f6e7365637465747500722e20496e20706f737565726520736f6c6c696369747564696e20656c656d00656e74756d2e0a0a457469616d20697073756d206573742c206d616c65737500616461206120666575676961742073697420616d65742c206d6f6c65737469006520656765742066656c69732e2041656e65616e2074656d70757320667269006e67696c6c61206469616d20696e20616c697175616d2e20446f6e6563207300697420616d65742072757472756d206469616d2e2050686173656c6c75732000756c6c616d636f72706572206d617474697320616363756d73616e2e205375007370656e646973736520616c6971756574207669746165206e6973692061630020766f6c75747061742e2050726f696e207075727573206d61757269732c2000696d706572646965742073697420616d657420647569206e6f6e2c20766568006963756c6120637572737573206f7263692e20446f6e65632065742074656c006c7573206574206d6574757320766573746962756c756d20656c656d656e7400756d206163206d6f6c6c6973206a7573746f2e2050656c6c656e74657371750065206c6967756c61206e69736c2c20616c697175616d206163206c6967756c006120706f73756572652c20656c656d656e74756d2068656e64726572697420006d61757269732e204d617572697320666163696c697369732066656c69732000696e2072757472756d20696163756c69732e204e756e632066657567696174002073656d20612068656e6472657269742072757472756d2e20496e746567650072206d6f6c65737469652064696374756d2066696e696275732e2041656e6500616e206e656320766f6c7574706174206c6967756c612e205175697371756500206d617373612070757275732c20706861726574726120757420696163756c006973207365642c20706f72747469746f7220616320616e74652e20416c69710075616d206d6173736120656e696d2c2076756c707574617465206e6563206d00692069642c20756c6c616d636f72706572206665756769617420747572706900732e0a0a4e756e63207669766572726120647569206c6f72656d2c207369740020616d657420656666696369747572206d65747573207375736369706974200076656c2e20566573746962756c756d2073697420616d657420706f7274746900746f722065782e205574206d616c657375616461206c6563747573206e656300206d65747573206672696e67696c6c612c206e65632073656d706572207572006e61206d616c6573756164612e20557420756c6c616d636f72706572206e69007369206174206e69736c20696d706572646965742070756c76696e61722e2000566573746962756c756d2065726f7320646f6c6f722c20766f6c757470617400206964206f64696f2069642c2074656d70757320636f6e76616c6c6973207200697375732e2043726173206575206661756369627573206c696265726f2e200050656c6c656e74657371756520696163756c697320766573746962756c756d0020646f6c6f72206964206566666963697475722e2046757363652061206e75006e6320717569732075726e61206469676e697373696d20646170696275732e002050726f696e2076656c20696163756c69732073656d2c20617420636f6e7600616c6c6973206475692e20496e2069642066656c69732074656c6c75732e2000446f6e6563207068617265747261206d6f6c657374696520617263752c206100206d616c6573756164612065737420677261766964612069642e0a0a517569007371756520616c6971756574206c6967756c61207574206f72636920706f7300756572652c207365642074696e636964756e74206d61676e6120756c74726900636965732e204d616563656e61732073697420616d657420756c6c616d636f0072706572207475727069732e20536564206e6563206d6f6c657374696520710075616d2e20566976616d7573206d617474697320636f6e64696d656e74756d00206f7263692c206e6f6e206375727375732066656c69732074656d707573200065752e2053656420656765742072697375732075726e612e20566976616d750073206f726e61726520756c6c616d636f72706572206172637520616320616c0069717565742e205072616573656e74206d616c6573756164612070756c7669006e6172206c65637475732c2073697420616d65742064696374756d20726973007573206d616c6573756164612061742e204e756c6c612061206d616c65737500616461206c65637475732c2065676573746173206d616c657375616461206600656c69732e20496e20696420696e74657264756d206e756e632e20496e74650067657220666163696c69736973206469676e697373696d20616e74652071750069732070686172657472612e0a0a446f6e65632070656c6c656e7465737175006520656e696d20766974616520616e746520756c7472696365732c2061742000657569736d6f64206d617373612066696e696275732e20517569737175652000636f6e67756520756c7472696369657320706f72747469746f722e204375720061626974757220756c7472696369657320626c616e64697420637572737573002e204675736365206567657420647569206375727375732c2070686172657400726120617263752076656c2c20706c6163657261742070757275732e204372006173206e6563206d6175726973206c656f2e204e616d207072657469756d20007072657469756d20766f6c75747061742e2050686173656c6c7573206e65710075652074656c6c75732c206672696e67696c6c612073697420616d65742066006163696c6973697320717569732c20616363756d73616e207363656c65726900737175652073656d2e204e756e632076697461652066656c69732073656420006d6173736120756c747269636965732064617069627573206e6f6e2065752000656e696d2e20496e20706f72747469746f722074656d706f72206e69736c2c00206567657420666163696c697369732075726e612066696e69627573207669007461652e205365642070656c6c656e746573717565206e656320747572706900732075742073656d7065722e205072616573656e74206566666963697475720020656c656966656e64206f64696f2e0a0a4e756c6c6120617563746f722063006f6e64696d656e74756d206e756c6c612e204d616563656e6173206d616c65007375616461206d61757269732061206c6967756c6120756c7472696365732000636f6d6d6f646f2065742076656c206469616d2e2053757370656e64697373006520696e74657264756d2074696e636964756e74206c6967756c612c20612000626962656e64756d206d6920696163756c697320612e20536564206d616c65007375616461206d657475732076656c206c696265726f206469676e69737369006d2c2073697420616d657420636f6e677565207175616d2074696e63696475006e742e204375726162697475722066696e696275732074696e636964756e74002073616769747469732e20517569737175652073617069656e20656e696d2c0020736f64616c6573206163206469616d20612c206469676e697373696d206c006163696e69612074656c6c75732e20446f6e65632065666669636974757220006c616375732072686f6e637573206672696e67696c6c6120636f6d6d6f646f002e20496e20696420656c69742076656c206c6f72656d20736167697474697300206f726e6172652e204372617320757420646f6c6f72206c6967756c612e200053656420656c656966656e64206c6563747573207661726975732066696e69006275732072757472756d2e204675736365206e65632061756775652061206a007573746f207661726975732074656d706f7220736564207669746165206c6f0072656d2e204d6175726973206174206c696265726f20696e2065737420637500727375732064696374756d2075742076697461652065726f732e205068617300656c6c75732072757472756d2c206c656374757320766974616520696e7465007264756d20626c616e6469742c206c6f72656d2075726e61207669766572720061206d617373612c2071756973207363656c657269737175652066656c697300206c6563747573206574206f64696f2e204d617572697320666163696c6973006973206c656f207475727069732c20696d70657264696574206665756769610074206475692074656d706f722073697420616d65742e0a0a4d616563656e6100732061206c656f2061756775652e20437572616269747572206e6f6e2069700073756d2073697420616d657420656c6974206c616f726565742076656e656e00617469732065676574206e6f6e206d61676e612e204375726162697475722000616c697175616d20696163756c697320706f72747469746f722e2053656420006163206c6f72656d206120646f6c6f7220616c6971756574206c7563747573002e2050726f696e206c6163696e696120697073756d20616e74652c207369740020616d657420696d70657264696574206c6563747573206469676e69737369006d20656765742e20566573746962756c756d20656666696369747572207369007420616d65742073656d207175697320736f64616c65732e20566976616d7500732070756c76696e6172207068617265747261206e69736c2076697461652000616363756d73616e2e204475697320696e74657264756d20636f6e67756520007661726975732e20446f6e65632061207361676974746973206e6973692c20007175697320656c656d656e74756d206475692e20536564206c756374757320006c616f72656574206c656f206567657420756c7472696365732e0a0a446f6e006563206120617567756520656765737461732c2076756c70757461746520650073742076656c2c206c616f72656574206c616375732e20416c697175616d2000646f6c6f7220646f6c6f722c20706c61636572617420696e2065676573746100732073697420616d65742c20616c69717565742061206f7263692e20496e200076756c70757461746520626c616e64697420656c69742c2068656e6472657200697420636f6d6d6f646f2075726e6120626962656e64756d2065752e2045740069616d20617567756520616e74652c206d6f6c65737469652071756973206f0064696f2065752c2074656d70757320636f6d6d6f646f206e6962682e20557400206d6174746973206c6163696e69612073617069656e2075742064617069620075732e20457469616d20636f6e736571756174206e6f6e206f64696f207175006973206375727375732e204e756e6320616c697175657420626962656e6475006d20646f6c6f722065752073656d7065722e20566976616d7573206163206d00692073697420616d65742061726375206c6163696e69612072757472756d200073697420616d65742061206e756c6c612e2050686173656c6c75732065726100742072697375732c206c75637475732065676574206c6f72656d207669746100652c206d616c65737561646120626962656e64756d206d657475732e204e61006d206964206d617474697320656e696d2c206665756769617420736167697400746973206d657475732e2050686173656c6c7573206c7563747573207475720070697320657261742c20657420766172697573206d61676e612072686f6e630075732069642e0a0a4372617320766172697573207361676974746973206f6400696f20757420677261766964612e20536564206f726e61726520706f727461002076756c7075746174652e20496e746567657220706f7375657265206172630075206c6f72656d2c206964207363656c657269737175652073656d206566660069636974757220612e205365642076656c20617563746f7220697073756d2e002050656c6c656e7465737175652069642065726f73206574206c6f72656d2000616363756d73616e20616363756d73616e206567657420717569732065726f00732e204e756e632063757273757320636f6e64696d656e74756d206d692c20006e65632066617563696275732070757275732070756c76696e6172207068610072657472612e205365642073656420736f64616c6573206e756e632e204675007363652070756c76696e617220756c747269636573206d692c206964207275007472756d206d69206672696e67696c6c612061632e2053656420697073756d00207175616d2c20756c74726963696573207669746165206c6163696e6961200076697461652c206665726d656e74756d206e6f6e206d61757269732e20507200616573656e74206461706962757320756c6c616d636f72706572206c696775006c612c206567657420756c6c616d636f727065722073656d2064617069627500732065752e2046757363652073697420616d657420766573746962756c756d00206c616375732e205072616573656e74207365642074726973746971756520006c616375732c2076656c2070756c76696e6172206573742e0a0a467573636500206e6563206e6571756520646f6c6f722e20566573746962756c756d20616c00697175616d206c6967756c612075742064696374756d2073656d7065722e2000457469616d206d616c657375616461206d65747573206567657420656c69740020636f6e64696d656e74756d20636f6e7365717561742e2053757370656e64006973736520736167697474697320656e696d207175616d2c20696e20756c7400726963696573206c656f206461706962757320717569732e2050656c6c656e007465737175652063757273757320766172697573206e6973692c2076656c2000736167697474697320656c6974206d6178696d7573206e6f6e2e205375737000656e646973736520746f72746f72206f64696f2c207068617265747261207600656c206475692061632c20656c656d656e74756d2076756c707574617465200074656c6c75732e20416c697175616d20696420666163696c69736973206578002e2044756973206e6563206672696e67696c6c61206e69736c2e2046757363006520736564206672696e67696c6c612065782e204675736365207574206d610075726973206574207175616d207669766572726120696e74657264756d2061002061742065726f732e20416c697175616d20616363756d73616e2065726174002075742074656c6c7573206469676e697373696d20696163756c6973207365006420657420746f72746f722e2050726f696e20736564206175677565207369007420616d6574206d657475732072757472756d206772617669646120696e200076656c206e69736c2e20496e746567657220706f73756572652061726375200069642065726f73206665726d656e74756d2074656d706f722e0a0a55742075006c74726963657320697073756d206f7263692e204d61757269732061756374006f72206d6178696d75732072697375732c20717569732066696e6962757320006e756c6c612065666669636974757220696e2e204e616d20756c74726963650073206e6571756520616320657820666163696c697369732c20696e2074656d00707573206c6967756c61206c6f626f727469732e204372617320706861726500747261206c6f72656d20696e74657264756d206e657175652068656e6472650072697420617563746f722e2050686173656c6c7573206e6f6e207275747275006d206c696265726f2c20617420736f64616c657320697073756d2e20496e2000756c6c616d636f72706572206578206c65637475732c2073697420616d657400207068617265747261206e756c6c6120636f6e76616c6c69732072686f6e630075732e2053757370656e6469737365206e6f6e20656c6974206c6f72656d2e00205072616573656e7420756c6c616d636f72706572206e756c6c612076656c0020637572737573206469676e697373696d2e2041656e65616e20736f64616c00657320746f72746f72206f64696f2c20617420656c656966656e64206c696700756c61206469676e697373696d2073697420616d65742e2044756973207665006c20736f6c6c696369747564696e2074656c6c75732e204d616563656e61730020717569732070656c6c656e746573717565206475692e204d6175726973200071756973207361676974746973206e756e632e20447569732072757472756d00206d616c657375616461206c6967756c612065752070756c76696e61722e0a000a41656e65616e206772617669646120706f727461207175616d20736564200070656c6c656e7465737175652e2050656c6c656e7465737175652076657374006962756c756d20626962656e64756d207472697374697175652e2056657374006962756c756d20696e206572617420656e696d2e2050726f696e2065726f7300206f7263692c2072686f6e63757320616320616c697175616d206e6f6e2c20007072657469756d2061206f7263692e20566573746962756c756d2074656d700075732c2076656c6974206d616c657375616461206c6163696e69612064617000696275732c2075726e61206c6f72656d206672696e67696c6c61206d61737300612c20696e206d6178696d757320656e696d20656e696d206574206e69736c002e204e616d207669766572726120636f6e64696d656e74756d206c6967756c006120696e20696d706572646965742e20536564207175697320656c656d656e0074756d206a7573746f2e204e756c6c61206f726e61726520636f6e73656374006574757220656e696d2061742074696e636964756e742e20457469616d207300697420616d6574206c616f7265657420697073756d2e0a0a457469616d2066006163696c697369732065737420706f72747469746f722c2066696e69627573002066656c69732065742c207375736369706974206c65637475732e2041656e0065616e20706c616365726174206567657374617320616c69717565742e204d00617572697320657420656e696d206c65637475732e204d616563656e6173200070656c6c656e746573717565206d6f6c6c6973206d692064696374756d2063006f6e6775652e205072616573656e742076656c2066656c6973206c616f72650065742c20636f6e7365637465747572206e756c6c61206e6f6e2c2066657567006961742074656c6c75732e2053656420616c697175616d2076656c697420730065642073656d20706c616365726174207361676974746973206174207369740020616d6574206c696265726f2e2051756973717565206d6174746973207275007472756d20656e696d2c2073656420656c656d656e74756d2076656c69742e002050686173656c6c7573206e6f6e206c616f72656574206f64696f2e204375007261626974757220656c656966656e64206f64696f2073697420616d65742000756c7472696369657320756c6c616d636f727065722e20496e20656765742000726973757320756c7472696365732c207665686963756c61206c65637475730020696e2c20616c6971756574207475727069732e0a0a50686173656c6c757300206e6f6e206d6574757320617563746f722c20636f6e736563746574757220006e69736c2061742c207361676974746973207175616d2e205072616573656e007420746f72746f722074656c6c75732c2074656d706f72206e6f6e207068610072657472612069642c207661726975732061742070757275732e2053656420006120636f6e64696d656e74756d206e6962682e205072616573656e74206c65006f206e756e632c20756c6c616d636f72706572207665686963756c612076650073746962756c756d2074696e636964756e742c206665726d656e74756d2075007420616e74652e20496e206f726e617265206c61637573206e6f6e206c69620065726f20736f6c6c696369747564696e2c2065752066657567696174206e75006c6c6120626c616e6469742e2050656c6c656e74657371756520686162697400616e74206d6f726269207472697374697175652073656e656374757320657400206e65747573206574206d616c6573756164612066616d6573206163207475007270697320656765737461732e204e756e632065676574206e756e63207369007420616d6574206d617572697320706861726574726120766573746962756c00756d20657520766974616520656e696d2e20496e20766f6c7574706174207300617069656e2065676574206c65637475732074696e636964756e7420766f6c0075747061742e20416c697175616d2073656420766976657272612075726e61002e204675736365206c6563747573206d657475732c20756c747269636573200076656c20657569736d6f642065742c20616c69717565742073656420746f7200746f722e2050686173656c6c757320626c616e6469742070656c6c656e7465007371756520756c747269636965732e204f72636920766172697573206e6174006f7175652070656e617469627573206574206d61676e697320646973207061007274757269656e74206d6f6e7465732c206e6173636574757220726964696300756c7573206d75732e204e756c6c61206469676e697373696d2c2076656c690074207175697320666163696c697369732072686f6e6375732c206e756c6c61002066656c697320747269737469717565206d61757269732c20657520636f6d006d6f646f206c656f206f726369206174206e6973692e20467573636520636f006e736563746574757220746f72746f7220657420706861726574726120766500686963756c612e204e756e63207665686963756c612c206d65747573207369007420616d657420657569736d6f642064696374756d2c20646f6c6f72206d650074757320616363756d73616e206573742c20696e20696163756c6973206d6100737361206c696265726f206e6f6e206c65637475732e0a0a496e2061742063006f6e736571756174207475727069732e204675736365206d69206e756c6c61002c206672696e67696c6c61207574207661726975732076697461652c2074720069737469717565206174206e6973692e204e756c6c61206964206d69206572006f732e204d6f726269206469616d20616e74652c2076656e656e617469732000696e2073757363697069742076656c2c2074696e636964756e7420766974610065206f64696f2e204d61757269732068656e647265726974206e6f6e20617200637520696420636f6e73656374657475722e205072616573656e7420616c69007175616d206e756e632076656c206d61676e61207665686963756c6120616c0069717565742e204e616d20636f6e7365637465747572206e756c6c612071750069732075726e6120696163756c697320756c6c616d636f727065722070656c006c656e74657371756520657420617263752e20496e7465676572206163206c00616f726565742076656c69742e2050656c6c656e7465737175652075742061006e7465207175616d2e20566976616d75732061206d6174746973206c656f2c002069642074656d707573206d692e204675736365207363656c657269737175006520646170696275732070757275732073656420616c697175616d2e0a0a4600757363652076656c20656e696d2070656c6c656e7465737175652c20656c65006d656e74756d206469616d2065752c2076756c7075746174652076656c6974002e204e756e63206c696265726f2074656c6c75732c20656c656d656e74756d00206964207175616d2073697420616d65742c20617563746f7220706f7274740069746f722070757275732e204c6f72656d20697073756d20646f6c6f72207300697420616d65742c20636f6e73656374657475722061646970697363696e670020656c69742e20457469616d206d6f6c6573746965206e756e6320736f6461006c657320636f6d6d6f646f20696163756c69732e204e616d20717569732065006c69742061206c696265726f20616c697175657420636f6e64696d656e7475006d207669746165206163206d692e20457469616d20756c7472696365732075006c74726963696573206d61676e6120766974616520706f73756572652e2056006976616d757320757420657569736d6f642076656c69742e20437261732073006f64616c6573206c6163696e6961206d61676e612c2071756973206665726d00656e74756d20657261742064696374756d2073697420616d65742e204675730063652074696e636964756e74206c696265726f206574206e657175652074720069737469717565206375727375732e204372617320616320646f6c6f72206c006967756c612e2050726f696e206567657420696d70657264696574206d6175007269732e20416c697175616d206469616d20646f6c6f722c20666163696c69007369732076656c206e69626820656765742c20636f6e7365717561742076650073746962756c756d206c696265726f2e204375726162697475722076756c700075746174652066617563696275732061756775652065676574207375736369007069742e204e756e632074696e636964756e742074656c6c7573207574206d006f6c6c6973206d6178696d75732e2050726f696e20766573746962756c756d00206c616f726565742073617069656e2c206e6563206672696e67696c6c6120006e6973692074656d70757320696e2e0a0a566573746962756c756d20616e74006520697073756d207072696d697320696e206661756369627573206f72636900206c756374757320657420756c74726963657320706f73756572652063756200696c69612063757261653b20566573746962756c756d20666163696c69736900732c20707572757320657520706f7375657265206c6163696e69612c2070750072757320657374206c616f72656574206e69736c2c206e656320766f6c75740070617420616e746520657261742076697665727261206e756c6c612e204e75006c6c6120666163696c6973692e20496e206e656320706f727461206d65747500732e20446f6e656320666163696c6973697320646f6c6f722073697420616d006574206f64696f20616c697175616d2c206567657420706f72747469746f720020697073756d2076756c7075746174652e204d61757269732076656e656e6100746973206d61676e61206575206578206f726e6172652c20696420736f6c6c00696369747564696e20616e746520636f6e6775652e2050656c6c656e746573007175652075726e61206f7263692c20756c747269636965732076697461652000706f73756572652075742c20756c74726963657320717569732074656c6c7500732e20536564206e6f6e20656c656966656e64206d692c20657520747269730074697175652073656d2e2041656e65616e2074656d707573206d61737361200065752067726176696461206d616c6573756164612e2050726f696e206e6563002076756c707574617465206e756e632e204e756e63206d616c657375616461002c206469616d206e6f6e20636f6d6d6f646f2064696374756d2c207175616d00206e69736c2074696e636964756e74206c616375732c2073697420616d6574002066657567696174206c6f72656d206e756c6c61206e656320697073756d2e000a0a4d617572697320736564206d6574757320617420646f6c6f7220636f6e0064696d656e74756d20636f6e73657175617420616363756d73616e2061632000646f6c6f722e2053757370656e6469737365206c756374757320626c616e640069742065782c20617420656c656d656e74756d206d692064696374756d206500752e20416c697175616d2074696e636964756e7420656c656d656e74756d20006d61676e6120766974616520616c69717565742e20446f6e656320696e206f00726e617265206d61757269732e20496e206c6163696e69612073697420616d006574206e756c6c61207669746165206665726d656e74756d2e20446f6e656300206e6563206665726d656e74756d2075726e612c206174206672696e67696c006c612076656c69742e20416c697175616d206572617420766f6c7574706174002e20566573746962756c756d2073656420747572706973206e657175652e2000496e74656765722076656c207375736369706974207475727069732e2053650064206e656320636f6e64696d656e74756d206e657175652e2041656e65616e0020636f6e76616c6c697320766f6c757470617420706f73756572652e205068006173656c6c7573206c6f626f72746973206c6967756c612076656c2072686f006e637573206c616f726565742e2041656e65616e2065676574206573742069006163756c69732c2076656e656e61746973206f64696f2075742c206469637400756d2074656c6c75732e2044756973207669746165206572617420766974610065206e69736920637572737573206d61747469732e204e756e6320626c616e006469742070656c6c656e7465737175652072697375732c206c7563747573200074696e636964756e74206d61676e6120706f7274612061632e204372617320007669766572726120616c697175657420706f73756572652e0a0a4c6f72656d0020697073756d20646f6c6f722073697420616d65742c20636f6e7365637465007475722061646970697363696e6720656c69742e204e756c6c616d20657520006c61637573206c65637475732e20467573636520612074656c6c7573206c61006375732e20496e74657264756d206574206d616c6573756164612066616d65007320616320616e746520697073756d207072696d697320696e206661756369006275732e204e756c6c616d2070656c6c656e746573717565206c6f72656d20007175616d2c2076656c2074656d706f7220746f72746f72207072657469756d002076697461652e20566573746962756c756d20736f6c6c696369747564696e002071756973206d692061632072757472756d2e20496e746567657220646967006e697373696d206c696265726f20616c697175616d206672696e67696c6c610020616363756d73616e2e20446f6e656320666163696c697369732064756920006e6f6e206c656f2074656d707573206c75637475732e20536564206d616c65007375616461207665686963756c6120756c7472696365732e20557420616e74006520616e74652c20616c69717565742073697420616d657420736f6c6c69630069747564696e2066696e696275732c20626c616e64697420756c747269636500732061756775652e20536564206e6563206e69736920717569732076656c69007420636f6e64696d656e74756d20677261766964612e2041656e65616e2061006c697175657420657569736d6f64206475692c207574207665686963756c610020697073756d2066617563696275732065752e0a0a46757363652076656c6900742073617069656e2c2073656d706572206574206469676e697373696d207600656c2c20696163756c69732069642076656c69742e205072616573656e7420006e6f6e206e69736c206567657420616e746520736f6c6c696369747564696e002072757472756d206e6563206e6563206573742e205365642076697665727200612066656c6973206e69736c2c206e65632065676573746173206573742073006f64616c65732065742e204e616d20636f6e67756520617567756520737573006369706974206578206c616f7265657420706f72747469746f722e2046757300636520626962656e64756d20697073756d206e657175652c206163206d617800696d757320646f6c6f72206672696e67696c6c612075742e2043757261626900747572206120636f6e736571756174206c6967756c612e204e616d20766f6c00757470617420636f6e736571756174206c696265726f20657520626c616e640069742e204e616d20696e74657264756d2074656c6c7573207574206f64696f0020636f6e736571756174206f726e6172652e204e756c6c6120666163696c690073692e204d616563656e6173206c756374757320616e74652065676574206f0064696f20636f6e64696d656e74756d206672696e67696c6c612e20496e7465006765722065676574206d61676e612073697420616d6574206d61676e6120660065726d656e74756d20677261766964612e0a0a4d6f72626920736f64616c6500732076656c6974206e6973692c2061206d6178696d75732064756920656c65006966656e64206e6f6e2e204d61757269732070757275732065726f732c2061007563746f722075742066696e6962757320656765742c20756c7472696369650073207175697320657261742e2041656e65616e207361676974746973207475007270697320696e206f72636920706f7274612c20696420706861726574726100206578206566666963697475722e20467573636520617420636f6e6775652000657261742e20566573746962756c756d206c756374757320656e696d20666500726d656e74756d206c656f2064696374756d207472697374697175652e2044006f6e6563206e65632066656c69732073697420616d65742064756920706f7200747469746f7220656c656d656e74756d2e205072616573656e74206c616f72006565742c2066656c6973207669746165207472697374697175652062696265006e64756d2c206c6f72656d206e6962682070656c6c656e746573717565207300617069656e2c20736564207363656c65726973717565206c6f72656d206e690062682076656c2073656d2e204675736365206e6f6e2076656e656e6174697300206e657175652e20446f6e6563207363656c65726973717565206469676e69007373696d20726973757320696420706f7274612e0a0a53757370656e6469730073652072686f6e637573206c696265726f2076656c2066656c6973206c616300696e69612074656d7075732e2046757363652064696374756d206e657175650020736564206e69626820677261766964612c20626962656e64756d206c6f62006f727469732075726e6120616c69717565742e204375726162697475722065007420657569736d6f6420656e696d2e2050656c6c656e74657371756520696d0070657264696574206175677565206c6f72656d2c2075742068656e64726572006974206e657175652073656d7065722076656c2e2050686173656c6c75732000636f6d6d6f646f20647569206e6f6e206c6f626f727469732076656e656e61007469732e20437261732076697665727261207361676974746973206e69736c002c207669746165206c6f626f72746973206d6574757320756c747269636965007320696e2e20416c697175616d207669746165206469676e697373696d207000757275732c206661756369627573207072657469756d2072697375732e20500072616573656e74206163206d61676e6120617563746f722c206d616c65737500616461206e756c6c61206c6f626f727469732c20636f6d6d6f646f20647569002e205072616573656e7420617420746f72746f7220697073756d2e204675730063652074656d7075732c2066656c697320696e20616363756d73616e206661007563696275732c206c696265726f20656e696d206d6f6c6c697320656e696d002c20696420656c656d656e74756d206d657475732070757275732061206d6100676e612e204375726162697475722073697420616d657420636f6e64696d65006e74756d2075726e612e20496e2075726e612066656c69732c20636f6e6469006d656e74756d207669746165206e756c6c612065752c20706f73756572652000636f6e64696d656e74756d206e6962682e2050656c6c656e746573717565200067726176696461206f64696f20656c69742c2076656c20616c69717565742000726973757320636f6e7365637465747572206e6f6e2e204d616563656e6173002074656d706f722c206d61676e6120616320706861726574726120616c69710075616d2c20616e7465206c6967756c612066657567696174207175616d2c20006575206d6174746973206e756c6c61206e69736c206e6f6e206d617373612e000a0a496e746567657220756c74726963657320736f64616c6573206a757374006f2e20416c697175616d20626962656e64756d207068617265747261207269007375732c2061632076697665727261206e69736920616363756d73616e207500742e20457469616d2067726176696461206665726d656e74756d206d692069006e207363656c657269737175652e20467573636520696e74657264756d2c20006c656f207175697320626962656e64756d206d61747469732c206a7573746f00206d65747573206672696e67696c6c6120656c69742c20616320706c6163650072617420747572706973206469616d206661756369627573206e69736c2e2000457469616d206c616f72656574206c696265726f206c6f72656d2c2076656c002074656d707573206f64696f206469676e697373696d2065742e204e756c6c006120666163696c6973692e20496e74656765722064617069627573206d6f6c00657374696520656e696d2c2061632074696e636964756e742073617069656e0020636f6e76616c6c69732075742e2043726173206d6f6c6c697320636f6e73006563746574757220666163696c697369732e2043757261626974757220747200697374697175652c20726973757320706f72747469746f722076756c7075740061746520756c7472696365732c206c6f72656d2073656d206469676e69737300696d206e657175652c20657520706f72747469746f72206d61676e61206e69007369207669746165207475727069732e20446f6e656320636f6e7365717561007420657374206575206469616d20666575676961742c2076656c2076657374006962756c756d206469616d206c6163696e69612e20457469616d20756c74720069636573206c65637475732073697420616d6574206f726369207361676974007469732c2076656c20616c69717565742065726f73206c6163696e69612e2000496e74656765722070686172657472612c206172637520657520626c616e640069742064696374756d2c2076656c6974206f64696f20636f6d6d6f646f206f0064696f2c20757420636f6e7365717561742074656c6c7573207175616d206e006563206a7573746f2e2053656420656666696369747572207365642066656c0069732061206d6178696d75732e204e756c6c616d20656c656966656e6420730063656c65726973717565206c6f72656d2c20696e206d6f6c65737469652074006f72746f72206d616c6573756164612076697461652e20457469616d20636f006e64696d656e74756d2c20617567756520657420696163756c69732064617000696275732c206469616d206172637520706f72747469746f722075726e612c0020616320636f6e76616c6c6973206d61676e61206175677565207365642064006f6c6f722e2050686173656c6c75732076656c206f64696f2070757275732e000a0a457469616d20656c656966656e64206469676e697373696d206e697369002066657567696174206c6163696e69612e2051756973717565206574206c6100637573207669746165206172637520706f73756572652074656d7075732e20004e616d20636f6e73657175617420657820696e206172637520756c747269630065732c2076656c2076656e656e61746973206e756e63206672696e67696c6c00612e20496e7465676572206575206a7573746f206964206e6962682062696200656e64756d2072757472756d2e20457469616d207363656c657269737175650020747572706973206c656f2c2061632074696e636964756e74207175616d200064696374756d2065752e204475697320636f6e73657175617420636f6e67750065206a7573746f2c206469676e697373696d20626962656e64756d207361700069656e20656c656966656e6420656765742e204d616563656e617320646967006e697373696d206d6173736120757420626c616e646974206c6163696e6961002e2050726f696e2066657567696174206e756e6320736564206c6f72656d2000616c697175616d2070756c76696e61722e20416c697175616d207661726975007320616e7465207365642073617069656e206469676e697373696d2c206574002064696374756d2073617069656e20696e74657264756d2e2041656e65616e00206574206c656f2061756775652e2053656420756c74726963696573207469006e636964756e742065726f732c2073656420706f727461206d6175726973200066696e69627573206e65632e0a0a53757370656e6469737365206e6563206c006f72656d206c696265726f2e204d616563656e6173206e6563206c6967756c0061206e6f6e20657820626c616e6469742073757363697069742e2050656c6c00656e746573717565206c616375732072697375732c206f726e6172652061200063757273757320656765742c2074656d706f72207669746165206e69736c2e00204375726162697475722072757472756d20766f6c757470617420657820610020706c6163657261742e204d6f726269206d616c6573756164612074656c6c0075732065752061726375206d6f6c6573746965206d61747469732e2045746900616d207363656c6572697371756520636f6d6d6f646f2061756775652c20710075697320636f6d6d6f646f2076656c697420656c656966656e642069642e20004d617572697320617563746f72207669746165206d657475732071756973200076656e656e617469732e2050726f696e20626962656e64756d206661756369006275732074656c6c75732c20736f6c6c696369747564696e20696d7065726400696574206e69736920766f6c75747061742076656c2e20446f6e656320666100756369627573206d6f6c6573746965207175616d2c206574206672696e6769006c6c61206469616d2e0a0a446f6e656320696d706572646965742065726174002061206e6973692066696e696275732c207574206469676e697373696d206e0069736920666163696c697369732e204e756c6c6120696163756c697320757400207175616d20616c69717565742068656e6472657269742e2050656c6c656e0074657371756520757420656c656966656e64206e657175652e20446f6e656300206575206c6563747573206574206c656f20696e74657264756d2074696e63006964756e742e204e616d20756c74726963657320656c6974206e6973692c200065676574206d6178696d7573207269737573206672696e67696c6c612071750069732e205365642076656c206e69736920617420747572706973207275747200756d2074696e636964756e742e204e756c6c6120636f6e677565206572617400206c6f72656d2c207365642066696e69627573206c6163757320616c6971750065742065742e2050656c6c656e746573717565207574207175616d20696e20006f72636920736f64616c65732074656d706f72207574206575206e65717565002e2051756973717565206d616c65737561646120736167697474697320726900737573206e6f6e2076656e656e617469732e204e756e632066696e696275730020756c74726963696573206e69626820706f737565726520636f6e7365637400657475722e20496e7465676572206e6563206c6967756c61206e756e632e20005574206e6563206d617373612076656c206c6967756c612074726973746971007565206665726d656e74756d20696e2065752074656c6c75732e0a0a4d61750072697320736f64616c6573206469616d2069642066656c6973206c616f72650065742c207175697320736f6c6c696369747564696e2074757270697320756c006c616d636f727065722e204e756c6c6120636f6d6d6f646f2c207361706965006e20657420756c6c616d636f7270657220736f6c6c696369747564696e2c200073656d206c6563747573206672696e67696c6c61207175616d2c2061742070006c6163657261742065782065726f732075742073617069656e2e20496e206f0064696f206e6973692c207661726975732073697420616d657420646f6c6f72002076656c2c20756c74726963657320706c6163657261742074656c6c75732e0020557420646f6c6f72206d692c2073656d706572206e6f6e206d6178696d7500732076656c2c2070756c76696e61722061742066656c69732e20457469616d00207269737573206e756c6c612c20656666696369747572206174206c6f7265006d206c6f626f727469732c20706f72746120656c656966656e64206c6f7265006d2e20566976616d757320617420636f6e64696d656e74756d2065726f732e00204475697320657420696163756c6973206d692c20766974616520636f6e73006563746574757220617263752e20496e2065726f73206d61757269732c207400656d706f7220717569732070656c6c656e74657371756520696e2c207068610072657472612076656c206c65637475732e204d6f72626920706f7274612c20006c696265726f20617420736f64616c657320656c656966656e642c206c6163007573206c6f72656d20626962656e64756d206f64696f2c206e656320706f7200747469746f72206c65637475732074656c6c75732076656c2073656d2e204e00756c6c61207363656c657269737175652065742075726e61206575206469630074756d2e205574206f726e617265206d61747469732074656d7075732e2055007420626c616e646974206f64696f2061206d61737361206d6178696d75732c00206e6563206d616c657375616461206c696265726f2066617563696275732e000a0a5574206d6178696d757320756c7472696369657320747269737469717500652e20457469616d206163206469616d206174206e756c6c61206c75637475007320756c6c616d636f7270657220696e20657520656c69742e2053656420650074206d617373612076656c206e6962682072686f6e6375732074696e63696400756e742e2053656420636f6e677565207363656c657269737175652074656d007075732e205175697371756520766f6c7574706174206d61737361206c6f7200656d2c2076656c2072757472756d20656e696d20636f6e64696d656e74756d00206e65632e20416c697175616d2074757270697320646f6c6f722c2065666600696369747572207365642064696374756d20616c697175616d2c206d617474006973206964206c616375732e204d616563656e61732066657567696174206e006973692071756973206d6178696d757320636f6e76616c6c69732e0a0a536500642074696e636964756e74207574206a7573746f2076697461652066696e69006275732e204d617572697320626c616e6469742065726174206e756e632c2000766974616520616363756d73616e2061726375206672696e67696c6c612071007569732e2053656420756c7472696365732074696e636964756e7420646961006d2073697420616d657420626962656e64756d2e20416c697175616d20666100756369627573206c61637573206567657420766573746962756c756d206865006e6472657269742e204e756c6c616d20766172697573206e6563206e657175006520657420656c656966656e642e2053656420766974616520747572706973002065742074757270697320656c656966656e642074656d706f722e2050656c006c656e74657371756520766573746962756c756d206172637520612065756900736d6f64206d61747469732e205072616573656e74206e6563207269737573002073697420616d6574207475727069732064617069627573207375736369700069742e20446f6e656320626962656e64756d2074656d707573206d6920696e002072757472756d2e20566573746962756c756d206d61737361206d65747573002c20696d7065726469657420657520736f64616c657320717569732c2061630063756d73616e2076656e656e6174697320617263752e20496e206e6f6e2070006f7375657265206c696265726f2c2076656c2073757363697069742075726e00612e0a0a53757370656e64697373652073617069656e206d657475732c207000756c76696e6172206e6563206c61637573206d6f6c65737469652c20656765007374617320766573746962756c756d2065782e20566573746962756c756d200074656d706f7220616e7465206e6563206e756e632074696e636964756e742000666163696c697369732e20457469616d20626962656e64756d2c20616e74650020696e207072657469756d20636f6e6775652c206d61737361206c6f72656d00206c6f626f727469732065782c206e65632072686f6e63757320746f72746f0072206d61757269732061632070757275732e20496e2072686f6e637573207600756c707574617465206d61676e6120617420657569736d6f642e204d61656300656e61732076656c206c616f72656574206a7573746f2c20696e206c616369006e6961206f64696f2e2050656c6c656e74657371756520616c697175657420006c616375732061632076656e656e61746973206c75637475732e20496e7465007264756d206574206d616c6573756164612066616d657320616320616e74650020697073756d207072696d697320696e2066617563696275732e205175697300717565206c6163696e6961207072657469756d2075726e6120736f64616c650073206d6178696d75732e20496e7465676572206469676e697373696d20707200657469756d206d6f6c6c69732e20536564206c656374757320656c69742c2000616c697175616d2061206469616d2069642c20646170696275732076617269007573206c6967756c612e204d6f726269206c6163696e696120736f64616c650073206c6f72656d2c20696420616c697175616d206e69736c20706f73756572006520656765742e0a0a41656e65616e2070686172657472612c2074656c6c750073206163206469676e697373696d20656765737461732c206175677565206500737420656c656d656e74756d2066656c69732c2076656c206c6f626f7274690073206e69736920656e696d20636f6d6d6f646f207475727069732e205375730070656e6469737365206e756e63207475727069732c206c6f626f727469732000736564206d61757269732069642c20706f72746120736f6c6c69636974756400696e206a7573746f2e2050726f696e20656c656d656e74756d206d6175726900732073697420616d6574206f72636920696e74657264756d2074696e63696400756e742e2053656420706f7274612075726e612066656c69732c206964207600656e656e617469732073617069656e207363656c657269737175652065742e0020566976616d7573206461706962757320706f72747469746f72206a757374006f2c206964206d6f6c6573746965206e69736c20696163756c69732074696e00636964756e742e20496e206d6174746973206d61757269732073697420616d00657420636f6e76616c6c697320756c747269636965732e20446f6e65632063006f6d6d6f646f2065676573746173206572617420766974616520617563746f00722e204e756c6c616d2066657567696174206d61676e61206573742c2065740020706f72747469746f72206573742074656d706f722061632e20416c69717500616d20766172697573206d69206575206c61637573206d61747469732c207300697420616d6574207375736369706974206e69736920736f64616c65732e200041656e65616e2065742068656e6472657269742076656c69742c20696e2070006c616365726174206e6973692e20446f6e656320717569732076656c697420006d692e20457469616d20706c61636572617420657261742076656c2065726f0073206672696e67696c6c6120636f6d6d6f646f2e0a0a50686173656c6c757300207669746165206475692066656c69732e205072616573656e7420707265740069756d206d6174746973206e657175652c2065676574206672696e67696c6c00612066656c69732074656d706f722061742e204372617320617563746f7220006e69736c206e65632073656d206c6f626f72746973206d61747469732e205000656c6c656e746573717565206d61747469732074696e636964756e74207465006d7075732e2050726f696e206c616f726565742073656d206120766f6c7574007061742072686f6e6375732e204d6f726269206575206d6175726973207369007420616d65742072697375732074696e636964756e74206f726e6172652e200041656e65616e20756c6c616d636f72706572206c61637573206e6f6e206e75006e6320696d706572646965742c20657420656c656966656e642074656c6c75007320706c6163657261742e2043726173206574206d6920696e206469616d20006567657374617320706c616365726174206e6f6e2073697420616d6574206c0065637475732e20416c697175616d20696163756c6973207075727573206c6f00626f727469732c207363656c657269737175652065726f7320656765742c200076617269757320646f6c6f722e2043757261626974757220737573636970690074206e6571756520736564206567657374617320636f6e7365717561742e2000496e2076656c20616c697175616d206d657475732c206c756374757320636f006d6d6f646f206e6962682e2053656420636f6e7365717561742070756c7669006e6172206d692c20736167697474697320616c69717565742065726f73206d006178696d75732076756c7075746174652e2055742065742074656d70757320006c616375732e0a0a53757370656e646973736520706f74656e74692e2044750069732076656c2076756c707574617465206d61757269732c20757420736f6c006c696369747564696e206d692e20446f6e65632076656c20616c697175616d00206c6967756c612c20656765742072686f6e6375732074656c6c75732e20500072616573656e74206e65632065726f732076697461652065726f732076756c0070757461746520617563746f722e204e756e632073757363697069742c206d00617572697320696420696e74657264756d20756c6c616d636f727065722c2000746f72746f72206a7573746f20646170696275732073617069656e2c20766900746165206c6163696e6961206c656f2075726e612076697665727261206e690062682e205175697371756520626962656e64756d20617563746f722065726f00732c206964206d6174746973206d617373612064696374756d20612e20557400206964206d69206e69736c2e20566573746962756c756d206575206c756374007573206c616375732e20446f6e65632061206d6178696d75732066656c6973002e0a0a446f6e65632073656d206e69736c2c20756c7472696365732061207400656c6c75732075742c2070656c6c656e74657371756520666163696c6973690073206e756c6c612e205365642065742073617069656e2075742065726f732000636f6e64696d656e74756d20706f72747469746f722e204675736365207369007420616d6574206d657475732065782e20496e20612065782073697420616d0065742074656c6c75732070756c76696e617220636f6e73657175617420612000696420656e696d2e204d616563656e617320756c6c616d636f727065722073006f64616c6573207475727069732c207175697320756c6c616d636f72706572002065726f7320636f6e7365717561742065742e20496e746567657220736f6400616c6573206573742073697420616d657420616e74652074656d7075732c2000696420616c69717565742066656c69732072757472756d2e204c6f72656d2000697073756d20646f6c6f722073697420616d65742c20636f6e7365637465740075722061646970697363696e6720656c69742e204d616563656e61732069640020747572706973207669746165206573742076656e656e6174697320656c65006d656e74756d2e0a0a446f6e656320696163756c697320677261766964612000636f6e73656374657475722e20457469616d20657569736d6f642065726f7300206567657420766573746962756c756d206672696e67696c6c612e20496e2000706f7274612c206572617420766974616520656c656d656e74756d2067726100766964612c20747572706973206c6f72656d206d6f6c6573746965206e696200682c20696420706861726574726120746f72746f72206d65747573206c616300696e6961207475727069732e204d6175726973207072657469756d2076617200697573207475727069732c2065742063757273757320657820766976657272006120717569732e20536564206d616c657375616461206c656f206574206d61007373612074656d707573206c6163696e69612e204e756e632073697420616d00657420656e696d2073656d2e20446f6e65632076656c206772617669646120007175616d2c2076656e656e61746973207665686963756c6120657261742e0a000a496e206e6f6e206c61637573206d616c6573756164612c206d6178696d750073206e696268206e65632c20636f6e73656374657475722076656c69742e20004e756c6c61206575206772617669646120746f72746f722e2050686173656c006c757320696e74657264756d206665726d656e74756d207661726975732e20004d6f726269207661726975732076656c697420696e206c6163757320736365006c65726973717565206d616c6573756164612e2050686173656c6c75732073007573636970697420616c697175616d2065726f7320696e20747269737469710075652e20566573746962756c756d2061632075726e61206e756e632e204d610075726973207072657469756d20746f72746f72206469616d2c206120667269006e67696c6c61206c65637475732074656d7075732061632e0a0a4d6f7262690020696d70657264696574206d6f6c6c697320646f6c6f722c206e65632065660066696369747572207175616d20616c697175657420612e20566976616d757300206c75637475732070757275732076656c206e69736c20657569736d6f642000706f72747469746f722061632076697461652074656c6c75732e2043726173002073757363697069742074726973746971756520707572757320757420736300656c657269737175652e2050656c6c656e7465737175652073697420616d65007420656c6974206964206c696265726f206665726d656e74756d20736f6461006c65732e204e756c6c616d20636f6e76616c6c6973206c6967756c6120696e00207175616d207072657469756d2c20696420616c6971756574206e6962682000636f6e7365717561742e204e756c6c6120666163696c6973692e2041656e6500616e206f726369206c696265726f2c2068656e647265726974207574206c6f0072656d2076656c2c20706f72747469746f7220706f72747469746f72206c69006265726f2e20557420696420616363756d73616e206d617373612e20536564002073617069656e206c656f2c2074696e636964756e74207072657469756d200061756775652076697461652c207669766572726120766f6c7574706174207300617069656e2e204d6f726269206d6f6c6c6973206f7263692073656420756c0074726963657320636f6e64696d656e74756d2e204372617320616363756d7300616e20736167697474697320696d706572646965742e204e616d2074656d70006f7220766573746962756c756d207475727069732c20636f6e64696d656e7400756d2074656d706f72206f64696f20656c656d656e74756d2076656c2e2056006573746962756c756d20737573636970697420616e7465206120617263752000616363756d73616e2c2076656c20636f6e677565206d61757269732067726100766964612e0a0a50686173656c6c757320766f6c7574706174206d6175726900732065676574206c696265726f206c616f7265657420616c697175616d2e2000566573746962756c756d207269737573206e69736c2c2074656d7075732061007420766f6c75747061742076697461652c2074696e636964756e74207669740061652065726f732e20416c697175616d2076656e656e6174697320616e74650020626c616e64697420707572757320666575676961742c206120616c69717500616d20616e746520626962656e64756d2e2050726f696e20696e7465726475006d20697073756d206e6962682c2076656c20706f7274612066656c69732065007569736d6f642065742e20457469616d20717569732074656c6c757320646f006c6f722e2044756973206964206c616f72656574206f64696f2c20657420630075727375732072697375732e2053757370656e6469737365206c616f726565007420646f6c6f72206575206e756c6c6120666575676961742c20736564206600657567696174206e756c6c6120626c616e6469742e20416c697175616d2071007569732061726375207175697320617567756520756c7472696365732069610063756c69732e20446f6e65632069642065726f73206e6f6e206e6973692061006363756d73616e206f726e6172652076656c20757420657261742e205365640020636f6d6d6f646f206c756374757320616e746520717569732070756c7669006e61722e205072616573656e7420616c697175616d206d6f6c6c6973207075007275732072686f6e63757320636f6e7365717561742e2055742076697461650020636f6e6775652072697375732e20496e206d6f6c6c6973206120707572750073206964206c6163696e69612e0a0a467573636520616c697175616d206175006775652073697420616d6574206a7573746f2070656c6c656e746573717565002c20756c6c616d636f7270657220706f7274612064756920696163756c6973002e2050726f696e20656765737461732076756c707574617465206e69736c2c002076656c20637572737573206d6173736120706f72747469746f722061742e0020536564206e6f6e2074656c6c75732076656c206e756c6c6120626c616e6400697420666163696c697369732e204d616563656e6173206572617420656e69006d2c20736f64616c65732061206c6163696e69612076656c2c20616c697175006574207574206e756c6c612e20496e74656765722066656c69732061726375002c20736f64616c65732076656c2066617563696275732073697420616d6574002c20766573746962756c756d2065676574206c6f72656d2e204e756c6c61200076697665727261206f64696f206163206e756e63206c75637475732c2065750020706c6163657261742074656c6c757320616c697175616d2e204d6f72626900206e65632073656d20657520616e746520706f737565726520736f6c6c69630069747564696e2e204e756c6c6120616363756d73616e20636f6e7365637465007475722065737420766974616520756c747269636965732e20447569732066006163696c69736973207363656c65726973717565206d61757269732c206e6f006e20636f6e64696d656e74756d2064756920766f6c757470617420696e2e0a000a4d617572697320717569732066696e6962757320656e696d2e204e756e630020656765742065726f7320616c69717565742c206d6178696d7573206c6f7200656d206e6f6e2c2070656c6c656e746573717565206a7573746f2e204d6f720062692065676574206e756e6320696420726973757320657569736d6f642062006c616e6469742076656c20612072697375732e204d6175726973206120736f0064616c65732074656c6c75732e2043757261626974757220626c616e64697400206174206e756e63206174206566666963697475722e204475697320657520006c696265726f206e656320647569206d6174746973206d6178696d75732e200053656420636f6e7365717561742065726174206d61757269732c2075742070006f727461206c6563747573206665756769617420717569732e2056657374690062756c756d2076656c2074656c6c7573206e65632073617069656e20636f6e006775652076656e656e617469732e20446f6e656320706c6163657261742075006c747269636573206d692e204675736365206c7563747573206e6f6e206d610075726973206163206375727375732e204e756c6c612065676574206d61676e006120766974616520747572706973206d616c6573756164612076697665727200612e2050656c6c656e746573717565206174206c6563747573206964206d6100676e612064617069627573206d61747469732076697461652061207175616d002e0a0a496e206572617420657261742c20696d7065726469657420757420710075616d206e65632c20756c6c616d636f727065722072757472756d20747572007069732e204d6f72626920706c61636572617420656c6974206174206e697300692070656c6c656e74657371756520706c6163657261742e2050726f696e20007669766572726120736f6c6c696369747564696e206375727375732e204675007363652076656e656e6174697320626c616e646974206e69736c207365642000636f6e6775652e204675736365206d6f6c65737469652c2075726e61207665006c20636f6e76616c6c69732072686f6e6375732c20656c6974206d657475730020657569736d6f642065782c2071756973207665686963756c61206d6173730061207075727573206163206475692e2041656e65616e206e6f6e206c6163750073207665686963756c612c20656c656966656e6420656c697420736f64616c0065732c207661726975732073617069656e2e20536564206e756c6c61206a750073746f2c206665726d656e74756d20706f72747469746f722076697665727200612075742c20706f727461206567657420656e696d2e2050656c6c656e7465007371756520636f6e736563746574757220736167697474697320747572706900732c206174206375727375732064756920706f737565726520696e2e20517500697371756520612073757363697069742065726f732e20457469616d20616c0069717565742c20646f6c6f722061742064696374756d2072686f6e6375732c00206d692065737420756c6c616d636f727065722072697375732c2061207469006e636964756e742074757270697320746f72746f72206e6f6e206e6962682e002053656420636f6d6d6f646f206469616d206163206f72636920766f6c7574007061742c207669746165206c6f626f72746973206d61676e6120706f7375650072652e204475697320636f6d6d6f646f20656c697420696420657820766172006975732c206567657420706f737565726520697073756d20617563746f722e0020467573636520756c74726963696573206f64696f20657520636f6e6775650020616c69717565742e2055742071756973206573742070756c76696e61722c002076756c707574617465206c65637475732076756c7075746174652c20636f006e7365717561742073617069656e2e0a0a446f6e656320636f6e76616c6c690073206d61757269732074656d7075732076617269757320617563746f722e2000416c697175616d207472697374697175652064696374756d2070757275732c0020696420677261766964612075726e6120616c69717565742075742e2056690076616d75732065752076656e656e6174697320616e74652c206d6178696d7500732074696e636964756e74206f7263692e20557420617420616c697175616d00206c6f72656d2e20416c697175616d206e6f6e206c61637573206e756c6c61002e204d6f72626920766974616520656666696369747572206d617373612c200076697461652072686f6e63757320657261742e2041656e65616e206e6f6e2000657261742071756973206d617572697320657569736d6f6420626c616e646900742e205574207669746165206e756c6c612073697420616d65742074656c6c007573206567657374617320636f6e7365717561742e205574206c696265726f00206c65637475732c20626c616e6469742070756c76696e6172207375736369007069742065752c20636f6e7365637465747572207669746165207361706965006e2e2043757261626974757220706f727461206e756e632066656c69732c2000717569732070656c6c656e746573717565206c656f206469676e697373696d002061742e204d6f7262692076656c20696163756c6973206e6962682e20446f006e65632074696e636964756e742065737420657520696d706572646965742000706f72747469746f722e20566573746962756c756d20696e207475727069730020746f72746f722e0a0a50726f696e2076697461652061726375206e696268002e205072616573656e74206573742073617069656e2c2074696e636964756e007420617420617263752076697461652c2076656e656e6174697320736f6c6c00696369747564696e20746f72746f722e2050656c6c656e7465737175652066006163696c697369732c206f64696f20696e2074726973746971756520736f6400616c65732c20657374206e6571756520657569736d6f6420697073756d2c2000657520656c656d656e74756d206f726369206e65717565207669746165206c00696265726f2e20446f6e65632074656d706f72206c696265726f20696e206c00656f20636f6d6d6f646f2c2075742076756c707574617465206d61676e6120006c616f726565742e204d616563656e61732072757472756d20656c656d656e0074756d20766f6c75747061742e20536564206d6f6c65737469652c206d657400757320657520656c656d656e74756d20616363756d73616e2c2073656d20710075616d20636f6e76616c6c6973206c696265726f2c206e6f6e206d616c6573007561646120616e7465206c61637573206c6f626f7274697320746f72746f72002e205365642076656c697420646f6c6f722c20636f6e73656374657475722000617563746f7220616c697175657420696e2c206f726e617265206575207361007069656e2e204e756c6c61206574206c65637475732061207075727573207300656d706572206d61747469732e204e756c6c616d206d617474697320656c65006966656e64206d6f6c65737469652e0a0a4d6175726973206c6f626f72746900732065726174206c616375732c20757420766573746962756c756d20617567007565207072657469756d2065752e20446f6e65632065742073656d70657220006d61757269732c2073697420616d65742067726176696461206c6563747573002e20447569732076656e656e61746973206d69206f7263692c2061206566660069636974757220646f6c6f7220617563746f722069642e204e756c6c61206e006f6e2075726e612075742065726174207665686963756c612074696e63696400756e74207574206964206a7573746f2e2041656e65616e206c6163696e69610020657374206964206c7563747573206d616c6573756164612e205574206f72006e61726520647569207175697320636f6e736563746574757220707265746900756d2e20496e206163206a7573746f206163206e756c6c61207669766572720061207665686963756c612e2053757370656e646973736520696e2076657374006962756c756d206d657475732c206120736f64616c6573206c6f72656d2e20004d6f726269206e6f6e206c6967756c612076697461652074656c6c7573206600696e69627573207363656c6572697371756520617420696e20616e74652e20005175697371756520696e2073656d70657220646f6c6f722e20457469616d20006d6f6c6c69732c206d6574757320696420766f6c75747061742073656d706500722c206d61737361206e65717565206c6163696e69612073656d2c20696e2000656666696369747572206c656374757320656c6974207574206e756e632e200050726f696e206c6163696e6961206c6f72656d2071756973207475727069730020756c7472696365732c20757420666175636962757320646f6c6f7220656c00656966656e642e20446f6e6563206c6f626f7274697320697073756d20657500206572617420616c69717565742c2065752065676573746173206c6967756c006120656c656d656e74756d2e205072616573656e742069642065726f73206600696e696275732c206d6f6c6c69732074757270697320696e2c206d6f6c6c690073207175616d2e2050686173656c6c757320626c616e64697420636f6d6d6f00646f206e756e6320696e20626c616e6469742e204e616d207175697320726900737573207574206469616d206c6f626f727469732073616769747469732e0a000a50726f696e20766f6c75747061742074656d7075732072757472756d2e200050726f696e20696d7065726469657420626c616e6469742073617069656e20007175697320706c6163657261742e204e756c6c6120706f73756572652064750069206964206f64696f20657569736d6f642c20696420696163756c6973207500726e6120646170696275732e20446f6e65632070656c6c656e74657371756500206d617373612069642076697665727261206c616f726565742e204e756c6c00616d2071756973206c6163757320636f6e76616c6c69732c20626c616e64690074206c656f206e6f6e2c20616c697175616d206c696265726f2e2053656420006461706962757320617567756520696e2075726e612070686172657472612c002061742073656d706572206c656374757320706c6163657261742e205365640020756c74726963657320726973757320696420696163756c69732074656d700075732e20496e7465676572206665726d656e74756d2c2072697375732065740020636f6e736563746574757220636f6e6775652c206e756e63206573742069006163756c69732072697375732c20706f73756572652076656e656e61746973002065726f7320616e74652076656c2070757275732e20496e7465676572206c006163696e69612074656c6c7573207669766572726120726973757320736167006974746973206672696e67696c6c612e2043726173206e6f6e20697073756d002071756973206e65717565207669766572726120666163696c69736973206e006f6e20736564206475692e20467573636520636f6d6d6f646f20656c65696600656e64206a7573746f207175697320636f6e6775652e0a0a566976616d757300207363656c657269737175652074696e636964756e74206e756e6320646967006e697373696d20636f6e64696d656e74756d2e2051756973717565206172630075206e69736c2c20756c6c616d636f72706572206e6563206c65637475732000717569732c20636f6e67756520616363756d73616e20657261742e2043757200616269747572207574206e697369207475727069732e20496e20766974616500206573742071756973206d657475732074656d70757320766573746962756c00756d206575206e656320617263752e2055742073656d206a7573746f2c20660065756769617420657520636f6e73657175617420656765742c20756c6c616d00636f72706572206567657420697073756d2e205072616573656e7420707265007469756d206d6174746973206c656f2c20677261766964612068656e64726500726974206c696265726f2065666669636974757220656765742e204d61656300656e617320626c616e646974206e696268206469616d2c206e6563206c616300696e69612061726375206c6163696e69612065742e0a0a4675736365207469006e636964756e7420746f72746f722066656c69732e20536564206469616d20006e6962682c20637572737573206e6563206461706962757320656765742c20006f726e61726520656666696369747572206d692e20446f6e65632069642074006f72746f72207669746165206d692064696374756d20766573746962756c75006d2e2050726f696e206964206c696265726f20616c697175616d2076656c6900742074656d706f7220696d706572646965742073697420616d657420766974006165206c616375732e20437261732073697420616d65742065782068656e640072657269742c206672696e67696c6c6120617567756520696e2c206c616f7200656574206f7263692e204d616563656e6173206c61637573206d657475732c0020656c656966656e6420736564206d657475732075742c20657569736d6f640020657569736d6f642076656c69742e20496e746567657220696e2061636375006d73616e206d692e0a0a41656e65616e20696163756c69732076656c206a750073746f20756c7472696369657320766f6c75747061742e204372617320636f006e73656374657475722c2065726f73206e6f6e20756c6c616d636f727065720020696163756c69732c2076656c6974206578207665686963756c612076656c0069742c2073697420616d657420696163756c6973206a7573746f206469616d00206567657420657261742e20496e74656765722066696e6962757320736f6400616c6573206d617373612073697420616d6574206d616c6573756164612e2000496e2072686f6e6375732073617069656e206964207175616d207669766572007261207665686963756c612e20496e20686163206861626974617373652070006c617465612064696374756d73742e20446f6e656320616320706f7274746900746f72206e657175652c2073656420656666696369747572206c6967756c61002e20446f6e6563206567657420616c697175616d206c616375732c206e6f6e00207665686963756c61206e69736c2e2053656420706c616365726174206d61007474697320636f6e76616c6c69732e20496e746567657220736f64616c6573002c206e69736c2061207665686963756c61206469676e697373696d2c207665006c69742074656c6c7573206566666963697475722070757275732c20612076006573746962756c756d206f64696f206c61637573206964206469616d2e204e00756c6c616d20766974616520626c616e64697420656c69742e20507261657300656e742074696e636964756e74206c656374757320656c69742c206e6f6e200074656d707573206e69736c20677261766964612076697461652e204e756c6c0061206469616d2070757275732c206c616f7265657420766974616520656765007374617320696e2c20636f6e7365637465747572206574206d61757269732e002053656420766172697573206d6f6c6c697320656c656d656e74756d2e204e00616d2073697420616d6574206d61676e6120677261766964612c2068656e6400726572697420697073756d206e6f6e2c2074656d7075732073656d2e204d61006563656e6173206469676e697373696d206d6f6c6c69732072686f6e637573002e205365642066656c6973206e69736c2c2073656d7065722061742074656c006c75732065742c206d616c65737561646120616c697175616d20697073756d002e0a0a496e74656765722073757363697069742076656c6974206964207365006d206665726d656e74756d2c207175697320756c7472696365732073656d200074696e636964756e742e2041656e65616e2076656c20646f6c6f72206e6563002074757270697320656c656d656e74756d207363656c657269737175652e200050726f696e206f64696f20746f72746f722c20616c697175657420656765740020696d7065726469657420717569732c20736f6c6c696369747564696e20690064206c616375732e2050656c6c656e74657371756520656e696d20656c6974002c207375736369706974206964207175616d206e65632c206375727375732000616c697175616d2065726f732e20446f6e656320626962656e64756d207369007420616d6574206d657475732071756973207363656c657269737175652e20004e756e6320616320747572706973206a7573746f2e2053656420706c6163650072617420746f72746f72206e6563206c6163757320736f6c6c69636974756400696e207363656c657269737175652e2050686173656c6c7573207669746165002063757273757320657261742c20616320756c7472696369657320746f7274006f722e0a0a43726173206d616c6573756164612067726176696461206a757300746f2076656c207661726975732e204e756c6c616d206c616f7265657420690064206d617572697320696e20646170696275732e20437572616269747572200073757363697069742065782065676574207361676974746973206c7563747500732e20447569732071756973207669766572726120656c69742c20717569730020756c6c616d636f72706572206e756e632e204d617572697320656c65696600656e642c206d6173736120696e20626962656e64756d20616363756d73616e002c206578206e69736920766573746962756c756d206469616d2c2075742069006163756c697320647569206f72636920736564207475727069732e204e756c006c6120626962656e64756d2c2076656c697420657520636f6e76616c6c6973002073656d7065722c206d65747573206e69736c20706f7375657265206175670075652c2068656e64726572697420696163756c69732073617069656e20717500616d206574206469616d2e2050726f696e2076656c206e69736c206175677500652e20566976616d75732076656e656e61746973206d657475732073656420006d617572697320706f73756572652c20612068656e64726572697420656e69006d20766976657272612e204475697320636f6d6d6f646f206172637520657400206d61676e6120756c7472696365732070656c6c656e7465737175652e204e00616d20696e206c696265726f2076656e656e617469732c2076657374696275006c756d206175677565206c6163696e69612c20766172697573206c6f72656d002e20457469616d206574206c7563747573206c616375732e205175697371750065206d6f6c65737469652c206e69626820617420756c747269636573206d6100747469732c206c616375732075726e6120636f6e76616c6c6973206e756c6c00612c20696e206d616c657375616461206e756c6c61206c6563747573206e6f006e206469616d2e20457469616d206567657420697073756d206d61676e612e002050686173656c6c75732066656c6973207175616d2c20626962656e64756d002073697420616d657420726973757320717569732c20677261766964612065007569736d6f642066656c69732e0a0a46757363652076656e656e617469732000696e74657264756d20656c69742c20717569732072757472756d206f7263690020706f7375657265206e6f6e2e20496e20656c656966656e6420657374207100756973206469616d20666163696c697369732c206163206d616c65737561640061206d61737361206f726e6172652e204c6f72656d20697073756d20646f6c006f722073697420616d65742c20636f6e7365637465747572206164697069730063696e6720656c69742e205365642063757273757320616c697175616d206f0064696f2076656c2073757363697069742e2050656c6c656e74657371756520006163206c696265726f206163206572617420616c6971756574207361676974007469732e204d616563656e617320616e7465206c616375732c207363656c6500726973717565206574207472697374697175652076697461652c20656666690063697475722065676574207175616d2e2050686173656c6c7573207275747200756d20656c69742061756775652c2071756973206c6163696e6961206f726300692074696e636964756e74206e65632e20496e20636f6e736563746574757200206964206f726369206575207363656c657269737175652e2050656c6c656e0074657371756520616c69717565742074656d707573206f64696f207574207600756c7075746174652e2051756973717565206c696265726f206e69736c2c200072757472756d2061742073617069656e206e65632c206c616f726565742074007269737469717565206a7573746f2e2043726173206c6163696e6961206e690062682069642065726f732072757472756d207363656c657269737175652e20004e756e63206e6f6e206d6175726973206f7263692e204e616d20696d70657200646965742064617069627573206a7573746f2e20496e2076656c206c616375007320706f72747469746f722c207661726975732072697375732075742c2061006c697175616d20746f72746f722e2043757261626974757220696e206d65740075732076656c2065782076656e656e6174697320706f7274612e0a0a5375730070656e6469737365207365642070756c76696e6172206573742e205068617300656c6c7573206e6563206d6920656c656966656e642c20666575676961742000617263752061742c20706f72747469746f72206e6973692e204475697320650067657420626c616e6469742065782e20437261732061206475692065726f73002e20496e74657264756d206574206d616c6573756164612066616d65732061006320616e746520697073756d207072696d697320696e206661756369627573002e20496e2073656d206c696265726f2c20766f6c757470617420656765742000647569207365642c2070656c6c656e746573717565206c7563747573206578002e20536564206574206c656f20656765742065726f7320696e74657264756d00206d6178696d75732e2050686173656c6c7573206e6f6e206d6f6c657374690065206c65637475732c206e6f6e207665686963756c61206c65637475732e2000446f6e656320656666696369747572206d616c657375616461206d6175726900732c2065676574207472697374697175652073656d206c6f626f727469732000612e204e616d2074656c6c75732075726e612c2072686f6e63757320666572006d656e74756d20737573636970697420717569732c20696d70657264696574002071756973206f7263692e20557420637572737573206572617420766974610065206665726d656e74756d20666163696c697369732e204e756e632075742000626c616e646974206c6f72656d2e20566573746962756c756d2074656c6c750073206469616d2c20636f6e67756520657520706f73756572652075742c206c006f626f7274697320612073656d2e204e756c6c616d206163206f726369206e006f6e2075726e6120656c656966656e6420696d706572646965742e0a0a507200616573656e74207669746165206e69736c206672696e67696c6c612c207375007363697069742065726174207365642c20656c656d656e74756d207269737500732e20446f6e656320696420756c74726963696573206f64696f2e2050726f00696e206d6174746973206d61757269732061206d61737361206d6178696d750073207472697374697175652e2050686173656c6c7573206567657420706f730075657265206e6962682e2050686173656c6c757320736564206d657475732000657420657820636f6d6d6f646f20766f6c75747061742e2041656e65616e20006c6163696e69612c206175677565206e6f6e2065666669636974757220636f006e6775652c206d617373612073656d2076697665727261206469616d2c20710075697320706f737565726520647569206c6f72656d2061206c6f72656d2e2000496e2076756c7075746174652064756920657520656c6974207375736369700069742074656d706f722e204372617320696d70657264696574206d6175726900732073656420657820637572737573206c616f726565742e20566976616d750073206e65717565206573742c20666163696c6973697320717569732066656c00697320717569732c20706f72747469746f7220706f72747469746f72206e75006e632e204675736365206e6f6e206c6f626f72746973206c6f72656d2e0a0a004d616563656e617320766f6c75747061742066617563696275732074656c6c00757320756c747269636965732070756c76696e61722e2050686173656c6c750073206120706f72747469746f7220617263752e20446f6e65632076756c7075007461746520656e696d207475727069732c20612074696e636964756e7420640069616d2074656d706f722065752e20446f6e656320736f6c6c69636974756400696e2c206578207669746165206c756374757320766573746962756c756d2c00206e69736c20616e746520756c6c616d636f72706572206d692c2061742075006c7472696369657320656e696d20646f6c6f722073656420656c69742e20500072616573656e74206d6f6c6c697320656666696369747572207269737573200071756973207072657469756d2e20566573746962756c756d2071756973206600696e69627573206475692c2065676574206f726e617265206c65637475732e0020457469616d2065676574206a7573746f20766573746962756c756d2c2062006c616e6469742073656d20696e2c206d6178696d75732065726f732e0a0a5000686173656c6c7573206120697073756d206575206d69206375727375732073006f64616c6573206e656320736564206e6973692e2044756973206672696e6700696c6c6120657374206163206c6967756c612070756c76696e61722067726100766964612e2050726f696e207669766572726120616363756d73616e207365006d2c2076656c2072757472756d206e69736c20636f6e736571756174207665006c2e204e756e63206672696e67696c6c61206d657475732076656c206661750063696275732074656d706f722e205072616573656e7420636f6e73656374650074757220646170696275732061756775652c206574207363656c6572697371007565206c656374757320636f6e64696d656e74756d206e65632e204e756e630020616363756d73616e2c2075726e61206e6f6e20706c61636572617420756c007472696365732c206d617572697320617567756520736f6c6c69636974756400696e20616e74652c2073697420616d657420616c697175616d206c61637573002076656c69742061632074656c6c75732e205365642076656e656e61746973002c2074656c6c7573206e656320617563746f7220646170696275732c206c6f0072656d2073617069656e2073656d70657220657261742c206575207669766500727261207175616d2075726e61207669746165206c6f72656d2e204d61656300656e6173207375736369706974206e756e63207574206d6f6c657374696520006d61747469732e20416c697175616d20766974616520657374206469676e69007373696d2064756920656c656d656e74756d20617563746f722e0a0a4d6f72006269206e756c6c61206c616375732c2073656d7065722073697420616d6574002066656c69732065742c2076756c707574617465206d616c65737561646120006475692e2050726f696e20656765742065726f73206c65637475732e20446f006e65632074696e636964756e7420656c69742076656c20736f6c6c69636974007564696e2073616769747469732e2050726f696e206163206d6f6c6573746900652073656d2e2053757370656e646973736520696163756c69732076657374006962756c756d2073656d206574206d61747469732e2050726f696e206c6f62006f72746973206c616f72656574206469616d2c2073656420706f737565726500206573742074656d706f722065742e2053656420696e20746f72746f7220710075697320657820696d70657264696574206c6163696e69612071756973206e006563206c6f72656d2e204d616563656e617320636f6e76616c6c69732065660066696369747572206f7263692c20657420706f72747469746f72206e69736c0020666163696c69736973206e6f6e2e205365642068656e647265726974207600656e656e617469732066656c697320666175636962757320656c656d656e7400756d2e204d6f7262692061632064756920736f64616c65732c2070656c6c65006e74657371756520697073756d2076656c2c20736f64616c65732076656c6900742e20457469616d20656e696d206c6f72656d2c2076656e656e6174697320006163206c616375732065742c2065676573746173206d616c65737561646120006c65637475732e20416c697175616d20736f64616c6573206e6962682065660066696369747572206c656374757320616c697175616d20766573746962756c00756d206e6f6e2061206f64696f2e204d61757269732069642066617563696200757320656c69742c2073656d70657220706f72747469746f72206e756c6c61002e204675736365206f726e6172652c206a7573746f20696e20766568696375006c6120636f6d6d6f646f2c206c61637573206c6163757320636f6e677565200074656c6c75732c20757420666175636962757320697073756d207269737573002061206e756c6c612e20457469616d207669766572726120707572757320710075616d2c2076656c20706f72747469746f72206d6574757320696d70657264006965742065752e204d6f72626920636f6e76616c6c697320636f6e73657175006174206475692e0a0a4d61757269732074726973746971756520617263752000717569732072686f6e6375732064696374756d2e204e756e6320646f6c6f7200206c696265726f2c206d6178696d757320617420656e696d2075742c2067720061766964612072686f6e637573207175616d2e20566573746962756c756d20006d61747469732074696e636964756e7420666163696c697369732e20467573006365206e756c6c612061756775652c206567657374617320736564206c616300696e69612076697461652c206d616c657375616461206163206e756c6c612e00204d617572697320696163756c6973207072657469756d206c616375732c2000612066696e696275732075726e6120706f73756572652061632e204d6f7262006920696e74657264756d20666175636962757320657261742c2061206c616f0072656574206d61676e6120626c616e64697420612e2043726173206e656320006d61676e612071756973206c61637573206567657374617320696163756c6900732e0a0a4c6f72656d20697073756d20646f6c6f722073697420616d65742c0020636f6e73656374657475722061646970697363696e6720656c69742e2055007420756c74726963696573206f726369207175616d2c2073697420616d65740020656c656966656e6420616e7465206672696e67696c6c61206e65632e205000726f696e20616c697175616d20696e2074656c6c757320677261766964612000636f6e76616c6c69732e2050726f696e2072757472756d20636f6e7365717500617420656e696d20736564206d616c6573756164612e2041656e65616e206500676573746173206d657475732076697461652073656d20636f6e64696d656e0074756d2073757363697069742e2053757370656e6469737365206172637520006475692c206772617669646120696e2065726f732065742c206d61747469730020616c69717565742074656c6c75732e20496e74656765722070656c6c656e0074657371756520616e74652066696e69627573206d692072757472756d2061006c697175616d2e20496e7465676572206d6174746973206469616d2073656400206665756769617420696d706572646965742e2046757363652069642062690062656e64756d206d617373612e20496e74656765722061742074656d7075730020656e696d2e20416c697175616d206574206d6f6c6c6973206d61676e612e000a0a5365642073656d70657220656c656d656e74756d206d61737361206e6f006e20766976657272612e205365642073697420616d6574206d61676e612065007420697073756d207472697374697175652076756c7075746174652e205065006c6c656e74657371756520696e206c696265726f2073656d2e205375737065006e646973736520736f64616c65732074656d706f722061756775652074696e00636964756e7420666163696c697369732e204d616563656e6173207363656c006572697371756520697073756d20617420666575676961742064696374756d002e204d616563656e61732076656c2075726e6120736564206d657475732075006c74726963696573206d6f6c6c69732e204e756c6c61206c6f72656d206d6100757269732c2073757363697069742065676574206172637520696e2c207275007472756d2072757472756d206d617373612e204d616563656e61732061632000696d7065726469657420656c69742c207365642073757363697069742069700073756d2e2050726f696e206d6f6c6573746965206d6173736120617263752c00206120636f6e64696d656e74756d206f64696f20756c747269636573207369007420616d65742e205072616573656e742072686f6e637573206578207075720075732c2073656420706c616365726174206e756e63206f726e617265206574002e2050686173656c6c75732061206e696268206d616c6573756164612c2075006c6c616d636f72706572206e69736c2061742c2070656c6c656e74657371750065206c6f72656d2e2050686173656c6c7573206c6f72656d20697073756d2c0020756c6c616d636f727065722075742076756c70757461746520616c6971750065742c207661726975732065676574206c6f72656d2e0a0a4d6175726973200068656e6472657269742074696e636964756e74207175616d20616320696e7400657264756d2e20496e206120697073756d206e6f6e207175616d206d617869006d75732066696e696275732e20536564206f64696f2065782c206c6163696e00696120766974616520697073756d2073616769747469732c20766568696375006c6120656765737461732072697375732e204e756c6c616d20616320656c65006966656e6420646f6c6f722c20657520706f72747469746f722074656c6c7500732e204d616563656e617320746f72746f722076656c69742c20636f6e6469006d656e74756d20696420656e696d2076656c2c20657569736d6f64206f726e006172652072697375732e20416c697175616d206964206c6f72656d20696e7400657264756d2c20616c697175616d20707572757320696e2c20706861726574007261206a7573746f2e205574207669746165206c656f206469616d2e204e75006c6c6120656c656d656e74756d206e756e63206d657475732c206e65632076006172697573206f64696f2066696e69627573206e65632e20457469616d207100756973206e69736c20696e74657264756d2c20766f6c757470617420646f6c006f722065742c2072686f6e637573206e6962682e204d616563656e6173206e006f6e2072757472756d2061756775652c20657520656c656966656e64206d69002e20446f6e6563206c6f626f7274697320616e7465207669746165206175670075652070686172657472612c206174206c6163696e696120746f72746f7220007072657469756d2e0a0a4d616563656e61732061742074656d706f72206d6100676e612c20696e20737573636970697420656e696d2e204e756c6c6120656c00656d656e74756d2072757472756d2065782c206567657420736f64616c657300206e756c6c6120636f6e76616c6c69732076697461652e20566976616d757300206469676e697373696d2c2065726f7320657520656c656d656e74756d2073006f6c6c696369747564696e2c206c6f72656d20647569206c7563747573207300617069656e2c206163206d617474697320646f6c6f7220656e696d2073757300636970697420656c69742e204e756c6c61206567657420696d7065726469650074206d657475732e2043757261626974757220636f6e64696d656e74756d200061207075727573207363656c6572697371756520756c7472696365732e2041006c697175616d206c696265726f206d692c20766573746962756c756d206574002074656d706f722065752c2070686172657472612073697420616d65742065006c69742e20557420696420616c697175616d206c696265726f2e0a0a5365640020636f6e7365637465747572206c65637475732066696e69627573206c656300747573206f726e61726520706f7274612e20447569732073656420636f6e670075652073617069656e2c20757420696d7065726469657420656e696d2e205300656420656c656d656e74756d20696163756c6973206c6967756c612c206e6f006e2076656e656e617469732073617069656e206c75637475732069642e2053006564206566666963697475722c20616e7465207669746165206d6f6c657374006965206566666963697475722c20656c697420697073756d20636f6e64696d00656e74756d20697073756d2c2076656c206d6f6c6c6973206d61676e61206f0064696f207669746165206c616375732e2053757370656e64697373652065670065737461732073656d206f64696f2c20696e20766573746962756c756d206e0069736c20706f72747469746f722076656c2e20496e2074696e636964756e74002c206d657475732061206c6f626f7274697320756c7472696365732c2069700073756d206d6574757320766573746962756c756d206e756c6c612c2061742000696d7065726469657420746f72746f72206e6571756520736564206d692e20004d617572697320617420616e746520616e74652e20566573746962756c756d0020637572737573207665686963756c6120756c7472696365732e204d6f72620069206c7563747573206120657374206e656320696d706572646965742e20550074206e6f6e2075726e61206672696e67696c6c612c2065676573746173206d00657475732065752c2064696374756d20656c69742e20496e2064696374756d00207075727573206964206c656374757320616c69717565742074656d706f72002e20416c697175616d206572617420766f6c75747061742e204e616d206175006775652066656c69732c20696d70657264696574206174206d61676e61206e0065632c2070656c6c656e746573717565207661726975732074656c6c75732e000a0a4d616563656e617320656765742065782070656c6c656e746573717565002c20656c656d656e74756d206469616d2061742c20656c656966656e642064006f6c6f722e204e756c6c616d20626962656e64756d2065726f73206e65632000646f6c6f7220646170696275732c206174207361676974746973206573742000636f6e64696d656e74756d2e205072616573656e74206e6f6e2068656e647200657269742065726f732e204d616563656e617320636f6e736571756174206d006173736120766974616520647569207665686963756c612c20757420756c740072696365732072697375732073656d7065722e2053757370656e646973736500206461706962757320616e746520646f6c6f722c206120626962656e64756d002076656c69742074726973746971756520696e2e204d616563656e6173206e00656320696163756c697320656e696d2e20566573746962756c756d2073656400206f64696f2064696374756d2c20766573746962756c756d206f64696f2065006765742c20656c656966656e64206d657475732e204d617572697320616320006c696265726f20736564206c656f2070756c76696e617220636f6e76616c6c0069732e2044756973207665686963756c61206f72636920656c69742e2056650073746962756c756d206566666963697475722065676573746173206578206100206f726e6172652e2051756973717565206f726e617265206e6962682063750072737573206d6f6c65737469652070656c6c656e7465737175652e0a0a446f006e65632074696e636964756e7420666575676961742073757363697069742e0020566573746962756c756d20756c6c616d636f7270657220646f6c6f72206e006f6e206c6967756c6120766573746962756c756d2c20612070756c76696e610072206e756e6320636f6e7365717561742e20416c697175616d2070756c7669006e6172207661726975732074656c6c757320657520617563746f722e204d6100757269732076697665727261207665686963756c612065782c2076697461650020616c697175616d20617263752064696374756d2069642e205175697371750065207068617265747261207669746165206d61676e6120696e206f726e617200652e20566573746962756c756d207072657469756d207363656c6572697371007565206f64696f20696420636f6e73656374657475722e204e756c6c61207300656420656e696d207574207175616d20636f6e736563746574757220747269007374697175652e0a0a4e756c6c616d206f64696f206d61757269732c20666500756769617420657520666575676961742075742c20706f737565726520766900746165206d61676e612e205365642076697461652073656d70657220747572007069732c2073697420616d6574207363656c65726973717565206e756c6c61002e20517569737175652074656d707573206e6f6e206d692073656420706f7200747469746f722e2050726f696e206c656f2065782c20706f73756572652065007520656765737461732076656c2c206d6f6c657374696520736564206d65740075732e204e616d20747269737469717565206c616375732065742069707375006d206d6178696d757320756c747269636965732e204e756c6c616d20706f7300756572652073697420616d65742073617069656e206d6f6c65737469652075006c6c616d636f727065722e204d6f72626920656765737461732c20657261740020616320626c616e6469742064696374756d2c2073617069656e206e69736c002066696e69627573206e6973692c2073656420656666696369747572206c6500637475732073656d20657520697073756d2e2050686173656c6c7573206c65006f2061756775652c2076756c70757461746520706c616365726174206175670075652065752c2074656d706f722074696e636964756e74206c6f72656d2e200046757363652073697420616d65742073656d70657220746f72746f722e0a0a0053757370656e646973736520706f74656e74692e204d616563656e6173206900642064617069627573207475727069732c206e6f6e2076756c707574617465002065782e204e756c6c616d2072757472756d206c6967756c61206e65632072006973757320737573636970697420766f6c75747061742e20416c697175616d00206c7563747573206e657175652073697420616d65742061726375207472690073746971756520766f6c75747061742e205365642076697461652066656c690073206c6f72656d2e20416c697175616d20706c61636572617420656c656d65006e74756d2073617069656e2c2076697461652076756c7075746174652072690073757320766f6c757470617420696e2e204d616563656e6173207669746165002064756920657261742e2050686173656c6c7573206672696e67696c6c61200073617069656e2073656420647569207665686963756c612c207661726975730020636f6e736563746574757220616e746520736f6c6c696369747564696e2e00204372617320696163756c69732c2073617069656e20696e74657264756d2000696d70657264696574206566666963697475722c20647569206d6175726973002070756c76696e617220697073756d2c2061742076656e656e61746973206e0069736c206f64696f2071756973207175616d2e204e756e63206566666963690074757220636f6e73656374657475722073656d7065722e204e756c6c616d2000706f7375657265206e756c6c612072686f6e6375732070756c76696e61722000756c747269636965732e204e756e632074656c6c757320617263752c206865006e64726572697420736f6c6c696369747564696e206469616d207669746165002c2068656e6472657269742066696e696275732065782e0a0a536564206c6f00626f72746973206d6174746973206c6967756c612c20766974616520636f6e0076616c6c6973206c656f2064617069627573206e6f6e2e204d616563656e610073207669746165206c61637573206575206e69736c20617563746f7220656c00656d656e74756d206e6563207669746165206c65637475732e204d61656365006e6173207669746165206f726369207669746165206d6920756c6c616d636f007270657220706f72747469746f72206964206c6f626f72746973206e69736c002e20446f6e6563206964206d617572697320697073756d2e20416c69717561006d206572617420766f6c75747061742e20566976616d7573206c6f626f7274006973206e696268207574206573742076756c7075746174652066657567696100742e20496e7465676572206c696265726f207175616d2c20756c74726963650073206174206f7263692061742c20636f6e677565206665726d656e74756d20006d617373612e20457469616d2069642065726f7320696163756c69732c2063006f6e64696d656e74756d206f7263692074696e636964756e742c206d617474006973206d657475732e204d616563656e617320756c747269636573207369740020616d657420646f6c6f722069642070656c6c656e7465737175652e2056650073746962756c756d20706f727461206d6178696d7573206e69736c2c20696e002066696e6962757320746f72746f7220766f6c75747061742075742e2055740020677261766964612c20646f6c6f7220756c7472696365732068656e6472650072697420666575676961742c20656e696d2073656d20696e74657264756d20006c6967756c612c20616320656666696369747572206572617420656c697420006964206c6f72656d2e20496e2073697420616d657420756c6c616d636f7270006572206c6f72656d2e0a0a50686173656c6c7573206c6967756c612075726e00612c20636f6e736571756174206574206c756374757320612c206f726e617200652065742061756775652e20566573746962756c756d20657420616e746520006174206c6163757320626962656e64756d20696d706572646965742e2045740069616d2074757270697320617263752c2063757273757320766974616520760069766572726120612c2068656e64726572697420766974616520617263752e002050726f696e206f726e617265206d6175726973207574206d61676e61206d006f6c6573746965206d61747469732e20446f6e65632074656d706f72206c6500637475732071756973206d617373612076756c70757461746520696e7465720064756d2e2050726f696e206575206c6967756c61206469616d2e204d61656300656e6173206461706962757320747572706973206c65637475732c2075742000666163696c6973697320656c6974206469676e697373696d2075742e204e75006e6320626c616e646974206f726369206120616e746520666163696c69736900732c20617420636f6e76616c6c69732066656c697320666163696c69736973002e20437572616269747572207375736369706974206d692061206c69626572006f20706f73756572652c2071756973206f726e617265206a7573746f2076690076657272612e2050656c6c656e746573717565206861626974616e74206d6f00726269207472697374697175652073656e6563747573206574206e6574757300206574206d616c6573756164612066616d6573206163207475727069732065006765737461732e204e756c6c612070756c76696e6172207363656c6572697300717565206d61676e612c2065676574206c6f626f72746973206e6962682063006f6d6d6f646f2061742e20447569732065676574207661726975732066656c0069732c20636f6e64696d656e74756d20706c616365726174206c6563747573002e20416c697175616d20617563746f722074656d706f722075726e61206575002070756c76696e61722e204d6f726269206375727375732074656d706f7220006e657175652c206e6f6e20626c616e64697420646f6c6f7220666163696c690073697320656765742e2053656420736564206c6f626f727469732073656d2e000a0a4d617572697320756c7472696369657320656c69742075726e612c207600656c20616c697175657420707572757320617563746f722076697461652e20005072616573656e742076697665727261206f64696f2074656c6c75732c20710075697320706f7375657265206e756c6c6120616c69717565742061742e204c006f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7300656374657475722061646970697363696e6720656c69742e20437572616269007475722065676574206d65747573206174206c6967756c6120656c65696665006e6420706861726574726120696e206d616c657375616461206475692e20440075697320636f6e7365637465747572206469616d2075742066657567696174002072757472756d2e20566976616d757320657569736d6f64206e69736c207600656c206d6178696d75732073616769747469732e20496e20636f6d6d6f646f002073697420616d6574206c6f72656d2065742074696e636964756e742e205500742070656c6c656e746573717565206e756c6c61206e6f6e206d61757269730020636f6e64696d656e74756d2c2069642076756c707574617465206f64696f0020626c616e6469742e2053757370656e6469737365206e6f6e20707265746900756d206d61757269732c206e65632074696e636964756e742073617069656e002e0a0a4675736365206461706962757320657569736d6f6420747572706973002c20757420656c656d656e74756d20656e696d20657569736d6f64206e6f6e002e204e616d2061206e6962682074656c6c75732e2050656c6c656e7465737100756520696163756c697320746f72746f722073656420706f72747469746f720020636f6e64696d656e74756d2e204375726162697475722066617563696275007320747572706973206d6178696d75732c2076656e656e6174697320616e740065207365642c206d6f6c6c69732072697375732e205365642074656d70757300206d61676e612065676574206e756e6320706f72747469746f722c206174200072757472756d207175616d20636f6d6d6f646f2e20496e746567657220626c00616e646974207661726975732074656c6c75732073697420616d6574207275007472756d2e2050726f696e206d6f6c6c697320747269737469717565206e6500717565207365642074656d7075732e204475697320706c6163657261742c20006f7263692069642064696374756d20766573746962756c756d2c206c696775006c6120646f6c6f7220766f6c7574706174206c656f2c2076697461652066610075636962757320656e696d206e756c6c6120717569732065782e20437261730020666175636962757320657374206573742c2073697420616d65742061636300756d73616e206c6163757320696d706572646965742069642e204e616d206d0061747469732c206e756e6320736564206469676e697373696d20706c616365007261742c206d617373612075726e6120696163756c69732076656c69742c200071756973206c7563747573206469616d206a7573746f206575206e6973692e0020416c697175616d206572617420766f6c75747061742e0a0a50656c6c656e00746573717565206e6571756520617263752c20636f6e677565206e6f6e2061007567756520717569732c2074726973746971756520696e74657264756d206e00756e632e2050726f696e20646f6c6f7220746f72746f722c206461706962750073207365642070656c6c656e74657371756520612c2072757472756d206567006574206e6973692e20437261732065742074656d7075732074656c6c75732e00204e756c6c6120706f72747469746f722c206e69736920657520617563746f0072207661726975732c206572617420746f72746f722072757472756d20747500727069732c206e6f6e2068656e64726572697420616e7465206e6571756520007574206573742e20416c697175616d2076756c7075746174652076656c69740020766974616520657569736d6f6420656765737461732e20496e7465676572002072757472756d206d6f6c6c697320617263752c20757420756c7472696369006573206a7573746f206d6f6c6c697320656765742e20457469616d206174200066696e6962757320656e696d2c206574206d6174746973206d61757269732e00204d616563656e617320696e20616c69717565742061756775652e204e616d0020756c74726963657320656c656d656e74756d20617263752076656c20616c00697175616d2e20566573746962756c756d20696e206c6967756c6120747269007374697175652c206661756369627573206f64696f20656765742c206c6f62006f72746973206a7573746f2e204d6f726269206575206e756e63207369742000616d657420726973757320636f6e73657175617420616c697175657420736500642061632065782e20496e2068656e64726572697420756c7472696369657300206c6967756c612c2071756973207375736369706974206c6563747573206400696374756d2065752e20536564206c616f7265657420636f6e67756520756c007472696365732e2050686173656c6c7573207375736369706974206d6173730061206120666163696c6973697320696d706572646965742e0a0a44756973200074696e636964756e742065726f732071756973206772617669646120766172006975732e2053757370656e6469737365206e6f6e206475692070757275732e0020496e74657264756d206574206d616c6573756164612066616d65732061630020616e746520697073756d207072696d697320696e2066617563696275732e0020446f6e65632061742070756c76696e61722066656c69732e20446f6e656300206e656320616c697175616d2065726f732c2064696374756d20626962656e0064756d20617263752e20496e206e656320646f6c6f722066696e696275732c00207072657469756d206c6967756c612065742c20636f6e736571756174206500782e20496e206861632068616269746173736520706c61746561206469637400756d73742e20457469616d2074656c6c757320656e696d2c20696e7465726400756d2073656d70657220697073756d20736f64616c65732c206772617669640061206672696e67696c6c6120646f6c6f722e204e756c6c61206c6163696e690061206a7573746f20736f6c6c696369747564696e206c616f72656574206d6f006c65737469652e20457469616d20616320766573746962756c756d20717561006d2c20696420657569736d6f6420697073756d2e205574206174206772617600696461206c6f72656d2e2053757370656e646973736520696e74657264756d0020656c656966656e64206c65637475732c2065752073656d7065722070757200757320766f6c757470617420612e0a0a55742076656c20617567756520756c007472696365732c2074696e636964756e74206d6173736120612c20736167690074746973206e69736c2e2050726f696e206567657420616e746520616c69710075616d2c206f726e6172652061756775652070656c6c656e7465737175652c0020646170696275732070757275732e20496e206574206d657475732061726300752e2050656c6c656e74657371756520616c697175616d20626c616e6469740020617263752071756973207472697374697175652e204d617572697320746f0072746f72206d617373612c206d6178696d75732071756973207661726975730020612c20706f72747469746f7220636f6e73656374657475722073656d2e200050726f696e207665686963756c6120707572757320657420696163756c69730020636f6e73656374657475722e20557420736f6c6c696369747564696e206600696e6962757320657820696e20656c656d656e74756d2e204f7263692076610072697573206e61746f7175652070656e617469627573206574206d61676e690073206469732070617274757269656e74206d6f6e7465732c206e6173636574007572207269646963756c7573206d75732e205072616573656e74206e65632000696d70657264696574206d61676e612e205574206d616c65737561646120690064207075727573206e656320766573746962756c756d2e2053757370656e64006973736520616363756d73616e2065726174206c656f2c20696e20666175630069627573206469616d20696163756c69732073697420616d65742e20447569007320736f6c6c696369747564696e206c6563747573207175697320656e696d00206c6163696e696120657569736d6f642076656c2075742061756775652e0a000a416c697175616d20756c7472696369657320636f6e76616c6c6973207465006c6c75732c206964206567657374617320656c69742073616769747469732000696e2e204372617320706f72747469746f72206e6973692065676574207361007069656e20636f6e76616c6c697320706f73756572652e204d6175726973200067726176696461206e65717565207669746165206c696265726f20637572730075732c20696420636f6e736571756174206e657175652072686f6e6375732e0020496e746567657220616c69717565742065676574206e696268206163207000686172657472612e204e756c6c616d20696163756c6973206e69736c206665006c69732c207175697320696d70657264696574206e756c6c6120756c74726900636573207365642e205175697371756520747269737469717565206c61637500732061742072686f6e63757320706f7274612e204e616d20616320636f6e6400696d656e74756d2075726e612e20536564206e656320706f72747469746f7200206e6962682e205365642067726176696461206d61676e612069642070757200757320706f737565726520766573746962756c756d206e6f6e20736564206e006973692e20566573746962756c756d2061726375207475727069732c2069610063756c69732076656c20636f6e7365717561742069642c206c6f626f72746900732073697420616d65742065782e205072616573656e742071756973207465006d706f722061756775652e204e756c6c61206567657420656e696d20656c65006966656e642c2074696e636964756e74206c696265726f2073697420616d6500742c206d6174746973206e6973692e20446f6e65632064756920657261742c002070756c76696e61722076656c207075727573206e65632c20666163696c69007369732066696e69627573206c6f72656d2e204e756c6c616d20756c7472690063657320707572757320766573746962756c756d20636f6d6d6f646f20616c00697175616d2e0a0a4f72636920766172697573206e61746f7175652070656e00617469627573206574206d61676e6973206469732070617274757269656e7400206d6f6e7465732c206e61736365747572207269646963756c7573206d7573002e204e756e6320626c616e646974206e756c6c612072697375732c2076656c0020736f64616c6573206c6f72656d206f726e6172652061632e20496e746567006572206e6f6e20646f6c6f7220626962656e64756d2c206f726e6172652074006f72746f7220656765742c20756c7472696369657320697073756d2e204165006e65616e2066696e69627573206469676e697373696d206f726e6172652e20004d61757269732074656d7075732c206572617420617420626962656e64756d0020617563746f722c206c656f20656c6974206c6163696e6961206f64696f2c002061742074656d7075732061726375206475692071756973206573742e20500072616573656e74206672696e67696c6c61206c6f72656d206d616c6573756100646120706f72747469746f7220696d706572646965742e20496e7465726475006d206574206d616c6573756164612066616d657320616320616e74652069700073756d207072696d697320696e2066617563696275732e204d6f7262692076006974616520666163696c69736973206c6f72656d2c20766974616520636f6e0073657175617420697073756d2e20457469616d20696420656c656d656e7475006d20657261742e204e616d20646f6c6f72206c656f2c2074656d706f722061006320657820717569732c206469676e697373696d206665726d656e74756d2000616e74652e0a0a446f6e65632061206e756c6c612072697375732e204d6175007269732066617563696275732c206e756e63206163206d6178696d7573207600656e656e617469732c206d61676e612076656c6974207072657469756d2061006e74652c206e6f6e206665726d656e74756d20656c6974206d617572697320006e6f6e206e756e632e20446f6e65632068656e6472657269742075726e61200061742074656c6c757320636f6e76616c6c69732c2061632066617563696275007320656c6974206c6f626f727469732e204e756c6c616d20626962656e6475006d20656c656966656e64206d61676e612073697420616d657420696e7465720064756d2e20496e20696e20736f64616c657320746f72746f722c206e6f6e20006c6f626f72746973206d692e205072616573656e742076656c2073656d206100206f64696f2076656e656e6174697320666163696c697369732e2056657374006962756c756d206163206d6f6c657374696520646f6c6f722c206174206669006e69627573206e6973692e0a0a566573746962756c756d20616e74652069700073756d207072696d697320696e206661756369627573206f726369206c75630074757320657420756c74726963657320706f737565726520637562696c6961002063757261653b2046757363652061632074656d70757320617263752c2076006974616520696163756c6973206e657175652e2055742061206e69736c207500742076656c697420636f6e73657175617420636f6e64696d656e74756d207600697461652065676574206e6962682e2044756973206574206d61676e612061006c69717565742c20636f6e76616c6c697320656c69742069642c20756c6c61006d636f72706572206d692e20566976616d757320696d70657264696574206600656c6973207175697320636f6e7365717561742072757472756d2e204d6f7200626920757420617263752073697420616d657420617567756520636f6e677500652074696e636964756e742e2053757370656e64697373652061206d617474006973206f7263692e204e756e6320656765737461732c2076656c69742073650064206469676e697373696d2073656d7065722c20656c6974206d61757269730020626962656e64756d206e657175652c206567657420616c697175616d206e00697369206e65717565206120616e74652e204e616d2066657567696174206e006571756520646f6c6f722e20566573746962756c756d20616e74652069707300756d207072696d697320696e206661756369627573206f726369206c75637400757320657420756c74726963657320706f737565726520637562696c6961200063757261653b20557420696e20636f6e736563746574757220646f6c6f722e002051756973717565206e6f6e20636f6e677565206e657175652e0a0a4e756c006c61207363656c657269737175652c206e65717565206567657420636f6e7600616c6c697320626962656e64756d2c206c6f72656d206d65747573207068610072657472612070757275732c2073656420626c616e6469742065726174206100726375206575206e6973692e204d617572697320706c616365726174206d6100737361206575206e6571756520766f6c75747061742c2073697420616d6574002076697665727261207269737573207363656c657269737175652e20496e200076656c20766573746962756c756d206e756c6c612e20416c697175616d207200686f6e6375732061632061756775652076656c2076756c7075746174652e20004d6175726973207669746165206469616d20696d706572646965742c20766f006c7574706174206e6962682065752c206661756369627573206d657475732e0020457469616d2070656c6c656e74657371756520747572706973206964206e0069626820636f6e73657175617420736f6c6c696369747564696e2e204e756e00632065676574206a7573746f2070756c76696e6172206d65747573207275740072756d206c75637475732073697420616d65742061206d657475732e204e75006c6c6120666163696c6973692e2053757370656e646973736520657520617500677565206c65637475732e2053757370656e646973736520736f6c6c69636900747564696e20657569736d6f64207661726975732e2050686173656c6c75730020616e746520657261742c20666175636962757320696420746f72746f7220006e65632c207363656c6572697371756520766172697573206e756e632e0a0a00457469616d206672696e67696c6c6120766f6c7574706174206d692c20706f00737565726520766573746962756c756d206c6967756c6120756c7472696365007320696e2e20446f6e6563207665686963756c612074757270697320717569007320756c74726963696573207661726975732e20446f6e65632073656d7065007220616e746520657261742c20616320666575676961742074656c6c75732000626962656e64756d2069642e20446f6e656320697073756d206e69736c2c200070756c76696e6172206e6563207175616d20696e2c20736f6c6c69636974750064696e20696e74657264756d20656e696d2e20566976616d7573206c616f72006565742074656c6c75732065676574206f72636920636f6e64696d656e7475006d207363656c657269737175652e2050726f696e20657420666175636962750073206f64696f2c206163206566666963697475722061756775652e2055742000696e74657264756d20747269737469717565206475692074656d7075732070006f7274612e20416c697175616d206672696e67696c6c6120707572757320760069746165206e6962682074656d706f7220626962656e64756d2e205175697300717565206574207361676974746973206f7263692c2061742074656d706f72002076656c69742e205365642066696e696275732073617069656e20657420740075727069732073656d7065722c206e6f6e206d6f6c6573746965206e756e6300206c75637475732e20536564206a7573746f206e6973692c20736f6c6c69630069747564696e20696e20697073756d20696e2c206665726d656e74756d20700072657469756d206f64696f2e204e756c6c6120757420766f6c7574706174200073656d2e0a0a436c61737320617074656e742074616369746920736f63696f00737175206164206c69746f726120746f727175656e742070657220636f6e7500626961206e6f737472612c2070657220696e636570746f732068696d656e6100656f732e204e756c6c61206e6f6e206f726369206d692e2056657374696275006c756d207361676974746973206f72636920657520636f6e64696d656e7475006d20636f6e6775652e20446f6e656320736564206d61676e612070656c6c65006e7465737175652c20706c61636572617420697073756d207365642c20616c00697175616d2073656d2e2043757261626974757220696d706572646965742000617567756520657420656c697420706c6163657261742c2061742070756c7600696e617220617263752066617563696275732e20566573746962756c756d2000666575676961742c20697073756d20617420756c747269636573206d6f6c6500737469652c206e65717565206f64696f20656c656966656e642076656c6974002c2061742065676573746173206f72636920647569206574206573742e2049006e7465676572207574206a7573746f206c65637475732e204e756c6c616d20006665756769617420696e74657264756d206f726369206e656320617563746f00722e0a0a446f6e656320616c697175657420616363756d73616e206d61737300612c20766974616520666163696c697369732072697375732e20467573636500207072657469756d206e756e63206e6f6e20636f6e73657175617420656c65006d656e74756d2e204d616563656e617320636f6e64696d656e74756d20736300656c6572697371756520706f72747469746f722e204f7263692076617269750073206e61746f7175652070656e617469627573206574206d61676e697320640069732070617274757269656e74206d6f6e7465732c206e6173636574757220007269646963756c7573206d75732e204d6175726973206e6563207075727573002066617563696275732c2074656d707573206469616d206e65632c20756c74007269636573206f7263692e2041656e65616e2066617563696275732c207361007069656e20757420706f72747469746f7220616c69717565742c206e756e6300206572617420636f6e6775652061756775652c2071756973206469676e69730073696d2073656d20697073756d206574206469616d2e2053757370656e646900737365206772617669646120657569736d6f6420697073756d2c206120696d0070657264696574206e756c6c6120636f6e7365717561742061632e2050726f00696e207175697320636f6e73657175617420697073756d2c20696e20737573006369706974206e657175652e204e616d207669746165207669766572726120006c656f2e2041656e65616e20756c74726963657320706c6163657261742062006c616e6469742e20496e7465676572206e6571756520617263752c2066616300696c697369732073697420616d6574206f726369207365642c2076657374690062756c756d206672696e67696c6c6120746f72746f722e2050656c6c656e740065737175652066657567696174206575206c6967756c612065676574206c6f00626f727469732e20536564206575206d6f6c6c69732065782c20696e206461007069627573206c616375732e20467573636520616c697175616d2c206e657100756520636f6e73657175617420666163696c6973697320706c616365726174002c20697073756d206f72636920696163756c6973206a7573746f2c20696d700065726469657420706f7375657265206d61676e61206f64696f206e6563207500726e612e20437572616269747572206d6f6c6c69732c20657820696e2066610063696c6973697320766f6c75747061742c206e697369206a7573746f20656c00656966656e64206c696265726f2c20612070656c6c656e7465737175652065006e696d206d61676e612071756973206e6962682e204d617572697320756c7400726963696573206469616d2065676574206c616375732070756c76696e6172002c20657420636f6e64696d656e74756d206e6962682073656d7065722e0a0a00566976616d757320746f72746f72207175616d2c20616c697175657420696e00206e756e632075742c206f726e61726520756c74726963696573206e65717500652e2050656c6c656e74657371756520637572737573206163206a7573746f0020766974616520756c747269636965732e20446f6e65632065676574206e6900736c2071756973206f726369206772617669646120766f6c75747061742065007420696420656e696d2e2053656420706f72747469746f72206c616375732000717569732073656d20756c74726963657320666163696c6973697320757420006567657420656e696d2e20416c697175616d20696163756c6973206572617400206e6563206d617373612072686f6e6375732068656e6472657269742e2041006c697175616d206f726e6172652070686172657472612075726e612065752000617563746f722e20566976616d7573206964206469616d206120617567756500206567657374617320636f6e6775652e205072616573656e742068656e647200657269742073617069656e20696e206f72636920636f6e6775652c20656765007420636f6e6775652073617069656e20696d706572646965742e205365642000617563746f7220657374206163206c7563747573206c6163696e69612e2049006e7465676572206e65717565206e657175652c20656c656966656e64207665006c206c656f2069642c20626962656e64756d20756c6c616d636f72706572200073656d2e20566573746962756c756d2076656c20666163696c6973697320650073742e20536564207175697320766f6c7574706174207475727069732e0a0a004e616d206d6174746973206d6f6c6573746965206d61676e612c2076697461006520636f6e736571756174206d657475732e204e616d206d6178696d75732000657569736d6f6420656c6974206e6563206f726e6172652e204e756c6c6120006d6f6c6c697320696420707572757320717569732074656d706f722e205065006c6c656e7465737175652072686f6e63757320656765737461732066657567006961742e204475697320756c74726963657320656c6974207574206c6f7265006d2070756c76696e617220736f6c6c696369747564696e2e2043757261626900747572206672696e67696c6c612076756c7075746174652076656e656e61740069732e204d61757269732074656d706f7220617563746f722075726e612e0a000a496e206861632068616269746173736520706c617465612064696374756d0073742e204d616563656e617320617563746f72206d61747469732062696265006e64756d2e20566573746962756c756d2074656d7075732072686f6e63757300206c65637475732c2069642072686f6e637573206e69736c206d6178696d7500732061742e204475697320766172697573206672696e67696c6c6120617567007565206e656320666163696c697369732e204e756c6c6120696163756c69730020612070757275732065676574206665726d656e74756d2e20457469616d20006e6563207361676974746973206f7263692e205072616573656e74206d6174007469732066656c69732072697375732e204e616d206567657420656c656d65006e74756d206c6967756c612e20436c61737320617074656e74207461636974006920736f63696f737175206164206c69746f726120746f727175656e74207000657220636f6e75626961206e6f737472612c2070657220696e636570746f73002068696d656e61656f732e2050686173656c6c75732065676573746173207000757275732070656c6c656e7465737175652c2070656c6c656e746573717565002076656c6974206e6f6e2c206772617669646120656c69742e0a0a53656420006e6f6e2074656d7075732070757275732e2053757370656e6469737365207000756c76696e6172206d65747573206e657175652c206e6f6e207472697374690071756520697073756d20706f727461206e6f6e2e205574206567657420747500727069732074696e636964756e742c2074656d706f722073656d2071756973002c2076656e656e61746973206d61676e612e20566573746962756c756d20690064206d6178696d75732072697375732e204475697320616c69717565742070006f73756572652066656c697320696e20706c6163657261742e2051756973710075652076656c6974206f64696f2c20656666696369747572206174206d617300736120612c20747269737469717565206f726e61726520646f6c6f722e204e00756c6c616d206567657374617320706c61636572617420647569207574207300656d7065722e20416c697175616d20717569732073617069656e206d65747500732e204475697320656c656d656e74756d2c2065726174206e656320626c61006e6469742072686f6e6375732c2065726f7320656e696d207363656c65726900737175652061756775652c206e656320766976657272612065726f73206c65006f206575206c656f2e204d6f7262692073656420666163696c69736973206a007573746f2e20566976616d75732073697420616d6574206d61676e61206865006e647265726974206c656f206772617669646120617563746f722e0a0a4e75006e632063757273757320616c6971756574206f64696f2e204e756e632069610063756c69732065742074757270697320617420756c747269636965732e204e00616d2076756c70757461746520656e696d2065676574207075727573207465006d707573206f726e6172652e204e756c6c616d20636f6e736571756174206d006f6c6573746965206469616d2c20766974616520756c747269636573206e6900626820706f72747469746f722065742e20566573746962756c756d20766f6c007574706174207574206c6f72656d20656765742070656c6c656e746573717500652e204e616d2064617069627573206c696265726f206d692e2050656c6c65006e7465737175652074696e636964756e74206e696268206e657175652c20610020696e74657264756d206c6f72656d20636f6e6775652076656e656e61746900732e2050686173656c6c757320696e2073656d206574206d617373612066610075636962757320616363756d73616e2074696e636964756e742076656c206e006962682e0a0a4e756c6c61206d616c657375616461206e69736c206e69736c002c206575206d6f6c657374696520697073756d206d6f6c6c69732065676574002e20416c697175616d2076756c70757461746520707572757320736564206c006967756c6120736167697474697320616c69717565742e20496e20616c69710075616d206469616d20677261766964612072757472756d2070756c76696e6100722e20496e206d616c6573756164612075726e612065676574206f726e6172006520656765737461732e20566573746962756c756d20766974616520736365006c65726973717565206573742c206567657420766573746962756c756d206f007263692e2050656c6c656e746573717565206672696e67696c6c61206d616c0065737561646120706f73756572652e204e756c6c6120696e74657264756d20006c656f207669746165207072657469756d20706f73756572652e204e616d20006d6f6c6c69732065726f73207365642074656c6c7573206d6174746973207300616769747469732e0a0a53757370656e646973736520636f6e64696d656e7400756d206c6563747573206574206c6f72656d20657569736d6f6420637572730075732e204d6175726973206172637520617263752c2072757472756d20636f006e73657175617420707572757320696e2c206567657374617320696163756c006973206c696265726f2e204d6f726269207068617265747261206d6178696d007573206d617373612c206567657420626c616e64697420747572706973207000756c76696e61722065742e204d6175726973206e656320646f6c6f72207665006e656e617469732c2070656c6c656e746573717565206d61676e612069642c0020617563746f722075726e612e204d616563656e617320766976657272612000706f72747469746f72206e6973692c2076656c20756c74726963696573206500726174206375727375732061742e20467573636520636f6e6775652074656c006c75732076697461652073617069656e20747269737469717565206665726d00656e74756d2e20446f6e656320696d706572646965742073656d206e6f6e20006d617572697320756c7472696365732076656e656e617469732e20437261730020756c747269636573206c6f72656d206c656f2e2053656420736564207665006e656e61746973206e657175652c2076697461652065676573746173206665006c69732e205072616573656e7420617420616e746520706f7274612c20636f006e64696d656e74756d206c65637475732076697461652c20706f7274746974006f72206e657175652e204e616d2074656c6c7573206c616375732c20747269007374697175652074656d706f72206e756c6c61206e65632c20706c6163657200617420626962656e64756d2061756775652e204e756c6c616d20657569736d006f642076697665727261206f7263692c206575206772617669646120656e69006d20636f6e64696d656e74756d20626962656e64756d2e2053757370656e6400697373652065676574206c6f72656d20766974616520697073756d20706c610063657261742070656c6c656e74657371756520696420636f6d6d6f646f206f0064696f2e204675736365206d61747469732075726e61207574206475692063006f6d6d6f646f2c206e656320636f6d6d6f646f20647569207068617265747200612e0a0a496e206861632068616269746173736520706c61746561206469630074756d73742e204e616d206a7573746f206e6962682c207665686963756c61002061206c6967756c612065752c206d617474697320656c656966656e64206c006967756c612e205175697371756520656765742074757270697320612061750067756520747269737469717565206665726d656e74756d2e204e756c6c616d00207669746165206c61637573206d6f6c65737469652c207363656c65726973007175652061756775652061742c20656c656966656e64206e69736c2e204e75006c6c61206d61676e612065726f732c20636f6e76616c6c697320736564206f0064696f207363656c657269737175652c206c6f626f7274697320636f6e7661006c6c6973206e6962682e204e616d206174207361676974746973206175677500652c20657520766172697573206c6967756c612e204e756c6c616d20706f730075657265206d6178696d7573206e697369206e656320616c69717565742e2000457469616d207363656c657269737175652071756973206469616d20656765007420656765737461732e205072616573656e7420756c7472696369657320730063656c65726973717565206d69206e656320626962656e64756d2e2056657300746962756c756d20616c697175616d2074656c6c75732076656c206a757374006f206c616f726565742c207574207072657469756d2073656d206f726e617200652e204e616d20616e7465206e6962682c2066696e69627573206e6563207300617069656e20612c2076656e656e6174697320636f6e677565207269737573002e20496e2076656c206e65717565206120656e696d20636f6e7365637465740075722070656c6c656e7465737175652e20566976616d757320636f6e76616c006c697320657374207574206e756c6c6120736167697474697320706f7375650072652e2050656c6c656e74657371756520626962656e64756d20736f64616c00657320697073756d2065742068656e6472657269742e0a0a536564207269730075732066656c69732c20736f6c6c696369747564696e206575206d6f6c6573007469652065742c20657569736d6f6420656765742065782e20457469616d200065676574206e756c6c61206e6962682e2043726173206772617669646120610020746f72746f722076697665727261207661726975732e2050686173656c6c0075732066696e696275732c2073617069656e20657420616c697175616d2075006c7472696365732c206d61757269732065726f7320706f72747469746f72200065726f732c20616320636f6e677565206c656f206573742065676574206d6100757269732e20536564206e756e632076656c69742c2065676573746173207300656420656c69742065752c20657569736d6f64206d6178696d7573207361700069656e2e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b2000566573746962756c756d206c656f206a7573746f2c20636f6d6d6f646f2071007569732076756c7075746174652061742c20736f6c6c696369747564696e200073697420616d6574206573742e205365642070756c76696e61722c2076656c00697420736564206469676e697373696d20766976657272612c206d617373610020646f6c6f722073656d706572206c6f72656d2c206e6f6e206d6f6c657374006965206d6175726973206f64696f2065742070757275732e204d616563656e006173206c6f626f7274697320696e74657264756d206e756e63207574206d6f006c65737469652e20536564206d6f6c6c697320636f6d6d6f646f2076656e65006e617469732e20496e74657264756d206574206d616c657375616461206661006d657320616320616e746520697073756d207072696d697320696e206661750063696275732e2055742073656420617263752076656c69742e204d617572690073206175677565206e756c6c612c206f726e617265206e656320616c697175006574207365642c20636f6d6d6f646f20696e206475692e0a0a496e74656765007220736f6c6c696369747564696e2075726e612065676574206e756c6c61200070686172657472612c206e6f6e20766172697573206e657175652070756c7600696e61722e204e756c6c61207574206c656374757320736564206d61757269007320756c6c616d636f7270657220706f7274612e2051756973717565206e650063206469616d207472697374697175652c2064617069627573206c65637475007320612c20616c697175616d206e6962682e2043757261626974757220616c006971756574206d6f6c6c69732073617069656e207574206d6f6c6573746965002e2050686173656c6c7573207361676974746973206e69736c20766974616500206d6178696d75732066617563696275732e20446f6e6563206d6178696d750073206120647569206575207661726975732e20457469616d2072686f6e6375007320746f72746f722076656c206e756e63206665726d656e74756d2070756c0076696e617220736564206e656320657261742e20416c697175616d20757420006c656f206e6f6e206e69736920646170696275732076756c7075746174652e0020496e746567657220616363756d73616e20636f6e6775652072686f6e637500732e2055742076756c707574617465206f64696f20656c69742c20707265740069756d2073656d7065722065726174207375736369706974206e65632e205300757370656e6469737365206d6174746973207475727069732076656c206572006f732070756c76696e617220756c7472696365732072757472756d207369740020616d657420616e74652e204475697320656c656966656e64206d6178696d00757320617567756520696e207363656c657269737175652e20446f6e656320006e6f6e20746f72746f722073697420616d657420657261742066617563696200757320616c69717565742e205365642074656d70757320747269737469717500652072697375732c207072657469756d20747269737469717565206475692000636f6e76616c6c69732065752e0a0a50686173656c6c757320616c69717561006d20747572706973206174206c656f20706f73756572652c207365642061630063756d73616e206e69736c2074656d7075732e204d616563656e6173207669007461652073617069656e206a7573746f2e2050686173656c6c75732074656d00707573206672696e67696c6c612070656c6c656e7465737175652e2050656c006c656e74657371756520617420646f6c6f72206964206d6175726973206c61006f7265657420637572737573206e6f6e2071756973206d657475732e204475006973206163206d69206e6f6e2074656c6c7573206461706962757320706f7200747469746f72206e6f6e206574206c6967756c612e20457469616d20736f6400616c65732069642074757270697320696e20756c747269636965732e205365006420616e7465206c616375732c2068656e64726572697420757420706f7274007469746f722075742c206665726d656e74756d207669746165206c656f2e0a000a4372617320706861726574726120616e746520616e74652c2076756c7075007461746520666575676961742072697375732066617563696275732065676500742e2050726f696e2073697420616d65742074656c6c75732072686f6e637500732c207665686963756c61206469616d206e6f6e2c206567657374617320650073742e2043726173207669746165206c696265726f206e657175652e20446f006e656320697073756d2066656c69732c20696e74657264756d2076656c20650067657374617320656765742c20616c6971756574206e65632065726f732e2000446f6e6563206e697369206d617373612c20766573746962756c756d207665006c20656e696d2065742c206461706962757320636f6e67756520697073756d002e205072616573656e7420647569206573742c20636f6e67756520766974610065206d6f6c657374696520717569732c206d616c657375616461206567657400206469616d2e20457469616d206e6f6e2076697665727261206f7263692e2000566573746962756c756d206d6f6c6c69732065726f73206174206c65637475007320706f72747469746f7220756c6c616d636f727065722e20496e2066657500676961742066656c6973206e656320657820756c7472696365732c2073656400206665726d656e74756d206a7573746f2066696e696275732e204475697320006e6f6e20706f7375657265206e657175652c20657420636f6e73657175617400206f7263692e20416c697175616d206575206a7573746f20756c747269636500732c2076656e656e6174697320746f72746f722061632c2072757472756d2000656e696d2e0a0a496e7465676572206469676e697373696d207175616d20650075206d61757269732066696e6962757320666163696c697369732e204d617500726973206c6163696e6961206a7573746f206c65637475732c2076656c206c007563747573207175616d20766f6c757470617420766f6c75747061742e20550074206e6f6e206f726369206e756c6c612e2041656e65616e20617563746f72002073617069656e206120726973757320656c656d656e74756d206d616c657300756164612e204e616d2065676574206c6563747573206c696265726f2e2041006c697175616d20697073756d206d617373612c20736f6c6c69636974756469006e20616320696163756c697320612c206d6178696d757320657520747572700069732e204d616563656e61732076656c206e756e632076656c2065726f732000766f6c7574706174207472697374697175652076697461652061742065782e002043757261626974757220657420656e696d206d6f6c6c69732c20707265740069756d20646f6c6f7220717569732c2068656e647265726974206c61637573002e20496e2074656d70757320657569736d6f6420646f6c6f722c206964206400696374756d206d657475732072757472756d20717569732e0a0a43757261620069747572207072657469756d206c6f626f72746973207363656c65726973710075652e204d61757269732076656c206d69206120697073756d20766568696300756c61207363656c657269737175652e204e756c6c6120666163696c697369002e20446f6e656320636f6e736571756174206f64696f206120657261742075006c6c616d636f7270657220666163696c697369732e2044756973206d617373006120656e696d2c20756c74726963696573206e6f6e2075726e612071756973002c20657569736d6f64207072657469756d20746f72746f722e20457469616d002068656e647265726974206c656374757320766974616520656c656d656e7400756d2076756c7075746174652e20496e74657264756d206574206d616c657300756164612066616d657320616320616e746520697073756d207072696d69730020696e2066617563696275732e20536564206f64696f206d61676e612c2063006f6e73656374657475722073697420616d657420706f727461207669746165002c20766976657272612061206d61676e612e20437261732065752069707375006d20656c656966656e64206f64696f20766976657272612072757472756d20006574206e6f6e206c6f72656d2e20517569737175652071756973206c656f2000757420726973757320756c6c616d636f72706572207375736369706974207600656c206e6563206469616d2e20467573636520646170696275732065726f7300206e6f6e206e69736c2066617563696275732c20657420656666696369747500722073656d20706c6163657261742e20566573746962756c756d20616e74650020697073756d207072696d697320696e206661756369627573206f72636920006c756374757320657420756c74726963657320706f73756572652063756269006c69612063757261653b20416c697175616d2069642073656d206163206c6f0072656d20706f72747469746f72206c616f7265657420616320717569732065006c69742e0a0a446f6e65632076656c20646f6c6f72206d6178696d75732c20006d6f6c6c6973206d61676e612073697420616d65742c207068617265747261002076656c69742e2041656e65616e2070656c6c656e74657371756520737573006369706974206c6563747573206174207665686963756c612e20446f6e656300206e6563206661756369627573206469616d2e204e616d20656765742064750069206575206d6175726973206461706962757320616c697175616d206469630074756d206575206d61757269732e20446f6e6563206c6563747573206d65740075732c206d6f6c657374696520636f6e73657175617420756c747269636965007320656765742c206c616f72656574206e6563206475692e20446f6e656320006575206c656374757320717569732076656c697420656c656d656e74756d2000657569736d6f642e204d616563656e617320626962656e64756d206c61637500732073697420616d657420736f6c6c696369747564696e206c6163696e6961002e0a0a5175697371756520737573636970697420706f73756572652070757200757320636f6e64696d656e74756d20706f7274612e20457469616d2068656e00647265726974207574206c696265726f20696e2072757472756d2e204e756c006c616d20756c74726963696573206c696265726f20657420647569206c6f62006f72746973206672696e67696c6c612e20496e746567657220757420656c690074206d61676e612e2051756973717565207665686963756c61206d6f6c6c690073206c656f2c206964207665686963756c61206d61676e6120616c6971756500742075742e20457469616d206e6f6e20706f72747469746f72206e69736c2c002073697420616d65742076756c707574617465206469616d2e2050726f696e00206e6571756520657261742c20737573636970697420656765742066656c69007320696e2c20677261766964612066696e69627573207175616d2e205068610073656c6c7573206d617474697320746f72746f722072697375732c2075742000656c656d656e74756d206d6574757320737573636970697420626962656e6400756d2e0a0a4e756c6c616d207175616d2065782c20706f72746120696e2070007572757320696e2c206d6f6c65737469652074726973746971756520646f6c006f722e20457469616d207472697374697175652072697375732076656c206c0061637573206672696e67696c6c612c206174206c75637475732075726e612000616c697175616d2e20416c697175616d2065752066656c69732066657567690061742c20696163756c6973206c6f72656d2073697420616d65742c2070756c0076696e617220697073756d2e204e616d2076697461652074696e636964756e0074206d61676e612e204d617572697320756c6c616d636f727065722c206d650074757320636f6e64696d656e74756d20736f64616c657320756c6c616d636f00727065722c2073656d2074656c6c757320636f6e7365637465747572206c6500637475732c2061742074656d7075732073617069656e206d6175726973207600656e656e61746973206d61757269732e2041656e65616e2076657374696275006c756d20646f6c6f722065782c2076656c2076697665727261206e69626820006d6178696d7573207365642e20457469616d20636f6d6d6f646f206d616c65007375616461206f7263692e204e616d20616363756d73616e206469616d206e006563206e756e6320766f6c7574706174206566666963697475722e20467573006365207072657469756d20697073756d206c656f2c207175697320696e7465007264756d206172637520736f6c6c696369747564696e20656765742e205065006c6c656e746573717565206d617474697320617420697073756d206567657400207072657469756d2e0a0a536564206c656f206d692c207068617265747261002073697420616d657420696d706572646965742065752c2074696e63696475006e7420657420746f72746f722e2055742071756973207072657469756d206d0061676e612c20657520616c697175657420697073756d2e2050726f696e2061006320756c74726963657320697073756d2c2076656c206d6f6c6573746965200073617069656e2e20457469616d20736f64616c6573206e6571756520616320006f726e6172652070686172657472612e204d6f7262692071756973206175670075652073697420616d65742075726e6120706c6163657261742070756c7669006e61722e204375726162697475722076617269757320666163696c69736973002072697375732c206964207375736369706974207175616d20696d7065726400696574206d616c6573756164612e20416c697175616d20646170696275732c0020697073756d2076656c20636f6e64696d656e74756d206d61747469732c20006c6967756c6120657374206375727375732074656c6c75732c20657520696e0074657264756d20616e7465206c656f206e6f6e20616e74652e204e756c6c6100207175616d206e6973692c20706f737565726520657420616363756d73616e0020696e74657264756d2c2076756c707574617465206e6f6e2070757275732e00204e756e632076617269757320696d706572646965742066656c6973206e65006320696e74657264756d2e2050726f696e2076656e656e617469732061206c006967756c6120657420636f6e73656374657475722e2050686173656c6c757300206e65632065726f73206d6f6c6c69732c20756c7472696369657320656c690074206e6f6e2c206c6163696e6961206d692e2053757370656e646973736520006c6967756c6120617263752c206665726d656e74756d20617420617563746f007220717569732c20656c656966656e64207669746165206e69736c2e0a0a53006564206665726d656e74756d20707572757320696e206f64696f2070756c7600696e61722c20766573746962756c756d20656c656966656e64206573742063006f6d6d6f646f2e2046757363652076617269757320736564207475727069730020696e20666575676961742e20557420616320666163696c69736973206f6400696f2e20557420766f6c757470617420697073756d20646f6c6f722c20696e0020657569736d6f6420646f6c6f7220696e74657264756d2069642e20536564002073617069656e206573742c20696d70657264696574206575206f726e6172006520656765742c2074656d70757320656765742066656c69732e205068617300656c6c75732070656c6c656e7465737175652c206e756c6c61207369742061006d65742066696e6962757320677261766964612c207175616d206e69736c200064696374756d206a7573746f2c2073697420616d6574206672696e67696c6c0061206469616d206c616375732065676574206573742e20566573746962756c00756d20626c616e646974206d617572697320696e20616e7465206d6178696d00757320766f6c75747061742e2050656c6c656e74657371756520686162697400616e74206d6f726269207472697374697175652073656e656374757320657400206e65747573206574206d616c6573756164612066616d6573206163207475007270697320656765737461732e20566573746962756c756d2066656c6973200072697375732c2073616769747469732076656c20636f6d6d6f646f20736564002c20706f72746120617563746f722073656d2e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d616563656e6173206e65006320706f72747469746f722066656c69732e20446f6e656320656c656d656e0074756d2073656d206e756c6c612e0a0a416c697175616d20656c656d656e7400756d206575206c6f72656d206964206c75637475732e204e756e6320617420006e696268206573742e205072616573656e7420666175636962757320766172006975732065726174206e656320706f73756572652e204e756c6c616d20717500616d206c616375732c20766f6c7574706174206e6563206c616f7265657420006e6f6e2c20706f7375657265206163206c6967756c612e2050726f696e2071007569732065676573746173206e69736c2c20736564206c7563747573206665006c69732e204e756c6c61207072657469756d207175616d206e65632066696e006962757320656c656966656e642e20457469616d206d617572697320656e69006d2c2072686f6e6375732076656c206d616c657375616461207365642c2063006f6e64696d656e74756d2076697665727261206c696265726f2e20416c69710075616d207175616d2073656d2c2072757472756d2061742073617069656e20006e65632c206c616f7265657420666163696c69736973207475727069732e20004e616d206e65632074656d707573206573742e204d616563656e617320766100726975732c206e69626820617420636f6e73656374657475722074656d707500732c206e756e63206c6f72656d206672696e67696c6c6120617263752c2069006d706572646965742072757472756d206e69736c206475692061206175677500652e205072616573656e7420706c6163657261742073617069656e2073656400206d69206d6f6c6c697320666163696c697369732061206e6563207075727500732e205072616573656e7420736f6c6c696369747564696e2066656c697320006d617373612c2076656c206d6174746973206c656f2068656e647265726974002061632e2053757370656e646973736520657569736d6f642064696374756d002074696e636964756e742e0a0a416c697175616d2064617069627573206c6f0072656d20657520736f64616c65732066617563696275732e204e756c6c612000747269737469717565206f64696f2065742072697375732064696374756d2c0020756c74726963696573206c6f626f72746973206c6967756c61207361676900747469732e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e204e756e632074656d7075732076656c206572617420766974610065206c6163696e69612e204e756c6c6120696e20656765737461732065726f00732e204e756c6c616d2076656c20646f6c6f722076656c2076656c69742070006c6163657261742076756c70757461746520696e20736564206c616375732e0020416c697175616d206c6f626f7274697320616e746520696e2074656c6c75007320696163756c69732c206120636f6d6d6f646f207175616d20616363756d0073616e2e2050726f696e2066657567696174206c6967756c61206964206e75006e632076756c70757461746520646170696275732e20457469616d20707265007469756d207669746165206475692073697420616d657420616c697175616d002e2041656e65616e206c6f626f727469732072757472756d206e6973692c2000612074656d7075732065726f7320666163696c697369732069642e204d617500726973206e6f6e2061726375206174206e6973692076697665727261206375007273757320657520616320646f6c6f722e0a0a4e756e6320696e206f64696f00206d692e204e616d206d617474697320736564206c6967756c61207369742000616d65742074656d706f722e20496e74656765722064696374756d207269730075732066617563696275732c2076656e656e6174697320616e74652065752c0020756c747269636573206d61757269732e20446f6e6563206e656320636f6e0064696d656e74756d2065782e2053656420666163696c69736973206f64696f00206475692c207669746165206672696e67696c6c61206d61757269732061750063746f72206e6f6e2e20496e74657264756d206574206d616c657375616461002066616d657320616320616e746520697073756d207072696d697320696e200066617563696275732e2053757370656e646973736520717569732074656c6c007573206c616f726565742c20756c7472696365732073656d206e65632c20730063656c6572697371756520656c69742e20536564207363656c65726973717500652065737420766f6c75747061742c20636f6e64696d656e74756d20616e74006520612c2076656e656e61746973206d617373612e204d6f726269206e65630020617563746f72206c65637475732c206163207072657469756d206e696268002e204675736365207363656c65726973717565206d61737361206e6f6e206300757273757320706f7274612e20566573746962756c756d206d65747573207000757275732c20636f6e736571756174206964206672696e67696c6c6120612c002074656d707573207068617265747261206c65637475732e2056657374696200756c756d20736f64616c6573206c6f626f7274697320756c7472696365732e000a0a4e616d2073697420616d657420626c616e646974206573742e204675730063652073697420616d65742074696e636964756e7420646f6c6f722e20446f006e65632076656c206e697369206c616375732e204d617572697320706f7375006572652075726e6120616320656c656966656e6420616c69717565742e205300757370656e6469737365206661756369627573206665726d656e74756d206c00696265726f2c20616320617563746f72206d617373612068656e647265726900742074656d706f722e20467573636520706f72747469746f72206172637520006163206c656374757320626962656e64756d20636f6d6d6f646f2e205365640020617563746f72206575206f64696f2076656c20616c69717565742e20436c0061737320617074656e742074616369746920736f63696f737175206164206c0069746f726120746f727175656e742070657220636f6e75626961206e6f73740072612c2070657220696e636570746f732068696d656e61656f732e2056697600616d7573206574206c756374757320656e696d2e20566573746962756c756d002074656d706f7220616e746520736564206d61747469732064696374756d2e002051756973717565207068617265747261206172637520656765742075726e006120756c74726963657320617563746f722e204d6f72626920656c65696665006e6420636f6e736571756174206d692069642068656e6472657269742e20460075736365206d617474697320616e746520636f6e64696d656e74756d20706f00737565726520736f64616c65732e20437572616269747572206c6f626f72740069732075726e612073697420616d6574206d61747469732065676573746173002e204d6175726973206665756769617420656c69742074656c6c75732c2075006c7472696369657320696d70657264696574206469616d2074656d707573200076656c2e0a0a566573746962756c756d206672696e67696c6c6120747269730074697175652075726e6120657520706f7274612e2050726f696e206665756700696174206e69736c207475727069732c207574206c6f626f727469732072690073757320696d706572646965742061742e2050686173656c6c7573207369740020616d657420616c69717565742066656c69732c20766974616520706f737500657265206d692e20416c697175616d2073616769747469732076617269757300206e696268206e6563206f726e6172652e2050656c6c656e746573717565200074696e636964756e742076697461652065737420657520616c697175616d2e00204475697320696163756c697320757420617263752073656420656c656d65006e74756d2e20467573636520616363756d73616e2c20646f6c6f72206e6f6e002074656d70757320616363756d73616e2c20646f6c6f72207175616d2061750063746f72206e657175652c2071756973206f726e61726520616e7465206c65006f2069642070757275732e2050686173656c6c75732073656420656c65696600656e6420656c69742e204372617320657520706f737565726520616e74652e0020496e20616e7465206c6f72656d2c2070686172657472612073697420616d00657420766573746962756c756d207365642c2072686f6e637573206964206a007573746f2e2055742074656d707573206469676e697373696d20766568696300756c612e204d616563656e6173206d61757269732076656c69742c2065676500737461732073697420616d6574207661726975732076697461652c2066616300696c697369732073697420616d6574206c6967756c612e0a0a4d6175726973002067726176696461206c656f2073697420616d6574206f7263692076656e65006e617469732c207574206d6178696d75732073617069656e20636f6e736571007561742e204d6f726269206e6563206f7263692065782e20566976616d757300207665686963756c61206469676e697373696d20707572757320736564207400696e636964756e742e20467573636520657569736d6f64206e6f6e20656e69006d20657420636f6d6d6f646f2e205072616573656e7420766f6c757470617400206d6f6c6573746965206f726e6172652e20566976616d757320636f6e6469006d656e74756d2076656c697420656c656d656e74756d2c207072657469756d00207475727069732065752c20626c616e6469742072697375732e204675736300652070656c6c656e746573717565206d6178696d7573206e697369206163200073656d7065722e20416c697175616d20757420657569736d6f642076656c6900742c2073656420656c656d656e74756d206c6f72656d2e204d616563656e610073206964207269737573206e6f6e206d61737361206772617669646120636f006d6d6f646f2e204e756c6c616d20696e20707572757320696420656c69742000666163696c6973697320636f6e6775652e2041656e65616e20636f6e677565002076756c707574617465206c616f726565742e20416c697175616d20656765007420656c69742074656c6c75732e205175697371756520737573636970697400207175616d206163206d6173736120626962656e64756d2065676573746173002e20416c697175616d2071756973206578206e6f6e2076656c697420736365006c6572697371756520756c6c616d636f727065722069642065676574206d6100676e612e2041656e65616e20612073656d206e6f6e2065726174206c6f626f007274697320636f6e6775652e0a0a43726173206e6f6e20647569206f64696f002e205175697371756520766f6c7574706174207363656c657269737175652000697073756d206174207661726975732e20536564206f726e6172652073656d00207365642076656e656e6174697320636f6e7365717561742e204475697320006f726e6172652076656e656e61746973206d6f6c6c69732e2053656420657800206e657175652c2065666669636974757220626962656e64756d20706c616300657261742065742c20736f6c6c696369747564696e2076656c206f7263692e0020496e7465676572206e696268206e657175652c20666163696c6973697320006e6f6e206d61757269732076656c2c20636f6e73656374657475722074726900737469717565206e756c6c612e204e756e632073697420616d657420706861007265747261206c656f2e204e756c6c616d206c656f206f7263692c20696d70006572646965742073697420616d657420696e74657264756d20717569732c2000696163756c6973206575206e69736c2e20416c697175616d2073656420747200697374697175652073656d2c206e6563206c6f626f7274697320746f72746f00722e204d616563656e617320736f64616c6573207075727573206e65632061006c697175616d20706f72747469746f722e20447569732075742066656c69730020657261742e0a0a437261732061206d6173736120696d706572646965742c0020616363756d73616e2072697375732069642c207375736369706974206e75006e632e20446f6e65632073656d70657220656e696d206575206d61676e612000636f6e7365717561742074696e636964756e742e2053757370656e64697373006520636f6e736571756174206c6563747573207669746165206d657475732000616c6971756574206c616f726565742e20436c61737320617074656e74207400616369746920736f63696f737175206164206c69746f726120746f72717565006e742070657220636f6e75626961206e6f737472612c2070657220696e63650070746f732068696d656e61656f732e20446f6e656320696e74657264756d20006469616d206174206e69626820616363756d73616e2c20657420617563746f0072206d61737361206c6163696e69612e20467573636520696420657820766900746165207269737573206c616f7265657420706f72746120636f6e64696d65006e74756d206567657420656e696d2e2050686173656c6c7573206c656374750073206f64696f2c20666163696c6973697320612074656d707573207365642c0020736f64616c6573206575206475692e204e616d20696e206d616c65737561006461206f64696f2e205175697371756520706c61636572617420697073756d002076656e656e617469732072697375732074656d707573206661756369627500732e2050656c6c656e74657371756520656c656d656e74756d20646f6c6f72002071756973206672696e67696c6c612074656d7075732e20457469616d207400696e636964756e7420766172697573206c6f72656d20696e206f726e617265002e204e616d206120656c656d656e74756d206f7263692e2050686173656c6c0075732067726176696461206e69736c20657520656c697420756c74726963690065732c20657420626962656e64756d2074656c6c75732066696e696275732e000a0a4372617320626c616e6469742070756c76696e6172206d657475732c2000616320696e74657264756d2066656c6973206d6178696d757320626962656e0064756d2e2041656e65616e20626962656e64756d20696d706572646965742000636f6e64696d656e74756d2e204e616d206e6f6e206c61637573206c696775006c612e20517569737175652073656420766573746962756c756d207361706900656e2e20536564207665686963756c612074696e636964756e74206c656f200071756973206c6163696e69612e20536564206c61637573206c6f72656d2c2000756c747269636573206e6563206c6f72656d207365642c20706c6163657261007420766f6c7574706174206d657475732e205365642075742073656d207369007420616d657420746f72746f7220756c747269636573207375736369706974002076656c206174207475727069732e0a0a5574207669746165206175677565002073697420616d657420656c69742070756c76696e61722068656e64726572006974206e65632061206c6967756c612e20446f6e656320706f727461206e6900736920636f6d6d6f646f20616e7465207665686963756c612073656d706572002e2055742066696e696275732c20707572757320757420666175636962757300206d6f6c6c69732c2066656c6973206e65717565206d616c65737561646120006e6962682c2061632076656e656e61746973206e756c6c612076656c69742000612066656c69732e204d617572697320677261766964612c206c6967756c6100206964206c6163696e696120766976657272612c206a7573746f206c69626500726f20766172697573206c6967756c612c2073697420616d657420706f72740061206c6f72656d206c696265726f2061206d657475732e20416c697175616d0020756c6c616d636f72706572206d61757269732073617069656e2c2061206700726176696461207075727573207363656c6572697371756520717569732e20004e756c6c616d2072757472756d20746f72746f722073697420616d6574206f0064696f20656666696369747572207072657469756d2e2044756973206c616f0072656574206566666963697475722076656c69742c20612073656d706572200066656c69732e2050726f696e206e696268206c616375732c20637572737573002073697420616d6574206c656374757320717569732c2065666669636974750072207665686963756c61206475692e20446f6e65632061726375206c656f2c002072757472756d2075742063757273757320696e2c207363656c6572697371007565206574206c616375732e204d616563656e61732074696e636964756e740020617263752061206e6571756520666575676961742c2076656c206469637400756d206e69736c2073656d7065722e20446f6e6563206e756e632076656c6900742c20636f6d6d6f646f20696420746f72746f722076697461652c20616c690071756574206661756369627573206c6f72656d2e2041656e65616e2076617200697573206d61747469732073617069656e2065676574206d6f6c6c69732e2000446f6e65632076697461652075726e6120756c6c616d636f727065722c20640069676e697373696d20656e696d2076697461652c20766573746962756c756d00206d657475732e2050686173656c6c757320636f6e7365637465747572206500726f7320696d706572646965742c20677261766964612065726f732069642c00206d6f6c6c69732076656c69742e0a0a5574206163206c6163757320636f6e0076616c6c69732c207665686963756c61206e6571756520717569732c2065660066696369747572206f7263692e205574206d69206c616375732c206566666900636974757220657420736f6c6c696369747564696e2075742c206661756369006275732073697420616d657420616e74652e2053656420636f6e64696d656e0074756d206567657420656c697420617420677261766964612e20457469616d00206e6563206e69736c2073656420656e696d20706f72746120706c616365720061742e205072616573656e74206672696e67696c6c6120736167697474697300206c656f2c2076656c2074656d706f72206f64696f206d6f6c6c69732076690076657272612e20566573746962756c756d2066696e69627573206a7573746f002072697375732c2065752073656d706572206475692066696e69627573206100632e204d617572697320706c616365726174206c6563747573206e6973692c00206e6f6e20766573746962756c756d20746f72746f72206d6174746973206100632e204e756c6c61206e656320626962656e64756d207175616d2e0a0a53650064206574206469616d2065676574206c696265726f2070756c76696e617220006672696e67696c6c6120756c74726963696573206964207475727069732e20005072616573656e7420657520656e696d206672696e67696c6c612c20706c61006365726174206172637520696e2c20766573746962756c756d206e65717565002e20457469616d207665686963756c6120657261742064696374756d206e6900626820657569736d6f6420736f6c6c696369747564696e2e20507261657365006e74206e65632074757270697320616c69717565742c206c6f626f7274697300206c656f20717569732c207665686963756c61207175616d2e205068617365006c6c75732073656420626962656e64756d206e6973692e204d616563656e61007320696420646f6c6f72206567657420616e746520626c616e6469742064610070696275732e20446f6e656320656c656d656e74756d20736564206e696268002065752073616769747469732e20467573636520636f6e6775652073656d20006c6f72656d2c206e6f6e206672696e67696c6c61206f64696f20617563746f007220612e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b20004d616563656e61732073656420636f6e7365637465747572206a7573746f2e0020536564206566666963697475722061207175616d2073697420616d657420006d6178696d75732e0a0a416c697175616d20636f6d6d6f646f20616e746520006574206d6f6c657374696520706f72747469746f722e204d616563656e61730020766f6c7574706174206e69736c207363656c657269737175652c206c6f62006f72746973206d61757269732061632c2064696374756d206d617373612e200050686173656c6c7573206d616c657375616461206c6163696e6961206f6469006f2069642066696e696275732e204d616563656e61732061206d61676e6120006f64696f2e20467573636520697073756d2075726e612c2073616769747469007320666175636962757320616e7465207365642c20756c747269636573206400617069627573206d61757269732e2053757370656e6469737365207574206f0064696f20717569732073656d206461706962757320616c697175616d20696e0020696420646f6c6f722e205574206d61747469732071756973206f64696f20007669746165206c6f626f727469732e20416c697175616d20616320746f7274006f72206163206d657475732073656d70657220766976657272612e20416c69007175616d206e65632064696374756d206d617373612c2076656c2073757363006970697420656c69742e2044756973207365642073656d206575206e6962680020636f6e736563746574757220696163756c69732076656c207574206175670075652e2044756973207669746165206c75637475732075726e612e204e616d00206e756c6c61206e6962682c20626c616e6469742073697420616d6574207300656d7065722076697461652c206d6f6c6c6973206c6f626f72746973206e75006e632e2053656420757420666175636962757320746f72746f722c20656765007420696163756c6973206f7263692e20496e206120626c616e64697420647500692c206174207068617265747261206d657475732e20457469616d2068656e00647265726974206c696265726f207669746165206c656374757320737573630069706974206f726e6172652e2051756973717565206d6174746973206c6163007573206174207068617265747261207661726975732e0a0a4d616563656e61007320666163696c6973697320656c697420756c74726963657320707265746900756d206c6f626f727469732e2046757363652076656c20766573746962756c00756d20657261742e20457469616d206175677565206d617373612c20666575006769617420766974616520657261742061632c206c6f626f7274697320766f006c7574706174206d61676e612e20446f6e6563206d616c6573756164612073006564206c6967756c6120717569732066696e696275732e204e756c6c616d20006566666963697475722076697665727261206475692c206e6f6e2076657374006962756c756d20746f72746f7220696e74657264756d2076656c2e2050726f00696e20616e7465206573742c20626c616e64697420696e207363656c65726900737175652073697420616d65742c20756c74726963696573206e6563206572006f732e205365642065726174206e69736c2c2067726176696461206574207400656d706f722065742c206665726d656e74756d2073697420616d6574206578002e2053656420656666696369747572206d6920766974616520657569736d6f0064206672696e67696c6c612e2053757370656e646973736520656765742061007563746f72206e6962682e20446f6e6563206e656320706861726574726120006f64696f2c2068656e64726572697420636f6e64696d656e74756d20646f6c006f722e0a0a4d6f72626920696d706572646965742c206469616d206e6563200076756c7075746174652072757472756d2c20746f72746f72206c6f72656d2000696e74657264756d20616e74652c207669746165206375727375732074757200706973206f64696f206e6f6e206d61676e612e20446f6e6563206c616f7265006574207669746165206d61676e612073697420616d657420617563746f722e00204372617320617563746f72206e69736c2071756973207661726975732063006f6d6d6f646f2e204d6175726973206174206c6163696e6961206e756c6c61002e20566573746962756c756d20666575676961742073656d206174206d61730073612066617563696275732064696374756d2e2046757363652076656c207300617069656e2073697420616d6574206a7573746f2073757363697069742061006363756d73616e2075742076656c206f7263692e204e756c6c612066616369006c6973692e204e756c6c616d20736f6c6c696369747564696e20737573636900706974206e6973692c20657520616363756d73616e206d6574757320636f6e00736563746574757220766573746962756c756d2e2051756973717565207465006c6c7573206d657475732c2073656d7065722074656d707573206d657475730020717569732c2064696374756d20656c656d656e74756d2066656c69732e200053757370656e646973736520636f6e76616c6c697320707572757320616320006c61637573207072657469756d2c20616320616c697175657420657374206600696e696275732e2050656c6c656e74657371756520626962656e64756d20700075727573206d61676e612c2073697420616d657420637572737573206e65710075652066657567696174206e6f6e2e2043757261626974757220696e206d610078696d7573206a7573746f2e2041656e65616e20696163756c6973206c616300696e69612072686f6e6375732e0a0a536564206672696e67696c6c61207365006d206163206d61737361206d616c6573756164612c206d617474697320696d0070657264696574207175616d2073757363697069742e2043726173206c616300696e69612061632065782076697461652072757472756d2e20536564206578002066656c69732c20706f727461206e656320617263752061632c2066696e6900627573206c7563747573207475727069732e204475697320697073756d206c00696265726f2c20696e74657264756d20757420696e74657264756d2075742c0020656c656d656e74756d206163206a7573746f2e204d6f7262692074726973007469717565206c6f626f7274697320706c6163657261742e2050656c6c656e007465737175652074696e636964756e742074656d70757320656e696d2061740020636f6e6775652e204e756c6c61206d61747469732074696e636964756e7400206e6973692c2061742072686f6e63757320616e746520656c656966656e64002068656e6472657269742e204e756c6c616d2064696374756d20706861726500747261206475692e20566573746962756c756d206c75637475732065737420007574206175677565207472697374697175652c2073697420616d657420656c00656d656e74756d2074656c6c757320656c656966656e642e20496e746567650072206e6563206f726e617265206a7573746f2c207175697320706f72746120006469616d2e2051756973717565206e6f6e206e697369206e6f6e206c6f7265006d2070756c76696e617220706f73756572652061206567657420656c69742e00205365642065676574206c6163696e69612073656d2e2050686173656c6c750073206e6f6e206e756c6c612074656d7075732c207363656c6572697371756500206c696265726f2076656c2c207068617265747261206e6962682e0a0a5375007370656e6469737365206469676e697373696d20636f6e67756520657374200069642070686172657472612e20447569732076697461652066656c69732069006e206c656374757320666163696c6973697320706861726574726120736564002061632070757275732e2050656c6c656e7465737175652076656e656e617400697320706c616365726174206d61757269732c206120626962656e64756d20006d6175726973206566666963697475722076697461652e204d6f7262692065006666696369747572206d65747573206575207363656c65726973717565206600617563696275732e20566573746962756c756d20616e746520697073756d20007072696d697320696e206661756369627573206f726369206c75637475732000657420756c74726963657320706f737565726520637562696c6961206375720061653b2041656e65616e20696e74657264756d20666163696c6973697320710075616d20717569732066617563696275732e20566573746962756c756d2061006e746520697073756d207072696d697320696e206661756369627573206f72006369206c756374757320657420756c74726963657320706f73756572652063007562696c69612063757261653b205072616573656e74206c6f626f7274697300206d61676e612071756973206e697369206d616c657375616461206d617869006d75732071756973206e6f6e206c6f72656d2e20437572616269747572206e006f6e206e756c6c612073697420616d657420657261742074696e636964756e007420666163696c6973697320617420657420746f72746f722e204d6f72626900206964206175677565207669766572726120697073756d2070756c76696e610072207363656c657269737175652071756973206e65632076656c69742e204e00616d2076656c206f64696f20636f6d6d6f646f2c20706f72746120617263750020696e2c20666163696c697369732073617069656e2e204e756e63207369740020616d65742076656e656e6174697320657261742c206174206c616f72656500742061756775652e20446f6e656320617563746f722070757275732071756900732074656d706f7220666575676961742e20496e2071756973206c6f72656d002065676574206e756e63206c6163696e696120646170696275732e20446f6e00656320696163756c6973206573742076656c2072686f6e63757320616c69710075616d2e0a0a4d6f726269206d61676e61206f64696f2c2076656e656e61740069732076697461652073656d2069642c20646170696275732074656d70757300206e756e632e204d6f7262692066617563696275732074656d706f72206d610078696d75732e205175697371756520657520696d70657264696574206d6167006e612c20696420616c697175616d2075726e612e20446f6e6563207574206c00696265726f206475692e20457469616d206d6174746973206e756c6c6120710075697320617567756520696e74657264756d2c2061206d6f6c657374696520006f726369207472697374697175652e20446f6e6563206e656320756c6c616d00636f72706572206e6962682c2061742074696e636964756e74207075727573002e204475697320626c616e646974206e69626820756c74726963696573206f0072636920616363756d73616e20736f6c6c696369747564696e2e20446f6e6500632069642061756775652071756973206e65717565206c616f72656574206f00726e6172652e204e756e632072757472756d206a7573746f2075742065676500737461732068656e6472657269742e20437261732074656d70757320696e20006d617572697320612074696e636964756e742e0a0a557420706f7274746974006f722074656d70757320616c697175616d2e204d616563656e617320677261007669646120636f6e736571756174206d692c2065742074726973746971756500206c6f72656d20666575676961742073697420616d65742e20507261657365006e7420736564206d6178696d7573206f64696f2c206567657420636f6e736500637465747572206c616375732e20416c697175616d20647569206e65717565002c207669766572726120636f6e73657175617420636f6e6775652076656c2c0020636f6e736571756174206964206f7263692e2041656e65616e2066696e69006275732065782073656d706572206e69736c206d61747469732c207175697300206c756374757320656e696d206c6163696e69612e2050726f696e20696420006d61737361206d61757269732e20496e74656765722065752061726375206c006163696e6961206c656374757320657569736d6f64206c75637475732e2049006e20766f6c7574706174206e6f6e206d657475732073697420616d65742063006f6e76616c6c69732e204e616d206c6967756c61206d657475732c20666572006d656e74756d2065752074656c6c75732069642c20656c656966656e642076006172697573206e657175652e204675736365206175677565206c6f72656d2c0020706861726574726120612073656d2076656c2c20636f6e64696d656e7475006d206d617474697320646f6c6f722e2046757363652073656d706572206e6900736c20696e2075726e612073757363697069742c206567657420707265746900756d206a7573746f20736f6c6c696369747564696e2e0a0a496e7465676572002076697461652072686f6e637573206573742c207175697320626962656e6400756d2072697375732e20457469616d206d616c657375616461206175677565002065752074656d70757320636f6e76616c6c69732e205175697371756520710075697320656c697420666575676961742c20756c6c616d636f72706572206e0069626820696e2c206c7563747573206d617373612e2050686173656c6c75730020636f6e76616c6c69732073617069656e2076656c206c616375732074696e00636964756e742c206e656320657569736d6f64206573742070656c6c656e740065737175652e20416c697175616d20706f727461206a7573746f206120756c00747269636965732068656e6472657269742e204d6175726973206c756374750073206175677565206575206c656374757320646170696275732c2075742070006f72746120656c69742070656c6c656e7465737175652e20496e74656765720020736564206d61676e6120757420646f6c6f722074696e636964756e7420660072696e67696c6c61206964206174206475692e204d6f72626920656c65696600656e642072697375732073697420616d6574206d61676e612074656d707573002c207665686963756c61206c6f626f72746973206f72636920736f6c6c69630069747564696e2e204e616d2065742074656d706f72206d61676e612e204d6f007262692071756973207072657469756d2072697375732c2075742076656e65006e617469732074656c6c75732e204d617572697320706f72746120646f6c6f007220657420636f6e73656374657475722068656e6472657269742e204e616d002070656c6c656e7465737175652065676573746173206f64696f207472697300746971756520677261766964612e2050656c6c656e74657371756520696420006665726d656e74756d206469616d2e20496e20636f6e736563746574757220006d692076656c206c696265726f20657569736d6f642064696374756d2e2044006f6e656320736167697474697320616e7465206d617373612e20507261657300656e74206163206175677565206e657175652e0a0a536564206d6173736120007475727069732c20636f6e76616c6c69732065676574207665686963756c61ba020000002065752c20636f6e64696d656e74756d20736564206d657475732e205365640020636f6e64696d656e74756d20766f6c7574706174206573742c2076656c200070756c76696e6172206e69736920736f6c6c696369747564696e206e6f6e2e0020496e7465676572207574206d61676e6120657420746f72746f72206469630074756d20636f6e64696d656e74756d20696e20706f727461206573742e2049006e2073697420616d65742061756775652065782e204e756e632076657374690062756c756d206964206c616375732076656c2070756c76696e61722e205072006f696e2070756c76696e6172206d6173736120757420616e7465206d617869006d75732c207669746165206c7563747573207175616d20656765737461732e002044756973206d6178696d757320616e74652073697420616d6574206d616c00657375616461206469676e697373696d2e204675736365207574206c656f2000626c616e6469742c20666163696c69736973206d657475732061742c20636f006e736571756174206c696265726f2e20437261732076656e656e6174697320006e69736920656765742075726e61206665726d656e74756d2c206174206669006e69627573207175616d20696163756c69732e20517569737175652076656c00206c6f72656d2065782e2050726f696e206a7573746f2066656c69732c20730063656c6572697371756520736564206f64696f2069642c20666575676961740020736f6c6c696369747564696e207175616d2e20496e74656765722076617200697573206f7263692073697420616d65742076756c7075746174652068656e006472657269742e204d6f726269206d6178696d75732c2065726f73206e6f6e0020636f6e7365717561742066696e696275732c207175616d206e6962682075006c6c616d636f72706572206475692c20616320696e74657264756d2073656d0020616e746520766974616520746f72746f722e204375726162697475722076006974616520706861726574726120656e696d2e20437261732073757363697000697420636f6e677565206c656f2c20696e20736f6c6c696369747564696e20006e697369207472697374697175652061742e20566976616d757320706f7274007469746f7220746f72746f7220636f6e64696d656e74756d2c20696163756c006973206c6967756c612075742c207472697374697175652065726f732e0a0a00496e206575206c756374757320616e74652e204d6f726269206d6178696d7500732075726e61206e6f6e206c6967756c6120706f73756572652c206120766f006c7574706174206f7263692073616769747469732e204e616d20617420656c0069742065676574206d692066696e696275732073656d70657220756c747269006365732073656420616e74652e205072616573656e742065752073656d70650072206f7263692e204e616d2071756973206469616d206e65632065737420650066666963697475722073656d7065722e204d6f7262692073697420616d657400206f64696f2070656c6c656e746573717565206e69736c20626c616e6469740020736f64616c65732e20447569732067726176696461206964206c6f72656d0020657520616c69717565742e205365642065726f73207475727069732c207300757363697069742073697420616d657420736f64616c6573207365642c2066006163696c69736973206574206573742e204f72636920766172697573206e6100746f7175652070656e617469627573206574206d61676e697320646973207000617274757269656e74206d6f6e7465732c206e6173636574757220726964690063756c7573206d75732e20566976616d75732073656d7065722074656d706f0072207661726975732e20416c697175616d20696420616c697175616d20646900616d2e0a0a416c697175616d20746f72746f72206573742c206c7563747573002065752075726e6120717569732c2074656d7075732068656e6472657269740020617263752e20566573746962756c756d2073697420616d657420656c656d00656e74756d206c656f2e2053757370656e64697373652071756973206e756e006320612073617069656e2068656e64726572697420696d706572646965742e002053656420696e2065676573746173206c696265726f2e20446f6e65632063006f6e6775652073697420616d6574206e6571756520646170696275732065750069736d6f642e204675736365207363656c657269737175652076656c20707500727573206964207363656c657269737175652e2050726f696e2076656c2070006f72747469746f72206e69736c2e0a0a4d6f726269206964206475692065670065742074757270697320696163756c697320636f6e6775652e204e756c6c61006d20617563746f722c206c6967756c61206567657420636f6d6d6f646f20700072657469756d2c206c696265726f206e756c6c6120756c7472696369657320006f64696f2c2075742072757472756d2061726375206172637520696e206e690073692e204d61757269732065676574206c6163757320696e20657820766172006975732073616769747469732073656420696e20656c69742e204d617572690073206d6f6c6573746965206f64696f206574206f7263692070686172657472006120706c6163657261742e20496e746567657220696e20747572706973206500676574206c696265726f20636f6e7365637465747572206c6f626f7274697300206575206e6f6e206c616375732e204d616563656e61732064696374756d20006c656f2074656d707573206c61637573206d617474697320736f64616c6573002e20446f6e6563206a7573746f206f64696f2c2074696e636964756e7420610063206172637520656765742c20666175636962757320706f73756572652064006f6c6f722e205072616573656e742065676574206e756e63206e6563206665006c697320696e74657264756d2072686f6e6375732e20566573746962756c75006d20656c656d656e74756d206461706962757320636f6e7365637465747572002e2053757370656e6469737365206964206e756e63206d61747469732c206c007563747573206e6962682073697420616d65742c20636f6e64696d656e7475006d2065782e20496e7465676572206f726e6172652075726e6120766974616500206e697369206c7563747573206469676e697373696d2e2041656e65616e200074696e636964756e742068656e647265726974207269737573206e6f6e2061006363756d73616e2e204e756c6c6120617420736f64616c6573206e69736c2e0020496e74656765722068656e647265726974207669746165206d61676e61200076697461652073757363697069742e20437261732064617069627573206c65006374757320736564206c656f207363656c657269737175652073656d706572002e204d61757269732061207269737573206e756c6c612e0a0a5365642069610063756c69732c206c656f20757420766573746962756c756d206672696e6769006c6c612c2066656c69732073617069656e20636f6e76616c6c6973206c6563007475732c2076656c206c616f72656574207175616d206f7263692061206d6100757269732e204e756c6c616d20657520616363756d73616e2073617069656e002e2050656c6c656e746573717565206d617474697320736f64616c6573206d0061757269732c20757420636f6e64696d656e74756d206d61676e6120636f6e006775652076656c2e2041656e65616e20706f72747469746f72206e6973692000616320657261742066617563696275732073757363697069742e205068617300656c6c757320656c656d656e74756d2074696e636964756e74207175616d20006e656320636f6e64696d656e74756d2e204375726162697475722066696e6900627573206e756c6c612076656c206c6163696e696120696d70657264696574002e204d616563656e61732066657567696174206d617474697320646f6c6f72002c206e656320616363756d73616e20697073756d2074656d706f722075742e002050686173656c6c757320617563746f7220666163696c69736973207275740072756d2e20536564207669746165206d69206e6f6e206f64696f2070656c6c00656e74657371756520626c616e64697420696e2061206d61676e612e0a0a5300656420696e206469616d20636f6e6775652c20636f6d6d6f646f20746f7274006f7220612c20657569736d6f64206c6967756c612e20496e2061632065666600696369747572206e756e632c2076656c20756c6c616d636f727065722069700073756d2e20416c697175616d2076656c206469616d206665726d656e74756d002c20736f6c6c696369747564696e20617263752065742c20656c656d656e7400756d2073617069656e2e2043726173206c656f206d657475732c2072686f6e006375732071756973206d617373612065752c20677261766964612069616375006c697320657261742e2043757261626974757220756c747269636573207369007420616d657420656e696d20757420617563746f722e2041656e65616e20610074206175677565206163206a7573746f2074656d70757320626962656e6475006d2073656420696d7065726469657420746f72746f722e204e756c6c616d2000736564206d61757269732073617069656e2e20447569732070656c6c656e740065737175652075726e6120696e2066696e69627573206d6f6c65737469652e00205072616573656e74206e6f6e207072657469756d206d61676e612c206e650063206c6163696e696120746f72746f722e2050726f696e2066617563696275007320656c656d656e74756d206c6f72656d2c2072686f6e6375732076756c7000757461746520657820616c69717565742061632e0a0a416c697175616d207400696e636964756e7420617263752073617069656e2c20616c697175657420730075736369706974206c656f20656c656d656e74756d2076697461652e204372006173206d617474697320617263752076656c206f726e617265206665726d65006e74756d2e204d6f72626920636f6e76616c6c6973206e697369206d6f6c65007374696520657261742073656d7065722c20736564206c7563747573206e65007175652076756c7075746174652e2053757370656e6469737365206d616c650073756164612c20646f6c6f722076656c20756c74726963657320696d70657200646965742c206d69206e69626820756c74726963696573207475727069732c00206e6563207072657469756d206c696265726f20697073756d207669746165002072697375732e20416c697175616d20696e20636f6e677565206c61637573002c20666575676961742076756c7075746174652065726f732e20496e206c61006f72656574206e69626820696e2076756c7075746174652076657374696275006c756d2e205574206661756369627573206f726e617265206e756e63207369007420616d657420656c656966656e642e205072616573656e7420706c616365007261742073617069656e2076656c20656c69742074656d706f722062696265006e64756d2e204e756c6c612071756973207665686963756c6120617263752e002053757370656e646973736520736f64616c6573206c656f2061632075726e006120616c69717565742076756c7075746174652e20536564206d6f6c6c6973002c206c6163757320657520656c656966656e6420736f64616c65732c206d6100676e61206172637520766172697573206c656f2c20657520626c616e646974002066656c6973206572617420657420746f72746f722e205072616573656e74002074656d7075732073697420616d6574206d61676e61207669746165206f72006e6172652e20416c697175616d20656c656966656e642076656c206f64696f0020696420636f6e7365717561742e204d6175726973206574206e657175652000717569732073617069656e20706f737565726520756c74726963696573206500752073697420616d65742075726e612e20437261732072686f6e637573206500726f732076656c2073656d2070756c76696e61722066696e69627573206120006e6f6e2072697375732e0a0a536564206c6f626f72746973206f64696f20710075616d2c206e6f6e20637572737573206e756c6c6120616c697175616d206e006f6e2e20446f6e65632061726375206573742c20666163696c697369732069006e20666175636962757320612c2070686172657472612073697420616d657400206e69736c2e205175697371756520696163756c6973206c656f206e6f6e2000656c656d656e74756d20706c6163657261742e205365642076657374696275006c756d206c656f20616e74652c20616320636f6e76616c6c697320647569200073616769747469732069642e20496e20686163206861626974617373652070006c617465612064696374756d73742e20536564206d6f6c657374696520636f006e76616c6c69732066656c69732c20696e2070656c6c656e7465737175652000616e746520696e74657264756d20612e20566976616d757320706c6163657200617420656c656966656e6420616e74652e2050656c6c656e746573717565200073697420616d6574206f64696f207665686963756c612c207361676974746900732065737420656765742c20656c656d656e74756d206c6f72656d2e204d61007572697320656c6974206d61676e612c20636f6e6775652076656c2065726f0073206e65632c20696163756c6973206d616c65737561646120616e74652e2000566976616d757320696e20656666696369747572206f64696f2c20717569730020616c697175616d206e756c6c612e204e756c6c61207574206469676e69730073696d206475692e20496e206567657374617320666163696c69736973206c006f72656d2c206e6f6e20656c656d656e74756d20647569207665686963756c0061206e65632e204e756c6c61206d616c65737561646120706f72747469746f00722065782061206f726e6172652e204e756c6c61206e6f6e2076617269757300206f64696f2e2041656e65616e206e656320696d70657264696574207361700069656e2e20446f6e6563206e69736920617263752c2070756c76696e617220007072657469756d206d616c6573756164612061632c20706f72746120766974006165207175616d2e0a0a437572616269747572206d6f6c65737469652c206d006920696e74657264756d206c7563747573206375727375732c207269737573002073617069656e206c6f626f72746973206c656f2c206174206566666963690074757220617567756520656c6974207365642074656c6c75732e204e756e6300207375736369706974206c7563747573206e69736c2073697420616d65742000626962656e64756d2e20446f6e6563206e6f6e20637572737573207075727500732c206163206661756369627573206a7573746f2e2050726f696e2061756300746f7220766f6c7574706174206e756e632c20696e2074726973746971756500206e69736c20626962656e64756d2061742e2053757370656e6469737365200076656e656e61746973206e756e63206e69736c2c206e6563206772617669640061206c696265726f2074726973746971756520696e2e20517569737175652000706c6163657261742061206e69736c20616320706c6163657261742e204165006e65616e20756c74726963696573206c696265726f20696420697073756d200072686f6e6375732c2073697420616d657420616c697175616d20656e696d20006c75637475732e20447569732076656e656e6174697320646f6c6f72206574002074656c6c757320636f6e736571756174206c6f626f727469732e20446f6e00656320696e206469616d20706f73756572652c206665726d656e74756d207200697375732065742c2070756c76696e6172206e657175652e0a0a496e746567006572206e6563206e6962682065752074656c6c7573207072657469756d2069006e74657264756d206174206574206469616d2e204e756c6c612070656c6c65006e746573717565206f64696f20717569732065726f7320656765737461732000736f64616c65732e2043757261626974757220656765742074656d70757320006469616d2e2050656c6c656e74657371756520756c747269636965732061720063752065782c206120696d70657264696574206a7573746f20706f7375657200652076656c2e2050726f696e2076756c70757461746520736f64616c657320006d617373612061742070686172657472612e20496e7465676572206e6f6e20006d61737361207574206c6967756c6120666575676961742074656d7075732e0020517569737175652073616769747469732076656c206e756e6320757420740072697374697175652e2041656e65616e2075742074656d706f72206a757374006f2e20446f6e656320636f6e677565206e69736c20736564207175616d206d006f6c6573746965206d6f6c6c69732e204e756c6c616d20706c616365726174002c20747572706973206567657420677261766964612072757472756d2c206600656c69732076656c697420616c697175616d2065726f732c20696420656c65006d656e74756d206c6967756c612075726e6120696420657261742e204e756c006c61206e65632072686f6e6375732073656d2e205574206e656320766568690063756c612065782c2076656c2068656e647265726974206e657175652e2055007420706c6163657261742076656c69742076656c2076656c69742068656e640072657269742c207669746165206665726d656e74756d207269737573206d6f006c65737469652e0a0a4d6175726973206f726369206c65637475732c20696d0070657264696574207365642066696e69627573206e65632c20616c69717561006d2076656c206e6962682e20566573746962756c756d206672696e67696c6c006120616363756d73616e206e756e63206574206d6f6c65737469652e205574002065742065726174206a7573746f2e2050656c6c656e74657371756520677200617669646120617263752070757275732e2041656e65616e20696e206e6962006820766974616520617263752064696374756d2074696e636964756e74206900642065752066656c69732e205072616573656e7420657420656c697420696400206d6920636f6e736563746574757220616c697175616d2e2056657374696200756c756d20696e20656e696d2064696374756d2c20626962656e64756d206500726174206e6f6e2c20756c74726963696573206f64696f2e2050656c6c656e0074657371756520636f6e76616c6c6973206f726369206e6973692c206e65630020756c74726963696573206f64696f20706f73756572652073697420616d6500742e0a0a4d616563656e61732073697420616d6574206665726d656e74756d00206e69736c2e20566573746962756c756d20616e746520697073756d20707200696d697320696e206661756369627573206f726369206c75637475732065740020756c74726963657320706f737565726520637562696c6961206375726165003b205072616573656e74206174206e756e6320696e206d61676e6120636f6e00736571756174207363656c657269737175652e204d616563656e617320696e00207175616d207574206a7573746f2074696e636964756e7420617563746f72002e2050686173656c6c757320757420646f6c6f72206d657475732e20496e200073656d706572206d6920736564206c6f72656d207068617265747261207268006f6e6375732e204675736365206567657420657374206c616f726565742c20007361676974746973206c696265726f2073697420616d65742c206665756769006174206e6962682e204d6f72626920646170696275732075726e6120616320007175616d206665726d656e74756d2072686f6e6375732e20446f6e65632063006f6e76616c6c697320657569736d6f64206469676e697373696d2e204375720061626974757220757420747269737469717565206c6967756c612e0a0a536500642072757472756d2074696e636964756e74207472697374697175652e204e00756e63206d69207175616d2c20637572737573206574207665686963756c610020656765742c2074696e636964756e74206e6f6e20646f6c6f722e20446f6e00656320617563746f722066696e69627573206f726e6172652e204d6f72626900207665686963756c612c206e69736c2076656c20636f6d6d6f646f20706f7200747469746f722c20646f6c6f72206e756e6320736167697474697320646961006d2c20656765742066617563696275732073617069656e2065782076656c20006d61676e612e204375726162697475722076656c206c6967756c61207369740020616d6574206c6967756c6120646170696275732066696e696275732e2045007469616d2073697420616d6574206c6f72656d206c65637475732e204e756c006c616d206665726d656e74756d206e69736c206c696265726f2c207669746100652074696e636964756e74207075727573206c6163696e696120717569732e00204d6f726269207574206d6f6c657374696520697073756d2c206575206d6f006c6573746965206c6967756c612e2050686173656c6c7573206574206c656300747573206a7573746f2e20566976616d7573206578206d61676e612c20636f006e7365717561742076656c206a7573746f2076656c2c2074656d706f722061006c697175616d20616e74652e205365642066696e6962757320736564206d6100737361207175697320636f6d6d6f646f2e20446f6e656320696e206e69626800206e65632074656c6c757320636f6e677565206469676e697373696d206567006574207669746165206e756c6c612e204475697320656c656966656e642070006c616365726174207269737573206120706c6163657261742e204d617572690073206e6563206c65637475732068656e6472657269742c207361676974746900732076656c697420636f6e64696d656e74756d2c206567657374617320647500692e0a0a4e616d20696163756c69732076656c697420717569732075726e610020706f7274612073616769747469732e2041656e65616e20636f6d6d6f646f00206e69736c206e656320697073756d206c6f626f727469732c20626962656e0064756d2065666669636974757220656e696d20636f6e64696d656e74756d2e002050726f696e206172637520656c69742c206665726d656e74756d2075742000656765737461732061742c206c616f726565742076656c206e69736c2e2049006e746567657220626962656e64756d20747572706973207574206469616d20006665726d656e74756d2c2065752074656d707573206c656f206672696e6769006c6c612e204d616563656e61732076656c697420617263752c20636f6e6469006d656e74756d20696d7065726469657420657261742065742c206661756369006275732076756c707574617465206c65637475732e2043757261626974757200206d6574757320656e696d2c206672696e67696c6c6120757420666163696c00697369732061632c20616363756d73616e20696e20697073756d2e204e756c006c616d207665686963756c61206c6163696e6961206d617373612c2076656c00206661756369627573206f64696f20636f6e64696d656e74756d2061742e20004d617572697320706f72747469746f722065726f73206d61676e612c20757400206d6178696d75732074656c6c7573206665726d656e74756d2069642e2056006976616d7573207574206c6563747573206f726e6172652c20706f7274746900746f72206469616d20656765742c20756c6c616d636f72706572206e696268002e20447569732076656e656e617469732074656d706f7220657261742c207500742076617269757320657374206c6f626f727469732076656c2e205068617300656c6c757320736564206578206c65637475732e205365642076656c207361007069656e20616c697175616d2c20696e74657264756d206475692069642c2000656c656966656e64206f7263692e0a0a5072616573656e74206174206c6f62006f72746973206d657475732e204e616d2074656d707573207175616d20647500692c206e6563206c7563747573206d617373612074696e636964756e742061002e2050656c6c656e74657371756520616363756d73616e2076656c697420750074206175677565206d617474697320636f6e76616c6c69732e205574206567006573746173206f64696f20656e696d2c206163207669766572726120616e74006520636f6e76616c6c69732075742e2041656e65616e20696e2064756920610074207175616d206665726d656e74756d2072757472756d2e20566976616d750073206567657420636f6e76616c6c6973206c65637475732e20457469616d2000657569736d6f64206672696e67696c6c6120746f72746f722c206e65632069006e74657264756d206a7573746f206d61747469732065752e204e756c6c616d00206d6178696d7573206e696268206469616d2c206575206c6f626f7274697300206a7573746f207072657469756d2076697461652e2051756973717565207400696e636964756e7420646f6c6f722061742075726e6120636f6e64696d656e0074756d2c207669746165206d616c6573756164612065737420706f7274746900746f722e2050656c6c656e746573717565207669746165206475692065782e0020566976616d757320766f6c757470617420697073756d207574207475727000697320656c656d656e74756d20706f7274612e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d617572697320736564200066656c6973206e756c6c612e205072616573656e742076656c207269737573002076656c69742e0a0a446f6e656320706f727461206174206469616d207365006d70657220616c69717565742e2041656e65616e20637572737573206c6f7200656d206e6f6e2076617269757320636f6d6d6f646f2e20536564206e65717500652065726f732c20656666696369747572206e6563206469616d20696e2c20007472697374697175652076697665727261206469616d2e2053757370656e64006973736520746f72746f72206475692c20657569736d6f64206e6563206e75006c6c612061632c20616c697175657420756c74726963696573206c6f72656d002e2050686173656c6c757320636f6e7365637465747572206575206573742000616320656765737461732e204e756e6320757420656c697420696e2070757200757320616363756d73616e20657569736d6f642e2043726173206c656f206f007263692c20677261766964612076656c20626962656e64756d20656765742c0020636f6e76616c6c697320696e2072697375732e2046757363652065676574002073656d7065722073617069656e2e0a0a536564206d6f6c65737469652070006c616365726174206c6967756c61206e656320766976657272612e20496e2000617420656666696369747572206d61676e612e204e616d2066696e6962757300206c6f72656d20657420726973757320756c747269636965732c2076656c2000637572737573206e65717565207363656c657269737175652e20496e7465720064756d206574206d616c6573756164612066616d657320616320616e74652000697073756d207072696d697320696e2066617563696275732e205365642069006e20656765737461732065726f732e2041656e65616e2074656d706f722c20006e69626820636f6d6d6f646f20626962656e64756d206c75637475732c207600656c6974206e756e6320696e74657264756d206f7263692c2073697420616d0065742074656d707573206c656f207075727573207669746165207269737573002e20457469616d207669746165207269737573206e6962682e2056657374690062756c756d206d6f6c65737469652063757273757320616e74652c206567650074206c6163696e6961206c656f206d6f6c65737469652076656c2e0a0a5375007370656e646973736520757420677261766964612073617069656e2e2056650073746962756c756d20616363756d73616e206e756e6320696e2064617069620075732073656d7065722e204e756e632076656c2073656d706572207175616d002e2050656c6c656e746573717565206861626974616e74206d6f72626920740072697374697175652073656e6563747573206574206e65747573206574206d00616c6573756164612066616d6573206163207475727069732065676573746100732e204675736365206d6f6c6573746965206672696e67696c6c61206c6f7200656d2c207175697320747269737469717565206d61676e6120756c6c616d63006f727065722073697420616d65742e2043757261626974757220766974616500206c6f72656d207574206a7573746f206c616f72656574207665686963756c00612061742061206469616d2e2053757370656e646973736520616c69717565007420636f6e73656374657475722065782c20757420636f6e736563746574750072206e6571756520636f6e7365637465747572206e65632e20496e74656765007220766974616520636f6e64696d656e74756d20746f72746f722e204e756e0063207365642073757363697069742073617069656e2e2050686173656c6c75007320656c656d656e74756d20657569736d6f642076656c69742c2065676574002064696374756d20646f6c6f7220756c6c616d636f727065722065752e0a0a0050686173656c6c75732061742064756920697073756d2e204e756e63206c75006374757320617563746f72206e69736c20657520617563746f722e20446f6e00656320636f6e76616c6c69732061726375206c6163696e6961206578207361006769747469732c20736564206f726e61726520616e7465206f726e6172652e00204e616d2074696e636964756e74206a7573746f207475727069732c2073650064206d617474697320616e746520736f6c6c696369747564696e207365642e0020536564206f726e61726520697073756d206e6962682c2061632074656d70006f72206d61676e612076617269757320696e2e204e616d206672696e67696c006c61206d61676e61206d692c2075742065676573746173206c6f72656d207600617269757320696e2e20536564206575206c75637475732073617069656e2e0020496e74656765722076656c206469676e697373696d20656c69742c2061740020706c616365726174207475727069732e20446f6e656320696e206e69626800206964206a7573746f206c6f626f727469732064696374756d2e20446f6e650063207068617265747261206f726369206e656320636f6e76616c6c69732073006f6c6c696369747564696e2e0a0a50656c6c656e746573717565207369742000616d6574206672696e67696c6c612073656d2c2061632073757363697069740020656c69742e20446f6e656320612074726973746971756520697073756d2c00206e6f6e20756c7472696365732065726f732e205072616573656e7420616c00697175616d20697073756d206567657420626962656e64756d20766f6c7574007061742e20447569732073697420616d6574206469616d20626962656e6475006d2c20617563746f72206e69736920656765742c206d6f6c6c697320746f7200746f722e204d61757269732065742076656c69742075726e612e205574206600656c6973206c65637475732c207072657469756d207365642074656d707573002073697420616d65742c206d6f6c6c6973207669746165206c65637475732e00204d61757269732073697420616d6574206f7263692065752074656c6c75730020666163696c697369732074696e636964756e742e20447569732068656e640072657269742066656c69732061206e6571756520617563746f7220636f6e670075652e204d6f726269206c6967756c61206573742c2070656c6c656e746573007175652076656c2073616769747469732065742c20666175636962757320650067657420656e696d2e0a0a517569737175652064696374756d206e6973692000696420736f6c6c696369747564696e207072657469756d2e20496e7465726400756d206574206d616c6573756164612066616d657320616320616e74652069007073756d207072696d697320696e2066617563696275732e2053757370656e006469737365207665686963756c612076656e656e617469732072697375732c00206174207665686963756c61206c616375732072757472756d206e6f6e2e200050656c6c656e746573717565206861626974616e74206d6f72626920747269007374697175652073656e6563747573206574206e65747573206574206d616c006573756164612066616d65732061632074757270697320656765737461732e0020496e207075727573206d617373612c206d6f6c657374696520696e206e6900626820612c2076656e656e6174697320626c616e64697420656c69742e205000686173656c6c75732073617069656e206469616d2c2074696e636964756e740020736f64616c6573206469616d2076697461652c20636f6e67756520736167006974746973206f64696f2e2043757261626974757220657569736d6f64206e00656320616e746520736564207072657469756d2e2050656c6c656e74657371007565206d6f6c65737469652076617269757320656e696d2c206e6f6e20666100756369627573206c656f2073616769747469732061632e20437572616269740075722071756973206d61757269732071756973206c6967756c6120756c6c61006d636f72706572206d616c65737561646120736564206575206c6563747573002e0a0a53757370656e64697373652076656c206d61676e61206469676e69730073696d2c2064696374756d206e657175652073757363697069742c2062696200656e64756d206c616375732e205175697371756520717569732066656c69730020617263752e2050686173656c6c75732065726174206c656f2c2073656d7000657220617420646f6c6f7220656765742c2076656e656e617469732072686f006e6375732065782e2043726173206d6f6c6c6973206e696268207365642061007567756520736f64616c65732c2073697420616d6574206d6f6c6c6973207000757275732070686172657472612e2043726173206e6563206d69207175697300206c656f20696d7065726469657420616363756d73616e20757420696420710075616d2e204e616d206e69736c20656c69742c206f726e6172652065752075006c7472696365732076697461652c20706f72747469746f72206574206c696700756c612e2050656c6c656e746573717565207665686963756c6120656c69740020657420697073756d20636f6e7365717561742c206e6563206d6f6c6c6973002065737420696e74657264756d2e2055742074656d706f722063757273757300206d6f6c65737469652e204d61757269732074696e636964756e742061636300756d73616e206e756e6320696420696d706572646965742e20457469616d20006d616c6573756164612c206e6973692061632076756c7075746174652069610063756c69732c206e697369206f72636920706c616365726174206e756c6c61002c206e65632074696e636964756e742074656c6c757320656c69742071756900732075726e612e20457469616d206c61637573206d617373612c2068656e6400726572697420757420636f6d6d6f646f20612c20696e74657264756d20696400206e69736c2e20496e746567657220766974616520616e7465206672696e6700696c6c61206d692074696e636964756e7420636f6e73656374657475722e20004e756c6c6120636f6e7365637465747572206f726e61726520626962656e6400756d2e0a0a55742073697420616d657420657569736d6f642074656c6c7573002e2050656c6c656e746573717565207072657469756d2074696e636964756e0074206475692065752073656d7065722e205365642076656c2065726f73206e006f6e20646f6c6f7220696163756c697320696e74657264756d20736564207100756973206f7263692e20496e2073656d706572206c6f626f7274697320646900676e697373696d2e205365642066617563696275732066657567696174207000656c6c656e7465737175652e2050656c6c656e74657371756520736f6c6c69006369747564696e206f64696f20736564206c6563747573207361676974746900732c206e6f6e20756c7472696369657320697073756d2072757472756d2e200053656420736564206f726e6172652065782e0a0a5072616573656e7420766900746165206d6f6c6573746965207175616d2c20616320626c616e646974206f0064696f2e20457469616d2065676573746173206375727375732075726e612000696420657569736d6f642e204e616d20616c6971756574206172637520657500206c7563747573206c616f726565742e20457469616d20696d7065726469650074207175616d2076656c20636f6e73657175617420626c616e6469742e204d00617572697320696e74657264756d2c206469616d20766172697573206c616300696e696120616c69717565742c2076656c69742074656c6c757320706861720065747261206a7573746f2c20656765742073757363697069742075726e6120006e756c6c612071756973206c656f2e204e756c6c61206578206e69736c2c2000666175636962757320617420626c616e6469742061632c2063757273757320006120697073756d2e20566976616d75732071756973206469616d20636f6e670075652c20657569736d6f642075726e612073697420616d65742c206672696e0067696c6c6120646f6c6f722e204e616d206e6f6e206e756c6c6120636f6e67007565206c696265726f2074656d706f7220756c747269636965732e2050656c006c656e7465737175652070756c76696e61722073617069656e20766974616500206e756e63207363656c65726973717565206672696e67696c6c612e204675007363652068656e64726572697420656666696369747572206661756369627500732e20416c697175616d2070757275732061756775652c206c756374757320006e6f6e20636f6e76616c6c697320717569732c206d6178696d7573206e6f6e00206475692e0a0a446f6e65632070656c6c656e74657371756520657261742000657520657374206c6163696e696120616363756d73616e2e2050726f696e20006d6f6c6c69732073656d20646f6c6f722c206964206d6f6c6c6973206c656300747573207669766572726120696e2e204e756e632071756973206d6173736100207661726975732c206665726d656e74756d206c656f2076697461652c206c006f626f72746973206e657175652e205175697371756520756c6c616d636f7200706572206a7573746f20766974616520636f6e67756520656c656966656e64002e20457469616d206574206c61637573206573742e20496e7465676572207400757270697320617263752c20616363756d73616e2076656c20697073756d2000656765742c206d616c65737561646120756c6c616d636f72706572206a757300746f2e204d6175726973206e6f6e2065782074696e636964756e742c20756c00747269636573206c616375732061742c20626c616e646974206f64696f2e2000566573746962756c756d2067726176696461206e65632073617069656e206e006563206469676e697373696d2e2053757370656e64697373652074656d706f007220696e206e69736c2076656c206d6f6c6c69732e204d616563656e6173200067726176696461206c616375732074656c6c75732c20657420756c7472696300696573206e756c6c612074696e636964756e7420612e20416c697175616d20006572617420766f6c75747061742e20446f6e65632065726f73206c6563747500732c206469676e697373696d2069642073617069656e2061742c20706c6163006572617420666163696c697369732070757275732e20566976616d757320700072657469756d2c206d69206120756c6c616d636f727065722074696e63696400756e742c206475692074656c6c757320626c616e646974206d617373612c20006e65632066696e6962757320657374206e69736c2071756973206e6962682e0020467573636520646170696275732064756920696e20636f6e73656374657400757220706c6163657261742e20467573636520736f6c6c696369747564696e00206567657374617320657261742c2073697420616d657420616363756d7361006e206c656f2074696e636964756e7420696e2e204d6f7262692065666669630069747572206d61757269732069642064696374756d20666163696c69736973002e0a0a55742075726e61206d61676e612c20706f72747469746f722061632000656666696369747572206e6f6e2c20656666696369747572206174206d61730073612e2041656e65616e2073656420656c6974206e6f6e2065782073757363006970697420616363756d73616e2e20416c697175616d207669746165206c65006f2073616769747469732c2067726176696461206c6967756c612065742c200070756c76696e617220646f6c6f722e20457469616d20616320746f72746f7200206c6f72656d2e2050686173656c6c7573206567657374617320696163756c00697320677261766964612e204e756e63206e6f6e206e756e63206e6962682e0020566976616d757320766974616520617563746f722073617069656e2e20430072617320706f7375657265206e756c6c61206f64696f2c20657520706f727400612065782076656e656e6174697320612e204e616d207269737573206e65710075652c20657569736d6f642075742063757273757320656765742c2066617500636962757320736f6c6c696369747564696e20746f72746f722e2043757261006269747572207574206d65747573206e6f6e206469616d20617563746f72200074696e636964756e742e20496e7465676572206d616c65737561646120707200657469756d2076656e656e617469732e20566976616d75732072686f6e637500732074696e636964756e74206c6f72656d207175697320756c74726963696500732e2050686173656c6c7573206f726e6172652065726f732065742068656e0064726572697420636f6d6d6f646f2e0a0a4375726162697475722069616375006c697320636f6e7365717561742073656d20717569732070656c6c656e746500737175652e2050726f696e206d617474697320656e696d20696e2065737420007361676974746973207661726975732e204d6f726269206e65632074696e63006964756e742076656c69742c206575206469676e697373696d20657261742e0020416c697175616d206572617420766f6c75747061742e205072616573656e00742066696e696275732074656c6c757320696e2068656e6472657269742076006573746962756c756d2e20437572616269747572206d6f6c6c69732074656c006c7573206d692c206e6563206d616c6573756164612076656c6974207375730063697069742061742e205365642065726174206e657175652c207275747275006d20736564206665726d656e74756d2076656c2c2070656c6c656e74657371007565206e6f6e20616e74652e204e616d20736f64616c65732070756c76696e006172206c6f72656d2c2065742074696e636964756e74206d6173736120646900676e697373696d2061632e20457469616d206d61737361207175616d2c2076006f6c7574706174206574206c6f626f727469732073697420616d65742c207600656e656e6174697320696420656e696d2e0a0a446f6e656320706f72746120006e69736c20657520697073756d20706f72747469746f722c2065676574207000756c76696e6172206c6f72656d206d6178696d75732e205574206163206e6500717565206c6f72656d2e204e756c6c612061206c6f72656d2065676574206c00656f206d6f6c6c6973206469676e697373696d2e20566573746962756c756d0020696d706572646965742073656d706572206c65637475732e204e756c6c6100206574206469616d206574206e756c6c61206f726e61726520736f6c6c69630069747564696e2e2050726f696e206120746f72746f7220636f6d6d6f646f2c00207665686963756c61206a7573746f2061742c2074696e636964756e74207300617069656e2e2043757261626974757220657569736d6f642076697665727200612072686f6e6375732e204e756e6320766172697573206f726369206e656300206d6173736120766976657272612c2065676574206c7563747573206c616300757320756c7472696365732e20437572616269747572206375727375732065006c697420646f6c6f722e20467573636520616c6971756574206f726e617265002065726f732c20612067726176696461206578206d616c657375616461207600656c2e204e616d206163206d61676e6120636f6e7365717561742c2076617200697573206d61757269732065752c206665726d656e74756d206c696265726f002e0a0a5072616573656e7420657420646f6c6f722074656d706f7220647569002074696e636964756e742064696374756d2e2050656c6c656e74657371756500206d6178696d757320697073756d20657520656765737461732074656d707500732e20467573636520616c697175616d20696d7065726469657420616e74650020657420626c616e6469742e204d61757269732068656e647265726974206c006f626f72746973206c616f726565742e2041656e65616e20706f7274612076006f6c757470617420697073756d2c206120736f6c6c696369747564696e20610072637520756c6c616d636f72706572206e6f6e2e20536564207661726975730020706c61636572617420656e696d206575207072657469756d2e20496e206a007573746f20617263752c20656c656d656e74756d20757420616c6971756574002065752c206c616f72656574206964206c656f2e20496e7465676572207365006420617263752061206469616d206c75637475732072686f6e6375732e20550074206567657420636f6e677565206d657475732c2069642072757472756d20006c65637475732e0a0a4d6f726269207665686963756c6120616363756d7361006e206e69736c2c20617420706f727461206c616375732066617563696275730020656765742e2053757370656e64697373652076756c707574617465206d6900206e6f6e20766f6c757470617420666575676961742e2051756973717565200064696374756d20706f72747469746f72206f64696f2073697420616d65742000636f6e6775652e2041656e65616e20657569736d6f64207072657469756d2000656c697420706f72747469746f722066696e696275732e204d616563656e610073207365642076756c7075746174652072697375732e2041656e65616e206500726f7320656e696d2c2076656e656e6174697320696420636f6e7365717561007420612c2072686f6e637573206f726e6172652073656d2e20517569737175006520626962656e64756d20766f6c757470617420616e74652c20616320706f0073756572652073617069656e20737573636970697420656666696369747572002e204e756c6c61206f726e617265206e696268206163206d6175726973207600756c7075746174652c206e6f6e207068617265747261206469616d2076697600657272612e20436c61737320617074656e742074616369746920736f63696f00737175206164206c69746f726120746f727175656e742070657220636f6e7500626961206e6f737472612c2070657220696e636570746f732068696d656e6100656f732e2050726f696e20617420766573746962756c756d2076656c69742e002053656420766976657272612076656e656e61746973206d692c207574206d00616c657375616461206e756c6c612e204475697320706861726574726120690064206e69626820617420636f6e6775652e20536564206c6163696e6961206500726f732061206572617420766976657272612c20612074696e636964756e740020617567756520616363756d73616e2e2050656c6c656e746573717565206c006f626f7274697320616363756d73616e2073656d2c2065676574206d616c65007375616461206e756c6c61206665726d656e74756d2073697420616d65742e0020496e20616363756d73616e206c616f72656574206e69736c2076697461650020666575676961742e20416c697175616d206572617420766f6c7574706174002e0a0a4475697320696420616e7465206c6967756c612e2050686173656c6c00757320736167697474697320706c61636572617420706f73756572652e204d00616563656e61732076697461652076697665727261206c616375732c206d6f006c6c6973206d616c657375616461206c65637475732e2050656c6c656e7465007371756520696e20657374206c6163696e69612c20656c656d656e74756d20006e756e6320656765742c2070656c6c656e746573717565206a7573746f2e20005175697371756520636f6e67756520747572706973206e6f6e206f64696f2000626c616e64697420736167697474697320677261766964612065742069707300756d2e204e756c6c616d206c6f626f72746973206e6571756520616320656c00697420636f6e76616c6c697320616363756d73616e2073697420616d6574200070756c76696e6172206d617373612e20446f6e656320657520636f6d6d6f64006f20616e74652c2073697420616d657420756c6c616d636f7270657220646f006c6f722e2044756973206d6175726973206c6967756c612c20656c656d656e0074756d2061742066617563696275732061632c20616c697175616d20696e200066656c69732e205072616573656e74206c6f626f72746973206578207369740020616d6574206e69736c20756c74726963696573206c6163696e69612e2056006976616d757320617563746f722c2073656d20717569732076657374696275006c756d207363656c657269737175652c2073617069656e206e69736c207275007472756d206c696265726f2c2073697420616d657420696e74657264756d20006e69736c206a7573746f207669746165206c65637475732e20566976616d75007320696d70657264696574206e756c6c6120657520657261742076656e656e00617469732c20736564206d6f6c657374696520646f6c6f7220766568696375006c612e20517569737175652076656c2061726375207365642073656d207365006d706572206375727375732e2050656c6c656e746573717565206d61747469007320656c656966656e64207269737573206574206d6f6c6c69732e20557420006c6f626f727469732c2065737420736564206665726d656e74756d2073656d007065722c2075726e612072697375732064617069627573206475692c2061200074656d707573206d6175726973206e69736c206174206469616d2e2056697600616d7573206469676e697373696d20666163696c6973697320636f6e7365630074657475722e20496e20706f737565726520736f6c6c696369747564696e2000656c656d656e74756d2e0a0a457469616d20697073756d206573742c206d61006c657375616461206120666575676961742073697420616d65742c206d6f6c00657374696520656765742066656c69732e2041656e65616e2074656d70757300206672696e67696c6c61206469616d20696e20616c697175616d2e20446f6e0065632073697420616d65742072757472756d206469616d2e2050686173656c006c757320756c6c616d636f72706572206d617474697320616363756d73616e002e2053757370656e646973736520616c6971756574207669746165206e6973006920616320766f6c75747061742e2050726f696e207075727573206d6175720069732c20696d706572646965742073697420616d657420647569206e6f6e2c00207665686963756c6120637572737573206f7263692e20446f6e6563206574002074656c6c7573206574206d6574757320766573746962756c756d20656c65006d656e74756d206163206d6f6c6c6973206a7573746f2e2050656c6c656e74006573717565206c6967756c61206e69736c2c20616c697175616d206163206c006967756c6120706f73756572652c20656c656d656e74756d2068656e64726500726974206d61757269732e204d617572697320666163696c69736973206665006c697320696e2072757472756d20696163756c69732e204e756e632066657500676961742073656d20612068656e6472657269742072757472756d2e20496e007465676572206d6f6c65737469652064696374756d2066696e696275732e200041656e65616e206e656320766f6c7574706174206c6967756c612e205175690073717565206d617373612070757275732c2070686172657472612075742069006163756c6973207365642c20706f72747469746f7220616320616e74652e2000416c697175616d206d6173736120656e696d2c2076756c707574617465206e006563206d692069642c20756c6c616d636f72706572206665756769617420740075727069732e0a0a4e756e63207669766572726120647569206c6f72656d2c002073697420616d657420656666696369747572206d65747573207375736369007069742076656c2e20566573746962756c756d2073697420616d657420706f0072747469746f722065782e205574206d616c657375616461206c656374757300206e6563206d65747573206672696e67696c6c612c206e65632073656d706500722075726e61206d616c6573756164612e20557420756c6c616d636f7270650072206e697369206174206e69736c20696d706572646965742070756c76696e0061722e20566573746962756c756d2065726f7320646f6c6f722c20766f6c750074706174206964206f64696f2069642c2074656d70757320636f6e76616c6c0069732072697375732e2043726173206575206661756369627573206c69626500726f2e2050656c6c656e74657371756520696163756c69732076657374696200756c756d20646f6c6f72206964206566666963697475722e204675736365200061206e756e6320717569732075726e61206469676e697373696d2064617069006275732e2050726f696e2076656c20696163756c69732073656d2c2061742000636f6e76616c6c6973206475692e20496e2069642066656c69732074656c6c0075732e20446f6e6563207068617265747261206d6f6c65737469652061726300752c2061206d616c6573756164612065737420677261766964612069642e0a000a5175697371756520616c6971756574206c6967756c61207574206f7263690020706f73756572652c207365642074696e636964756e74206d61676e612075006c747269636965732e204d616563656e61732073697420616d657420756c6c00616d636f72706572207475727069732e20536564206e6563206d6f6c657374006965207175616d2e20566976616d7573206d617474697320636f6e64696d65006e74756d206f7263692c206e6f6e206375727375732066656c69732074656d007075732065752e2053656420656765742072697375732075726e612e2056690076616d7573206f726e61726520756c6c616d636f7270657220617263752061006320616c69717565742e205072616573656e74206d616c657375616461207000756c76696e6172206c65637475732c2073697420616d65742064696374756d00207269737573206d616c6573756164612061742e204e756c6c612061206d61006c657375616461206c65637475732c2065676573746173206d616c657375610064612066656c69732e20496e20696420696e74657264756d206e756e632e2000496e746567657220666163696c69736973206469676e697373696d20616e74006520717569732070686172657472612e0a0a446f6e65632070656c6c656e7400657371756520656e696d20766974616520616e746520756c7472696365732c0020617420657569736d6f64206d617373612066696e696275732e20517569730071756520636f6e67756520756c7472696369657320706f72747469746f722e002043757261626974757220756c7472696369657320626c616e64697420637500727375732e204675736365206567657420647569206375727375732c2070680061726574726120617263752076656c2c20706c616365726174207075727573002e2043726173206e6563206d6175726973206c656f2e204e616d20707265740069756d207072657469756d20766f6c75747061742e2050686173656c6c757300206e657175652074656c6c75732c206672696e67696c6c612073697420616d00657420666163696c6973697320717569732c20616363756d73616e20736365006c657269737175652073656d2e204e756e632076697461652066656c69732000736564206d6173736120756c747269636965732064617069627573206e6f6e0020657520656e696d2e20496e20706f72747469746f722074656d706f72206e0069736c2c206567657420666163696c697369732075726e612066696e69627500732076697461652e205365642070656c6c656e746573717565206e656320740075727069732075742073656d7065722e205072616573656e74206566666963006974757220656c656966656e64206f64696f2e0a0a4e756c6c612061756374006f7220636f6e64696d656e74756d206e756c6c612e204d616563656e617320006d616c657375616461206d61757269732061206c6967756c6120756c7472690063657320636f6d6d6f646f2065742076656c206469616d2e2053757370656e00646973736520696e74657264756d2074696e636964756e74206c6967756c61002c206120626962656e64756d206d6920696163756c697320612e2053656420006d616c657375616461206d657475732076656c206c696265726f206469676e00697373696d2c2073697420616d657420636f6e677565207175616d2074696e00636964756e742e204375726162697475722066696e696275732074696e63690064756e742073616769747469732e20517569737175652073617069656e2065006e696d2c20736f64616c6573206163206469616d20612c206469676e69737300696d206c6163696e69612074656c6c75732e20446f6e65632065666669636900747572206c616375732072686f6e637573206672696e67696c6c6120636f6d006d6f646f2e20496e20696420656c69742076656c206c6f72656d20736167690074746973206f726e6172652e204372617320757420646f6c6f72206c696775006c612e2053656420656c656966656e64206c656374757320766172697573200066696e696275732072757472756d2e204675736365206e6563206175677565002061206a7573746f207661726975732074656d706f722073656420766974610065206c6f72656d2e204d6175726973206174206c696265726f20696e2065730074206375727375732064696374756d2075742076697461652065726f732e200050686173656c6c75732072757472756d2c206c65637475732076697461652000696e74657264756d20626c616e6469742c206c6f72656d2075726e61207669007665727261206d617373612c2071756973207363656c65726973717565206600656c6973206c6563747573206574206f64696f2e204d61757269732066616300696c69736973206c656f207475727069732c20696d70657264696574206665007567696174206475692074656d706f722073697420616d65742e0a0a4d61650063656e61732061206c656f2061756775652e20437572616269747572206e6f006e20697073756d2073697420616d657420656c6974206c616f72656574207600656e656e617469732065676574206e6f6e206d61676e612e204375726162690074757220616c697175616d20696163756c697320706f72747469746f722e2000536564206163206c6f72656d206120646f6c6f7220616c6971756574206c7500637475732e2050726f696e206c6163696e696120697073756d20616e74652c002073697420616d657420696d70657264696574206c6563747573206469676e00697373696d20656765742e20566573746962756c756d20656666696369747500722073697420616d65742073656d207175697320736f64616c65732e2056690076616d75732070756c76696e6172207068617265747261206e69736c2076690074616520616363756d73616e2e204475697320696e74657264756d20636f6e00677565207661726975732e20446f6e65632061207361676974746973206e690073692c207175697320656c656d656e74756d206475692e20536564206c756300747573206c616f72656574206c656f206567657420756c7472696365732e0a000a446f6e6563206120617567756520656765737461732c2076756c70757461007465206573742076656c2c206c616f72656574206c616375732e20416c69710075616d20646f6c6f7220646f6c6f722c20706c61636572617420696e2065670065737461732073697420616d65742c20616c69717565742061206f7263692e0020496e2076756c70757461746520626c616e64697420656c69742c2068656e0064726572697420636f6d6d6f646f2075726e6120626962656e64756d206575002e20457469616d20617567756520616e74652c206d6f6c6573746965207175006973206f64696f2065752c2074656d70757320636f6d6d6f646f206e696268002e205574206d6174746973206c6163696e69612073617069656e2075742064006170696275732e20457469616d20636f6e736571756174206e6f6e206f6469006f2071756973206375727375732e204e756e6320616c69717565742062696200656e64756d20646f6c6f722065752073656d7065722e20566976616d757320006163206d692073697420616d65742061726375206c6163696e6961207275740072756d2073697420616d65742061206e756c6c612e2050686173656c6c75730020657261742072697375732c206c75637475732065676574206c6f72656d200076697461652c206d616c65737561646120626962656e64756d206d65747573002e204e616d206964206d617474697320656e696d2c206665756769617420730061676974746973206d657475732e2050686173656c6c7573206c7563747573002074757270697320657261742c20657420766172697573206d61676e61207200686f6e6375732069642e0a0a437261732076617269757320736167697474690073206f64696f20757420677261766964612e20536564206f726e6172652070006f7274612076756c7075746174652e20496e746567657220706f7375657265002061726375206c6f72656d2c206964207363656c657269737175652073656d002065666669636974757220612e205365642076656c20617563746f722069700073756d2e2050656c6c656e7465737175652069642065726f73206574206c6f0072656d20616363756d73616e20616363756d73616e20656765742071756973002065726f732e204e756e632063757273757320636f6e64696d656e74756d20006d692c206e65632066617563696275732070757275732070756c76696e6172002070686172657472612e205365642073656420736f64616c6573206e756e63002e2046757363652070756c76696e617220756c747269636573206d692c206900642072757472756d206d69206672696e67696c6c612061632e205365642069007073756d207175616d2c20756c74726963696573207669746165206c616369006e69612076697461652c206665726d656e74756d206e6f6e206d6175726973002e205072616573656e74206461706962757320756c6c616d636f7270657220006c6967756c612c206567657420756c6c616d636f727065722073656d2064610070696275732065752e2046757363652073697420616d65742076657374696200756c756d206c616375732e205072616573656e74207365642074726973746900717565206c616375732c2076656c2070756c76696e6172206573742e0a0a460075736365206e6563206e6571756520646f6c6f722e20566573746962756c75006d20616c697175616d206c6967756c612075742064696374756d2073656d700065722e20457469616d206d616c657375616461206d6574757320656765742000656c697420636f6e64696d656e74756d20636f6e7365717561742e205375730070656e646973736520736167697474697320656e696d207175616d2c20696e0020756c74726963696573206c656f206461706962757320717569732e205065006c6c656e7465737175652063757273757320766172697573206e6973692c200076656c20736167697474697320656c6974206d6178696d7573206e6f6e2e200053757370656e646973736520746f72746f72206f64696f2c207068617265740072612076656c206475692061632c20656c656d656e74756d2076756c707574006174652074656c6c75732e20416c697175616d20696420666163696c69736900732065782e2044756973206e6563206672696e67696c6c61206e69736c2e2000467573636520736564206672696e67696c6c612065782e20467573636520750074206d6175726973206574207175616d207669766572726120696e7465726400756d20612061742065726f732e20416c697175616d20616363756d73616e2000657261742075742074656c6c7573206469676e697373696d20696163756c6900732073656420657420746f72746f722e2050726f696e20736564206175677500652073697420616d6574206d657475732072757472756d20677261766964610020696e2076656c206e69736c2e20496e746567657220706f73756572652061007263752069642065726f73206665726d656e74756d2074656d706f722e0a0a00557420756c74726963657320697073756d206f7263692e204d61757269732000617563746f72206d6178696d75732072697375732c20717569732066696e6900627573206e756c6c612065666669636974757220696e2e204e616d20756c74007269636573206e6571756520616320657820666163696c697369732c20696e002074656d707573206c6967756c61206c6f626f727469732e204372617320700068617265747261206c6f72656d20696e74657264756d206e65717565206865006e64726572697420617563746f722e2050686173656c6c7573206e6f6e207200757472756d206c696265726f2c20617420736f64616c657320697073756d2e0020496e20756c6c616d636f72706572206578206c65637475732c207369742000616d6574207068617265747261206e756c6c6120636f6e76616c6c6973207200686f6e6375732e2053757370656e6469737365206e6f6e20656c6974206c6f0072656d2e205072616573656e7420756c6c616d636f72706572206e756c6c61002076656c20637572737573206469676e697373696d2e2041656e65616e2073006f64616c657320746f72746f72206f64696f2c20617420656c656966656e6400206c6967756c61206469676e697373696d2073697420616d65742e2044756900732076656c20736f6c6c696369747564696e2074656c6c75732e204d61656300656e617320717569732070656c6c656e746573717565206475692e204d6175007269732071756973207361676974746973206e756e632e2044756973207275007472756d206d616c657375616461206c6967756c612065752070756c76696e0061722e0a0a41656e65616e206772617669646120706f727461207175616d20007365642070656c6c656e7465737175652e2050656c6c656e7465737175652000766573746962756c756d20626962656e64756d207472697374697175652e2000566573746962756c756d20696e206572617420656e696d2e2050726f696e200065726f73206f7263692c2072686f6e63757320616320616c697175616d206e006f6e2c207072657469756d2061206f7263692e20566573746962756c756d200074656d7075732c2076656c6974206d616c657375616461206c6163696e69610020646170696275732c2075726e61206c6f72656d206672696e67696c6c6120006d617373612c20696e206d6178696d757320656e696d20656e696d20657420006e69736c2e204e616d207669766572726120636f6e64696d656e74756d206c006967756c6120696e20696d706572646965742e20536564207175697320656c00656d656e74756d206a7573746f2e204e756c6c61206f726e61726520636f6e00736563746574757220656e696d2061742074696e636964756e742e2045746900616d2073697420616d6574206c616f7265657420697073756d2e0a0a45746900616d20666163696c697369732065737420706f72747469746f722c2066696e00696275732066656c69732065742c207375736369706974206c65637475732e002041656e65616e20706c616365726174206567657374617320616c6971756500742e204d617572697320657420656e696d206c65637475732e204d61656365006e61732070656c6c656e746573717565206d6f6c6c6973206d69206469637400756d20636f6e6775652e205072616573656e742076656c2066656c6973206c00616f726565742c20636f6e7365637465747572206e756c6c61206e6f6e2c2000666575676961742074656c6c75732e2053656420616c697175616d2076656c006974207365642073656d20706c616365726174207361676974746973206174002073697420616d6574206c696265726f2e2051756973717565206d6174746900732072757472756d20656e696d2c2073656420656c656d656e74756d207665006c69742e2050686173656c6c7573206e6f6e206c616f72656574206f64696f002e2043757261626974757220656c656966656e64206f64696f207369742061006d657420756c7472696369657320756c6c616d636f727065722e20496e20650067657420726973757320756c7472696365732c207665686963756c61206c65006374757320696e2c20616c6971756574207475727069732e0a0a5068617365006c6c7573206e6f6e206d6574757320617563746f722c20636f6e736563746500747572206e69736c2061742c207361676974746973207175616d2e20507261006573656e7420746f72746f722074656c6c75732c2074656d706f72206e6f6e002070686172657472612069642c207661726975732061742070757275732e2000536564206120636f6e64696d656e74756d206e6962682e205072616573656e0074206c656f206e756e632c20756c6c616d636f72706572207665686963756c006120766573746962756c756d2074696e636964756e742c206665726d656e7400756d20757420616e74652e20496e206f726e617265206c61637573206e6f6e00206c696265726f20736f6c6c696369747564696e2c206575206665756769610074206e756c6c6120626c616e6469742e2050656c6c656e74657371756520680061626974616e74206d6f726269207472697374697175652073656e656374750073206574206e65747573206574206d616c6573756164612066616d6573206100632074757270697320656765737461732e204e756e632065676574206e756e00632073697420616d6574206d61757269732070686172657472612076657374006962756c756d20657520766974616520656e696d2e20496e20766f6c7574700061742073617069656e2065676574206c65637475732074696e636964756e740020766f6c75747061742e20416c697175616d207365642076697665727261200075726e612e204675736365206c6563747573206d657475732c20756c747269006365732076656c20657569736d6f642065742c20616c6971756574207365640020746f72746f722e2050686173656c6c757320626c616e6469742070656c6c00656e74657371756520756c747269636965732e204f7263692076617269757300206e61746f7175652070656e617469627573206574206d61676e697320646900732070617274757269656e74206d6f6e7465732c206e6173636574757220720069646963756c7573206d75732e204e756c6c61206469676e697373696d2c200076656c6974207175697320666163696c697369732072686f6e6375732c206e00756c6c612066656c697320747269737469717565206d61757269732c2065750020636f6d6d6f646f206c656f206f726369206174206e6973692e2046757363006520636f6e736563746574757220746f72746f7220657420706861726574720061207665686963756c612e204e756e63207665686963756c612c206d65747500732073697420616d657420657569736d6f642064696374756d2c20646f6c6f0072206d6574757320616363756d73616e206573742c20696e20696163756c690073206d61737361206c696265726f206e6f6e206c65637475732e0a0a496e2000617420636f6e736571756174207475727069732e204675736365206d69206e00756c6c612c206672696e67696c6c6120757420766172697573207669746165002c20747269737469717565206174206e6973692e204e756c6c61206964206d00692065726f732e204d6f726269206469616d20616e74652c2076656e656e610074697320696e2073757363697069742076656c2c2074696e636964756e7420007669746165206f64696f2e204d61757269732068656e647265726974206e6f006e206172637520696420636f6e73656374657475722e205072616573656e740020616c697175616d206e756e632076656c206d61676e61207665686963756c006120616c69717565742e204e616d20636f6e7365637465747572206e756c6c006120717569732075726e6120696163756c697320756c6c616d636f72706572002070656c6c656e74657371756520657420617263752e20496e746567657220006163206c616f726565742076656c69742e2050656c6c656e7465737175652000757420616e7465207175616d2e20566976616d75732061206d617474697320006c656f2c2069642074656d707573206d692e204675736365207363656c657200697371756520646170696275732070757275732073656420616c697175616d002e0a0a46757363652076656c20656e696d2070656c6c656e7465737175652c0020656c656d656e74756d206469616d2065752c2076756c707574617465207600656c69742e204e756e63206c696265726f2074656c6c75732c20656c656d65006e74756d206964207175616d2073697420616d65742c20617563746f722070006f72747469746f722070757275732e204c6f72656d20697073756d20646f6c006f722073697420616d65742c20636f6e7365637465747572206164697069730063696e6720656c69742e20457469616d206d6f6c6573746965206e756e632000736f64616c657320636f6d6d6f646f20696163756c69732e204e616d20717500697320656c69742061206c696265726f20616c697175657420636f6e64696d00656e74756d207669746165206163206d692e20457469616d20756c7472696300657320756c74726963696573206d61676e6120766974616520706f7375657200652e20566976616d757320757420657569736d6f642076656c69742e20437200617320736f64616c6573206c6163696e6961206d61676e612c207175697320006665726d656e74756d20657261742064696374756d2073697420616d65742e002046757363652074696e636964756e74206c696265726f206574206e657175006520747269737469717565206375727375732e204372617320616320646f6c006f72206c6967756c612e2050726f696e206567657420696d7065726469657400206d61757269732e20416c697175616d206469616d20646f6c6f722c2066610063696c697369732076656c206e69626820656765742c20636f6e7365717561007420766573746962756c756d206c696265726f2e20437572616269747572200076756c7075746174652066617563696275732061756775652065676574207300757363697069742e204e756e632074696e636964756e742074656c6c757320007574206d6f6c6c6973206d6178696d75732e2050726f696e2076657374696200756c756d206c616f726565742073617069656e2c206e6563206672696e6769006c6c61206e6973692074656d70757320696e2e0a0a566573746962756c756d0020616e746520697073756d207072696d697320696e20666175636962757320006f726369206c756374757320657420756c74726963657320706f73756572650020637562696c69612063757261653b20566573746962756c756d2066616369006c697369732c20707572757320657520706f7375657265206c6163696e6961002c20707572757320657374206c616f72656574206e69736c2c206e65632076006f6c757470617420616e746520657261742076697665727261206e756c6c61002e204e756c6c6120666163696c6973692e20496e206e656320706f72746120006d657475732e20446f6e656320666163696c6973697320646f6c6f72207369007420616d6574206f64696f20616c697175616d2c206567657420706f7274740069746f7220697073756d2076756c7075746174652e204d6175726973207665006e656e61746973206d61676e61206575206578206f726e6172652c2069642000736f6c6c696369747564696e20616e746520636f6e6775652e2050656c6c65006e7465737175652075726e61206f7263692c20756c747269636965732076690074616520706f73756572652075742c20756c7472696365732071756973207400656c6c75732e20536564206e6f6e20656c656966656e64206d692c20657520007472697374697175652073656d2e2041656e65616e2074656d707573206d61007373612065752067726176696461206d616c6573756164612e2050726f696e00206e65632076756c707574617465206e756e632e204e756e63206d616c657300756164612c206469616d206e6f6e20636f6d6d6f646f2064696374756d2c20007175616d206e69736c2074696e636964756e74206c616375732c207369742000616d65742066657567696174206c6f72656d206e756c6c61206e65632069700073756d2e0a0a4d617572697320736564206d6574757320617420646f6c6f720020636f6e64696d656e74756d20636f6e73657175617420616363756d73616e0020616320646f6c6f722e2053757370656e6469737365206c75637475732062006c616e6469742065782c20617420656c656d656e74756d206d69206469637400756d2065752e20416c697175616d2074696e636964756e7420656c656d656e0074756d206d61676e6120766974616520616c69717565742e20446f6e65632000696e206f726e617265206d61757269732e20496e206c6163696e6961207369007420616d6574206e756c6c61207669746165206665726d656e74756d2e2044006f6e6563206e6563206665726d656e74756d2075726e612c20617420667269006e67696c6c612076656c69742e20416c697175616d206572617420766f6c7500747061742e20566573746962756c756d2073656420747572706973206e65710075652e20496e74656765722076656c20737573636970697420747572706973002e20536564206e656320636f6e64696d656e74756d206e657175652e204165006e65616e20636f6e76616c6c697320766f6c757470617420706f7375657265002e2050686173656c6c7573206c6f626f72746973206c6967756c612076656c002072686f6e637573206c616f726565742e2041656e65616e2065676574206500737420696163756c69732c2076656e656e61746973206f64696f2075742c200064696374756d2074656c6c75732e2044756973207669746165206572617420007669746165206e69736920637572737573206d61747469732e204e756e632000626c616e6469742070656c6c656e7465737175652072697375732c206c7563007475732074696e636964756e74206d61676e6120706f7274612061632e204300726173207669766572726120616c697175657420706f73756572652e0a0a4c006f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7300656374657475722061646970697363696e6720656c69742e204e756c6c616d00206575206c61637573206c65637475732e20467573636520612074656c6c750073206c616375732e20496e74657264756d206574206d616c657375616461200066616d657320616320616e746520697073756d207072696d697320696e206600617563696275732e204e756c6c616d2070656c6c656e746573717565206c6f0072656d207175616d2c2076656c2074656d706f7220746f72746f7220707265007469756d2076697461652e20566573746962756c756d20736f6c6c69636974007564696e2071756973206d692061632072757472756d2e20496e746567657200206469676e697373696d206c696265726f20616c697175616d206672696e6700696c6c6120616363756d73616e2e20446f6e656320666163696c697369732000647569206e6f6e206c656f2074656d707573206c75637475732e2053656420006d616c657375616461207665686963756c6120756c7472696365732e2055740020616e746520616e74652c20616c69717565742073697420616d657420736f006c6c696369747564696e2066696e696275732c20626c616e64697420756c740072696365732061756775652e20536564206e6563206e6973692071756973200076656c697420636f6e64696d656e74756d20677261766964612e2041656e6500616e20616c697175657420657569736d6f64206475692c20757420766568690063756c6120697073756d2066617563696275732065752e0a0a4675736365200076656c69742073617069656e2c2073656d706572206574206469676e69737300696d2076656c2c20696163756c69732069642076656c69742e20507261657300656e74206e6f6e206e69736c206567657420616e746520736f6c6c69636974007564696e2072757472756d206e6563206e6563206573742e205365642076690076657272612066656c6973206e69736c2c206e65632065676573746173206500737420736f64616c65732065742e204e616d20636f6e67756520617567756500207375736369706974206578206c616f7265657420706f72747469746f722e0020467573636520626962656e64756d20697073756d206e657175652c20616300206d6178696d757320646f6c6f72206672696e67696c6c612075742e2043750072616269747572206120636f6e736571756174206c6967756c612e204e616d0020766f6c757470617420636f6e736571756174206c696265726f2065752062006c616e6469742e204e616d20696e74657264756d2074656c6c757320757420006f64696f20636f6e736571756174206f726e6172652e204e756c6c612066610063696c6973692e204d616563656e6173206c756374757320616e7465206567006574206f64696f20636f6e64696d656e74756d206672696e67696c6c612e2000496e74656765722065676574206d61676e612073697420616d6574206d6167006e61206665726d656e74756d20677261766964612e0a0a4d6f72626920736f0064616c65732076656c6974206e6973692c2061206d6178696d7573206475690020656c656966656e64206e6f6e2e204d61757269732070757275732065726f00732c20617563746f722075742066696e6962757320656765742c20756c7472006963696573207175697320657261742e2041656e65616e207361676974746900732074757270697320696e206f72636920706f7274612c20696420706861720065747261206578206566666963697475722e20467573636520617420636f6e0067756520657261742e20566573746962756c756d206c756374757320656e69006d206665726d656e74756d206c656f2064696374756d20747269737469717500652e20446f6e6563206e65632066656c69732073697420616d6574206475690020706f72747469746f7220656c656d656e74756d2e205072616573656e7420006c616f726565742c2066656c6973207669746165207472697374697175652000626962656e64756d2c206c6f72656d206e6962682070656c6c656e746573710075652073617069656e2c20736564207363656c65726973717565206c6f7265006d206e6962682076656c2073656d2e204675736365206e6f6e2076656e656e0061746973206e657175652e20446f6e6563207363656c6572697371756520640069676e697373696d20726973757320696420706f7274612e0a0a5375737065006e64697373652072686f6e637573206c696265726f2076656c2066656c697300206c6163696e69612074656d7075732e2046757363652064696374756d206e006571756520736564206e69626820677261766964612c20626962656e64756d00206c6f626f727469732075726e6120616c69717565742e204375726162697400757220657420657569736d6f6420656e696d2e2050656c6c656e7465737175006520696d70657264696574206175677565206c6f72656d2c2075742068656e00647265726974206e657175652073656d7065722076656c2e2050686173656c006c757320636f6d6d6f646f20647569206e6f6e206c6f626f72746973207665006e656e617469732e2043726173207669766572726120736167697474697320006e69736c2c207669746165206c6f626f72746973206d6574757320756c747200696369657320696e2e20416c697175616d207669746165206469676e69737300696d2070757275732c206661756369627573207072657469756d207269737500732e205072616573656e74206163206d61676e6120617563746f722c206d61006c657375616461206e756c6c61206c6f626f727469732c20636f6d6d6f646f00206475692e205072616573656e7420617420746f72746f7220697073756d2e002046757363652074656d7075732c2066656c697320696e20616363756d7361006e2066617563696275732c206c696265726f20656e696d206d6f6c6c69732000656e696d2c20696420656c656d656e74756d206d65747573207075727573200061206d61676e612e204375726162697475722073697420616d657420636f6e0064696d656e74756d2075726e612e20496e2075726e612066656c69732c2063006f6e64696d656e74756d207669746165206e756c6c612065752c20706f73750065726520636f6e64696d656e74756d206e6962682e2050656c6c656e746573007175652067726176696461206f64696f20656c69742c2076656c20616c69710075657420726973757320636f6e7365637465747572206e6f6e2e204d61656300656e61732074656d706f722c206d61676e612061632070686172657472612000616c697175616d2c20616e7465206c6967756c61206665756769617420717500616d2c206575206d6174746973206e756c6c61206e69736c206e6f6e206d61007373612e0a0a496e746567657220756c74726963657320736f64616c657320006a7573746f2e20416c697175616d20626962656e64756d207068617265747200612072697375732c2061632076697665727261206e69736920616363756d7300616e2075742e20457469616d2067726176696461206665726d656e74756d20006d6920696e207363656c657269737175652e20467573636520696e7465726400756d2c206c656f207175697320626962656e64756d206d61747469732c206a007573746f206d65747573206672696e67696c6c6120656c69742c2061632070006c61636572617420747572706973206469616d206661756369627573206e6900736c2e20457469616d206c616f72656574206c696265726f206c6f72656d2c002076656c2074656d707573206f64696f206469676e697373696d2065742e20004e756c6c6120666163696c6973692e20496e7465676572206461706962757300206d6f6c657374696520656e696d2c2061632074696e636964756e74207361007069656e20636f6e76616c6c69732075742e2043726173206d6f6c6c69732000636f6e736563746574757220666163696c697369732e2043757261626974750072207472697374697175652c20726973757320706f72747469746f72207675006c70757461746520756c7472696365732c206c6f72656d2073656d20646967006e697373696d206e657175652c20657520706f72747469746f72206d61676e0061206e697369207669746165207475727069732e20446f6e656320636f6e7300657175617420657374206575206469616d20666575676961742c2076656c2000766573746962756c756d206469616d206c6163696e69612e20457469616d2000756c747269636573206c65637475732073697420616d6574206f726369207300616769747469732c2076656c20616c69717565742065726f73206c6163696e0069612e20496e74656765722070686172657472612c20617263752065752062006c616e6469742064696374756d2c2076656c6974206f64696f20636f6d6d6f00646f206f64696f2c20757420636f6e7365717561742074656c6c757320717500616d206e6563206a7573746f2e205365642065666669636974757220736564002066656c69732061206d6178696d75732e204e756c6c616d20656c65696665006e64207363656c65726973717565206c6f72656d2c20696e206d6f6c65737400696520746f72746f72206d616c6573756164612076697461652e2045746961006d20636f6e64696d656e74756d2c20617567756520657420696163756c69730020646170696275732c206469616d206172637520706f72747469746f72207500726e612c20616320636f6e76616c6c6973206d61676e61206175677565207300656420646f6c6f722e2050686173656c6c75732076656c206f64696f207075007275732e0a0a457469616d20656c656966656e64206469676e697373696d20006e6973692066657567696174206c6163696e69612e205175697371756520650074206c61637573207669746165206172637520706f73756572652074656d700075732e204e616d20636f6e73657175617420657820696e206172637520756c007472696365732c2076656c2076656e656e61746973206e756e63206672696e0067696c6c612e20496e7465676572206575206a7573746f206964206e6962680020626962656e64756d2072757472756d2e20457469616d207363656c657269007371756520747572706973206c656f2c2061632074696e636964756e7420710075616d2064696374756d2065752e204475697320636f6e7365717561742063006f6e677565206a7573746f2c206469676e697373696d20626962656e64756d002073617069656e20656c656966656e6420656765742e204d616563656e617300206469676e697373696d206d6173736120757420626c616e646974206c616300696e69612e2050726f696e2066657567696174206e756e6320736564206c6f0072656d20616c697175616d2070756c76696e61722e20416c697175616d207600617269757320616e7465207365642073617069656e206469676e697373696d002c2065742064696374756d2073617069656e20696e74657264756d2e204165006e65616e206574206c656f2061756775652e2053656420756c74726963696500732074696e636964756e742065726f732c2073656420706f727461206d6175007269732066696e69627573206e65632e0a0a53757370656e6469737365206e006563206c6f72656d206c696265726f2e204d616563656e6173206e6563206c006967756c61206e6f6e20657820626c616e6469742073757363697069742e200050656c6c656e746573717565206c616375732072697375732c206f726e6172006520612063757273757320656765742c2074656d706f72207669746165206e0069736c2e204375726162697475722072757472756d20766f6c757470617420006578206120706c6163657261742e204d6f726269206d616c657375616461200074656c6c75732065752061726375206d6f6c6573746965206d61747469732e0020457469616d207363656c6572697371756520636f6d6d6f646f206175677500652c207175697320636f6d6d6f646f2076656c697420656c656966656e64200069642e204d617572697320617563746f72207669746165206d657475732071007569732076656e656e617469732e2050726f696e20626962656e64756d206600617563696275732074656c6c75732c20736f6c6c696369747564696e20696d0070657264696574206e69736920766f6c75747061742076656c2e20446f6e650063206661756369627573206d6f6c6573746965207175616d2c20657420667200696e67696c6c61206469616d2e0a0a446f6e656320696d706572646965742000657261742061206e6973692066696e696275732c207574206469676e69737300696d206e69736920666163696c697369732e204e756c6c6120696163756c690073207574207175616d20616c69717565742068656e6472657269742e205065006c6c656e74657371756520757420656c656966656e64206e657175652e2044006f6e6563206575206c6563747573206574206c656f20696e74657264756d200074696e636964756e742e204e616d20756c74726963657320656c6974206e690073692c2065676574206d6178696d7573207269737573206672696e67696c6c006120717569732e205365642076656c206e69736920617420747572706973200072757472756d2074696e636964756e742e204e756c6c6120636f6e677565200065726174206c6f72656d2c207365642066696e69627573206c616375732061006c69717565742065742e2050656c6c656e746573717565207574207175616d0020696e206f72636920736f64616c65732074656d706f72207574206575206e00657175652e2051756973717565206d616c65737561646120736167697474690073207269737573206e6f6e2076656e656e617469732e204e756e632066696e006962757320756c74726963696573206e69626820706f737565726520636f6e0073656374657475722e20496e7465676572206e6563206c6967756c61206e75006e632e205574206e6563206d617373612076656c206c6967756c612074726900737469717565206665726d656e74756d20696e2065752074656c6c75732e0a000a4d617572697320736f64616c6573206469616d2069642066656c6973206c00616f726565742c207175697320736f6c6c696369747564696e207475727069007320756c6c616d636f727065722e204e756c6c6120636f6d6d6f646f2c207300617069656e20657420756c6c616d636f7270657220736f6c6c69636974756400696e2c2073656d206c6563747573206672696e67696c6c61207175616d2c2000617420706c6163657261742065782065726f732075742073617069656e2e2000496e206f64696f206e6973692c207661726975732073697420616d65742064006f6c6f722076656c2c20756c74726963657320706c6163657261742074656c006c75732e20557420646f6c6f72206d692c2073656d706572206e6f6e206d610078696d75732076656c2c2070756c76696e61722061742066656c69732e2045007469616d207269737573206e756c6c612c2065666669636974757220617420006c6f72656d206c6f626f727469732c20706f72746120656c656966656e6420006c6f72656d2e20566976616d757320617420636f6e64696d656e74756d206500726f732e204475697320657420696163756c6973206d692c2076697461652000636f6e736563746574757220617263752e20496e2065726f73206d6175726900732c2074656d706f7220717569732070656c6c656e74657371756520696e2c002070686172657472612076656c206c65637475732e204d6f72626920706f720074612c206c696265726f20617420736f64616c657320656c656966656e642c00206c61637573206c6f72656d20626962656e64756d206f64696f2c206e65630020706f72747469746f72206c65637475732074656c6c75732076656c207365006d2e204e756c6c61207363656c657269737175652065742075726e61206575002064696374756d2e205574206f726e617265206d61747469732074656d707500732e20557420626c616e646974206f64696f2061206d61737361206d617869006d75732c206e6563206d616c657375616461206c696265726f206661756369006275732e0a0a5574206d6178696d757320756c7472696369657320747269730074697175652e20457469616d206163206469616d206174206e756c6c61206c00756374757320756c6c616d636f7270657220696e20657520656c69742e2053006564206574206d617373612076656c206e6962682072686f6e637573207469006e636964756e742e2053656420636f6e677565207363656c65726973717565002074656d7075732e205175697371756520766f6c7574706174206d6173736100206c6f72656d2c2076656c2072757472756d20656e696d20636f6e64696d65006e74756d206e65632e20416c697175616d2074757270697320646f6c6f722c0020656666696369747572207365642064696374756d20616c697175616d2c20006d6174746973206964206c616375732e204d616563656e6173206665756769006174206e6973692071756973206d6178696d757320636f6e76616c6c69732e000a0a5365642074696e636964756e74207574206a7573746f207669746165200066696e696275732e204d617572697320626c616e6469742065726174206e75006e632c20766974616520616363756d73616e2061726375206672696e67696c006c6120717569732e2053656420756c7472696365732074696e636964756e7400206469616d2073697420616d657420626962656e64756d2e20416c69717561006d206661756369627573206c61637573206567657420766573746962756c75006d2068656e6472657269742e204e756c6c616d20766172697573206e656320006e6571756520657420656c656966656e642e2053656420766974616520747500727069732065742074757270697320656c656966656e642074656d706f722e002050656c6c656e74657371756520766573746962756c756d206172637520610020657569736d6f64206d61747469732e205072616573656e74206e6563207200697375732073697420616d6574207475727069732064617069627573207375007363697069742e20446f6e656320626962656e64756d2074656d707573206d006920696e2072757472756d2e20566573746962756c756d206d61737361206d00657475732c20696d7065726469657420657520736f64616c65732071756973002c20616363756d73616e2076656e656e6174697320617263752e20496e206e006f6e20706f7375657265206c696265726f2c2076656c207375736369706974002075726e612e0a0a53757370656e64697373652073617069656e206d65747500732c2070756c76696e6172206e6563206c61637573206d6f6c65737469652c00206567657374617320766573746962756c756d2065782e2056657374696275006c756d2074656d706f7220616e7465206e6563206e756e632074696e63696400756e7420666163696c697369732e20457469616d20626962656e64756d2c2000616e746520696e207072657469756d20636f6e6775652c206d61737361206c006f72656d206c6f626f727469732065782c206e65632072686f6e6375732074006f72746f72206d61757269732061632070757275732e20496e2072686f6e630075732076756c707574617465206d61676e6120617420657569736d6f642e20004d616563656e61732076656c206c616f72656574206a7573746f2c20696e20006c6163696e6961206f64696f2e2050656c6c656e74657371756520616c697100756574206c616375732061632076656e656e61746973206c75637475732e2000496e74657264756d206574206d616c6573756164612066616d65732061632000616e746520697073756d207072696d697320696e2066617563696275732e200051756973717565206c6163696e6961207072657469756d2075726e6120736f0064616c6573206d6178696d75732e20496e7465676572206469676e69737369006d207072657469756d206d6f6c6c69732e20536564206c656374757320656c0069742c20616c697175616d2061206469616d2069642c20646170696275732000766172697573206c6967756c612e204d6f726269206c6163696e696120736f0064616c6573206c6f72656d2c20696420616c697175616d206e69736c20706f00737565726520656765742e0a0a41656e65616e2070686172657472612c207400656c6c7573206163206469676e697373696d20656765737461732c206175670075652065737420656c656d656e74756d2066656c69732c2076656c206c6f62006f72746973206e69736920656e696d20636f6d6d6f646f207475727069732e002053757370656e6469737365206e756e63207475727069732c206c6f626f720074697320736564206d61757269732069642c20706f72746120736f6c6c69630069747564696e206a7573746f2e2050726f696e20656c656d656e74756d206d0061757269732073697420616d6574206f72636920696e74657264756d207469006e636964756e742e2053656420706f7274612075726e612066656c69732c200069642076656e656e617469732073617069656e207363656c65726973717565002065742e20566976616d7573206461706962757320706f72747469746f7220006a7573746f2c206964206d6f6c6573746965206e69736c20696163756c6973002074696e636964756e742e20496e206d6174746973206d6175726973207369007420616d657420636f6e76616c6c697320756c747269636965732e20446f6e00656320636f6d6d6f646f206567657374617320657261742076697461652061007563746f722e204e756c6c616d2066657567696174206d61676e6120657374002c20657420706f72747469746f72206573742074656d706f722061632e2041006c697175616d20766172697573206d69206575206c61637573206d6174746900732c2073697420616d6574207375736369706974206e69736920736f64616c0065732e2041656e65616e2065742068656e6472657269742076656c69742c2000696e20706c616365726174206e6973692e20446f6e65632071756973207665006c6974206d692e20457469616d20706c61636572617420657261742076656c002065726f73206672696e67696c6c6120636f6d6d6f646f2e0a0a5068617365006c6c7573207669746165206475692066656c69732e205072616573656e7420007072657469756d206d6174746973206e657175652c2065676574206672696e0067696c6c612066656c69732074656d706f722061742e20437261732061756300746f72206e69736c206e65632073656d206c6f626f72746973206d6174746900732e2050656c6c656e746573717565206d61747469732074696e636964756e00742074656d7075732e2050726f696e206c616f726565742073656d20612076006f6c75747061742072686f6e6375732e204d6f726269206575206d6175726900732073697420616d65742072697375732074696e636964756e74206f726e610072652e2041656e65616e20756c6c616d636f72706572206c61637573206e6f006e206e756e6320696d706572646965742c20657420656c656966656e64207400656c6c757320706c6163657261742e2043726173206574206d6920696e20640069616d206567657374617320706c616365726174206e6f6e2073697420616d006574206c65637475732e20416c697175616d20696163756c697320707572750073206c6f626f727469732c207363656c657269737175652065726f732065670065742c2076617269757320646f6c6f722e2043757261626974757220737573006369706974206e6571756520736564206567657374617320636f6e736571750061742e20496e2076656c20616c697175616d206d657475732c206c75637475007320636f6d6d6f646f206e6962682e2053656420636f6e736571756174207000756c76696e6172206d692c20736167697474697320616c6971756574206572006f73206d6178696d75732076756c7075746174652e2055742065742074656d00707573206c616375732e0a0a53757370656e646973736520706f74656e7469002e20447569732076656c2076756c707574617465206d61757269732c2075740020736f6c6c696369747564696e206d692e20446f6e65632076656c20616c69007175616d206c6967756c612c20656765742072686f6e6375732074656c6c7500732e205072616573656e74206e65632065726f732076697461652065726f73002076756c70757461746520617563746f722e204e756e63207375736369706900742c206d617572697320696420696e74657264756d20756c6c616d636f72700065722c20746f72746f72206a7573746f20646170696275732073617069656e002c207669746165206c6163696e6961206c656f2075726e61207669766572720061206e6962682e205175697371756520626962656e64756d20617563746f72002065726f732c206964206d6174746973206d617373612064696374756d2061002e205574206964206d69206e69736c2e20566573746962756c756d20657520006c7563747573206c616375732e20446f6e65632061206d6178696d7573206600656c69732e0a0a446f6e65632073656d206e69736c2c20756c7472696365730020612074656c6c75732075742c2070656c6c656e7465737175652066616369006c69736973206e756c6c612e205365642065742073617069656e207574206500726f7320636f6e64696d656e74756d20706f72747469746f722e204675736300652073697420616d6574206d657475732065782e20496e2061206578207369007420616d65742074656c6c75732070756c76696e617220636f6e73657175610074206120696420656e696d2e204d616563656e617320756c6c616d636f727000657220736f64616c6573207475727069732c207175697320756c6c616d636f00727065722065726f7320636f6e7365717561742065742e20496e74656765720020736f64616c6573206573742073697420616d657420616e74652074656d700075732c20696420616c69717565742066656c69732072757472756d2e204c6f0072656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365006374657475722061646970697363696e6720656c69742e204d616563656e61007320696420747572706973207669746165206573742076656e656e617469730020656c656d656e74756d2e0a0a446f6e656320696163756c697320677261760069646120636f6e73656374657475722e20457469616d20657569736d6f64200065726f73206567657420766573746962756c756d206672696e67696c6c612e0020496e20706f7274612c206572617420766974616520656c656d656e74756d0020677261766964612c20747572706973206c6f72656d206d6f6c657374696500206e6962682c20696420706861726574726120746f72746f72206d6574757300206c6163696e6961207475727069732e204d6175726973207072657469756d0020766172697573207475727069732c2065742063757273757320657820766900766572726120717569732e20536564206d616c657375616461206c656f20650074206d617373612074656d707573206c6163696e69612e204e756e63207369007420616d657420656e696d2073656d2e20446f6e65632076656c206772617600696461207175616d2c2076656e656e61746973207665686963756c612065720061742e0a0a496e206e6f6e206c61637573206d616c6573756164612c206d610078696d7573206e696268206e65632c20636f6e73656374657475722076656c0069742e204e756c6c61206575206772617669646120746f72746f722e205068006173656c6c757320696e74657264756d206665726d656e74756d20766172690075732e204d6f726269207661726975732076656c697420696e206c6163757300207363656c65726973717565206d616c6573756164612e2050686173656c6c00757320737573636970697420616c697175616d2065726f7320696e20747269007374697175652e20566573746962756c756d2061632075726e61206e756e63002e204d6175726973207072657469756d20746f72746f72206469616d2c206100206672696e67696c6c61206c65637475732074656d7075732061632e0a0a4d006f72626920696d70657264696574206d6f6c6c697320646f6c6f722c206e65006320656666696369747572207175616d20616c697175657420612e2056697600616d7573206c75637475732070757275732076656c206e69736c2065756973006d6f6420706f72747469746f722061632076697461652074656c6c75732e2000437261732073757363697069742074726973746971756520707572757320750074207363656c657269737175652e2050656c6c656e746573717565207369740020616d657420656c6974206964206c696265726f206665726d656e74756d2000736f64616c65732e204e756c6c616d20636f6e76616c6c6973206c6967756c006120696e207175616d207072657469756d2c20696420616c6971756574206e0069626820636f6e7365717561742e204e756c6c6120666163696c6973692e200041656e65616e206f726369206c696265726f2c2068656e64726572697420750074206c6f72656d2076656c2c20706f72747469746f7220706f72747469746f0072206c696265726f2e20557420696420616363756d73616e206d617373612e00205365642073617069656e206c656f2c2074696e636964756e7420707265740069756d2061756775652076697461652c207669766572726120766f6c7574700061742073617069656e2e204d6f726269206d6f6c6c6973206f726369207365006420756c74726963657320636f6e64696d656e74756d2e20437261732061630063756d73616e20736167697474697320696d706572646965742e204e616d200074656d706f7220766573746962756c756d207475727069732c20636f6e6469006d656e74756d2074656d706f72206f64696f20656c656d656e74756d207665006c2e20566573746962756c756d20737573636970697420616e7465206120610072637520616363756d73616e2c2076656c20636f6e677565206d61757269730020677261766964612e0a0a50686173656c6c757320766f6c7574706174206d0061757269732065676574206c696265726f206c616f7265657420616c69717500616d2e20566573746962756c756d207269737573206e69736c2c2074656d7000757320617420766f6c75747061742076697461652c2074696e636964756e74002076697461652065726f732e20416c697175616d2076656e656e617469732000616e746520626c616e64697420707572757320666575676961742c20612061006c697175616d20616e746520626962656e64756d2e2050726f696e20696e7400657264756d20697073756d206e6962682c2076656c20706f7274612066656c00697320657569736d6f642065742e20457469616d20717569732074656c6c75007320646f6c6f722e2044756973206964206c616f72656574206f64696f2c20006574206375727375732072697375732e2053757370656e6469737365206c61006f7265657420646f6c6f72206575206e756c6c6120666575676961742c20730065642066657567696174206e756c6c6120626c616e6469742e20416c69717500616d20717569732061726375207175697320617567756520756c7472696365007320696163756c69732e20446f6e65632069642065726f73206e6f6e206e6900736920616363756d73616e206f726e6172652076656c20757420657261742e002053656420636f6d6d6f646f206c756374757320616e74652071756973207000756c76696e61722e205072616573656e7420616c697175616d206d6f6c6c6900732070757275732072686f6e63757320636f6e7365717561742e2055742076006974616520636f6e6775652072697375732e20496e206d6f6c6c6973206120007075727573206964206c6163696e69612e0a0a467573636520616c69717561006d2061756775652073697420616d6574206a7573746f2070656c6c656e746500737175652c20756c6c616d636f7270657220706f727461206475692069616300756c69732e2050726f696e20656765737461732076756c707574617465206e0069736c2c2076656c20637572737573206d6173736120706f72747469746f72002061742e20536564206e6f6e2074656c6c75732076656c206e756c6c612062006c616e64697420666163696c697369732e204d616563656e617320657261740020656e696d2c20736f64616c65732061206c6163696e69612076656c2c2061006c6971756574207574206e756c6c612e20496e74656765722066656c69732000617263752c20736f64616c65732076656c206661756369627573207369742000616d65742c20766573746962756c756d2065676574206c6f72656d2e204e75006c6c612076697665727261206f64696f206163206e756e63206c7563747573002c20657520706c6163657261742074656c6c757320616c697175616d2e204d006f726269206e65632073656d20657520616e746520706f737565726520736f006c6c696369747564696e2e204e756c6c6120616363756d73616e20636f6e7300656374657475722065737420766974616520756c747269636965732e20447500697320666163696c69736973207363656c65726973717565206d6175726973002c206e6f6e20636f6e64696d656e74756d2064756920766f6c75747061742000696e2e0a0a4d617572697320717569732066696e6962757320656e696d2e20004e756e6320656765742065726f7320616c69717565742c206d6178696d757300206c6f72656d206e6f6e2c2070656c6c656e746573717565206a7573746f2e00204d6f7262692065676574206e756e6320696420726973757320657569736d006f6420626c616e6469742076656c20612072697375732e204d617572697320006120736f64616c65732074656c6c75732e2043757261626974757220626c61006e646974206174206e756e63206174206566666963697475722e204475697300206575206c696265726f206e656320647569206d6174746973206d6178696d0075732e2053656420636f6e7365717561742065726174206d61757269732c2000757420706f727461206c6563747573206665756769617420717569732e2056006573746962756c756d2076656c2074656c6c7573206e65632073617069656e0020636f6e6775652076656e656e617469732e20446f6e656320706c6163657200617420756c747269636573206d692e204675736365206c7563747573206e6f006e206d6175726973206163206375727375732e204e756c6c61206567657420006d61676e6120766974616520747572706973206d616c6573756164612076690076657272612e2050656c6c656e746573717565206174206c656374757320690064206d61676e612064617069627573206d6174746973207669746165206120007175616d2e0a0a496e206572617420657261742c20696d7065726469657420007574207175616d206e65632c20756c6c616d636f727065722072757472756d00207475727069732e204d6f72626920706c61636572617420656c697420617400206e6973692070656c6c656e74657371756520706c6163657261742e205072006f696e207669766572726120736f6c6c696369747564696e20637572737573002e2046757363652076656e656e6174697320626c616e646974206e69736c200073656420636f6e6775652e204675736365206d6f6c65737469652c2075726e00612076656c20636f6e76616c6c69732072686f6e6375732c20656c6974206d006574757320657569736d6f642065782c2071756973207665686963756c6120006d61737361207075727573206163206475692e2041656e65616e206e6f6e20006c61637573207665686963756c612c20656c656966656e6420656c69742073006f64616c65732c207661726975732073617069656e2e20536564206e756c6c0061206a7573746f2c206665726d656e74756d20706f72747469746f722076690076657272612075742c20706f727461206567657420656e696d2e2050656c6c00656e74657371756520636f6e736563746574757220736167697474697320740075727069732c206174206375727375732064756920706f737565726520696e002e205175697371756520612073757363697069742065726f732e2045746961006d20616c69717565742c20646f6c6f722061742064696374756d2072686f6e006375732c206d692065737420756c6c616d636f727065722072697375732c2000612074696e636964756e742074757270697320746f72746f72206e6f6e206e006962682e2053656420636f6d6d6f646f206469616d206163206f7263692076006f6c75747061742c207669746165206c6f626f72746973206d61676e612070006f73756572652e204475697320636f6d6d6f646f20656c697420696420657800207661726975732c206567657420706f737565726520697073756d2061756300746f722e20467573636520756c74726963696573206f64696f20657520636f006e67756520616c69717565742e2055742071756973206573742070756c7669006e61722c2076756c707574617465206c65637475732076756c707574617465002c20636f6e7365717561742073617069656e2e0a0a446f6e656320636f6e7600616c6c6973206d61757269732074656d707573207661726975732061756374006f722e20416c697175616d207472697374697175652064696374756d207075007275732c20696420677261766964612075726e6120616c6971756574207574002e20566976616d75732065752076656e656e6174697320616e74652c206d610078696d75732074696e636964756e74206f7263692e20557420617420616c69007175616d206c6f72656d2e20416c697175616d206e6f6e206c61637573206e00756c6c612e204d6f72626920766974616520656666696369747572206d61730073612c2076697461652072686f6e63757320657261742e2041656e65616e20006e6f6e20657261742071756973206d617572697320657569736d6f6420626c00616e6469742e205574207669746165206e756c6c612073697420616d6574200074656c6c7573206567657374617320636f6e7365717561742e205574206c69006265726f206c65637475732c20626c616e6469742070756c76696e6172207300757363697069742065752c20636f6e7365637465747572207669746165207300617069656e2e2043757261626974757220706f727461206e756e632066656c0069732c20717569732070656c6c656e746573717565206c656f206469676e69007373696d2061742e204d6f7262692076656c20696163756c6973206e696268002e20446f6e65632074696e636964756e742065737420657520696d706572640069657420706f72747469746f722e20566573746962756c756d20696e207475007270697320746f72746f722e0a0a50726f696e207669746165206172637520006e6962682e205072616573656e74206573742073617069656e2c2074696e63006964756e7420617420617263752076697461652c2076656e656e617469732000736f6c6c696369747564696e20746f72746f722e2050656c6c656e7465737100756520666163696c697369732c206f64696f20696e207472697374697175650020736f64616c65732c20657374206e6571756520657569736d6f642069707300756d2c20657520656c656d656e74756d206f726369206e6571756520766974006165206c696265726f2e20446f6e65632074656d706f72206c696265726f2000696e206c656f20636f6d6d6f646f2c2075742076756c707574617465206d6100676e61206c616f726565742e204d616563656e61732072757472756d20656c00656d656e74756d20766f6c75747061742e20536564206d6f6c65737469652c00206d6574757320657520656c656d656e74756d20616363756d73616e2c207300656d207175616d20636f6e76616c6c6973206c696265726f2c206e6f6e206d00616c65737561646120616e7465206c61637573206c6f626f7274697320746f0072746f722e205365642076656c697420646f6c6f722c20636f6e73656374650074757220617563746f7220616c697175657420696e2c206f726e617265206500752073617069656e2e204e756c6c61206574206c65637475732061207075720075732073656d706572206d61747469732e204e756c6c616d206d61747469730020656c656966656e64206d6f6c65737469652e0a0a4d6175726973206c6f62006f727469732065726174206c616375732c20757420766573746962756c756d00206175677565207072657469756d2065752e20446f6e65632065742073656d00706572206d61757269732c2073697420616d65742067726176696461206c6500637475732e20447569732076656e656e61746973206d69206f7263692c2061002065666669636974757220646f6c6f7220617563746f722069642e204e756c006c61206e6f6e2075726e612075742065726174207665686963756c61207469006e636964756e74207574206964206a7573746f2e2041656e65616e206c616300696e696120657374206964206c7563747573206d616c6573756164612e20550074206f726e61726520647569207175697320636f6e736563746574757220700072657469756d2e20496e206163206a7573746f206163206e756c6c61207669007665727261207665686963756c612e2053757370656e646973736520696e2000766573746962756c756d206d657475732c206120736f64616c6573206c6f7200656d2e204d6f726269206e6f6e206c6967756c612076697461652074656c6c0075732066696e69627573207363656c6572697371756520617420696e20616e0074652e205175697371756520696e2073656d70657220646f6c6f722e2045740069616d206d6f6c6c69732c206d6574757320696420766f6c7574706174207300656d7065722c206d61737361206e65717565206c6163696e69612073656d2c0020696e20656666696369747572206c656374757320656c6974207574206e75006e632e2050726f696e206c6163696e6961206c6f72656d2071756973207475007270697320756c7472696365732c20757420666175636962757320646f6c6f007220656c656966656e642e20446f6e6563206c6f626f727469732069707375006d206575206572617420616c69717565742c2065752065676573746173206c006967756c6120656c656d656e74756d2e205072616573656e74206964206572006f732066696e696275732c206d6f6c6c69732074757270697320696e2c206d006f6c6c6973207175616d2e2050686173656c6c757320626c616e6469742063006f6d6d6f646f206e756e6320696e20626c616e6469742e204e616d207175690073207269737573207574206469616d206c6f626f72746973207361676974740069732e0a0a50726f696e20766f6c75747061742074656d707573207275747200756d2e2050726f696e20696d7065726469657420626c616e646974207361700069656e207175697320706c6163657261742e204e756c6c6120706f73756572006520647569206964206f64696f20657569736d6f642c20696420696163756c0069732075726e6120646170696275732e20446f6e65632070656c6c656e74650073717565206d617373612069642076697665727261206c616f726565742e20004e756c6c616d2071756973206c6163757320636f6e76616c6c69732c20626c00616e646974206c656f206e6f6e2c20616c697175616d206c696265726f2e2000536564206461706962757320617567756520696e2075726e61207068617265007472612c2061742073656d706572206c656374757320706c6163657261742e002053656420756c74726963657320726973757320696420696163756c6973200074656d7075732e20496e7465676572206665726d656e74756d2c2072697375007320657420636f6e736563746574757220636f6e6775652c206e756e63206500737420696163756c69732072697375732c20706f73756572652076656e656e00617469732065726f7320616e74652076656c2070757275732e20496e746567006572206c6163696e69612074656c6c7573207669766572726120726973757300207361676974746973206672696e67696c6c612e2043726173206e6f6e2069007073756d2071756973206e65717565207669766572726120666163696c6973006973206e6f6e20736564206475692e20467573636520636f6d6d6f646f2065006c656966656e64206a7573746f207175697320636f6e6775652e0a0a56697600616d7573207363656c657269737175652074696e636964756e74206e756e6300206469676e697373696d20636f6e64696d656e74756d2e2051756973717565002061726375206e69736c2c20756c6c616d636f72706572206e6563206c65630074757320717569732c20636f6e67756520616363756d73616e20657261742e0020437572616269747572207574206e697369207475727069732e20496e20760069746165206573742071756973206d657475732074656d7075732076657374006962756c756d206575206e656320617263752e2055742073656d206a757374006f2c206665756769617420657520636f6e73657175617420656765742c2075006c6c616d636f72706572206567657420697073756d2e205072616573656e7400207072657469756d206d6174746973206c656f2c2067726176696461206865006e647265726974206c696265726f2065666669636974757220656765742e20004d616563656e617320626c616e646974206e696268206469616d2c206e656300206c6163696e69612061726375206c6163696e69612065742e0a0a4675736300652074696e636964756e7420746f72746f722066656c69732e2053656420640069616d206e6962682c20637572737573206e656320646170696275732065670065742c206f726e61726520656666696369747572206d692e20446f6e65632000696420746f72746f72207669746165206d692064696374756d2076657374690062756c756d2e2050726f696e206964206c696265726f20616c697175616d200076656c69742074656d706f7220696d706572646965742073697420616d657400207669746165206c616375732e20437261732073697420616d6574206578200068656e6472657269742c206672696e67696c6c6120617567756520696e2c20006c616f72656574206f7263692e204d616563656e6173206c61637573206d65007475732c20656c656966656e6420736564206d657475732075742c2065756900736d6f6420657569736d6f642076656c69742e20496e746567657220696e2000616363756d73616e206d692e0a0a41656e65616e20696163756c6973207665006c206a7573746f20756c7472696369657320766f6c75747061742e20437261007320636f6e73656374657475722c2065726f73206e6f6e20756c6c616d636f007270657220696163756c69732c2076656c6974206578207665686963756c61002076656c69742c2073697420616d657420696163756c6973206a7573746f20006469616d206567657420657261742e20496e74656765722066696e696275730020736f64616c6573206d617373612073697420616d6574206d616c657375610064612e20496e2072686f6e6375732073617069656e206964207175616d207600697665727261207665686963756c612e20496e20686163206861626974617300736520706c617465612064696374756d73742e20446f6e656320616320706f0072747469746f72206e657175652c2073656420656666696369747572206c690067756c612e20446f6e6563206567657420616c697175616d206c616375732c00206e6f6e207665686963756c61206e69736c2e2053656420706c61636572610074206d617474697320636f6e76616c6c69732e20496e746567657220736f6400616c65732c206e69736c2061207665686963756c61206469676e697373696d002c2076656c69742074656c6c7573206566666963697475722070757275732c00206120766573746962756c756d206f64696f206c6163757320696420646961006d2e204e756c6c616d20766974616520626c616e64697420656c69742e20500072616573656e742074696e636964756e74206c656374757320656c69742c20006e6f6e2074656d707573206e69736c20677261766964612076697461652e20004e756c6c61206469616d2070757275732c206c616f7265657420766974616500206567657374617320696e2c20636f6e7365637465747572206574206d6175007269732e2053656420766172697573206d6f6c6c697320656c656d656e7475006d2e204e616d2073697420616d6574206d61676e6120677261766964612c200068656e64726572697420697073756d206e6f6e2c2074656d7075732073656d002e204d616563656e6173206469676e697373696d206d6f6c6c69732072686f006e6375732e205365642066656c6973206e69736c2c2073656d706572206174002074656c6c75732065742c206d616c65737561646120616c697175616d2069007073756d2e0a0a496e74656765722073757363697069742076656c6974206900642073656d206665726d656e74756d2c207175697320756c747269636573200073656d2074696e636964756e742e2041656e65616e2076656c20646f6c6f7200206e65632074757270697320656c656d656e74756d207363656c65726973710075652e2050726f696e206f64696f20746f72746f722c20616c697175657420006567657420696d7065726469657420717569732c20736f6c6c69636974756400696e206964206c616375732e2050656c6c656e74657371756520656e696d2000656c69742c207375736369706974206964207175616d206e65632c206375720073757320616c697175616d2065726f732e20446f6e656320626962656e6475006d2073697420616d6574206d657475732071756973207363656c65726973710075652e204e756e6320616320747572706973206a7573746f2e205365642070006c61636572617420746f72746f72206e6563206c6163757320736f6c6c69630069747564696e207363656c657269737175652e2050686173656c6c7573207600697461652063757273757320657261742c20616320756c747269636965732000746f72746f722e0a0a43726173206d616c657375616461206772617669646100206a7573746f2076656c207661726975732e204e756c6c616d206c616f7265006574206964206d617572697320696e20646170696275732e20437572616269007475722073757363697069742065782065676574207361676974746973206c0075637475732e20447569732071756973207669766572726120656c69742c20007175697320756c6c616d636f72706572206e756e632e204d61757269732065006c656966656e642c206d6173736120696e20626962656e64756d2061636375006d73616e2c206578206e69736920766573746962756c756d206469616d2c2000757420696163756c697320647569206f72636920736564207475727069732e00204e756c6c6120626962656e64756d2c2076656c697420657520636f6e7661006c6c69732073656d7065722c206d65747573206e69736c20706f7375657265002061756775652c2068656e64726572697420696163756c6973207361706965006e207175616d206574206469616d2e2050726f696e2076656c206e69736c200061756775652e20566976616d75732076656e656e61746973206d657475732000736564206d617572697320706f73756572652c20612068656e6472657269740020656e696d20766976657272612e204475697320636f6d6d6f646f206172630075206574206d61676e6120756c7472696365732070656c6c656e746573717500652e204e616d20696e206c696265726f2076656e656e617469732c2076657300746962756c756d206175677565206c6163696e69612c20766172697573206c006f72656d2e20457469616d206574206c7563747573206c616375732e205175006973717565206d6f6c65737469652c206e69626820617420756c74726963650073206d61747469732c206c616375732075726e6120636f6e76616c6c697320006e756c6c612c20696e206d616c657375616461206e756c6c61206c656374750073206e6f6e206469616d2e20457469616d206567657420697073756d206d6100676e612e2050686173656c6c75732066656c6973207175616d2c2062696265006e64756d2073697420616d657420726973757320717569732c20677261766900646120657569736d6f642066656c69732e0a0a46757363652076656e656e610074697320696e74657264756d20656c69742c20717569732072757472756d20006f72636920706f7375657265206e6f6e2e20496e20656c656966656e6420650073742071756973206469616d20666163696c697369732c206163206d616c65007375616461206d61737361206f726e6172652e204c6f72656d20697073756d0020646f6c6f722073697420616d65742c20636f6e7365637465747572206164006970697363696e6720656c69742e205365642063757273757320616c69717500616d206f64696f2076656c2073757363697069742e2050656c6c656e74657300717565206163206c696265726f206163206572617420616c6971756574207300616769747469732e204d616563656e617320616e7465206c616375732c20730063656c65726973717565206574207472697374697175652076697461652c20006566666963697475722065676574207175616d2e2050686173656c6c7573200072757472756d20656c69742061756775652c2071756973206c6163696e696100206f7263692074696e636964756e74206e65632e20496e20636f6e736563740065747572206964206f726369206575207363656c657269737175652e205065006c6c656e74657371756520616c69717565742074656d707573206f64696f200075742076756c7075746174652e2051756973717565206c696265726f206e6900736c2c2072757472756d2061742073617069656e206e65632c206c616f726500657420747269737469717565206a7573746f2e2043726173206c6163696e690061206e6962682069642065726f732072757472756d207363656c65726973710075652e204e756e63206e6f6e206d6175726973206f7263692e204e616d2069006d706572646965742064617069627573206a7573746f2e20496e2076656c20006c6163757320706f72747469746f722c20766172697573207269737573207500742c20616c697175616d20746f72746f722e2043757261626974757220696e00206d657475732076656c2065782076656e656e6174697320706f7274612e0a000a53757370656e6469737365207365642070756c76696e6172206573742e200050686173656c6c7573206e6563206d6920656c656966656e642c20666575670069617420617263752061742c20706f72747469746f72206e6973692e204475006973206567657420626c616e6469742065782e2043726173206120647569200065726f732e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e20496e2073656d206c696265726f2c20766f6c757470617420650067657420647569207365642c2070656c6c656e746573717565206c7563747500732065782e20536564206574206c656f20656765742065726f7320696e7465007264756d206d6178696d75732e2050686173656c6c7573206e6f6e206d6f6c006573746965206c65637475732c206e6f6e207665686963756c61206c6563740075732e20446f6e656320656666696369747572206d616c657375616461206d0061757269732c2065676574207472697374697175652073656d206c6f626f720074697320612e204e616d2074656c6c75732075726e612c2072686f6e63757300206665726d656e74756d20737573636970697420717569732c20696d70657200646965742071756973206f7263692e20557420637572737573206572617420007669746165206665726d656e74756d20666163696c697369732e204e756e630020757420626c616e646974206c6f72656d2e20566573746962756c756d207400656c6c7573206469616d2c20636f6e67756520657520706f7375657265207500742c206c6f626f7274697320612073656d2e204e756c6c616d206163206f72006369206e6f6e2075726e6120656c656966656e6420696d706572646965742e000a0a5072616573656e74207669746165206e69736c206672696e67696c6c61002c2073757363697069742065726174207365642c20656c656d656e74756d200072697375732e20446f6e656320696420756c74726963696573206f64696f2e002050726f696e206d6174746973206d61757269732061206d61737361206d610078696d7573207472697374697175652e2050686173656c6c757320656765740020706f7375657265206e6962682e2050686173656c6c757320736564206d650074757320657420657820636f6d6d6f646f20766f6c75747061742e2041656e0065616e206c6163696e69612c206175677565206e6f6e206566666963697475007220636f6e6775652c206d617373612073656d207669766572726120646961006d2c207175697320706f737565726520647569206c6f72656d2061206c6f7200656d2e20496e2076756c7075746174652064756920657520656c6974207375007363697069742074656d706f722e204372617320696d70657264696574206d0061757269732073656420657820637572737573206c616f726565742e2056690076616d7573206e65717565206573742c20666163696c697369732071756973002066656c697320717569732c20706f72747469746f7220706f72747469746f0072206e756e632e204675736365206e6f6e206c6f626f72746973206c6f7265006d2e0a0a4d616563656e617320766f6c7574706174206661756369627573200074656c6c757320756c747269636965732070756c76696e61722e205068617300656c6c7573206120706f72747469746f7220617263752e20446f6e6563207600756c70757461746520656e696d207475727069732c20612074696e63696475006e74206469616d2074656d706f722065752e20446f6e656320736f6c6c69630069747564696e2c206578207669746165206c75637475732076657374696275006c756d2c206e69736c20616e746520756c6c616d636f72706572206d692c2000617420756c7472696369657320656e696d20646f6c6f722073656420656c6900742e205072616573656e74206d6f6c6c697320656666696369747572207269007375732071756973207072657469756d2e20566573746962756c756d2071750069732066696e69627573206475692c2065676574206f726e617265206c6563007475732e20457469616d2065676574206a7573746f20766573746962756c75006d2c20626c616e6469742073656d20696e2c206d6178696d75732065726f73002e0a0a50686173656c6c7573206120697073756d206575206d69206375727300757320736f64616c6573206e656320736564206e6973692e204475697320660072696e67696c6c6120657374206163206c6967756c612070756c76696e61720020677261766964612e2050726f696e207669766572726120616363756d7361006e2073656d2c2076656c2072757472756d206e69736c20636f6e736571756100742076656c2e204e756e63206672696e67696c6c61206d657475732076656c002066617563696275732074656d706f722e205072616573656e7420636f6e73006563746574757220646170696275732061756775652c206574207363656c6500726973717565206c656374757320636f6e64696d656e74756d206e65632e20004e756e6320616363756d73616e2c2075726e61206e6f6e20706c6163657261007420756c7472696365732c206d617572697320617567756520736f6c6c69630069747564696e20616e74652c2073697420616d657420616c697175616d206c00616375732076656c69742061632074656c6c75732e205365642076656e656e00617469732c2074656c6c7573206e656320617563746f722064617069627573002c206c6f72656d2073617069656e2073656d70657220657261742c206575200076697665727261207175616d2075726e61207669746165206c6f72656d2e20004d616563656e6173207375736369706974206e756e63207574206d6f6c657300746965206d61747469732e20416c697175616d2076697461652065737420640069676e697373696d2064756920656c656d656e74756d20617563746f722e0a000a4d6f726269206e756c6c61206c616375732c2073656d706572207369742000616d65742066656c69732065742c2076756c707574617465206d616c65737500616461206475692e2050726f696e20656765742065726f73206c6563747573002e20446f6e65632074696e636964756e7420656c69742076656c20736f6c6c00696369747564696e2073616769747469732e2050726f696e206163206d6f6c0065737469652073656d2e2053757370656e646973736520696163756c69732000766573746962756c756d2073656d206574206d61747469732e2050726f696e00206c6f626f72746973206c616f72656574206469616d2c2073656420706f730075657265206573742074656d706f722065742e2053656420696e20746f7274006f72207175697320657820696d70657264696574206c6163696e6961207175006973206e6563206c6f72656d2e204d616563656e617320636f6e76616c6c69007320656666696369747572206f7263692c20657420706f72747469746f7220006e69736c20666163696c69736973206e6f6e2e205365642068656e647265720069742076656e656e617469732066656c697320666175636962757320656c65006d656e74756d2e204d6f7262692061632064756920736f64616c65732c207000656c6c656e74657371756520697073756d2076656c2c20736f64616c6573200076656c69742e20457469616d20656e696d206c6f72656d2c2076656e656e6100746973206163206c616375732065742c2065676573746173206d616c65737500616461206c65637475732e20416c697175616d20736f64616c6573206e6962006820656666696369747572206c656374757320616c697175616d2076657374006962756c756d206e6f6e2061206f64696f2e204d61757269732069642066610075636962757320656c69742c2073656d70657220706f72747469746f72206e00756c6c612e204675736365206f726e6172652c206a7573746f20696e20766500686963756c6120636f6d6d6f646f2c206c61637573206c6163757320636f6e006775652074656c6c75732c20757420666175636962757320697073756d207200697375732061206e756c6c612e20457469616d207669766572726120707572007573207175616d2c2076656c20706f72747469746f72206d6574757320696d00706572646965742065752e204d6f72626920636f6e76616c6c697320636f6e00736571756174206475692e0a0a4d61757269732074726973746971756520610072637520717569732072686f6e6375732064696374756d2e204e756e632064006f6c6f72206c696265726f2c206d6178696d757320617420656e696d207574002c20677261766964612072686f6e637573207175616d2e2056657374696275006c756d206d61747469732074696e636964756e7420666163696c697369732e00204675736365206e756c6c612061756775652c20656765737461732073656400206c6163696e69612076697461652c206d616c657375616461206163206e75006c6c612e204d617572697320696163756c6973207072657469756d206c61630075732c20612066696e696275732075726e6120706f73756572652061632e20004d6f72626920696e74657264756d20666175636962757320657261742c206100206c616f72656574206d61676e6120626c616e64697420612e204372617320006e6563206d61676e612071756973206c6163757320656765737461732069610063756c69732e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f862b093fd6807e033db6b24db5485814f79a98c7e241432e95c2e327042f821f24f4a59315cf4e881205f472e99835729977ab0aa9da85a334c2935e670bd44e9b734481fc5ab72859c76f741008a92c2836932af9e60697b6319f3454a141154fcd583f862b091a6c5d19e50b1b85ae2ef07477160381babf00f0906f5219ce09dee2e00d7d347cb0586d90b491637cdb1715e62d152b0a660592b94033f9c5f7987005fa5d1f84435585ddaaf4b3adc0a198b983f2ae007db73b90067a96ec214b24d7b9820b9"`; +exports[`eip4844 > w/ prepareTransactionRequest 1`] = `"0x03fa04018df8b701820311843b9aca008502ae1107ec8252089400000000000000000000000000000000000000008080c08504a817c800f842a0012580b7683c14cc7540be305587b0eec4e7ec739094213ca080e2526c9237c4a001243c18a024c835cce144b3b6b0eb878b7820c7c7b7d9feff80080d76519c4501a01af5ca1379ce8d661e11cb4ec12c822f8585744c2e92b546a8b306c7eb114a1fa0743de0c135b1425428f830b826d3addea041a863a9257347a6591df502d37cc7fa040008ba020000004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e0073656374657475722061646970697363696e6720656c69742e20557420756c0074726963696573206f726369207175616d2c2073697420616d657420656c65006966656e6420616e7465206672696e67696c6c61206e65632e2050726f696e0020616c697175616d20696e2074656c6c7573206772617669646120636f6e7600616c6c69732e2050726f696e2072757472756d20636f6e7365717561742065006e696d20736564206d616c6573756164612e2041656e65616e206567657374006173206d657475732076697461652073656d20636f6e64696d656e74756d200073757363697069742e2053757370656e64697373652061726375206475692c00206772617669646120696e2065726f732065742c206d617474697320616c6900717565742074656c6c75732e20496e74656765722070656c6c656e7465737100756520616e74652066696e69627573206d692072757472756d20616c69717500616d2e20496e7465676572206d6174746973206469616d2073656420666575006769617420696d706572646965742e20467573636520696420626962656e6400756d206d617373612e20496e74656765722061742074656d70757320656e69006d2e20416c697175616d206574206d6f6c6c6973206d61676e612e0a0a536500642073656d70657220656c656d656e74756d206d61737361206e6f6e2076690076657272612e205365642073697420616d6574206d61676e612065742069700073756d207472697374697175652076756c7075746174652e2050656c6c656e0074657371756520696e206c696265726f2073656d2e2053757370656e64697300736520736f64616c65732074656d706f722061756775652074696e63696475006e7420666163696c697369732e204d616563656e6173207363656c657269730071756520697073756d20617420666575676961742064696374756d2e204d61006563656e61732076656c2075726e6120736564206d6574757320756c7472690063696573206d6f6c6c69732e204e756c6c61206c6f72656d206d6175726973002c2073757363697069742065676574206172637520696e2c2072757472756d002072757472756d206d617373612e204d616563656e617320616320696d706500726469657420656c69742c2073656420737573636970697420697073756d2e002050726f696e206d6f6c6573746965206d6173736120617263752c20612063006f6e64696d656e74756d206f64696f20756c7472696365732073697420616d0065742e205072616573656e742072686f6e6375732065782070757275732c200073656420706c616365726174206e756e63206f726e6172652065742e205068006173656c6c75732061206e696268206d616c6573756164612c20756c6c616d00636f72706572206e69736c2061742c2070656c6c656e746573717565206c6f0072656d2e2050686173656c6c7573206c6f72656d20697073756d2c20756c6c00616d636f727065722075742076756c70757461746520616c69717565742c20007661726975732065676574206c6f72656d2e0a0a4d61757269732068656e640072657269742074696e636964756e74207175616d20616320696e7465726475006d2e20496e206120697073756d206e6f6e207175616d206d6178696d7573200066696e696275732e20536564206f64696f2065782c206c6163696e69612076006974616520697073756d2073616769747469732c207665686963756c612065006765737461732072697375732e204e756c6c616d20616320656c656966656e006420646f6c6f722c20657520706f72747469746f722074656c6c75732e204d00616563656e617320746f72746f722076656c69742c20636f6e64696d656e7400756d20696420656e696d2076656c2c20657569736d6f64206f726e617265200072697375732e20416c697175616d206964206c6f72656d20696e7465726475006d2c20616c697175616d20707572757320696e2c207068617265747261206a007573746f2e205574207669746165206c656f206469616d2e204e756c6c612000656c656d656e74756d206e756e63206d657475732c206e65632076617269750073206f64696f2066696e69627573206e65632e20457469616d207175697320006e69736c20696e74657264756d2c20766f6c757470617420646f6c6f72206500742c2072686f6e637573206e6962682e204d616563656e6173206e6f6e207200757472756d2061756775652c20657520656c656966656e64206d692e20446f006e6563206c6f626f7274697320616e7465207669746165206175677565207000686172657472612c206174206c6163696e696120746f72746f7220707265740069756d2e0a0a4d616563656e61732061742074656d706f72206d61676e612c0020696e20737573636970697420656e696d2e204e756c6c6120656c656d656e0074756d2072757472756d2065782c206567657420736f64616c6573206e756c006c6120636f6e76616c6c69732076697461652e20566976616d757320646967006e697373696d2c2065726f7320657520656c656d656e74756d20736f6c6c69006369747564696e2c206c6f72656d20647569206c7563747573207361706965006e2c206163206d617474697320646f6c6f7220656e696d2073757363697069007420656c69742e204e756c6c61206567657420696d70657264696574206d65007475732e2043757261626974757220636f6e64696d656e74756d206120707500727573207363656c6572697371756520756c7472696365732e20416c69717500616d206c696265726f206d692c20766573746962756c756d2065742074656d00706f722065752c2070686172657472612073697420616d657420656c69742e0020557420696420616c697175616d206c696265726f2e0a0a53656420636f6e007365637465747572206c65637475732066696e69627573206c656374757320006f726e61726520706f7274612e20447569732073656420636f6e677565207300617069656e2c20757420696d7065726469657420656e696d2e205365642065006c656d656e74756d20696163756c6973206c6967756c612c206e6f6e207665006e656e617469732073617069656e206c75637475732069642e2053656420650066666963697475722c20616e7465207669746165206d6f6c657374696520650066666963697475722c20656c697420697073756d20636f6e64696d656e7475006d20697073756d2c2076656c206d6f6c6c6973206d61676e61206f64696f20007669746165206c616375732e2053757370656e64697373652065676573746100732073656d206f64696f2c20696e20766573746962756c756d206e69736c2000706f72747469746f722076656c2e20496e2074696e636964756e742c206d65007475732061206c6f626f7274697320756c7472696365732c20697073756d20006d6574757320766573746962756c756d206e756c6c612c20617420696d706500726469657420746f72746f72206e6571756520736564206d692e204d61757200697320617420616e746520616e74652e20566573746962756c756d2063757200737573207665686963756c6120756c7472696365732e204d6f726269206c750063747573206120657374206e656320696d706572646965742e205574206e6f006e2075726e61206672696e67696c6c612c2065676573746173206d65747573002065752c2064696374756d20656c69742e20496e2064696374756d20707572007573206964206c656374757320616c69717565742074656d706f722e20416c00697175616d206572617420766f6c75747061742e204e616d206175677565200066656c69732c20696d70657264696574206174206d61676e61206e65632c200070656c6c656e746573717565207661726975732074656c6c75732e0a0a4d61006563656e617320656765742065782070656c6c656e7465737175652c20656c00656d656e74756d206469616d2061742c20656c656966656e6420646f6c6f72002e204e756c6c616d20626962656e64756d2065726f73206e656320646f6c6f007220646170696275732c2061742073616769747469732065737420636f6e6400696d656e74756d2e205072616573656e74206e6f6e2068656e647265726974002065726f732e204d616563656e617320636f6e736571756174206d617373610020766974616520647569207665686963756c612c20757420756c747269636500732072697375732073656d7065722e2053757370656e646973736520646170006962757320616e746520646f6c6f722c206120626962656e64756d2076656c0069742074726973746971756520696e2e204d616563656e6173206e65632069006163756c697320656e696d2e20566573746962756c756d20736564206f6469006f2064696374756d2c20766573746962756c756d206f64696f20656765742c0020656c656966656e64206d657475732e204d6175726973206163206c69626500726f20736564206c656f2070756c76696e617220636f6e76616c6c69732e200044756973207665686963756c61206f72636920656c69742e2056657374696200756c756d2065666669636974757220656765737461732065782061206f726e006172652e2051756973717565206f726e617265206e6962682063757273757300206d6f6c65737469652070656c6c656e7465737175652e0a0a446f6e6563200074696e636964756e7420666575676961742073757363697069742e2056657300746962756c756d20756c6c616d636f7270657220646f6c6f72206e6f6e206c006967756c6120766573746962756c756d2c20612070756c76696e6172206e75006e6320636f6e7365717561742e20416c697175616d2070756c76696e617220007661726975732074656c6c757320657520617563746f722e204d6175726973002076697665727261207665686963756c612065782c20766974616520616c69007175616d20617263752064696374756d2069642e205175697371756520706800617265747261207669746165206d61676e6120696e206f726e6172652e2056006573746962756c756d207072657469756d207363656c65726973717565206f0064696f20696420636f6e73656374657475722e204e756c6c61207365642065006e696d207574207175616d20636f6e736563746574757220747269737469710075652e0a0a4e756c6c616d206f64696f206d61757269732c20666575676961007420657520666575676961742075742c20706f737565726520766974616520006d61676e612e205365642076697461652073656d706572207475727069732c002073697420616d6574207363656c65726973717565206e756c6c612e2051750069737175652074656d707573206e6f6e206d692073656420706f7274746974006f722e2050726f696e206c656f2065782c20706f73756572652065752065670065737461732076656c2c206d6f6c657374696520736564206d657475732e20004e616d20747269737469717565206c6163757320657420697073756d206d610078696d757320756c747269636965732e204e756c6c616d20706f7375657265002073697420616d65742073617069656e206d6f6c657374696520756c6c616d00636f727065722e204d6f72626920656765737461732c20657261742061632000626c616e6469742064696374756d2c2073617069656e206e69736c2066696e0069627573206e6973692c2073656420656666696369747572206c6563747573002073656d20657520697073756d2e2050686173656c6c7573206c656f206175006775652c2076756c70757461746520706c616365726174206175677565206500752c2074656d706f722074696e636964756e74206c6f72656d2e204675736300652073697420616d65742073656d70657220746f72746f722e0a0a5375737000656e646973736520706f74656e74692e204d616563656e6173206964206461007069627573207475727069732c206e6f6e2076756c7075746174652065782e00204e756c6c616d2072757472756d206c6967756c61206e65632072697375730020737573636970697420766f6c75747061742e20416c697175616d206c756300747573206e657175652073697420616d65742061726375207472697374697100756520766f6c75747061742e205365642076697461652066656c6973206c6f0072656d2e20416c697175616d20706c61636572617420656c656d656e74756d002073617069656e2c2076697461652076756c7075746174652072697375732000766f6c757470617420696e2e204d616563656e6173207669746165206475690020657261742e2050686173656c6c7573206672696e67696c6c61207361706900656e2073656420647569207665686963756c612c2076617269757320636f6e00736563746574757220616e746520736f6c6c696369747564696e2e20437261007320696163756c69732c2073617069656e20696e74657264756d20696d7065007264696574206566666963697475722c20647569206d61757269732070756c0076696e617220697073756d2c2061742076656e656e61746973206e69736c20006f64696f2071756973207175616d2e204e756e63206566666963697475722000636f6e73656374657475722073656d7065722e204e756c6c616d20706f737500657265206e756c6c612072686f6e6375732070756c76696e617220756c74720069636965732e204e756e632074656c6c757320617263752c2068656e6472650072697420736f6c6c696369747564696e206469616d2076697461652c206865006e6472657269742066696e696275732065782e0a0a536564206c6f626f7274006973206d6174746973206c6967756c612c20766974616520636f6e76616c6c006973206c656f2064617069627573206e6f6e2e204d616563656e617320766900746165206c61637573206575206e69736c20617563746f7220656c656d656e0074756d206e6563207669746165206c65637475732e204d616563656e617320007669746165206f726369207669746165206d6920756c6c616d636f727065720020706f72747469746f72206964206c6f626f72746973206e69736c2e20446f006e6563206964206d617572697320697073756d2e20416c697175616d20657200617420766f6c75747061742e20566976616d7573206c6f626f72746973206e00696268207574206573742076756c70757461746520666575676961742e2049006e7465676572206c696265726f207175616d2c20756c74726963657320617400206f7263692061742c20636f6e677565206665726d656e74756d206d61737300612e20457469616d2069642065726f7320696163756c69732c20636f6e6469006d656e74756d206f7263692074696e636964756e742c206d6174746973206d00657475732e204d616563656e617320756c7472696365732073697420616d65007420646f6c6f722069642070656c6c656e7465737175652e2056657374696200756c756d20706f727461206d6178696d7573206e69736c2c20696e2066696e006962757320746f72746f7220766f6c75747061742075742e2055742067726100766964612c20646f6c6f7220756c7472696365732068656e6472657269742000666575676961742c20656e696d2073656d20696e74657264756d206c696775006c612c20616320656666696369747572206572617420656c6974206964206c006f72656d2e20496e2073697420616d657420756c6c616d636f72706572206c006f72656d2e0a0a50686173656c6c7573206c6967756c612075726e612c2063006f6e736571756174206574206c756374757320612c206f726e617265206574002061756775652e20566573746962756c756d20657420616e7465206174206c006163757320626962656e64756d20696d706572646965742e20457469616d200074757270697320617263752c2063757273757320766974616520766976657200726120612c2068656e64726572697420766974616520617263752e2050726f00696e206f726e617265206d6175726973207574206d61676e61206d6f6c657300746965206d61747469732e20446f6e65632074656d706f72206c6563747573002071756973206d617373612076756c70757461746520696e74657264756d2e002050726f696e206575206c6967756c61206469616d2e204d616563656e617300206461706962757320747572706973206c65637475732c2075742066616369006c6973697320656c6974206469676e697373696d2075742e204e756e632062006c616e646974206f726369206120616e746520666163696c697369732c2061007420636f6e76616c6c69732066656c697320666163696c697369732e2043750072616269747572207375736369706974206d692061206c696265726f20706f0073756572652c2071756973206f726e617265206a7573746f2076697665727200612e2050656c6c656e746573717565206861626974616e74206d6f72626920007472697374697175652073656e6563747573206574206e6574757320657420006d616c6573756164612066616d6573206163207475727069732065676573740061732e204e756c6c612070756c76696e6172207363656c6572697371756520006d61676e612c2065676574206c6f626f72746973206e69626820636f6d6d6f00646f2061742e20447569732065676574207661726975732066656c69732c2000636f6e64696d656e74756d20706c616365726174206c65637475732e20416c00697175616d20617563746f722074656d706f722075726e612065752070756c0076696e61722e204d6f726269206375727375732074656d706f72206e65717500652c206e6f6e20626c616e64697420646f6c6f7220666163696c697369732000656765742e2053656420736564206c6f626f727469732073656d2e0a0a4d61007572697320756c7472696369657320656c69742075726e612c2076656c2061006c697175657420707572757320617563746f722076697461652e20507261650073656e742076697665727261206f64696f2074656c6c75732c20717569732000706f7375657265206e756c6c6120616c69717565742061742e204c6f72656d0020697073756d20646f6c6f722073697420616d65742c20636f6e7365637465007475722061646970697363696e6720656c69742e20437572616269747572200065676574206d65747573206174206c6967756c6120656c656966656e642070006861726574726120696e206d616c657375616461206475692e20447569732000636f6e7365637465747572206469616d2075742066657567696174207275740072756d2e20566976616d757320657569736d6f64206e69736c2076656c206d006178696d75732073616769747469732e20496e20636f6d6d6f646f207369740020616d6574206c6f72656d2065742074696e636964756e742e205574207065006c6c656e746573717565206e756c6c61206e6f6e206d617572697320636f6e0064696d656e74756d2c2069642076756c707574617465206f64696f20626c61006e6469742e2053757370656e6469737365206e6f6e207072657469756d206d0061757269732c206e65632074696e636964756e742073617069656e2e0a0a460075736365206461706962757320657569736d6f64207475727069732c2075740020656c656d656e74756d20656e696d20657569736d6f64206e6f6e2e204e61006d2061206e6962682074656c6c75732e2050656c6c656e7465737175652069006163756c697320746f72746f722073656420706f72747469746f7220636f6e0064696d656e74756d2e204375726162697475722066617563696275732074750072706973206d6178696d75732c2076656e656e6174697320616e746520736500642c206d6f6c6c69732072697375732e205365642074656d707573206d6167006e612065676574206e756e6320706f72747469746f722c206174207275747200756d207175616d20636f6d6d6f646f2e20496e746567657220626c616e64690074207661726975732074656c6c75732073697420616d65742072757472756d002e2050726f696e206d6f6c6c697320747269737469717565206e6571756520007365642074656d7075732e204475697320706c6163657261742c206f726369002069642064696374756d20766573746962756c756d2c206c6967756c612064006f6c6f7220766f6c7574706174206c656f2c2076697461652066617563696200757320656e696d206e756c6c6120717569732065782e20437261732066617500636962757320657374206573742c2073697420616d657420616363756d7361006e206c6163757320696d706572646965742069642e204e616d206d6174746900732c206e756e6320736564206469676e697373696d20706c6163657261742c00206d617373612075726e6120696163756c69732076656c69742c207175697300206c7563747573206469616d206a7573746f206575206e6973692e20416c69007175616d206572617420766f6c75747061742e0a0a50656c6c656e74657371007565206e6571756520617263752c20636f6e677565206e6f6e2061756775650020717569732c2074726973746971756520696e74657264756d206e756e632e002050726f696e20646f6c6f7220746f72746f722c206461706962757320736500642070656c6c656e74657371756520612c2072757472756d2065676574206e006973692e20437261732065742074656d7075732074656c6c75732e204e756c006c6120706f72747469746f722c206e69736920657520617563746f7220766100726975732c206572617420746f72746f722072757472756d20747572706973002c206e6f6e2068656e64726572697420616e7465206e6571756520757420650073742e20416c697175616d2076756c7075746174652076656c69742076697400616520657569736d6f6420656765737461732e20496e7465676572207275740072756d206d6f6c6c697320617263752c20757420756c74726963696573206a007573746f206d6f6c6c697320656765742e20457469616d2061742066696e690062757320656e696d2c206574206d6174746973206d61757269732e204d61650063656e617320696e20616c69717565742061756775652e204e616d20756c7400726963657320656c656d656e74756d20617263752076656c20616c69717561006d2e20566573746962756c756d20696e206c6967756c6120747269737469710075652c206661756369627573206f64696f20656765742c206c6f626f7274690073206a7573746f2e204d6f726269206575206e756e632073697420616d65740020726973757320636f6e73657175617420616c697175657420736564206163002065782e20496e2068656e64726572697420756c74726963696573206c696700756c612c2071756973207375736369706974206c6563747573206469637475006d2065752e20536564206c616f7265657420636f6e67756520756c747269630065732e2050686173656c6c7573207375736369706974206d6173736120612000666163696c6973697320696d706572646965742e0a0a447569732074696e63006964756e742065726f7320717569732067726176696461207661726975732e002053757370656e6469737365206e6f6e206475692070757275732e20496e7400657264756d206574206d616c6573756164612066616d657320616320616e74006520697073756d207072696d697320696e2066617563696275732e20446f6e0065632061742070756c76696e61722066656c69732e20446f6e6563206e65630020616c697175616d2065726f732c2064696374756d20626962656e64756d2000617263752e20496e206e656320646f6c6f722066696e696275732c20707265007469756d206c6967756c612065742c20636f6e7365717561742065782e2049006e206861632068616269746173736520706c617465612064696374756d7374002e20457469616d2074656c6c757320656e696d2c20696e74657264756d207300656d70657220697073756d20736f64616c65732c206772617669646120667200696e67696c6c6120646f6c6f722e204e756c6c61206c6163696e6961206a750073746f20736f6c6c696369747564696e206c616f72656574206d6f6c6573740069652e20457469616d20616320766573746962756c756d207175616d2c2069006420657569736d6f6420697073756d2e205574206174206772617669646120006c6f72656d2e2053757370656e646973736520696e74657264756d20656c65006966656e64206c65637475732c2065752073656d7065722070757275732076006f6c757470617420612e0a0a55742076656c20617567756520756c747269630065732c2074696e636964756e74206d6173736120612c20736167697474697300206e69736c2e2050726f696e206567657420616e746520616c697175616d2c00206f726e6172652061756775652070656c6c656e7465737175652c2064617000696275732070757275732e20496e206574206d6574757320617263752e205000656c6c656e74657371756520616c697175616d20626c616e6469742061726300752071756973207472697374697175652e204d617572697320746f72746f7200206d617373612c206d6178696d757320717569732076617269757320612c2000706f72747469746f7220636f6e73656374657475722073656d2e2050726f69006e207665686963756c6120707572757320657420696163756c697320636f6e0073656374657475722e20557420736f6c6c696369747564696e2066696e696200757320657820696e20656c656d656e74756d2e204f7263692076617269757300206e61746f7175652070656e617469627573206574206d61676e697320646900732070617274757269656e74206d6f6e7465732c206e6173636574757220720069646963756c7573206d75732e205072616573656e74206e656320696d7065007264696574206d61676e612e205574206d616c65737561646120696420707500727573206e656320766573746962756c756d2e2053757370656e64697373650020616363756d73616e2065726174206c656f2c20696e20666175636962757300206469616d20696163756c69732073697420616d65742e204475697320736f006c6c696369747564696e206c6563747573207175697320656e696d206c616300696e696120657569736d6f642076656c2075742061756775652e0a0a416c69007175616d20756c7472696369657320636f6e76616c6c69732074656c6c7573002c206964206567657374617320656c697420736167697474697320696e2e20004372617320706f72747469746f72206e69736920656765742073617069656e0020636f6e76616c6c697320706f73756572652e204d6175726973206772617600696461206e65717565207669746165206c696265726f206375727375732c2000696420636f6e736571756174206e657175652072686f6e6375732e20496e74006567657220616c69717565742065676574206e696268206163207068617265007472612e204e756c6c616d20696163756c6973206e69736c2066656c69732c00207175697320696d70657264696574206e756c6c6120756c74726963657320007365642e205175697371756520747269737469717565206c61637573206174002072686f6e63757320706f7274612e204e616d20616320636f6e64696d656e0074756d2075726e612e20536564206e656320706f72747469746f72206e696200682e205365642067726176696461206d61676e612069642070757275732070006f737565726520766573746962756c756d206e6f6e20736564206e6973692e0020566573746962756c756d2061726375207475727069732c20696163756c6900732076656c20636f6e7365717561742069642c206c6f626f72746973207369007420616d65742065782e205072616573656e7420717569732074656d706f72002061756775652e204e756c6c61206567657420656e696d20656c656966656e00642c2074696e636964756e74206c696265726f2073697420616d65742c206d006174746973206e6973692e20446f6e65632064756920657261742c2070756c0076696e61722076656c207075727573206e65632c20666163696c69736973200066696e69627573206c6f72656d2e204e756c6c616d20756c7472696365732000707572757320766573746962756c756d20636f6d6d6f646f20616c69717561006d2e0a0a4f72636920766172697573206e61746f7175652070656e61746962007573206574206d61676e6973206469732070617274757269656e74206d6f6e007465732c206e61736365747572207269646963756c7573206d75732e204e75006e6320626c616e646974206e756c6c612072697375732c2076656c20736f6400616c6573206c6f72656d206f726e6172652061632e20496e7465676572206e006f6e20646f6c6f7220626962656e64756d2c206f726e61726520746f72746f007220656765742c20756c7472696369657320697073756d2e2041656e65616e002066696e69627573206469676e697373696d206f726e6172652e204d6175720069732074656d7075732c206572617420617420626962656e64756d2061756300746f722c206c656f20656c6974206c6163696e6961206f64696f2c206174200074656d7075732061726375206475692071756973206573742e20507261657300656e74206672696e67696c6c61206c6f72656d206d616c6573756164612070006f72747469746f7220696d706572646965742e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d6f7262692076697461650020666163696c69736973206c6f72656d2c20766974616520636f6e7365717500617420697073756d2e20457469616d20696420656c656d656e74756d2065720061742e204e616d20646f6c6f72206c656f2c2074656d706f722061632065780020717569732c206469676e697373696d206665726d656e74756d20616e7465002e0a0a446f6e65632061206e756c6c612072697375732e204d6175726973200066617563696275732c206e756e63206163206d6178696d75732076656e656e00617469732c206d61676e612076656c6974207072657469756d20616e74652c00206e6f6e206665726d656e74756d20656c6974206d6175726973206e6f6e20006e756e632e20446f6e65632068656e6472657269742075726e61206174207400656c6c757320636f6e76616c6c69732c20616320666175636962757320656c006974206c6f626f727469732e204e756c6c616d20626962656e64756d20656c00656966656e64206d61676e612073697420616d657420696e74657264756d2e0020496e20696e20736f64616c657320746f72746f722c206e6f6e206c6f626f0072746973206d692e205072616573656e742076656c2073656d2061206f6469006f2076656e656e6174697320666163696c697369732e20566573746962756c00756d206163206d6f6c657374696520646f6c6f722c2061742066696e6962750073206e6973692e0a0a566573746962756c756d20616e746520697073756d20007072696d697320696e206661756369627573206f726369206c75637475732000657420756c74726963657320706f737565726520637562696c6961206375720061653b2046757363652061632074656d70757320617263752c2076697461650020696163756c6973206e657175652e2055742061206e69736c207574207665006c697420636f6e73657175617420636f6e64696d656e74756d207669746165002065676574206e6962682e2044756973206574206d61676e6120616c6971750065742c20636f6e76616c6c697320656c69742069642c20756c6c616d636f7200706572206d692e20566976616d757320696d706572646965742066656c697300207175697320636f6e7365717561742072757472756d2e204d6f7262692075007420617263752073697420616d657420617567756520636f6e677565207469006e636964756e742e2053757370656e64697373652061206d6174746973206f007263692e204e756e6320656765737461732c2076656c69742073656420646900676e697373696d2073656d7065722c20656c6974206d61757269732062696200656e64756d206e657175652c206567657420616c697175616d206e69736920006e65717565206120616e74652e204e616d2066657567696174206e657175650020646f6c6f722e20566573746962756c756d20616e746520697073756d20700072696d697320696e206661756369627573206f726369206c75637475732065007420756c74726963657320706f737565726520637562696c6961206375726100653b20557420696e20636f6e736563746574757220646f6c6f722e205175690073717565206e6f6e20636f6e677565206e657175652e0a0a4e756c6c6120730063656c657269737175652c206e65717565206567657420636f6e76616c6c69007320626962656e64756d2c206c6f72656d206d65747573207068617265747200612070757275732c2073656420626c616e6469742065726174206172637520006575206e6973692e204d617572697320706c616365726174206d6173736120006575206e6571756520766f6c75747061742c2073697420616d6574207669760065727261207269737573207363656c657269737175652e20496e2076656c2000766573746962756c756d206e756c6c612e20416c697175616d2072686f6e630075732061632061756775652076656c2076756c7075746174652e204d617572006973207669746165206469616d20696d706572646965742c20766f6c757470006174206e6962682065752c206661756369627573206d657475732e2045746900616d2070656c6c656e74657371756520747572706973206964206e6962682000636f6e73657175617420736f6c6c696369747564696e2e204e756e63206567006574206a7573746f2070756c76696e6172206d657475732072757472756d20006c75637475732073697420616d65742061206d657475732e204e756c6c612000666163696c6973692e2053757370656e646973736520657520617567756520006c65637475732e2053757370656e646973736520736f6c6c69636974756469006e20657569736d6f64207661726975732e2050686173656c6c757320616e74006520657261742c20666175636962757320696420746f72746f72206e65632c00207363656c6572697371756520766172697573206e756e632e0a0a45746961006d206672696e67696c6c6120766f6c7574706174206d692c20706f73756572006520766573746962756c756d206c6967756c6120756c74726963657320696e002e20446f6e6563207665686963756c6120747572706973207175697320756c0074726963696573207661726975732e20446f6e65632073656d70657220616e00746520657261742c20616320666575676961742074656c6c75732062696265006e64756d2069642e20446f6e656320697073756d206e69736c2c2070756c7600696e6172206e6563207175616d20696e2c20736f6c6c696369747564696e2000696e74657264756d20656e696d2e20566976616d7573206c616f72656574200074656c6c75732065676574206f72636920636f6e64696d656e74756d20736300656c657269737175652e2050726f696e206574206661756369627573206f6400696f2c206163206566666963697475722061756775652e20557420696e7465007264756d20747269737469717565206475692074656d70757320706f727461002e20416c697175616d206672696e67696c6c6120707572757320766974616500206e6962682074656d706f7220626962656e64756d2e205175697371756520006574207361676974746973206f7263692c2061742074656d706f722076656c0069742e205365642066696e696275732073617069656e20657420747572706900732073656d7065722c206e6f6e206d6f6c6573746965206e756e63206c7563007475732e20536564206a7573746f206e6973692c20736f6c6c69636974756400696e20696e20697073756d20696e2c206665726d656e74756d20707265746900756d206f64696f2e204e756c6c6120757420766f6c75747061742073656d2e000a0a436c61737320617074656e742074616369746920736f63696f73717520006164206c69746f726120746f727175656e742070657220636f6e7562696120006e6f737472612c2070657220696e636570746f732068696d656e61656f732e00204e756c6c61206e6f6e206f726369206d692e20566573746962756c756d20007361676974746973206f72636920657520636f6e64696d656e74756d20636f006e6775652e20446f6e656320736564206d61676e612070656c6c656e746573007175652c20706c61636572617420697073756d207365642c20616c69717561006d2073656d2e2043757261626974757220696d706572646965742061756775006520657420656c697420706c6163657261742c2061742070756c76696e61720020617263752066617563696275732e20566573746962756c756d2066657567006961742c20697073756d20617420756c747269636573206d6f6c6573746965002c206e65717565206f64696f20656c656966656e642076656c69742c206174002065676573746173206f72636920647569206574206573742e20496e746567006572207574206a7573746f206c65637475732e204e756c6c616d20666575670069617420696e74657264756d206f726369206e656320617563746f722e0a0a00446f6e656320616c697175657420616363756d73616e206d617373612c2076006974616520666163696c697369732072697375732e20467573636520707265007469756d206e756e63206e6f6e20636f6e73657175617420656c656d656e7400756d2e204d616563656e617320636f6e64696d656e74756d207363656c657200697371756520706f72747469746f722e204f72636920766172697573206e6100746f7175652070656e617469627573206574206d61676e697320646973207000617274757269656e74206d6f6e7465732c206e6173636574757220726964690063756c7573206d75732e204d6175726973206e6563207075727573206661750063696275732c2074656d707573206469616d206e65632c20756c74726963650073206f7263692e2041656e65616e2066617563696275732c2073617069656e0020757420706f72747469746f7220616c69717565742c206e756e6320657261007420636f6e6775652061756775652c2071756973206469676e697373696d200073656d20697073756d206574206469616d2e2053757370656e646973736520006772617669646120657569736d6f6420697073756d2c206120696d7065726400696574206e756c6c6120636f6e7365717561742061632e2050726f696e20710075697320636f6e73657175617420697073756d2c20696e20737573636970690074206e657175652e204e616d2076697461652076697665727261206c656f2e002041656e65616e20756c74726963657320706c61636572617420626c616e640069742e20496e7465676572206e6571756520617263752c20666163696c69730069732073697420616d6574206f726369207365642c20766573746962756c75006d206672696e67696c6c6120746f72746f722e2050656c6c656e746573717500652066657567696174206575206c6967756c612065676574206c6f626f72740069732e20536564206575206d6f6c6c69732065782c20696e206461706962750073206c616375732e20467573636520616c697175616d2c206e657175652063006f6e73657175617420666163696c6973697320706c6163657261742c2069700073756d206f72636920696163756c6973206a7573746f2c20696d706572646900657420706f7375657265206d61676e61206f64696f206e65632075726e612e0020437572616269747572206d6f6c6c69732c20657820696e20666163696c690073697320766f6c75747061742c206e697369206a7573746f20656c65696665006e64206c696265726f2c20612070656c6c656e74657371756520656e696d20006d61676e612071756973206e6962682e204d617572697320756c7472696369006573206469616d2065676574206c616375732070756c76696e61722c2065740020636f6e64696d656e74756d206e6962682073656d7065722e0a0a56697661006d757320746f72746f72207175616d2c20616c697175657420696e206e756e00632075742c206f726e61726520756c74726963696573206e657175652e205000656c6c656e74657371756520637572737573206163206a7573746f2076697400616520756c747269636965732e20446f6e65632065676574206e69736c207100756973206f726369206772617669646120766f6c75747061742065742069640020656e696d2e2053656420706f72747469746f72206c616375732071756973002073656d20756c74726963657320666163696c6973697320757420656765740020656e696d2e20416c697175616d20696163756c69732065726174206e656300206d617373612072686f6e6375732068656e6472657269742e20416c69717500616d206f726e6172652070686172657472612075726e612065752061756374006f722e20566976616d7573206964206469616d206120617567756520656765007374617320636f6e6775652e205072616573656e742068656e647265726974002073617069656e20696e206f72636920636f6e6775652c206567657420636f006e6775652073617069656e20696d706572646965742e205365642061756374006f7220657374206163206c7563747573206c6163696e69612e20496e746567006572206e65717565206e657175652c20656c656966656e642076656c206c65006f2069642c20626962656e64756d20756c6c616d636f727065722073656d2e0020566573746962756c756d2076656c20666163696c69736973206573742e2000536564207175697320766f6c7574706174207475727069732e0a0a4e616d20006d6174746973206d6f6c6573746965206d61676e612c20766974616520636f006e736571756174206d657475732e204e616d206d6178696d75732065756973006d6f6420656c6974206e6563206f726e6172652e204e756c6c61206d6f6c6c00697320696420707572757320717569732074656d706f722e2050656c6c656e007465737175652072686f6e637573206567657374617320666575676961742e00204475697320756c74726963657320656c6974207574206c6f72656d207075006c76696e617220736f6c6c696369747564696e2e2043757261626974757220006672696e67696c6c612076756c7075746174652076656e656e617469732e20004d61757269732074656d706f7220617563746f722075726e612e0a0a496e20006861632068616269746173736520706c617465612064696374756d73742e20004d616563656e617320617563746f72206d617474697320626962656e64756d002e20566573746962756c756d2074656d7075732072686f6e637573206c6563007475732c2069642072686f6e637573206e69736c206d6178696d7573206174002e204475697320766172697573206672696e67696c6c61206175677565206e00656320666163696c697369732e204e756c6c6120696163756c69732061207000757275732065676574206665726d656e74756d2e20457469616d206e656320007361676974746973206f7263692e205072616573656e74206d6174746973200066656c69732072697375732e204e616d206567657420656c656d656e74756d00206c6967756c612e20436c61737320617074656e742074616369746920736f0063696f737175206164206c69746f726120746f727175656e74207065722063006f6e75626961206e6f737472612c2070657220696e636570746f732068696d00656e61656f732e2050686173656c6c75732065676573746173207075727573002070656c6c656e7465737175652c2070656c6c656e7465737175652076656c006974206e6f6e2c206772617669646120656c69742e0a0a536564206e6f6e200074656d7075732070757275732e2053757370656e64697373652070756c7669006e6172206d65747573206e657175652c206e6f6e207472697374697175652000697073756d20706f727461206e6f6e2e205574206567657420747572706973002074696e636964756e742c2074656d706f722073656d20717569732c207665006e656e61746973206d61676e612e20566573746962756c756d206964206d610078696d75732072697375732e204475697320616c697175657420706f7375650072652066656c697320696e20706c6163657261742e2051756973717565207600656c6974206f64696f2c20656666696369747572206174206d617373612061002c20747269737469717565206f726e61726520646f6c6f722e204e756c6c61006d206567657374617320706c616365726174206475692075742073656d706500722e20416c697175616d20717569732073617069656e206d657475732e20440075697320656c656d656e74756d2c2065726174206e656320626c616e646974002072686f6e6375732c2065726f7320656e696d207363656c65726973717565002061756775652c206e656320766976657272612065726f73206c656f20657500206c656f2e204d6f7262692073656420666163696c69736973206a7573746f002e20566976616d75732073697420616d6574206d61676e612068656e64726500726974206c656f206772617669646120617563746f722e0a0a4e756e63206300757273757320616c6971756574206f64696f2e204e756e6320696163756c6900732065742074757270697320617420756c747269636965732e204e616d207600756c70757461746520656e696d20656765742070757275732074656d70757300206f726e6172652e204e756c6c616d20636f6e736571756174206d6f6c657300746965206469616d2c20766974616520756c747269636573206e6962682070006f72747469746f722065742e20566573746962756c756d20766f6c757470610074207574206c6f72656d20656765742070656c6c656e7465737175652e204e00616d2064617069627573206c696265726f206d692e2050656c6c656e746573007175652074696e636964756e74206e696268206e657175652c206120696e7400657264756d206c6f72656d20636f6e6775652076656e656e617469732e205000686173656c6c757320696e2073656d206574206d617373612066617563696200757320616363756d73616e2074696e636964756e742076656c206e6962682e000a0a4e756c6c61206d616c657375616461206e69736c206e69736c2c20657500206d6f6c657374696520697073756d206d6f6c6c697320656765742e20416c00697175616d2076756c70757461746520707572757320736564206c6967756c006120736167697474697320616c69717565742e20496e20616c697175616d20006469616d20677261766964612072757472756d2070756c76696e61722e2049006e206d616c6573756164612075726e612065676574206f726e6172652065670065737461732e20566573746962756c756d207669746165207363656c6572690073717565206573742c206567657420766573746962756c756d206f7263692e002050656c6c656e746573717565206672696e67696c6c61206d616c6573756100646120706f73756572652e204e756c6c6120696e74657264756d206c656f20007669746165207072657469756d20706f73756572652e204e616d206d6f6c6c0069732065726f73207365642074656c6c7573206d6174746973207361676974007469732e0a0a53757370656e646973736520636f6e64696d656e74756d206c006563747573206574206c6f72656d20657569736d6f64206375727375732e20004d6175726973206172637520617263752c2072757472756d20636f6e7365710075617420707572757320696e2c206567657374617320696163756c6973206c00696265726f2e204d6f726269207068617265747261206d6178696d7573206d00617373612c206567657420626c616e646974207475727069732070756c7669006e61722065742e204d6175726973206e656320646f6c6f722076656e656e61007469732c2070656c6c656e746573717565206d61676e612069642c2061756300746f722075726e612e204d616563656e6173207669766572726120706f7274007469746f72206e6973692c2076656c20756c74726963696573206572617420006375727375732061742e20467573636520636f6e6775652074656c6c7573200076697461652073617069656e20747269737469717565206665726d656e7475006d2e20446f6e656320696d706572646965742073656d206e6f6e206d61757200697320756c7472696365732076656e656e617469732e204372617320756c74007269636573206c6f72656d206c656f2e20536564207365642076656e656e6100746973206e657175652c20766974616520656765737461732066656c69732e00205072616573656e7420617420616e746520706f7274612c20636f6e64696d00656e74756d206c65637475732076697461652c20706f72747469746f72206e00657175652e204e616d2074656c6c7573206c616375732c20747269737469710075652074656d706f72206e756c6c61206e65632c20706c6163657261742062006962656e64756d2061756775652e204e756c6c616d20657569736d6f64207600697665727261206f7263692c206575206772617669646120656e696d20636f006e64696d656e74756d20626962656e64756d2e2053757370656e6469737365002065676574206c6f72656d20766974616520697073756d20706c616365726100742070656c6c656e74657371756520696420636f6d6d6f646f206f64696f2e00204675736365206d61747469732075726e612075742064756920636f6d6d6f00646f2c206e656320636f6d6d6f646f206475692070686172657472612e0a0a00496e206861632068616269746173736520706c617465612064696374756d7300742e204e616d206a7573746f206e6962682c207665686963756c612061206c006967756c612065752c206d617474697320656c656966656e64206c6967756c00612e205175697371756520656765742074757270697320612061756775652000747269737469717565206665726d656e74756d2e204e756c6c616d20766974006165206c61637573206d6f6c65737469652c207363656c65726973717565200061756775652061742c20656c656966656e64206e69736c2e204e756c6c6120006d61676e612065726f732c20636f6e76616c6c697320736564206f64696f20007363656c657269737175652c206c6f626f7274697320636f6e76616c6c697300206e6962682e204e616d2061742073616769747469732061756775652c2065007520766172697573206c6967756c612e204e756c6c616d20706f737565726500206d6178696d7573206e697369206e656320616c69717565742e2045746961006d207363656c657269737175652071756973206469616d20656765742065670065737461732e205072616573656e7420756c74726963696573207363656c6500726973717565206d69206e656320626962656e64756d2e2056657374696275006c756d20616c697175616d2074656c6c75732076656c206a7573746f206c61006f726565742c207574207072657469756d2073656d206f726e6172652e204e00616d20616e7465206e6962682c2066696e69627573206e6563207361706965006e20612c2076656e656e6174697320636f6e6775652072697375732e20496e002076656c206e65717565206120656e696d20636f6e7365637465747572207000656c6c656e7465737175652e20566976616d757320636f6e76616c6c69732000657374207574206e756c6c6120736167697474697320706f73756572652e200050656c6c656e74657371756520626962656e64756d20736f64616c65732069007073756d2065742068656e6472657269742e0a0a536564207269737573206600656c69732c20736f6c6c696369747564696e206575206d6f6c6573746965200065742c20657569736d6f6420656765742065782e20457469616d206567657400206e756c6c61206e6962682e20437261732067726176696461206120746f7200746f722076697665727261207661726975732e2050686173656c6c7573206600696e696275732c2073617069656e20657420616c697175616d20756c747269006365732c206d61757269732065726f7320706f72747469746f722065726f73002c20616320636f6e677565206c656f206573742065676574206d6175726973002e20536564206e756e632076656c69742c2065676573746173207365642065006c69742065752c20657569736d6f64206d6178696d75732073617069656e2e0020566573746962756c756d20616e746520697073756d207072696d69732069006e206661756369627573206f726369206c756374757320657420756c7472690063657320706f737565726520637562696c69612063757261653b2056657374006962756c756d206c656f206a7573746f2c20636f6d6d6f646f2071756973200076756c7075746174652061742c20736f6c6c696369747564696e207369742000616d6574206573742e205365642070756c76696e61722c2076656c69742073006564206469676e697373696d20766976657272612c206d6173736120646f6c006f722073656d706572206c6f72656d2c206e6f6e206d6f6c6573746965206d006175726973206f64696f2065742070757275732e204d616563656e6173206c006f626f7274697320696e74657264756d206e756e63207574206d6f6c6573740069652e20536564206d6f6c6c697320636f6d6d6f646f2076656e656e61746900732e20496e74657264756d206574206d616c6573756164612066616d65732000616320616e746520697073756d207072696d697320696e206661756369627500732e2055742073656420617263752076656c69742e204d617572697320617500677565206e756c6c612c206f726e617265206e656320616c697175657420730065642c20636f6d6d6f646f20696e206475692e0a0a496e746567657220736f006c6c696369747564696e2075726e612065676574206e756c6c61207068617200657472612c206e6f6e20766172697573206e657175652070756c76696e6172002e204e756c6c61207574206c656374757320736564206d617572697320756c006c616d636f7270657220706f7274612e2051756973717565206e656320646900616d207472697374697175652c2064617069627573206c656374757320612c0020616c697175616d206e6962682e2043757261626974757220616c697175650074206d6f6c6c69732073617069656e207574206d6f6c65737469652e205068006173656c6c7573207361676974746973206e69736c207669746165206d617800696d75732066617563696275732e20446f6e6563206d6178696d757320612000647569206575207661726975732e20457469616d2072686f6e63757320746f0072746f722076656c206e756e63206665726d656e74756d2070756c76696e61007220736564206e656320657261742e20416c697175616d207574206c656f20006e6f6e206e69736920646170696275732076756c7075746174652e20496e74006567657220616363756d73616e20636f6e6775652072686f6e6375732e205500742076756c707574617465206f64696f20656c69742c207072657469756d200073656d7065722065726174207375736369706974206e65632e205375737065006e6469737365206d6174746973207475727069732076656c2065726f73207000756c76696e617220756c7472696365732072757472756d2073697420616d65007420616e74652e204475697320656c656966656e64206d6178696d75732061007567756520696e207363656c657269737175652e20446f6e6563206e6f6e2000746f72746f722073697420616d657420657261742066617563696275732061006c69717565742e205365642074656d70757320747269737469717565207269007375732c207072657469756d207472697374697175652064756920636f6e7600616c6c69732065752e0a0a50686173656c6c757320616c697175616d2074750072706973206174206c656f20706f73756572652c2073656420616363756d7300616e206e69736c2074656d7075732e204d616563656e6173207669746165200073617069656e206a7573746f2e2050686173656c6c75732074656d70757320006672696e67696c6c612070656c6c656e7465737175652e2050656c6c656e7400657371756520617420646f6c6f72206964206d6175726973206c616f726565007420637572737573206e6f6e2071756973206d657475732e204475697320610063206d69206e6f6e2074656c6c7573206461706962757320706f7274746974006f72206e6f6e206574206c6967756c612e20457469616d20736f64616c6573002069642074757270697320696e20756c747269636965732e2053656420616e007465206c616375732c2068656e64726572697420757420706f72747469746f00722075742c206665726d656e74756d207669746165206c656f2e0a0a437261007320706861726574726120616e746520616e74652c2076756c70757461746500206665756769617420726973757320666175636962757320656765742e205000726f696e2073697420616d65742074656c6c75732072686f6e6375732c20760065686963756c61206469616d206e6f6e2c2065676573746173206573742e200043726173207669746165206c696265726f206e657175652e20446f6e65632000697073756d2066656c69732c20696e74657264756d2076656c20656765737400617320656765742c20616c6971756574206e65632065726f732e20446f6e650063206e697369206d617373612c20766573746962756c756d2076656c20656e00696d2065742c206461706962757320636f6e67756520697073756d2e20507200616573656e7420647569206573742c20636f6e677565207669746165206d6f006c657374696520717569732c206d616c657375616461206567657420646961006d2e20457469616d206e6f6e2076697665727261206f7263692e2056657374006962756c756d206d6f6c6c69732065726f73206174206c656374757320706f0072747469746f7220756c6c616d636f727065722e20496e2066657567696174002066656c6973206e656320657820756c7472696365732c2073656420666572006d656e74756d206a7573746f2066696e696275732e2044756973206e6f6e2000706f7375657265206e657175652c20657420636f6e736571756174206f726300692e20416c697175616d206575206a7573746f20756c7472696365732c207600656e656e6174697320746f72746f722061632c2072757472756d20656e696d002e0a0a496e7465676572206469676e697373696d207175616d206575206d6100757269732066696e6962757320666163696c697369732e204d617572697320006c6163696e6961206a7573746f206c65637475732c2076656c206c756374750073207175616d20766f6c757470617420766f6c75747061742e205574206e6f006e206f726369206e756c6c612e2041656e65616e20617563746f72207361700069656e206120726973757320656c656d656e74756d206d616c657375616461002e204e616d2065676574206c6563747573206c696265726f2e20416c69717500616d20697073756d206d617373612c20736f6c6c696369747564696e2061630020696163756c697320612c206d6178696d7573206575207475727069732e20004d616563656e61732076656c206e756e632076656c2065726f7320766f6c750074706174207472697374697175652076697461652061742065782e204375720061626974757220657420656e696d206d6f6c6c69732c207072657469756d2000646f6c6f7220717569732c2068656e647265726974206c616375732e20496e002074656d70757320657569736d6f6420646f6c6f722c206964206469637475006d206d657475732072757472756d20717569732e0a0a43757261626974757200207072657469756d206c6f626f72746973207363656c657269737175652e20004d61757269732076656c206d69206120697073756d207665686963756c6120007363656c657269737175652e204e756c6c6120666163696c6973692e20446f006e656320636f6e736571756174206f64696f2061206572617420756c6c616d00636f7270657220666163696c697369732e2044756973206d6173736120656e00696d2c20756c74726963696573206e6f6e2075726e6120717569732c2065750069736d6f64207072657469756d20746f72746f722e20457469616d2068656e00647265726974206c656374757320766974616520656c656d656e74756d207600756c7075746174652e20496e74657264756d206574206d616c657375616461002066616d657320616320616e746520697073756d207072696d697320696e200066617563696275732e20536564206f64696f206d61676e612c20636f6e7365006374657475722073697420616d657420706f7274612076697461652c2076690076657272612061206d61676e612e204372617320657520697073756d20656c00656966656e64206f64696f20766976657272612072757472756d206574206e006f6e206c6f72656d2e20517569737175652071756973206c656f2075742072006973757320756c6c616d636f727065722073757363697069742076656c206e006563206469616d2e20467573636520646170696275732065726f73206e6f6e00206e69736c2066617563696275732c20657420656666696369747572207365006d20706c6163657261742e20566573746962756c756d20616e74652069707300756d207072696d697320696e206661756369627573206f726369206c75637400757320657420756c74726963657320706f737565726520637562696c6961200063757261653b20416c697175616d2069642073656d206163206c6f72656d2000706f72747469746f72206c616f72656574206163207175697320656c69742e000a0a446f6e65632076656c20646f6c6f72206d6178696d75732c206d6f6c6c006973206d61676e612073697420616d65742c2070686172657472612076656c0069742e2041656e65616e2070656c6c656e74657371756520737573636970690074206c6563747573206174207665686963756c612e20446f6e6563206e656300206661756369627573206469616d2e204e616d20656765742064756920657500206d6175726973206461706962757320616c697175616d2064696374756d20006575206d61757269732e20446f6e6563206c6563747573206d657475732c20006d6f6c657374696520636f6e73657175617420756c747269636965732065670065742c206c616f72656574206e6563206475692e20446f6e6563206575206c00656374757320717569732076656c697420656c656d656e74756d2065756973006d6f642e204d616563656e617320626962656e64756d206c61637573207369007420616d657420736f6c6c696369747564696e206c6163696e69612e0a0a510075697371756520737573636970697420706f73756572652070757275732063006f6e64696d656e74756d20706f7274612e20457469616d2068656e64726572006974207574206c696265726f20696e2072757472756d2e204e756c6c616d2000756c74726963696573206c696265726f20657420647569206c6f626f7274690073206672696e67696c6c612e20496e746567657220757420656c6974206d6100676e612e2051756973717565207665686963756c61206d6f6c6c6973206c65006f2c206964207665686963756c61206d61676e6120616c6971756574207574002e20457469616d206e6f6e20706f72747469746f72206e69736c2c207369740020616d65742076756c707574617465206469616d2e2050726f696e206e657100756520657261742c20737573636970697420656765742066656c697320696e002c20677261766964612066696e69627573207175616d2e2050686173656c6c007573206d617474697320746f72746f722072697375732c20757420656c656d00656e74756d206d6574757320737573636970697420626962656e64756d2e0a000a4e756c6c616d207175616d2065782c20706f72746120696e2070757275730020696e2c206d6f6c65737469652074726973746971756520646f6c6f722e2000457469616d207472697374697175652072697375732076656c206c6163757300206672696e67696c6c612c206174206c75637475732075726e6120616c69710075616d2e20416c697175616d2065752066656c697320666575676961742c2000696163756c6973206c6f72656d2073697420616d65742c2070756c76696e61007220697073756d2e204e616d2076697461652074696e636964756e74206d6100676e612e204d617572697320756c6c616d636f727065722c206d657475732000636f6e64696d656e74756d20736f64616c657320756c6c616d636f72706572002c2073656d2074656c6c757320636f6e7365637465747572206c6563747573002c2061742074656d7075732073617069656e206d61757269732076656e656e0061746973206d61757269732e2041656e65616e20766573746962756c756d2000646f6c6f722065782c2076656c2076697665727261206e696268206d617869006d7573207365642e20457469616d20636f6d6d6f646f206d616c65737561640061206f7263692e204e616d20616363756d73616e206469616d206e6563206e00756e6320766f6c7574706174206566666963697475722e20467573636520700072657469756d20697073756d206c656f2c207175697320696e74657264756d00206172637520736f6c6c696369747564696e20656765742e2050656c6c656e00746573717565206d617474697320617420697073756d206567657420707265007469756d2e0a0a536564206c656f206d692c207068617265747261207369740020616d657420696d706572646965742065752c2074696e636964756e742065007420746f72746f722e2055742071756973207072657469756d206d61676e61002c20657520616c697175657420697073756d2e2050726f696e20616320756c0074726963657320697073756d2c2076656c206d6f6c6573746965207361706900656e2e20457469616d20736f64616c6573206e65717565206163206f726e610072652070686172657472612e204d6f7262692071756973206175677565207300697420616d65742075726e6120706c6163657261742070756c76696e61722e00204375726162697475722076617269757320666163696c69736973207269730075732c206964207375736369706974207175616d20696d7065726469657420006d616c6573756164612e20416c697175616d20646170696275732c2069707300756d2076656c20636f6e64696d656e74756d206d61747469732c206c696775006c6120657374206375727375732074656c6c75732c20657520696e7465726400756d20616e7465206c656f206e6f6e20616e74652e204e756c6c6120717561006d206e6973692c20706f737565726520657420616363756d73616e20696e7400657264756d2c2076756c707574617465206e6f6e2070757275732e204e756e00632076617269757320696d706572646965742066656c6973206e656320696e0074657264756d2e2050726f696e2076656e656e617469732061206c6967756c006120657420636f6e73656374657475722e2050686173656c6c7573206e6563002065726f73206d6f6c6c69732c20756c7472696369657320656c6974206e6f006e2c206c6163696e6961206d692e2053757370656e6469737365206c696775006c6120617263752c206665726d656e74756d20617420617563746f722071750069732c20656c656966656e64207669746165206e69736c2e0a0a53656420660065726d656e74756d20707572757320696e206f64696f2070756c76696e6172002c20766573746962756c756d20656c656966656e642065737420636f6d6d6f00646f2e20467573636520766172697573207365642074757270697320696e2000666575676961742e20557420616320666163696c69736973206f64696f2e2000557420766f6c757470617420697073756d20646f6c6f722c20696e2065756900736d6f6420646f6c6f7220696e74657264756d2069642e20536564207361700069656e206573742c20696d70657264696574206575206f726e6172652065670065742c2074656d70757320656765742066656c69732e2050686173656c6c7500732070656c6c656e7465737175652c206e756c6c612073697420616d6574200066696e6962757320677261766964612c207175616d206e69736c206469637400756d206a7573746f2c2073697420616d6574206672696e67696c6c6120646900616d206c616375732065676574206573742e20566573746962756c756d2062006c616e646974206d617572697320696e20616e7465206d6178696d75732076006f6c75747061742e2050656c6c656e746573717565206861626974616e7420006d6f726269207472697374697175652073656e6563747573206574206e6574007573206574206d616c6573756164612066616d6573206163207475727069730020656765737461732e20566573746962756c756d2066656c6973207269737500732c2073616769747469732076656c20636f6d6d6f646f207365642c20706f0072746120617563746f722073656d2e20496e74657264756d206574206d616c006573756164612066616d657320616320616e746520697073756d207072696d00697320696e2066617563696275732e204d616563656e6173206e656320706f0072747469746f722066656c69732e20446f6e656320656c656d656e74756d200073656d206e756c6c612e0a0a416c697175616d20656c656d656e74756d20650075206c6f72656d206964206c75637475732e204e756e63206174206e69626800206573742e205072616573656e7420666175636962757320766172697573200065726174206e656320706f73756572652e204e756c6c616d207175616d206c00616375732c20766f6c7574706174206e6563206c616f72656574206e6f6e2c0020706f7375657265206163206c6967756c612e2050726f696e2071756973200065676573746173206e69736c2c20736564206c75637475732066656c69732e00204e756c6c61207072657469756d207175616d206e65632066696e696275730020656c656966656e642e20457469616d206d617572697320656e696d2c207200686f6e6375732076656c206d616c657375616461207365642c20636f6e6469006d656e74756d2076697665727261206c696265726f2e20416c697175616d20007175616d2073656d2c2072757472756d2061742073617069656e206e65632c00206c616f7265657420666163696c69736973207475727069732e204e616d20006e65632074656d707573206573742e204d616563656e617320766172697573002c206e69626820617420636f6e73656374657475722074656d7075732c206e00756e63206c6f72656d206672696e67696c6c6120617263752c20696d70657200646965742072757472756d206e69736c2064756920612061756775652e20500072616573656e7420706c6163657261742073617069656e20736564206d6920006d6f6c6c697320666163696c697369732061206e65632070757275732e20500072616573656e7420736f6c6c696369747564696e2066656c6973206d61737300612c2076656c206d6174746973206c656f2068656e6472657269742061632e002053757370656e646973736520657569736d6f642064696374756d2074696e00636964756e742e0a0a416c697175616d2064617069627573206c6f72656d2000657520736f64616c65732066617563696275732e204e756c6c612074726973007469717565206f64696f2065742072697375732064696374756d2c20756c7400726963696573206c6f626f72746973206c6967756c61207361676974746973002e20496e74657264756d206574206d616c6573756164612066616d65732061006320616e746520697073756d207072696d697320696e206661756369627573002e204e756e632074656d7075732076656c2065726174207669746165206c610063696e69612e204e756c6c6120696e20656765737461732065726f732e204e00756c6c616d2076656c20646f6c6f722076656c2076656c697420706c616365007261742076756c70757461746520696e20736564206c616375732e20416c69007175616d206c6f626f7274697320616e746520696e2074656c6c75732069610063756c69732c206120636f6d6d6f646f207175616d20616363756d73616e2e002050726f696e2066657567696174206c6967756c61206964206e756e63207600756c70757461746520646170696275732e20457469616d207072657469756d00207669746165206475692073697420616d657420616c697175616d2e204165006e65616e206c6f626f727469732072757472756d206e6973692c2061207465006d7075732065726f7320666163696c697369732069642e204d617572697320006e6f6e2061726375206174206e6973692076697665727261206375727375730020657520616320646f6c6f722e0a0a4e756e6320696e206f64696f206d692e00204e616d206d617474697320736564206c6967756c612073697420616d6574002074656d706f722e20496e74656765722064696374756d207269737573206600617563696275732c2076656e656e6174697320616e74652065752c20756c74007269636573206d61757269732e20446f6e6563206e656320636f6e64696d65006e74756d2065782e2053656420666163696c69736973206f64696f20647569002c207669746165206672696e67696c6c61206d617572697320617563746f7200206e6f6e2e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e2053757370656e646973736520717569732074656c6c7573206c00616f726565742c20756c7472696365732073656d206e65632c207363656c650072697371756520656c69742e20536564207363656c65726973717565206573007420766f6c75747061742c20636f6e64696d656e74756d20616e746520612c002076656e656e61746973206d617373612e204d6f726269206e65632061756300746f72206c65637475732c206163207072657469756d206e6962682e20467500736365207363656c65726973717565206d61737361206e6f6e206375727375007320706f7274612e20566573746962756c756d206d65747573207075727573002c20636f6e736571756174206964206672696e67696c6c6120612c2074656d00707573207068617265747261206c65637475732e20566573746962756c756d0020736f64616c6573206c6f626f7274697320756c7472696365732e0a0a4e61006d2073697420616d657420626c616e646974206573742e204675736365207300697420616d65742074696e636964756e7420646f6c6f722e20446f6e6563200076656c206e697369206c616375732e204d617572697320706f7375657265200075726e6120616320656c656966656e6420616c69717565742e205375737065006e6469737365206661756369627573206665726d656e74756d206c69626572006f2c20616320617563746f72206d617373612068656e647265726974207465006d706f722e20467573636520706f72747469746f722061726375206163206c00656374757320626962656e64756d20636f6d6d6f646f2e205365642061756300746f72206575206f64696f2076656c20616c69717565742e20436c6173732000617074656e742074616369746920736f63696f737175206164206c69746f72006120746f727175656e742070657220636f6e75626961206e6f737472612c200070657220696e636570746f732068696d656e61656f732e20566976616d757300206574206c756374757320656e696d2e20566573746962756c756d2074656d00706f7220616e746520736564206d61747469732064696374756d2e205175690073717565207068617265747261206172637520656765742075726e6120756c0074726963657320617563746f722e204d6f72626920656c656966656e642063006f6e736571756174206d692069642068656e6472657269742e20467573636500206d617474697320616e746520636f6e64696d656e74756d20706f73756572006520736f64616c65732e20437572616269747572206c6f626f72746973207500726e612073697420616d6574206d617474697320656765737461732e204d610075726973206665756769617420656c69742074656c6c75732c20756c747269006369657320696d70657264696574206469616d2074656d7075732076656c2e000a0a566573746962756c756d206672696e67696c6c6120747269737469717500652075726e6120657520706f7274612e2050726f696e206665756769617420006e69736c207475727069732c207574206c6f626f727469732072697375732000696d706572646965742061742e2050686173656c6c75732073697420616d65007420616c69717565742066656c69732c20766974616520706f737565726520006d692e20416c697175616d20736167697474697320766172697573206e69620068206e6563206f726e6172652e2050656c6c656e7465737175652074696e63006964756e742076697461652065737420657520616c697175616d2e20447569007320696163756c697320757420617263752073656420656c656d656e74756d002e20467573636520616363756d73616e2c20646f6c6f72206e6f6e2074656d0070757320616363756d73616e2c20646f6c6f72207175616d20617563746f7200206e657175652c2071756973206f726e61726520616e7465206c656f206964002070757275732e2050686173656c6c75732073656420656c656966656e642000656c69742e204372617320657520706f737565726520616e74652e20496e2000616e7465206c6f72656d2c2070686172657472612073697420616d65742076006573746962756c756d207365642c2072686f6e637573206964206a7573746f002e2055742074656d707573206469676e697373696d207665686963756c612e00204d616563656e6173206d61757269732076656c69742c2065676573746173002073697420616d6574207661726975732076697461652c20666163696c69730069732073697420616d6574206c6967756c612e0a0a4d6175726973206772610076696461206c656f2073697420616d6574206f7263692076656e656e61746900732c207574206d6178696d75732073617069656e20636f6e7365717561742e00204d6f726269206e6563206f7263692065782e20566976616d757320766568006963756c61206469676e697373696d207075727573207365642074696e63690064756e742e20467573636520657569736d6f64206e6f6e20656e696d2065740020636f6d6d6f646f2e205072616573656e7420766f6c7574706174206d6f6c006573746965206f726e6172652e20566976616d757320636f6e64696d656e7400756d2076656c697420656c656d656e74756d2c207072657469756d20747572007069732065752c20626c616e6469742072697375732e204675736365207065006c6c656e746573717565206d6178696d7573206e6973692061632073656d700065722e20416c697175616d20757420657569736d6f642076656c69742c207300656420656c656d656e74756d206c6f72656d2e204d616563656e617320696400207269737573206e6f6e206d61737361206772617669646120636f6d6d6f64006f2e204e756c6c616d20696e20707572757320696420656c69742066616369006c6973697320636f6e6775652e2041656e65616e20636f6e6775652076756c00707574617465206c616f726565742e20416c697175616d206567657420656c0069742074656c6c75732e205175697371756520737573636970697420717561006d206163206d6173736120626962656e64756d20656765737461732e20416c00697175616d2071756973206578206e6f6e2076656c6974207363656c657269007371756520756c6c616d636f727065722069642065676574206d61676e612e002041656e65616e20612073656d206e6f6e2065726174206c6f626f727469730020636f6e6775652e0a0a43726173206e6f6e20647569206f64696f2e20517500697371756520766f6c7574706174207363656c657269737175652069707375006d206174207661726975732e20536564206f726e6172652073656d20736564002076656e656e6174697320636f6e7365717561742e2044756973206f726e610072652076656e656e61746973206d6f6c6c69732e20536564206578206e65710075652c2065666669636974757220626962656e64756d20706c616365726174002065742c20736f6c6c696369747564696e2076656c206f7263692e20496e740065676572206e696268206e657175652c20666163696c69736973206e6f6e20006d61757269732076656c2c20636f6e73656374657475722074726973746971007565206e756c6c612e204e756e632073697420616d657420706861726574720061206c656f2e204e756c6c616d206c656f206f7263692c20696d70657264690065742073697420616d657420696e74657264756d20717569732c2069616375006c6973206575206e69736c2e20416c697175616d2073656420747269737469007175652073656d2c206e6563206c6f626f7274697320746f72746f722e204d00616563656e617320736f64616c6573207075727573206e656320616c69717500616d20706f72747469746f722e20447569732075742066656c69732065726100742e0a0a437261732061206d6173736120696d706572646965742c2061636300756d73616e2072697375732069642c207375736369706974206e756e632e2000446f6e65632073656d70657220656e696d206575206d61676e6120636f6e730065717561742074696e636964756e742e2053757370656e646973736520636f006e736571756174206c6563747573207669746165206d6574757320616c697100756574206c616f726565742e20436c61737320617074656e74207461636974006920736f63696f737175206164206c69746f726120746f727175656e74207000657220636f6e75626961206e6f737472612c2070657220696e636570746f73002068696d656e61656f732e20446f6e656320696e74657264756d206469616d00206174206e69626820616363756d73616e2c20657420617563746f72206d6100737361206c6163696e69612e20467573636520696420657820766974616520007269737573206c616f7265657420706f72746120636f6e64696d656e74756d00206567657420656e696d2e2050686173656c6c7573206c6563747573206f6400696f2c20666163696c6973697320612074656d707573207365642c20736f6400616c6573206575206475692e204e616d20696e206d616c657375616461206f0064696f2e205175697371756520706c61636572617420697073756d2076656e00656e617469732072697375732074656d7075732066617563696275732e205000656c6c656e74657371756520656c656d656e74756d20646f6c6f72207175690073206672696e67696c6c612074656d7075732e20457469616d2074696e63690064756e7420766172697573206c6f72656d20696e206f726e6172652e204e61006d206120656c656d656e74756d206f7263692e2050686173656c6c7573206700726176696461206e69736c20657520656c697420756c747269636965732c2000657420626962656e64756d2074656c6c75732066696e696275732e0a0a437200617320626c616e6469742070756c76696e6172206d657475732c2061632069006e74657264756d2066656c6973206d6178696d757320626962656e64756d2e002041656e65616e20626962656e64756d20696d7065726469657420636f6e6400696d656e74756d2e204e616d206e6f6e206c61637573206c6967756c612e2000517569737175652073656420766573746962756c756d2073617069656e2e2000536564207665686963756c612074696e636964756e74206c656f207175697300206c6163696e69612e20536564206c61637573206c6f72656d2c20756c74720069636573206e6563206c6f72656d207365642c20706c61636572617420766f006c7574706174206d657475732e205365642075742073656d2073697420616d00657420746f72746f7220756c7472696365732073757363697069742076656c00206174207475727069732e0a0a5574207669746165206175677565207369740020616d657420656c69742070756c76696e61722068656e647265726974206e0065632061206c6967756c612e20446f6e656320706f727461206e6973692063006f6d6d6f646f20616e7465207665686963756c612073656d7065722e205574002066696e696275732c207075727573207574206661756369627573206d6f6c006c69732c2066656c6973206e65717565206d616c657375616461206e696268002c2061632076656e656e61746973206e756c6c612076656c69742061206665006c69732e204d617572697320677261766964612c206c6967756c6120696420006c6163696e696120766976657272612c206a7573746f206c696265726f2076006172697573206c6967756c612c2073697420616d657420706f727461206c6f0072656d206c696265726f2061206d657475732e20416c697175616d20756c6c00616d636f72706572206d61757269732073617069656e2c2061206772617669006461207075727573207363656c6572697371756520717569732e204e756c6c00616d2072757472756d20746f72746f722073697420616d6574206f64696f2000656666696369747572207072657469756d2e2044756973206c616f7265657400206566666963697475722076656c69742c20612073656d7065722066656c6900732e2050726f696e206e696268206c616375732c20637572737573207369740020616d6574206c656374757320717569732c2065666669636974757220766500686963756c61206475692e20446f6e65632061726375206c656f2c207275740072756d2075742063757273757320696e2c207363656c6572697371756520650074206c616375732e204d616563656e61732074696e636964756e742061726300752061206e6571756520666575676961742c2076656c2064696374756d206e0069736c2073656d7065722e20446f6e6563206e756e632076656c69742c2063006f6d6d6f646f20696420746f72746f722076697461652c20616c697175657400206661756369627573206c6f72656d2e2041656e65616e2076617269757320006d61747469732073617069656e2065676574206d6f6c6c69732e20446f6e6500632076697461652075726e6120756c6c616d636f727065722c206469676e69007373696d20656e696d2076697461652c20766573746962756c756d206d65740075732e2050686173656c6c757320636f6e73656374657475722065726f732000696d706572646965742c20677261766964612065726f732069642c206d6f6c006c69732076656c69742e0a0a5574206163206c6163757320636f6e76616c6c0069732c207665686963756c61206e6571756520717569732c2065666669636900747572206f7263692e205574206d69206c616375732c206566666963697475007220657420736f6c6c696369747564696e2075742c206661756369627573200073697420616d657420616e74652e2053656420636f6e64696d656e74756d20006567657420656c697420617420677261766964612e20457469616d206e656300206e69736c2073656420656e696d20706f72746120706c6163657261742e20005072616573656e74206672696e67696c6c61207361676974746973206c656f002c2076656c2074656d706f72206f64696f206d6f6c6c69732076697665727200612e20566573746962756c756d2066696e69627573206a7573746f207269730075732c2065752073656d706572206475692066696e696275732061632e204d00617572697320706c616365726174206c6563747573206e6973692c206e6f6e0020766573746962756c756d20746f72746f72206d61747469732061632e204e00756c6c61206e656320626962656e64756d207175616d2e0a0a53656420657400206469616d2065676574206c696265726f2070756c76696e6172206672696e0067696c6c6120756c74726963696573206964207475727069732e20507261650073656e7420657520656e696d206672696e67696c6c612c20706c61636572610074206172637520696e2c20766573746962756c756d206e657175652e2045740069616d207665686963756c6120657261742064696374756d206e6962682065007569736d6f6420736f6c6c696369747564696e2e205072616573656e74206e0065632074757270697320616c69717565742c206c6f626f72746973206c656f0020717569732c207665686963756c61207175616d2e2050686173656c6c7573002073656420626962656e64756d206e6973692e204d616563656e61732069640020646f6c6f72206567657420616e746520626c616e6469742064617069627500732e20446f6e656320656c656d656e74756d20736564206e696268206575200073616769747469732e20467573636520636f6e6775652073656d206c6f7265006d2c206e6f6e206672696e67696c6c61206f64696f20617563746f7220612e0020566573746962756c756d20616e746520697073756d207072696d69732069006e206661756369627573206f726369206c756374757320657420756c7472690063657320706f737565726520637562696c69612063757261653b204d61656300656e61732073656420636f6e7365637465747572206a7573746f2e2053656400206566666963697475722061207175616d2073697420616d6574206d617869006d75732e0a0a416c697175616d20636f6d6d6f646f20616e7465206574206d006f6c657374696520706f72747469746f722e204d616563656e617320766f6c007574706174206e69736c207363656c657269737175652c206c6f626f7274690073206d61757269732061632c2064696374756d206d617373612e205068617300656c6c7573206d616c657375616461206c6163696e6961206f64696f206964002066696e696275732e204d616563656e61732061206d61676e61206f64696f002e20467573636520697073756d2075726e612c2073616769747469732066610075636962757320616e7465207365642c20756c747269636573206461706962007573206d61757269732e2053757370656e6469737365207574206f64696f2000717569732073656d206461706962757320616c697175616d20696e2069642000646f6c6f722e205574206d61747469732071756973206f64696f20766974610065206c6f626f727469732e20416c697175616d20616320746f72746f7220610063206d657475732073656d70657220766976657272612e20416c697175616d00206e65632064696374756d206d617373612c2076656c2073757363697069740020656c69742e2044756973207365642073656d206575206e69626820636f6e00736563746574757220696163756c69732076656c2075742061756775652e200044756973207669746165206c75637475732075726e612e204e616d206e756c006c61206e6962682c20626c616e6469742073697420616d65742073656d706500722076697461652c206d6f6c6c6973206c6f626f72746973206e756e632e200053656420757420666175636962757320746f72746f722c20656765742069610063756c6973206f7263692e20496e206120626c616e646974206475692c20610074207068617265747261206d657475732e20457469616d2068656e64726572006974206c696265726f207669746165206c656374757320737573636970697400206f726e6172652e2051756973717565206d6174746973206c6163757320610074207068617265747261207661726975732e0a0a4d616563656e61732066610063696c6973697320656c697420756c747269636573207072657469756d206c006f626f727469732e2046757363652076656c20766573746962756c756d2065007261742e20457469616d206175677565206d617373612c20666575676961740020766974616520657261742061632c206c6f626f7274697320766f6c757470006174206d61676e612e20446f6e6563206d616c65737561646120736564206c006967756c6120717569732066696e696275732e204e756c6c616d20656666690063697475722076697665727261206475692c206e6f6e20766573746962756c00756d20746f72746f7220696e74657264756d2076656c2e2050726f696e2061006e7465206573742c20626c616e64697420696e207363656c65726973717565002073697420616d65742c20756c74726963696573206e65632065726f732e20005365642065726174206e69736c2c20677261766964612065742074656d706f00722065742c206665726d656e74756d2073697420616d65742065782e205365006420656666696369747572206d6920766974616520657569736d6f6420667200696e67696c6c612e2053757370656e6469737365206567657420617563746f0072206e6962682e20446f6e6563206e6563207068617265747261206f64696f002c2068656e64726572697420636f6e64696d656e74756d20646f6c6f722e0a000a4d6f72626920696d706572646965742c206469616d206e65632076756c700075746174652072757472756d2c20746f72746f72206c6f72656d20696e7465007264756d20616e74652c207669746165206375727375732074757270697320006f64696f206e6f6e206d61676e612e20446f6e6563206c616f7265657420760069746165206d61676e612073697420616d657420617563746f722e20437261007320617563746f72206e69736c20717569732076617269757320636f6d6d6f00646f2e204d6175726973206174206c6163696e6961206e756c6c612e2056650073746962756c756d20666575676961742073656d206174206d61737361206600617563696275732064696374756d2e2046757363652076656c207361706965006e2073697420616d6574206a7573746f20737573636970697420616363756d0073616e2075742076656c206f7263692e204e756c6c6120666163696c697369002e204e756c6c616d20736f6c6c696369747564696e20737573636970697420006e6973692c20657520616363756d73616e206d6574757320636f6e73656374006574757220766573746962756c756d2e20517569737175652074656c6c757300206d657475732c2073656d7065722074656d707573206d657475732071756900732c2064696374756d20656c656d656e74756d2066656c69732e205375737000656e646973736520636f6e76616c6c6973207075727573206163206c6163750073207072657469756d2c20616320616c6971756574206573742066696e69620075732e2050656c6c656e74657371756520626962656e64756d20707572757300206d61676e612c2073697420616d657420637572737573206e65717565206600657567696174206e6f6e2e2043757261626974757220696e206d6178696d750073206a7573746f2e2041656e65616e20696163756c6973206c6163696e6961002072686f6e6375732e0a0a536564206672696e67696c6c612073656d20616300206d61737361206d616c6573756164612c206d617474697320696d7065726400696574207175616d2073757363697069742e2043726173206c6163696e6961002061632065782076697461652072757472756d2e205365642065782066656c0069732c20706f727461206e656320617263752061632c2066696e6962757320006c7563747573207475727069732e204475697320697073756d206c69626572006f2c20696e74657264756d20757420696e74657264756d2075742c20656c65006d656e74756d206163206a7573746f2e204d6f7262692074726973746971750065206c6f626f7274697320706c6163657261742e2050656c6c656e746573710075652074696e636964756e742074656d70757320656e696d20617420636f6e006775652e204e756c6c61206d61747469732074696e636964756e74206e697300692c2061742072686f6e63757320616e746520656c656966656e642068656e006472657269742e204e756c6c616d2064696374756d20706861726574726120006475692e20566573746962756c756d206c75637475732065737420757420610075677565207472697374697175652c2073697420616d657420656c656d656e0074756d2074656c6c757320656c656966656e642e20496e7465676572206e650063206f726e617265206a7573746f2c207175697320706f727461206469616d002e2051756973717565206e6f6e206e697369206e6f6e206c6f72656d207075006c76696e617220706f73756572652061206567657420656c69742e20536564002065676574206c6163696e69612073656d2e2050686173656c6c7573206e6f006e206e756c6c612074656d7075732c207363656c65726973717565206c69620065726f2076656c2c207068617265747261206e6962682e0a0a53757370656e006469737365206469676e697373696d20636f6e67756520657374206964207000686172657472612e20447569732076697461652066656c697320696e206c65006374757320666163696c6973697320706861726574726120736564206163200070757275732e2050656c6c656e7465737175652076656e656e617469732070006c616365726174206d61757269732c206120626962656e64756d206d617572006973206566666963697475722076697461652e204d6f7262692065666669630069747572206d65747573206575207363656c65726973717565206661756369006275732e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b200041656e65616e20696e74657264756d20666163696c69736973207175616d2000717569732066617563696275732e20566573746962756c756d20616e74652000697073756d207072696d697320696e206661756369627573206f726369206c00756374757320657420756c74726963657320706f737565726520637562696c0069612063757261653b205072616573656e74206c6f626f72746973206d6167006e612071756973206e697369206d616c657375616461206d6178696d7573200071756973206e6f6e206c6f72656d2e20437572616269747572206e6f6e206e00756c6c612073697420616d657420657261742074696e636964756e742066610063696c6973697320617420657420746f72746f722e204d6f72626920696420006175677565207669766572726120697073756d2070756c76696e617220736300656c657269737175652071756973206e65632076656c69742e204e616d207600656c206f64696f20636f6d6d6f646f2c20706f727461206172637520696e2c0020666163696c697369732073617069656e2e204e756e632073697420616d6500742076656e656e6174697320657261742c206174206c616f72656574206175006775652e20446f6e656320617563746f722070757275732071756973207465006d706f7220666575676961742e20496e2071756973206c6f72656d206567650074206e756e63206c6163696e696120646170696275732e20446f6e65632069006163756c6973206573742076656c2072686f6e63757320616c697175616d2e000a0a4d6f726269206d61676e61206f64696f2c2076656e656e61746973207600697461652073656d2069642c20646170696275732074656d707573206e756e00632e204d6f7262692066617563696275732074656d706f72206d6178696d7500732e205175697371756520657520696d70657264696574206d61676e612c2000696420616c697175616d2075726e612e20446f6e6563207574206c69626572006f206475692e20457469616d206d6174746973206e756c6c6120717569732000617567756520696e74657264756d2c2061206d6f6c6573746965206f72636900207472697374697175652e20446f6e6563206e656320756c6c616d636f7270006572206e6962682c2061742074696e636964756e742070757275732e20447500697320626c616e646974206e69626820756c74726963696573206f7263692000616363756d73616e20736f6c6c696369747564696e2e20446f6e6563206964002061756775652071756973206e65717565206c616f72656574206f726e617200652e204e756e632072757472756d206a7573746f2075742065676573746173002068656e6472657269742e20437261732074656d70757320696e206d61757200697320612074696e636964756e742e0a0a557420706f72747469746f72207400656d70757320616c697175616d2e204d616563656e617320677261766964610020636f6e736571756174206d692c20657420747269737469717565206c6f7200656d20666575676961742073697420616d65742e205072616573656e742073006564206d6178696d7573206f64696f2c206567657420636f6e736563746574007572206c616375732e20416c697175616d20647569206e657175652c20766900766572726120636f6e73657175617420636f6e6775652076656c2c20636f6e00736571756174206964206f7263692e2041656e65616e2066696e69627573200065782073656d706572206e69736c206d61747469732c2071756973206c75630074757320656e696d206c6163696e69612e2050726f696e206964206d6173730061206d61757269732e20496e74656765722065752061726375206c6163696e006961206c656374757320657569736d6f64206c75637475732e20496e20766f006c7574706174206e6f6e206d657475732073697420616d657420636f6e7661006c6c69732e204e616d206c6967756c61206d657475732c206665726d656e7400756d2065752074656c6c75732069642c20656c656966656e642076617269750073206e657175652e204675736365206175677565206c6f72656d2c2070686100726574726120612073656d2076656c2c20636f6e64696d656e74756d206d61007474697320646f6c6f722e2046757363652073656d706572206e69736c2069006e2075726e612073757363697069742c2065676574207072657469756d206a007573746f20736f6c6c696369747564696e2e0a0a496e7465676572207669740061652072686f6e637573206573742c207175697320626962656e64756d207200697375732e20457469616d206d616c657375616461206175677565206575200074656d70757320636f6e76616c6c69732e205175697371756520717569732000656c697420666575676961742c20756c6c616d636f72706572206e6962682000696e2c206c7563747573206d617373612e2050686173656c6c757320636f6e0076616c6c69732073617069656e2076656c206c616375732074696e63696475006e742c206e656320657569736d6f64206573742070656c6c656e746573717500652e20416c697175616d20706f727461206a7573746f206120756c74726963006965732068656e6472657269742e204d6175726973206c756374757320617500677565206575206c656374757320646170696275732c20757420706f7274610020656c69742070656c6c656e7465737175652e20496e74656765722073656400206d61676e6120757420646f6c6f722074696e636964756e74206672696e6700696c6c61206964206174206475692e204d6f72626920656c656966656e64200072697375732073697420616d6574206d61676e612074656d7075732c20766500686963756c61206c6f626f72746973206f72636920736f6c6c69636974756400696e2e204e616d2065742074656d706f72206d61676e612e204d6f726269200071756973207072657469756d2072697375732c2075742076656e656e61746900732074656c6c75732e204d617572697320706f72746120646f6c6f722065740020636f6e73656374657475722068656e6472657269742e204e616d2070656c006c656e7465737175652065676573746173206f64696f207472697374697175006520677261766964612e2050656c6c656e746573717565206964206665726d00656e74756d206469616d2e20496e20636f6e7365637465747572206d69207600656c206c696265726f20657569736d6f642064696374756d2e20446f6e65630020736167697474697320616e7465206d617373612e205072616573656e7420006163206175677565206e657175652e0a0a536564206d6173736120747572700069732c20636f6e76616c6c69732065676574207665686963756c612065752c0020636f6e64696d656e74756d20736564206d657475732e2053656420636f6e0064696d656e74756d20766f6c7574706174206573742c2076656c2070756c7600696e6172206e69736920736f6c6c696369747564696e206e6f6e2e20496e740065676572207574206d61676e6120657420746f72746f722064696374756d2000636f6e64696d656e74756d20696e20706f727461206573742e20496e207369007420616d65742061756775652065782e204e756e6320766573746962756c75006d206964206c616375732076656c2070756c76696e61722e2050726f696e200070756c76696e6172206d6173736120757420616e7465206d6178696d75732c00207669746165206c7563747573207175616d20656765737461732e204475690073206d6178696d757320616e74652073697420616d6574206d616c65737561006461206469676e697373696d2e204675736365207574206c656f20626c616e006469742c20666163696c69736973206d657475732061742c20636f6e73657100756174206c696265726f2e20437261732076656e656e61746973206e6973690020656765742075726e61206665726d656e74756d2c2061742066696e6962750073207175616d20696163756c69732e20517569737175652076656c206c6f7200656d2065782e2050726f696e206a7573746f2066656c69732c207363656c650072697371756520736564206f64696f2069642c206665756769617420736f6c006c696369747564696e207175616d2e20496e74656765722076617269757320006f7263692073697420616d65742076756c7075746174652068656e647265720069742e204d6f726269206d6178696d75732c2065726f73206e6f6e20636f6e007365717561742066696e696275732c207175616d206e69626820756c6c616d00636f72706572206475692c20616320696e74657264756d2073656d20616e74006520766974616520746f72746f722e204375726162697475722076697461650020706861726574726120656e696d2e20437261732073757363697069742063006f6e677565206c656f2c20696e20736f6c6c696369747564696e206e69736900207472697374697175652061742e20566976616d757320706f72747469746f007220746f72746f7220636f6e64696d656e74756d2c20696163756c6973206c006967756c612075742c207472697374697175652065726f732e0a0a496e20650075206c756374757320616e74652e204d6f726269206d6178696d7573207572006e61206e6f6e206c6967756c6120706f73756572652c206120766f6c757470006174206f7263692073616769747469732e204e616d20617420656c6974206500676574206d692066696e696275732073656d70657220756c747269636573200073656420616e74652e205072616573656e742065752073656d706572206f720063692e204e616d2071756973206469616d206e65632065737420656666696300697475722073656d7065722e204d6f7262692073697420616d6574206f6469006f2070656c6c656e746573717565206e69736c20626c616e64697420736f6400616c65732e20447569732067726176696461206964206c6f72656d2065752000616c69717565742e205365642065726f73207475727069732c207375736369007069742073697420616d657420736f64616c6573207365642c20666163696c0069736973206574206573742e204f72636920766172697573206e61746f717500652070656e617469627573206574206d61676e697320646973207061727475007269656e74206d6f6e7465732c206e61736365747572207269646963756c750073206d75732e20566976616d75732073656d7065722074656d706f7220766100726975732e20416c697175616d20696420616c697175616d206469616d2e0a000a416c697175616d20746f72746f72206573742c206c7563747573206575200075726e6120717569732c2074656d7075732068656e6472657269742061726300752e20566573746962756c756d2073697420616d657420656c656d656e7475006d206c656f2e2053757370656e64697373652071756973206e756e632061200073617069656e2068656e64726572697420696d706572646965742e205365640020696e2065676573746173206c696265726f2e20446f6e656320636f6e677500652073697420616d6574206e65717565206461706962757320657569736d6f00642e204675736365207363656c657269737175652076656c20707572757320006964207363656c657269737175652e2050726f696e2076656c20706f7274740069746f72206e69736c2e0a0a4d6f726269206964206475692065676574207400757270697320696163756c697320636f6e6775652e204e756c6c616d2061750063746f722c206c6967756c61206567657420636f6d6d6f646f20707265746900756d2c206c696265726f206e756c6c6120756c74726963696573206f64696f002c2075742072757472756d2061726375206172637520696e206e6973692e20004d61757269732065676574206c6163757320696e20657820766172697573200073616769747469732073656420696e20656c69742e204d6175726973206d6f006c6573746965206f64696f206574206f72636920706861726574726120706c006163657261742e20496e746567657220696e20747572706973206567657420006c696265726f20636f6e7365637465747572206c6f626f7274697320657520006e6f6e206c616375732e204d616563656e61732064696374756d206c656f200074656d707573206c61637573206d617474697320736f64616c65732e20446f006e6563206a7573746f206f64696f2c2074696e636964756e7420616320617200637520656765742c20666175636962757320706f737565726520646f6c6f72002e205072616573656e742065676574206e756e63206e65632066656c69732000696e74657264756d2072686f6e6375732e20566573746962756c756d20656c00656d656e74756d206461706962757320636f6e73656374657475722e205375007370656e6469737365206964206e756e63206d61747469732c206c756374750073206e6962682073697420616d65742c20636f6e64696d656e74756d206578002e20496e7465676572206f726e6172652075726e61207669746165206e69730069206c7563747573206469676e697373696d2e2041656e65616e2074696e63006964756e742068656e647265726974207269737573206e6f6e20616363756d0073616e2e204e756c6c6120617420736f64616c6573206e69736c2e20496e7400656765722068656e647265726974207669746165206d61676e61207669746100652073757363697069742e20437261732064617069627573206c65637475730020736564206c656f207363656c657269737175652073656d7065722e204d6100757269732061207269737573206e756c6c612e0a0a53656420696163756c6900732c206c656f20757420766573746962756c756d206672696e67696c6c612c002066656c69732073617069656e20636f6e76616c6c6973206c65637475732c002076656c206c616f72656574207175616d206f7263692061206d6175726973002e204e756c6c616d20657520616363756d73616e2073617069656e2e205065006c6c656e746573717565206d617474697320736f64616c6573206d6175726900732c20757420636f6e64696d656e74756d206d61676e6120636f6e677565200076656c2e2041656e65616e20706f72747469746f72206e6973692061632065007261742066617563696275732073757363697069742e2050686173656c6c75007320656c656d656e74756d2074696e636964756e74207175616d206e65632000636f6e64696d656e74756d2e204375726162697475722066696e6962757320006e756c6c612076656c206c6163696e696120696d706572646965742e204d61006563656e61732066657567696174206d617474697320646f6c6f722c206e65006320616363756d73616e20697073756d2074656d706f722075742e205068610073656c6c757320617563746f7220666163696c697369732072757472756d2e0020536564207669746165206d69206e6f6e206f64696f2070656c6c656e7465007371756520626c616e64697420696e2061206d61676e612e0a0a5365642069006e206469616d20636f6e6775652c20636f6d6d6f646f20746f72746f722061002c20657569736d6f64206c6967756c612e20496e2061632065666669636974007572206e756e632c2076656c20756c6c616d636f7270657220697073756d2e0020416c697175616d2076656c206469616d206665726d656e74756d2c20736f006c6c696369747564696e20617263752065742c20656c656d656e74756d207300617069656e2e2043726173206c656f206d657475732c2072686f6e637573200071756973206d617373612065752c206772617669646120696163756c69732000657261742e2043757261626974757220756c7472696365732073697420616d00657420656e696d20757420617563746f722e2041656e65616e20617420617500677565206163206a7573746f2074656d70757320626962656e64756d207365006420696d7065726469657420746f72746f722e204e756c6c616d2073656420006d61757269732073617069656e2e20447569732070656c6c656e746573717500652075726e6120696e2066696e69627573206d6f6c65737469652e20507261006573656e74206e6f6e207072657469756d206d61676e612c206e6563206c610063696e696120746f72746f722e2050726f696e20666175636962757320656c00656d656e74756d206c6f72656d2c2072686f6e6375732076756c7075746174006520657820616c69717565742061632e0a0a416c697175616d2074696e63690064756e7420617263752073617069656e2c20616c697175657420737573636900706974206c656f20656c656d656e74756d2076697461652e2043726173206d00617474697320617263752076656c206f726e617265206665726d656e74756d002e204d6f72626920636f6e76616c6c6973206e697369206d6f6c65737469650020657261742073656d7065722c20736564206c7563747573206e65717565200076756c7075746174652e2053757370656e6469737365206d616c657375616400612c20646f6c6f722076656c20756c74726963657320696d70657264696574002c206d69206e69626820756c74726963696573207475727069732c206e656300207072657469756d206c696265726f20697073756d207669746165207269730075732e20416c697175616d20696e20636f6e677565206c616375732c2066650075676961742076756c7075746174652065726f732e20496e206c616f7265650074206e69626820696e2076756c70757461746520766573746962756c756d2e00205574206661756369627573206f726e617265206e756e632073697420616d00657420656c656966656e642e205072616573656e7420706c616365726174200073617069656e2076656c20656c69742074656d706f7220626962656e64756d002e204e756c6c612071756973207665686963756c6120617263752e205375730070656e646973736520736f64616c6573206c656f2061632075726e6120616c0069717565742076756c7075746174652e20536564206d6f6c6c69732c206c610063757320657520656c656966656e6420736f64616c65732c206d61676e6120006172637520766172697573206c656f2c20657520626c616e6469742066656c006973206572617420657420746f72746f722e205072616573656e742074656d007075732073697420616d6574206d61676e61207669746165206f726e617265002e20416c697175616d20656c656966656e642076656c206f64696f2069642000636f6e7365717561742e204d6175726973206574206e657175652071756973002073617069656e20706f737565726520756c74726963696573206575207369007420616d65742075726e612e20437261732072686f6e6375732065726f73200076656c2073656d2070756c76696e61722066696e696275732061206e6f6e200072697375732e0a0a536564206c6f626f72746973206f64696f207175616d2c00206e6f6e20637572737573206e756c6c6120616c697175616d206e6f6e2e2000446f6e65632061726375206573742c20666163696c6973697320696e2066610075636962757320612c2070686172657472612073697420616d6574206e6973006c2e205175697371756520696163756c6973206c656f206e6f6e20656c656d00656e74756d20706c6163657261742e2053656420766573746962756c756d20006c656f20616e74652c20616320636f6e76616c6c697320647569207361676900747469732069642e20496e206861632068616269746173736520706c61746500612064696374756d73742e20536564206d6f6c657374696520636f6e76616c006c69732066656c69732c20696e2070656c6c656e74657371756520616e74650020696e74657264756d20612e20566976616d757320706c6163657261742065006c656966656e6420616e74652e2050656c6c656e746573717565207369742000616d6574206f64696f207665686963756c612c207361676974746973206573007420656765742c20656c656d656e74756d206c6f72656d2e204d61757269730020656c6974206d61676e612c20636f6e6775652076656c2065726f73206e6500632c20696163756c6973206d616c65737561646120616e74652e2056697661006d757320696e20656666696369747572206f64696f2c207175697320616c69007175616d206e756c6c612e204e756c6c61207574206469676e697373696d20006475692e20496e206567657374617320666163696c69736973206c6f72656d002c206e6f6e20656c656d656e74756d20647569207665686963756c61206e6500632e204e756c6c61206d616c65737561646120706f72747469746f72206578002061206f726e6172652e204e756c6c61206e6f6e20766172697573206f6469006f2e2041656e65616e206e656320696d706572646965742073617069656e2e0020446f6e6563206e69736920617263752c2070756c76696e617220707265740069756d206d616c6573756164612061632c20706f72746120766974616520710075616d2e0a0a437572616269747572206d6f6c65737469652c206d6920696e0074657264756d206c7563747573206375727375732c207269737573207361700069656e206c6f626f72746973206c656f2c206174206566666963697475722000617567756520656c6974207365642074656c6c75732e204e756e6320737573006369706974206c7563747573206e69736c2073697420616d65742062696265006e64756d2e20446f6e6563206e6f6e206375727375732070757275732c20610063206661756369627573206a7573746f2e2050726f696e20617563746f722000766f6c7574706174206e756e632c20696e20747269737469717565206e6973006c20626962656e64756d2061742e2053757370656e64697373652076656e65006e61746973206e756e63206e69736c2c206e65632067726176696461206c69006265726f2074726973746971756520696e2e205175697371756520706c616300657261742061206e69736c20616320706c6163657261742e2041656e65616e0020756c74726963696573206c696265726f20696420697073756d2072686f6e006375732c2073697420616d657420616c697175616d20656e696d206c7563740075732e20447569732076656e656e6174697320646f6c6f722065742074656c006c757320636f6e736571756174206c6f626f727469732e20446f6e65632069006e206469616d20706f73756572652c206665726d656e74756d207269737573002065742c2070756c76696e6172206e657175652e0a0a496e7465676572206e006563206e6962682065752074656c6c7573207072657469756d20696e7465720064756d206174206574206469616d2e204e756c6c612070656c6c656e74657300717565206f64696f20717569732065726f73206567657374617320736f6461006c65732e2043757261626974757220656765742074656d707573206469616d002e2050656c6c656e74657371756520756c747269636965732061726375206500782c206120696d70657264696574206a7573746f20706f7375657265207665006c2e2050726f696e2076756c70757461746520736f64616c6573206d61737300612061742070686172657472612e20496e7465676572206e6f6e206d6173730061207574206c6967756c6120666575676961742074656d7075732e2051756900737175652073616769747469732076656c206e756e6320757420747269737400697175652e2041656e65616e2075742074656d706f72206a7573746f2e2044006f6e656320636f6e677565206e69736c20736564207175616d206d6f6c657300746965206d6f6c6c69732e204e756c6c616d20706c6163657261742c2074750072706973206567657420677261766964612072757472756d2c2066656c6973002076656c697420616c697175616d2065726f732c20696420656c656d656e7400756d206c6967756c612075726e6120696420657261742e204e756c6c61206e0065632072686f6e6375732073656d2e205574206e6563207665686963756c61002065782c2076656c2068656e647265726974206e657175652e20557420706c006163657261742076656c69742076656c2076656c69742068656e647265726900742c207669746165206665726d656e74756d207269737573206d6f6c6573740069652e0a0a4d6175726973206f726369206c65637475732c20696d7065726400696574207365642066696e69627573206e65632c20616c697175616d207665006c206e6962682e20566573746962756c756d206672696e67696c6c612061630063756d73616e206e756e63206574206d6f6c65737469652e205574206574200065726174206a7573746f2e2050656c6c656e74657371756520677261766964006120617263752070757275732e2041656e65616e20696e206e6962682076690074616520617263752064696374756d2074696e636964756e74206964206575002066656c69732e205072616573656e7420657420656c6974206964206d692000636f6e736563746574757220616c697175616d2e20566573746962756c756d0020696e20656e696d2064696374756d2c20626962656e64756d206572617420006e6f6e2c20756c74726963696573206f64696f2e2050656c6c656e7465737100756520636f6e76616c6c6973206f726369206e6973692c206e656320756c7400726963696573206f64696f20706f73756572652073697420616d65742e0a0a004d616563656e61732073697420616d6574206665726d656e74756d206e6973006c2e20566573746962756c756d20616e746520697073756d207072696d69730020696e206661756369627573206f726369206c756374757320657420756c7400726963657320706f737565726520637562696c69612063757261653b20507200616573656e74206174206e756e6320696e206d61676e6120636f6e73657175006174207363656c657269737175652e204d616563656e617320696e20717561006d207574206a7573746f2074696e636964756e7420617563746f722e205068006173656c6c757320757420646f6c6f72206d657475732e20496e2073656d70006572206d6920736564206c6f72656d2070686172657472612072686f6e637500732e204675736365206567657420657374206c616f726565742c20736167690074746973206c696265726f2073697420616d65742c2066657567696174206e006962682e204d6f72626920646170696275732075726e61206163207175616d00206665726d656e74756d2072686f6e6375732e20446f6e656320636f6e7661006c6c697320657569736d6f64206469676e697373696d2e204375726162697400757220757420747269737469717565206c6967756c612e0a0a536564207275007472756d2074696e636964756e74207472697374697175652e204e756e6320006d69207175616d2c20637572737573206574207665686963756c612065676500742c2074696e636964756e74206e6f6e20646f6c6f722e20446f6e65632061007563746f722066696e69627573206f726e6172652e204d6f72626920766568006963756c612c206e69736c2076656c20636f6d6d6f646f20706f7274746974006f722c20646f6c6f72206e756e63207361676974746973206469616d2c2065006765742066617563696275732073617069656e2065782076656c206d61676e00612e204375726162697475722076656c206c6967756c612073697420616d650074206c6967756c6120646170696275732066696e696275732e20457469616d002073697420616d6574206c6f72656d206c65637475732e204e756c6c616d20006665726d656e74756d206e69736c206c696265726f2c207669746165207469006e636964756e74207075727573206c6163696e696120717569732e204d6f72006269207574206d6f6c657374696520697073756d2c206575206d6f6c657374006965206c6967756c612e2050686173656c6c7573206574206c656374757320006a7573746f2e20566976616d7573206578206d61676e612c20636f6e736571007561742076656c206a7573746f2076656c2c2074656d706f7220616c69717500616d20616e74652e205365642066696e6962757320736564206d6173736120007175697320636f6d6d6f646f2e20446f6e656320696e206e696268206e6563002074656c6c757320636f6e677565206469676e697373696d206567657420760069746165206e756c6c612e204475697320656c656966656e6420706c61636500726174207269737573206120706c6163657261742e204d6175726973206e650063206c65637475732068656e6472657269742c207361676974746973207665006c697420636f6e64696d656e74756d2c2065676573746173206475692e0a0a004e616d20696163756c69732076656c697420717569732075726e6120706f720074612073616769747469732e2041656e65616e20636f6d6d6f646f206e6973006c206e656320697073756d206c6f626f727469732c20626962656e64756d200065666669636974757220656e696d20636f6e64696d656e74756d2e2050726f00696e206172637520656c69742c206665726d656e74756d2075742065676573007461732061742c206c616f726565742076656c206e69736c2e20496e74656700657220626962656e64756d20747572706973207574206469616d206665726d00656e74756d2c2065752074656d707573206c656f206672696e67696c6c612e00204d616563656e61732076656c697420617263752c20636f6e64696d656e7400756d20696d7065726469657420657261742065742c206661756369627573200076756c707574617465206c65637475732e20437572616269747572206d657400757320656e696d2c206672696e67696c6c6120757420666163696c69736973002061632c20616363756d73616e20696e20697073756d2e204e756c6c616d20007665686963756c61206c6163696e6961206d617373612c2076656c20666175006369627573206f64696f20636f6e64696d656e74756d2061742e204d61757200697320706f72747469746f722065726f73206d61676e612c207574206d617800696d75732074656c6c7573206665726d656e74756d2069642e20566976616d007573207574206c6563747573206f726e6172652c20706f72747469746f7220006469616d20656765742c20756c6c616d636f72706572206e6962682e2044750069732076656e656e617469732074656d706f7220657261742c207574207661007269757320657374206c6f626f727469732076656c2e2050686173656c6c75007320736564206578206c65637475732e205365642076656c2073617069656e0020616c697175616d2c20696e74657264756d206475692069642c20656c65690066656e64206f7263692e0a0a5072616573656e74206174206c6f626f7274690073206d657475732e204e616d2074656d707573207175616d206475692c206e006563206c7563747573206d617373612074696e636964756e7420612e205065006c6c656e74657371756520616363756d73616e2076656c697420757420617500677565206d617474697320636f6e76616c6c69732e205574206567657374610073206f64696f20656e696d2c206163207669766572726120616e746520636f006e76616c6c69732075742e2041656e65616e20696e2064756920617420717500616d206665726d656e74756d2072757472756d2e20566976616d757320656700657420636f6e76616c6c6973206c65637475732e20457469616d2065756973006d6f64206672696e67696c6c6120746f72746f722c206e656320696e7465720064756d206a7573746f206d61747469732065752e204e756c6c616d206d617800696d7573206e696268206469616d2c206575206c6f626f72746973206a757300746f207072657469756d2076697461652e20517569737175652074696e63690064756e7420646f6c6f722061742075726e6120636f6e64696d656e74756d2c00207669746165206d616c6573756164612065737420706f72747469746f722e002050656c6c656e746573717565207669746165206475692065782e2056697600616d757320766f6c757470617420697073756d207574207475727069732065006c656d656e74756d20706f7274612e20496e74657264756d206574206d616c006573756164612066616d657320616320616e746520697073756d207072696d00697320696e2066617563696275732e204d6175726973207365642066656c690073206e756c6c612e205072616573656e742076656c2072697375732076656c0069742e0a0a446f6e656320706f727461206174206469616d2073656d7065720020616c69717565742e2041656e65616e20637572737573206c6f72656d206e006f6e2076617269757320636f6d6d6f646f2e20536564206e65717565206572006f732c20656666696369747572206e6563206469616d20696e2c20747269730074697175652076697665727261206469616d2e2053757370656e64697373650020746f72746f72206475692c20657569736d6f64206e6563206e756c6c61200061632c20616c697175657420756c74726963696573206c6f72656d2e205068006173656c6c757320636f6e7365637465747572206575206573742061632065006765737461732e204e756e6320757420656c697420696e2070757275732061006363756d73616e20657569736d6f642e2043726173206c656f206f7263692c0020677261766964612076656c20626962656e64756d20656765742c20636f6e0076616c6c697320696e2072697375732e20467573636520656765742073656d007065722073617069656e2e0a0a536564206d6f6c657374696520706c61636500726174206c6967756c61206e656320766976657272612e20496e2061742065006666696369747572206d61676e612e204e616d2066696e69627573206c6f7200656d20657420726973757320756c747269636965732c2076656c2063757273007573206e65717565207363656c657269737175652e20496e74657264756d20006574206d616c6573756164612066616d657320616320616e74652069707375006d207072696d697320696e2066617563696275732e2053656420696e2065670065737461732065726f732e2041656e65616e2074656d706f722c206e6962680020636f6d6d6f646f20626962656e64756d206c75637475732c2076656c697400206e756e6320696e74657264756d206f7263692c2073697420616d6574207400656d707573206c656f2070757275732076697461652072697375732e2045740069616d207669746165207269737573206e6962682e20566573746962756c75006d206d6f6c65737469652063757273757320616e74652c2065676574206c610063696e6961206c656f206d6f6c65737469652076656c2e0a0a53757370656e00646973736520757420677261766964612073617069656e2e2056657374696200756c756d20616363756d73616e206e756e6320696e2064617069627573207300656d7065722e204e756e632076656c2073656d706572207175616d2e205065006c6c656e746573717565206861626974616e74206d6f72626920747269737400697175652073656e6563747573206574206e65747573206574206d616c657300756164612066616d65732061632074757270697320656765737461732e20460075736365206d6f6c6573746965206672696e67696c6c61206c6f72656d2c20007175697320747269737469717565206d61676e6120756c6c616d636f72706500722073697420616d65742e20437572616269747572207669746165206c6f7200656d207574206a7573746f206c616f72656574207665686963756c61206174002061206469616d2e2053757370656e646973736520616c697175657420636f006e73656374657475722065782c20757420636f6e7365637465747572206e650071756520636f6e7365637465747572206e65632e20496e74656765722076690074616520636f6e64696d656e74756d20746f72746f722e204e756e6320736500642073757363697069742073617069656e2e2050686173656c6c757320656c00656d656e74756d20657569736d6f642076656c69742c2065676574206469630074756d20646f6c6f7220756c6c616d636f727065722065752e0a0a5068617300656c6c75732061742064756920697073756d2e204e756e63206c75637475730020617563746f72206e69736c20657520617563746f722e20446f6e65632063006f6e76616c6c69732061726375206c6163696e6961206578207361676974740069732c20736564206f726e61726520616e7465206f726e6172652e204e616d002074696e636964756e74206a7573746f207475727069732c20736564206d61007474697320616e746520736f6c6c696369747564696e207365642e2053656400206f726e61726520697073756d206e6962682c2061632074656d706f72206d0061676e612076617269757320696e2e204e616d206672696e67696c6c61206d0061676e61206d692c2075742065676573746173206c6f72656d207661726975007320696e2e20536564206575206c75637475732073617069656e2e20496e7400656765722076656c206469676e697373696d20656c69742c20617420706c61006365726174207475727069732e20446f6e656320696e206e69626820696420006a7573746f206c6f626f727469732064696374756d2e20446f6e656320706800617265747261206f726369206e656320636f6e76616c6c697320736f6c6c69006369747564696e2e0a0a50656c6c656e7465737175652073697420616d657400206672696e67696c6c612073656d2c20616320737573636970697420656c6900742e20446f6e656320612074726973746971756520697073756d2c206e6f6e0020756c7472696365732065726f732e205072616573656e7420616c69717561006d20697073756d206567657420626962656e64756d20766f6c75747061742e0020447569732073697420616d6574206469616d20626962656e64756d2c2061007563746f72206e69736920656765742c206d6f6c6c697320746f72746f722e00204d61757269732065742076656c69742075726e612e2055742066656c697300206c65637475732c207072657469756d207365642074656d707573207369740020616d65742c206d6f6c6c6973207669746165206c65637475732e204d6175007269732073697420616d6574206f7263692065752074656c6c75732066616300696c697369732074696e636964756e742e20447569732068656e647265726900742066656c69732061206e6571756520617563746f7220636f6e6775652e20004d6f726269206c6967756c61206573742c2070656c6c656e746573717565200076656c2073616769747469732065742c20666175636962757320656765742000656e696d2e0a0a517569737175652064696374756d206e6973692069642073006f6c6c696369747564696e207072657469756d2e20496e74657264756d20650074206d616c6573756164612066616d657320616320616e746520697073756d00207072696d697320696e2066617563696275732e2053757370656e646973730065207665686963756c612076656e656e617469732072697375732c20617420007665686963756c61206c616375732072757472756d206e6f6e2e2050656c6c00656e746573717565206861626974616e74206d6f72626920747269737469710075652073656e6563747573206574206e65747573206574206d616c657375610064612066616d65732061632074757270697320656765737461732e20496e20007075727573206d617373612c206d6f6c657374696520696e206e6962682061002c2076656e656e6174697320626c616e64697420656c69742e205068617365006c6c75732073617069656e206469616d2c2074696e636964756e7420736f6400616c6573206469616d2076697461652c20636f6e67756520736167697474690073206f64696f2e2043757261626974757220657569736d6f64206e65632061006e746520736564207072657469756d2e2050656c6c656e746573717565206d006f6c65737469652076617269757320656e696d2c206e6f6e20666175636962007573206c656f2073616769747469732061632e20437572616269747572207100756973206d61757269732071756973206c6967756c6120756c6c616d636f7200706572206d616c65737561646120736564206575206c65637475732e0a0a5300757370656e64697373652076656c206d61676e61206469676e697373696d2c002064696374756d206e657175652073757363697069742c20626962656e6475006d206c616375732e205175697371756520717569732066656c69732061726300752e2050686173656c6c75732065726174206c656f2c2073656d7065722061007420646f6c6f7220656765742c2076656e656e617469732072686f6e637573002065782e2043726173206d6f6c6c6973206e696268207365642061756775650020736f64616c65732c2073697420616d6574206d6f6c6c6973207075727573002070686172657472612e2043726173206e6563206d692071756973206c656f0020696d7065726469657420616363756d73616e207574206964207175616d2e00204e616d206e69736c20656c69742c206f726e61726520657520756c747269006365732076697461652c20706f72747469746f72206574206c6967756c612e002050656c6c656e746573717565207665686963756c6120656c69742065742000697073756d20636f6e7365717561742c206e6563206d6f6c6c6973206573740020696e74657264756d2e2055742074656d706f7220637572737573206d6f6c0065737469652e204d61757269732074696e636964756e7420616363756d7361006e206e756e6320696420696d706572646965742e20457469616d206d616c650073756164612c206e6973692061632076756c70757461746520696163756c6900732c206e697369206f72636920706c616365726174206e756c6c612c206e6500632074696e636964756e742074656c6c757320656c69742071756973207572006e612e20457469616d206c61637573206d617373612c2068656e6472657269007420757420636f6d6d6f646f20612c20696e74657264756d206964206e6973006c2e20496e746567657220766974616520616e7465206672696e67696c6c6100206d692074696e636964756e7420636f6e73656374657475722e204e756c6c006120636f6e7365637465747572206f726e61726520626962656e64756d2e0a000a55742073697420616d657420657569736d6f642074656c6c75732e205065006c6c656e746573717565207072657469756d2074696e636964756e7420647500692065752073656d7065722e205365642076656c2065726f73206e6f6e2064006f6c6f7220696163756c697320696e74657264756d20736564207175697320006f7263692e20496e2073656d706572206c6f626f72746973206469676e69730073696d2e2053656420666175636962757320666575676961742070656c6c65006e7465737175652e2050656c6c656e74657371756520736f6c6c69636974750064696e206f64696f20736564206c65637475732073616769747469732c206e006f6e20756c7472696369657320697073756d2072757472756d2e205365642000736564206f726e6172652065782e0a0a5072616573656e7420766974616520006d6f6c6573746965207175616d2c20616320626c616e646974206f64696f2e0020457469616d2065676573746173206375727375732075726e612069642065007569736d6f642e204e616d20616c69717565742061726375206575206c756300747573206c616f726565742e20457469616d20696d7065726469657420717500616d2076656c20636f6e73657175617420626c616e6469742e204d61757269007320696e74657264756d2c206469616d20766172697573206c6163696e69610020616c69717565742c2076656c69742074656c6c757320706861726574726100206a7573746f2c20656765742073757363697069742075726e61206e756c6c00612071756973206c656f2e204e756c6c61206578206e69736c2c2066617563006962757320617420626c616e6469742061632c2063757273757320612069700073756d2e20566976616d75732071756973206469616d20636f6e6775652c2000657569736d6f642075726e612073697420616d65742c206672696e67696c6c006120646f6c6f722e204e616d206e6f6e206e756c6c6120636f6e677565206c00696265726f2074656d706f7220756c747269636965732e2050656c6c656e740065737175652070756c76696e61722073617069656e207669746165206e756e0063207363656c65726973717565206672696e67696c6c612e204675736365200068656e647265726974206566666963697475722066617563696275732e2041006c697175616d2070757275732061756775652c206c7563747573206e6f6e2000636f6e76616c6c697320717569732c206d6178696d7573206e6f6e20647569002e0a0a446f6e65632070656c6c656e74657371756520657261742065752065007374206c6163696e696120616363756d73616e2e2050726f696e206d6f6c6c0069732073656d20646f6c6f722c206964206d6f6c6c6973206c656374757320007669766572726120696e2e204e756e632071756973206d6173736120766172006975732c206665726d656e74756d206c656f2076697461652c206c6f626f7200746973206e657175652e205175697371756520756c6c616d636f7270657220006a7573746f20766974616520636f6e67756520656c656966656e642e2045740069616d206574206c61637573206573742e20496e7465676572207475727069007320617263752c20616363756d73616e2076656c20697073756d2065676574002c206d616c65737561646120756c6c616d636f72706572206a7573746f2e20004d6175726973206e6f6e2065782074696e636964756e742c20756c74726963006573206c616375732061742c20626c616e646974206f64696f2e2056657374006962756c756d2067726176696461206e65632073617069656e206e656320640069676e697373696d2e2053757370656e64697373652074656d706f7220696e00206e69736c2076656c206d6f6c6c69732e204d616563656e6173206772617600696461206c616375732074656c6c75732c20657420756c7472696369657320006e756c6c612074696e636964756e7420612e20416c697175616d20657261740020766f6c75747061742e20446f6e65632065726f73206c65637475732c20640069676e697373696d2069642073617069656e2061742c20706c6163657261740020666163696c697369732070757275732e20566976616d757320707265746900756d2c206d69206120756c6c616d636f727065722074696e636964756e742c00206475692074656c6c757320626c616e646974206d617373612c206e6563200066696e6962757320657374206e69736c2071756973206e6962682e2046757300636520646170696275732064756920696e20636f6e73656374657475722070006c6163657261742e20467573636520736f6c6c696369747564696e20656765007374617320657261742c2073697420616d657420616363756d73616e206c65006f2074696e636964756e7420696e2e204d6f7262692065666669636974757200206d61757269732069642064696374756d20666163696c697369732e0a0a5500742075726e61206d61676e612c20706f72747469746f722061632065666669006369747572206e6f6e2c20656666696369747572206174206d617373612e200041656e65616e2073656420656c6974206e6f6e2065782073757363697069740020616363756d73616e2e20416c697175616d207669746165206c656f207361006769747469732c2067726176696461206c6967756c612065742c2070756c7600696e617220646f6c6f722e20457469616d20616320746f72746f72206c6f7200656d2e2050686173656c6c7573206567657374617320696163756c69732067007261766964612e204e756e63206e6f6e206e756e63206e6962682e2056697600616d757320766974616520617563746f722073617069656e2e20437261732000706f7375657265206e756c6c61206f64696f2c20657520706f727461206578002076656e656e6174697320612e204e616d207269737573206e657175652c2000657569736d6f642075742063757273757320656765742c2066617563696275007320736f6c6c696369747564696e20746f72746f722e2043757261626974750072207574206d65747573206e6f6e206469616d20617563746f722074696e63006964756e742e20496e7465676572206d616c65737561646120707265746975006d2076656e656e617469732e20566976616d75732072686f6e637573207469006e636964756e74206c6f72656d207175697320756c747269636965732e205000686173656c6c7573206f726e6172652065726f732065742068656e6472657200697420636f6d6d6f646f2e0a0a43757261626974757220696163756c69732000636f6e7365717561742073656d20717569732070656c6c656e746573717565002e2050726f696e206d617474697320656e696d20696e2065737420736167690074746973207661726975732e204d6f726269206e65632074696e636964756e00742076656c69742c206575206469676e697373696d20657261742e20416c69007175616d206572617420766f6c75747061742e205072616573656e74206669006e696275732074656c6c757320696e2068656e6472657269742076657374690062756c756d2e20437572616269747572206d6f6c6c69732074656c6c757320006d692c206e6563206d616c6573756164612076656c6974207375736369706900742061742e205365642065726174206e657175652c2072757472756d2073650064206665726d656e74756d2076656c2c2070656c6c656e746573717565206e006f6e20616e74652e204e616d20736f64616c65732070756c76696e6172206c006f72656d2c2065742074696e636964756e74206d61737361206469676e69730073696d2061632e20457469616d206d61737361207175616d2c20766f6c757400706174206574206c6f626f727469732073697420616d65742c2076656e656e006174697320696420656e696d2e0a0a446f6e656320706f727461206e69736c0020657520697073756d20706f72747469746f722c20656765742070756c7669006e6172206c6f72656d206d6178696d75732e205574206163206e6571756520006c6f72656d2e204e756c6c612061206c6f72656d2065676574206c656f206d006f6c6c6973206469676e697373696d2e20566573746962756c756d20696d70006572646965742073656d706572206c65637475732e204e756c6c6120657420006469616d206574206e756c6c61206f726e61726520736f6c6c69636974756400696e2e2050726f696e206120746f72746f7220636f6d6d6f646f2c20766568006963756c61206a7573746f2061742c2074696e636964756e74207361706965006e2e2043757261626974757220657569736d6f642076697665727261207268006f6e6375732e204e756e6320766172697573206f726369206e6563206d617300736120766976657272612c2065676574206c7563747573206c616375732075006c7472696365732e204375726162697475722063757273757320656c69742000646f6c6f722e20467573636520616c6971756574206f726e6172652065726f00732c20612067726176696461206578206d616c6573756164612076656c2e20004e616d206163206d61676e6120636f6e7365717561742c2076617269757320006d61757269732065752c206665726d656e74756d206c696265726f2e0a0a500072616573656e7420657420646f6c6f722074656d706f72206475692074696e00636964756e742064696374756d2e2050656c6c656e746573717565206d617800696d757320697073756d20657520656765737461732074656d7075732e2046007573636520616c697175616d20696d7065726469657420616e74652065742000626c616e6469742e204d61757269732068656e647265726974206c6f626f7200746973206c616f726565742e2041656e65616e20706f72746120766f6c75740070617420697073756d2c206120736f6c6c696369747564696e20617263752000756c6c616d636f72706572206e6f6e2e205365642076617269757320706c6100636572617420656e696d206575207072657469756d2e20496e206a7573746f0020617263752c20656c656d656e74756d20757420616c69717565742065752c00206c616f72656574206964206c656f2e20496e7465676572207365642061720063752061206469616d206c75637475732072686f6e6375732e20557420656700657420636f6e677565206d657475732c2069642072757472756d206c6563740075732e0a0a4d6f726269207665686963756c6120616363756d73616e206e6900736c2c20617420706f727461206c616375732066617563696275732065676500742e2053757370656e64697373652076756c707574617465206d69206e6f6e0020766f6c757470617420666575676961742e2051756973717565206469637400756d20706f72747469746f72206f64696f2073697420616d657420636f6e670075652e2041656e65616e20657569736d6f64207072657469756d20656c69740020706f72747469746f722066696e696275732e204d616563656e617320736500642076756c7075746174652072697375732e2041656e65616e2065726f732000656e696d2c2076656e656e6174697320696420636f6e73657175617420612c002072686f6e637573206f726e6172652073656d2e20517569737175652062690062656e64756d20766f6c757470617420616e74652c20616320706f7375657200652073617069656e207375736369706974206566666963697475722e204e75006c6c61206f726e617265206e696268206163206d61757269732076756c707500746174652c206e6f6e207068617265747261206469616d2076697665727261002e20436c61737320617074656e742074616369746920736f63696f73717520006164206c69746f726120746f727175656e742070657220636f6e7562696120006e6f737472612c2070657220696e636570746f732068696d656e61656f732e002050726f696e20617420766573746962756c756d2076656c69742e205365640020766976657272612076656e656e61746973206d692c207574206d616c65730075616461206e756c6c612e2044756973207068617265747261206964206e6900626820617420636f6e6775652e20536564206c6163696e69612065726f73200061206572617420766976657272612c20612074696e636964756e742061756700756520616363756d73616e2e2050656c6c656e746573717565206c6f626f720074697320616363756d73616e2073656d2c2065676574206d616c65737561640061206e756c6c61206665726d656e74756d2073697420616d65742e20496e2000616363756d73616e206c616f72656574206e69736c2076697461652066657500676961742e20416c697175616d206572617420766f6c75747061742e0a0a440075697320696420616e7465206c6967756c612e2050686173656c6c75732073006167697474697320706c61636572617420706f73756572652e204d61656365006e61732076697461652076697665727261206c616375732c206d6f6c6c697300206d616c657375616461206c65637475732e2050656c6c656e7465737175650020696e20657374206c6163696e69612c20656c656d656e74756d206e756e630020656765742c2070656c6c656e746573717565206a7573746f2e20517569730071756520636f6e67756520747572706973206e6f6e206f64696f20626c616e00646974207361676974746973206772617669646120657420697073756d2e20004e756c6c616d206c6f626f72746973206e6571756520616320656c69742063006f6e76616c6c697320616363756d73616e2073697420616d65742070756c7600696e6172206d617373612e20446f6e656320657520636f6d6d6f646f20616e0074652c2073697420616d657420756c6c616d636f7270657220646f6c6f722e002044756973206d6175726973206c6967756c612c20656c656d656e74756d200061742066617563696275732061632c20616c697175616d20696e2066656c6900732e205072616573656e74206c6f626f727469732065782073697420616d650074206e69736c20756c74726963696573206c6163696e69612e20566976616d00757320617563746f722c2073656d207175697320766573746962756c756d20007363656c657269737175652c2073617069656e206e69736c2072757472756d00206c696265726f2c2073697420616d657420696e74657264756d206e69736c00206a7573746f207669746165206c65637475732e20566976616d757320696d0070657264696574206e756c6c6120657520657261742076656e656e61746973002c20736564206d6f6c657374696520646f6c6f72207665686963756c612e2000517569737175652076656c2061726375207365642073656d2073656d70657200206375727375732e2050656c6c656e746573717565206d617474697320656c00656966656e64207269737573206574206d6f6c6c69732e205574206c6f626f00727469732c2065737420736564206665726d656e74756d2073656d7065722c002075726e612072697375732064617069627573206475692c20612074656d70007573206d6175726973206e69736c206174206469616d2e20566976616d757300206469676e697373696d20666163696c6973697320636f6e7365637465747500722e20496e20706f737565726520736f6c6c696369747564696e20656c656d00656e74756d2e0a0a457469616d20697073756d206573742c206d616c65737500616461206120666575676961742073697420616d65742c206d6f6c65737469006520656765742066656c69732e2041656e65616e2074656d70757320667269006e67696c6c61206469616d20696e20616c697175616d2e20446f6e6563207300697420616d65742072757472756d206469616d2e2050686173656c6c75732000756c6c616d636f72706572206d617474697320616363756d73616e2e205375007370656e646973736520616c6971756574207669746165206e6973692061630020766f6c75747061742e2050726f696e207075727573206d61757269732c2000696d706572646965742073697420616d657420647569206e6f6e2c20766568006963756c6120637572737573206f7263692e20446f6e65632065742074656c006c7573206574206d6574757320766573746962756c756d20656c656d656e7400756d206163206d6f6c6c6973206a7573746f2e2050656c6c656e74657371750065206c6967756c61206e69736c2c20616c697175616d206163206c6967756c006120706f73756572652c20656c656d656e74756d2068656e64726572697420006d61757269732e204d617572697320666163696c697369732066656c69732000696e2072757472756d20696163756c69732e204e756e632066657567696174002073656d20612068656e6472657269742072757472756d2e20496e746567650072206d6f6c65737469652064696374756d2066696e696275732e2041656e6500616e206e656320766f6c7574706174206c6967756c612e205175697371756500206d617373612070757275732c20706861726574726120757420696163756c006973207365642c20706f72747469746f7220616320616e74652e20416c69710075616d206d6173736120656e696d2c2076756c707574617465206e6563206d00692069642c20756c6c616d636f72706572206665756769617420747572706900732e0a0a4e756e63207669766572726120647569206c6f72656d2c207369740020616d657420656666696369747572206d65747573207375736369706974200076656c2e20566573746962756c756d2073697420616d657420706f7274746900746f722065782e205574206d616c657375616461206c6563747573206e656300206d65747573206672696e67696c6c612c206e65632073656d706572207572006e61206d616c6573756164612e20557420756c6c616d636f72706572206e69007369206174206e69736c20696d706572646965742070756c76696e61722e2000566573746962756c756d2065726f7320646f6c6f722c20766f6c757470617400206964206f64696f2069642c2074656d70757320636f6e76616c6c6973207200697375732e2043726173206575206661756369627573206c696265726f2e200050656c6c656e74657371756520696163756c697320766573746962756c756d0020646f6c6f72206964206566666963697475722e2046757363652061206e75006e6320717569732075726e61206469676e697373696d20646170696275732e002050726f696e2076656c20696163756c69732073656d2c20617420636f6e7600616c6c6973206475692e20496e2069642066656c69732074656c6c75732e2000446f6e6563207068617265747261206d6f6c657374696520617263752c206100206d616c6573756164612065737420677261766964612069642e0a0a517569007371756520616c6971756574206c6967756c61207574206f72636920706f7300756572652c207365642074696e636964756e74206d61676e6120756c74726900636965732e204d616563656e61732073697420616d657420756c6c616d636f0072706572207475727069732e20536564206e6563206d6f6c657374696520710075616d2e20566976616d7573206d617474697320636f6e64696d656e74756d00206f7263692c206e6f6e206375727375732066656c69732074656d707573200065752e2053656420656765742072697375732075726e612e20566976616d750073206f726e61726520756c6c616d636f72706572206172637520616320616c0069717565742e205072616573656e74206d616c6573756164612070756c7669006e6172206c65637475732c2073697420616d65742064696374756d20726973007573206d616c6573756164612061742e204e756c6c612061206d616c65737500616461206c65637475732c2065676573746173206d616c657375616461206600656c69732e20496e20696420696e74657264756d206e756e632e20496e74650067657220666163696c69736973206469676e697373696d20616e74652071750069732070686172657472612e0a0a446f6e65632070656c6c656e7465737175006520656e696d20766974616520616e746520756c7472696365732c2061742000657569736d6f64206d617373612066696e696275732e20517569737175652000636f6e67756520756c7472696369657320706f72747469746f722e204375720061626974757220756c7472696369657320626c616e64697420637572737573002e204675736365206567657420647569206375727375732c2070686172657400726120617263752076656c2c20706c6163657261742070757275732e204372006173206e6563206d6175726973206c656f2e204e616d207072657469756d20007072657469756d20766f6c75747061742e2050686173656c6c7573206e65710075652074656c6c75732c206672696e67696c6c612073697420616d65742066006163696c6973697320717569732c20616363756d73616e207363656c65726900737175652073656d2e204e756e632076697461652066656c69732073656420006d6173736120756c747269636965732064617069627573206e6f6e2065752000656e696d2e20496e20706f72747469746f722074656d706f72206e69736c2c00206567657420666163696c697369732075726e612066696e69627573207669007461652e205365642070656c6c656e746573717565206e656320747572706900732075742073656d7065722e205072616573656e74206566666963697475720020656c656966656e64206f64696f2e0a0a4e756c6c6120617563746f722063006f6e64696d656e74756d206e756c6c612e204d616563656e6173206d616c65007375616461206d61757269732061206c6967756c6120756c7472696365732000636f6d6d6f646f2065742076656c206469616d2e2053757370656e64697373006520696e74657264756d2074696e636964756e74206c6967756c612c20612000626962656e64756d206d6920696163756c697320612e20536564206d616c65007375616461206d657475732076656c206c696265726f206469676e69737369006d2c2073697420616d657420636f6e677565207175616d2074696e63696475006e742e204375726162697475722066696e696275732074696e636964756e74002073616769747469732e20517569737175652073617069656e20656e696d2c0020736f64616c6573206163206469616d20612c206469676e697373696d206c006163696e69612074656c6c75732e20446f6e65632065666669636974757220006c616375732072686f6e637573206672696e67696c6c6120636f6d6d6f646f002e20496e20696420656c69742076656c206c6f72656d20736167697474697300206f726e6172652e204372617320757420646f6c6f72206c6967756c612e200053656420656c656966656e64206c6563747573207661726975732066696e69006275732072757472756d2e204675736365206e65632061756775652061206a007573746f207661726975732074656d706f7220736564207669746165206c6f0072656d2e204d6175726973206174206c696265726f20696e2065737420637500727375732064696374756d2075742076697461652065726f732e205068617300656c6c75732072757472756d2c206c656374757320766974616520696e7465007264756d20626c616e6469742c206c6f72656d2075726e61207669766572720061206d617373612c2071756973207363656c657269737175652066656c697300206c6563747573206574206f64696f2e204d617572697320666163696c6973006973206c656f207475727069732c20696d70657264696574206665756769610074206475692074656d706f722073697420616d65742e0a0a4d616563656e6100732061206c656f2061756775652e20437572616269747572206e6f6e2069700073756d2073697420616d657420656c6974206c616f726565742076656e656e00617469732065676574206e6f6e206d61676e612e204375726162697475722000616c697175616d20696163756c697320706f72747469746f722e2053656420006163206c6f72656d206120646f6c6f7220616c6971756574206c7563747573002e2050726f696e206c6163696e696120697073756d20616e74652c207369740020616d657420696d70657264696574206c6563747573206469676e69737369006d20656765742e20566573746962756c756d20656666696369747572207369007420616d65742073656d207175697320736f64616c65732e20566976616d7500732070756c76696e6172207068617265747261206e69736c2076697461652000616363756d73616e2e204475697320696e74657264756d20636f6e67756520007661726975732e20446f6e65632061207361676974746973206e6973692c20007175697320656c656d656e74756d206475692e20536564206c756374757320006c616f72656574206c656f206567657420756c7472696365732e0a0a446f6e006563206120617567756520656765737461732c2076756c70757461746520650073742076656c2c206c616f72656574206c616375732e20416c697175616d2000646f6c6f7220646f6c6f722c20706c61636572617420696e2065676573746100732073697420616d65742c20616c69717565742061206f7263692e20496e200076756c70757461746520626c616e64697420656c69742c2068656e6472657200697420636f6d6d6f646f2075726e6120626962656e64756d2065752e2045740069616d20617567756520616e74652c206d6f6c65737469652071756973206f0064696f2065752c2074656d70757320636f6d6d6f646f206e6962682e20557400206d6174746973206c6163696e69612073617069656e2075742064617069620075732e20457469616d20636f6e736571756174206e6f6e206f64696f207175006973206375727375732e204e756e6320616c697175657420626962656e6475006d20646f6c6f722065752073656d7065722e20566976616d7573206163206d00692073697420616d65742061726375206c6163696e69612072757472756d200073697420616d65742061206e756c6c612e2050686173656c6c75732065726100742072697375732c206c75637475732065676574206c6f72656d207669746100652c206d616c65737561646120626962656e64756d206d657475732e204e61006d206964206d617474697320656e696d2c206665756769617420736167697400746973206d657475732e2050686173656c6c7573206c7563747573207475720070697320657261742c20657420766172697573206d61676e612072686f6e630075732069642e0a0a4372617320766172697573207361676974746973206f6400696f20757420677261766964612e20536564206f726e61726520706f727461002076756c7075746174652e20496e746567657220706f7375657265206172630075206c6f72656d2c206964207363656c657269737175652073656d206566660069636974757220612e205365642076656c20617563746f7220697073756d2e002050656c6c656e7465737175652069642065726f73206574206c6f72656d2000616363756d73616e20616363756d73616e206567657420717569732065726f00732e204e756e632063757273757320636f6e64696d656e74756d206d692c20006e65632066617563696275732070757275732070756c76696e6172207068610072657472612e205365642073656420736f64616c6573206e756e632e204675007363652070756c76696e617220756c747269636573206d692c206964207275007472756d206d69206672696e67696c6c612061632e2053656420697073756d00207175616d2c20756c74726963696573207669746165206c6163696e6961200076697461652c206665726d656e74756d206e6f6e206d61757269732e20507200616573656e74206461706962757320756c6c616d636f72706572206c696775006c612c206567657420756c6c616d636f727065722073656d2064617069627500732065752e2046757363652073697420616d657420766573746962756c756d00206c616375732e205072616573656e74207365642074726973746971756520006c616375732c2076656c2070756c76696e6172206573742e0a0a467573636500206e6563206e6571756520646f6c6f722e20566573746962756c756d20616c00697175616d206c6967756c612075742064696374756d2073656d7065722e2000457469616d206d616c657375616461206d65747573206567657420656c69740020636f6e64696d656e74756d20636f6e7365717561742e2053757370656e64006973736520736167697474697320656e696d207175616d2c20696e20756c7400726963696573206c656f206461706962757320717569732e2050656c6c656e007465737175652063757273757320766172697573206e6973692c2076656c2000736167697474697320656c6974206d6178696d7573206e6f6e2e205375737000656e646973736520746f72746f72206f64696f2c207068617265747261207600656c206475692061632c20656c656d656e74756d2076756c707574617465200074656c6c75732e20416c697175616d20696420666163696c69736973206578002e2044756973206e6563206672696e67696c6c61206e69736c2e2046757363006520736564206672696e67696c6c612065782e204675736365207574206d610075726973206574207175616d207669766572726120696e74657264756d2061002061742065726f732e20416c697175616d20616363756d73616e2065726174002075742074656c6c7573206469676e697373696d20696163756c6973207365006420657420746f72746f722e2050726f696e20736564206175677565207369007420616d6574206d657475732072757472756d206772617669646120696e200076656c206e69736c2e20496e746567657220706f73756572652061726375200069642065726f73206665726d656e74756d2074656d706f722e0a0a55742075006c74726963657320697073756d206f7263692e204d61757269732061756374006f72206d6178696d75732072697375732c20717569732066696e6962757320006e756c6c612065666669636974757220696e2e204e616d20756c74726963650073206e6571756520616320657820666163696c697369732c20696e2074656d00707573206c6967756c61206c6f626f727469732e204372617320706861726500747261206c6f72656d20696e74657264756d206e657175652068656e6472650072697420617563746f722e2050686173656c6c7573206e6f6e207275747275006d206c696265726f2c20617420736f64616c657320697073756d2e20496e2000756c6c616d636f72706572206578206c65637475732c2073697420616d657400207068617265747261206e756c6c6120636f6e76616c6c69732072686f6e630075732e2053757370656e6469737365206e6f6e20656c6974206c6f72656d2e00205072616573656e7420756c6c616d636f72706572206e756c6c612076656c0020637572737573206469676e697373696d2e2041656e65616e20736f64616c00657320746f72746f72206f64696f2c20617420656c656966656e64206c696700756c61206469676e697373696d2073697420616d65742e2044756973207665006c20736f6c6c696369747564696e2074656c6c75732e204d616563656e61730020717569732070656c6c656e746573717565206475692e204d6175726973200071756973207361676974746973206e756e632e20447569732072757472756d00206d616c657375616461206c6967756c612065752070756c76696e61722e0a000a41656e65616e206772617669646120706f727461207175616d20736564200070656c6c656e7465737175652e2050656c6c656e7465737175652076657374006962756c756d20626962656e64756d207472697374697175652e2056657374006962756c756d20696e206572617420656e696d2e2050726f696e2065726f7300206f7263692c2072686f6e63757320616320616c697175616d206e6f6e2c20007072657469756d2061206f7263692e20566573746962756c756d2074656d700075732c2076656c6974206d616c657375616461206c6163696e69612064617000696275732c2075726e61206c6f72656d206672696e67696c6c61206d61737300612c20696e206d6178696d757320656e696d20656e696d206574206e69736c002e204e616d207669766572726120636f6e64696d656e74756d206c6967756c006120696e20696d706572646965742e20536564207175697320656c656d656e0074756d206a7573746f2e204e756c6c61206f726e61726520636f6e73656374006574757220656e696d2061742074696e636964756e742e20457469616d207300697420616d6574206c616f7265657420697073756d2e0a0a457469616d2066006163696c697369732065737420706f72747469746f722c2066696e69627573002066656c69732065742c207375736369706974206c65637475732e2041656e0065616e20706c616365726174206567657374617320616c69717565742e204d00617572697320657420656e696d206c65637475732e204d616563656e6173200070656c6c656e746573717565206d6f6c6c6973206d692064696374756d2063006f6e6775652e205072616573656e742076656c2066656c6973206c616f72650065742c20636f6e7365637465747572206e756c6c61206e6f6e2c2066657567006961742074656c6c75732e2053656420616c697175616d2076656c697420730065642073656d20706c616365726174207361676974746973206174207369740020616d6574206c696265726f2e2051756973717565206d6174746973207275007472756d20656e696d2c2073656420656c656d656e74756d2076656c69742e002050686173656c6c7573206e6f6e206c616f72656574206f64696f2e204375007261626974757220656c656966656e64206f64696f2073697420616d65742000756c7472696369657320756c6c616d636f727065722e20496e20656765742000726973757320756c7472696365732c207665686963756c61206c65637475730020696e2c20616c6971756574207475727069732e0a0a50686173656c6c757300206e6f6e206d6574757320617563746f722c20636f6e736563746574757220006e69736c2061742c207361676974746973207175616d2e205072616573656e007420746f72746f722074656c6c75732c2074656d706f72206e6f6e207068610072657472612069642c207661726975732061742070757275732e2053656420006120636f6e64696d656e74756d206e6962682e205072616573656e74206c65006f206e756e632c20756c6c616d636f72706572207665686963756c612076650073746962756c756d2074696e636964756e742c206665726d656e74756d2075007420616e74652e20496e206f726e617265206c61637573206e6f6e206c69620065726f20736f6c6c696369747564696e2c2065752066657567696174206e75006c6c6120626c616e6469742e2050656c6c656e74657371756520686162697400616e74206d6f726269207472697374697175652073656e656374757320657400206e65747573206574206d616c6573756164612066616d6573206163207475007270697320656765737461732e204e756e632065676574206e756e63207369007420616d6574206d617572697320706861726574726120766573746962756c00756d20657520766974616520656e696d2e20496e20766f6c7574706174207300617069656e2065676574206c65637475732074696e636964756e7420766f6c0075747061742e20416c697175616d2073656420766976657272612075726e61002e204675736365206c6563747573206d657475732c20756c747269636573200076656c20657569736d6f642065742c20616c69717565742073656420746f7200746f722e2050686173656c6c757320626c616e6469742070656c6c656e7465007371756520756c747269636965732e204f72636920766172697573206e6174006f7175652070656e617469627573206574206d61676e697320646973207061007274757269656e74206d6f6e7465732c206e6173636574757220726964696300756c7573206d75732e204e756c6c61206469676e697373696d2c2076656c690074207175697320666163696c697369732072686f6e6375732c206e756c6c61002066656c697320747269737469717565206d61757269732c20657520636f6d006d6f646f206c656f206f726369206174206e6973692e20467573636520636f006e736563746574757220746f72746f7220657420706861726574726120766500686963756c612e204e756e63207665686963756c612c206d65747573207369007420616d657420657569736d6f642064696374756d2c20646f6c6f72206d650074757320616363756d73616e206573742c20696e20696163756c6973206d6100737361206c696265726f206e6f6e206c65637475732e0a0a496e2061742063006f6e736571756174207475727069732e204675736365206d69206e756c6c61002c206672696e67696c6c61207574207661726975732076697461652c2074720069737469717565206174206e6973692e204e756c6c61206964206d69206572006f732e204d6f726269206469616d20616e74652c2076656e656e617469732000696e2073757363697069742076656c2c2074696e636964756e7420766974610065206f64696f2e204d61757269732068656e647265726974206e6f6e20617200637520696420636f6e73656374657475722e205072616573656e7420616c69007175616d206e756e632076656c206d61676e61207665686963756c6120616c0069717565742e204e616d20636f6e7365637465747572206e756c6c612071750069732075726e6120696163756c697320756c6c616d636f727065722070656c006c656e74657371756520657420617263752e20496e7465676572206163206c00616f726565742076656c69742e2050656c6c656e7465737175652075742061006e7465207175616d2e20566976616d75732061206d6174746973206c656f2c002069642074656d707573206d692e204675736365207363656c657269737175006520646170696275732070757275732073656420616c697175616d2e0a0a4600757363652076656c20656e696d2070656c6c656e7465737175652c20656c65006d656e74756d206469616d2065752c2076756c7075746174652076656c6974002e204e756e63206c696265726f2074656c6c75732c20656c656d656e74756d00206964207175616d2073697420616d65742c20617563746f7220706f7274740069746f722070757275732e204c6f72656d20697073756d20646f6c6f72207300697420616d65742c20636f6e73656374657475722061646970697363696e670020656c69742e20457469616d206d6f6c6573746965206e756e6320736f6461006c657320636f6d6d6f646f20696163756c69732e204e616d20717569732065006c69742061206c696265726f20616c697175657420636f6e64696d656e7475006d207669746165206163206d692e20457469616d20756c7472696365732075006c74726963696573206d61676e6120766974616520706f73756572652e2056006976616d757320757420657569736d6f642076656c69742e20437261732073006f64616c6573206c6163696e6961206d61676e612c2071756973206665726d00656e74756d20657261742064696374756d2073697420616d65742e204675730063652074696e636964756e74206c696265726f206574206e657175652074720069737469717565206375727375732e204372617320616320646f6c6f72206c006967756c612e2050726f696e206567657420696d70657264696574206d6175007269732e20416c697175616d206469616d20646f6c6f722c20666163696c69007369732076656c206e69626820656765742c20636f6e7365717561742076650073746962756c756d206c696265726f2e204375726162697475722076756c700075746174652066617563696275732061756775652065676574207375736369007069742e204e756e632074696e636964756e742074656c6c7573207574206d006f6c6c6973206d6178696d75732e2050726f696e20766573746962756c756d00206c616f726565742073617069656e2c206e6563206672696e67696c6c6120006e6973692074656d70757320696e2e0a0a566573746962756c756d20616e74006520697073756d207072696d697320696e206661756369627573206f72636900206c756374757320657420756c74726963657320706f73756572652063756200696c69612063757261653b20566573746962756c756d20666163696c69736900732c20707572757320657520706f7375657265206c6163696e69612c2070750072757320657374206c616f72656574206e69736c2c206e656320766f6c75740070617420616e746520657261742076697665727261206e756c6c612e204e75006c6c6120666163696c6973692e20496e206e656320706f727461206d65747500732e20446f6e656320666163696c6973697320646f6c6f722073697420616d006574206f64696f20616c697175616d2c206567657420706f72747469746f720020697073756d2076756c7075746174652e204d61757269732076656e656e6100746973206d61676e61206575206578206f726e6172652c20696420736f6c6c00696369747564696e20616e746520636f6e6775652e2050656c6c656e746573007175652075726e61206f7263692c20756c747269636965732076697461652000706f73756572652075742c20756c74726963657320717569732074656c6c7500732e20536564206e6f6e20656c656966656e64206d692c20657520747269730074697175652073656d2e2041656e65616e2074656d707573206d61737361200065752067726176696461206d616c6573756164612e2050726f696e206e6563002076756c707574617465206e756e632e204e756e63206d616c657375616461002c206469616d206e6f6e20636f6d6d6f646f2064696374756d2c207175616d00206e69736c2074696e636964756e74206c616375732c2073697420616d6574002066657567696174206c6f72656d206e756c6c61206e656320697073756d2e000a0a4d617572697320736564206d6574757320617420646f6c6f7220636f6e0064696d656e74756d20636f6e73657175617420616363756d73616e2061632000646f6c6f722e2053757370656e6469737365206c756374757320626c616e640069742065782c20617420656c656d656e74756d206d692064696374756d206500752e20416c697175616d2074696e636964756e7420656c656d656e74756d20006d61676e6120766974616520616c69717565742e20446f6e656320696e206f00726e617265206d61757269732e20496e206c6163696e69612073697420616d006574206e756c6c61207669746165206665726d656e74756d2e20446f6e656300206e6563206665726d656e74756d2075726e612c206174206672696e67696c006c612076656c69742e20416c697175616d206572617420766f6c7574706174002e20566573746962756c756d2073656420747572706973206e657175652e2000496e74656765722076656c207375736369706974207475727069732e2053650064206e656320636f6e64696d656e74756d206e657175652e2041656e65616e0020636f6e76616c6c697320766f6c757470617420706f73756572652e205068006173656c6c7573206c6f626f72746973206c6967756c612076656c2072686f006e637573206c616f726565742e2041656e65616e2065676574206573742069006163756c69732c2076656e656e61746973206f64696f2075742c206469637400756d2074656c6c75732e2044756973207669746165206572617420766974610065206e69736920637572737573206d61747469732e204e756e6320626c616e006469742070656c6c656e7465737175652072697375732c206c7563747573200074696e636964756e74206d61676e6120706f7274612061632e204372617320007669766572726120616c697175657420706f73756572652e0a0a4c6f72656d0020697073756d20646f6c6f722073697420616d65742c20636f6e7365637465007475722061646970697363696e6720656c69742e204e756c6c616d20657520006c61637573206c65637475732e20467573636520612074656c6c7573206c61006375732e20496e74657264756d206574206d616c6573756164612066616d65007320616320616e746520697073756d207072696d697320696e206661756369006275732e204e756c6c616d2070656c6c656e746573717565206c6f72656d20007175616d2c2076656c2074656d706f7220746f72746f72207072657469756d002076697461652e20566573746962756c756d20736f6c6c696369747564696e002071756973206d692061632072757472756d2e20496e746567657220646967006e697373696d206c696265726f20616c697175616d206672696e67696c6c610020616363756d73616e2e20446f6e656320666163696c697369732064756920006e6f6e206c656f2074656d707573206c75637475732e20536564206d616c65007375616461207665686963756c6120756c7472696365732e20557420616e74006520616e74652c20616c69717565742073697420616d657420736f6c6c69630069747564696e2066696e696275732c20626c616e64697420756c747269636500732061756775652e20536564206e6563206e69736920717569732076656c69007420636f6e64696d656e74756d20677261766964612e2041656e65616e2061006c697175657420657569736d6f64206475692c207574207665686963756c610020697073756d2066617563696275732065752e0a0a46757363652076656c6900742073617069656e2c2073656d706572206574206469676e697373696d207600656c2c20696163756c69732069642076656c69742e205072616573656e7420006e6f6e206e69736c206567657420616e746520736f6c6c696369747564696e002072757472756d206e6563206e6563206573742e205365642076697665727200612066656c6973206e69736c2c206e65632065676573746173206573742073006f64616c65732065742e204e616d20636f6e67756520617567756520737573006369706974206578206c616f7265657420706f72747469746f722e2046757300636520626962656e64756d20697073756d206e657175652c206163206d617800696d757320646f6c6f72206672696e67696c6c612075742e2043757261626900747572206120636f6e736571756174206c6967756c612e204e616d20766f6c00757470617420636f6e736571756174206c696265726f20657520626c616e640069742e204e616d20696e74657264756d2074656c6c7573207574206f64696f0020636f6e736571756174206f726e6172652e204e756c6c6120666163696c690073692e204d616563656e6173206c756374757320616e74652065676574206f0064696f20636f6e64696d656e74756d206672696e67696c6c612e20496e7465006765722065676574206d61676e612073697420616d6574206d61676e6120660065726d656e74756d20677261766964612e0a0a4d6f72626920736f64616c6500732076656c6974206e6973692c2061206d6178696d75732064756920656c65006966656e64206e6f6e2e204d61757269732070757275732065726f732c2061007563746f722075742066696e6962757320656765742c20756c7472696369650073207175697320657261742e2041656e65616e207361676974746973207475007270697320696e206f72636920706f7274612c20696420706861726574726100206578206566666963697475722e20467573636520617420636f6e6775652000657261742e20566573746962756c756d206c756374757320656e696d20666500726d656e74756d206c656f2064696374756d207472697374697175652e2044006f6e6563206e65632066656c69732073697420616d65742064756920706f7200747469746f7220656c656d656e74756d2e205072616573656e74206c616f72006565742c2066656c6973207669746165207472697374697175652062696265006e64756d2c206c6f72656d206e6962682070656c6c656e746573717565207300617069656e2c20736564207363656c65726973717565206c6f72656d206e690062682076656c2073656d2e204675736365206e6f6e2076656e656e6174697300206e657175652e20446f6e6563207363656c65726973717565206469676e69007373696d20726973757320696420706f7274612e0a0a53757370656e6469730073652072686f6e637573206c696265726f2076656c2066656c6973206c616300696e69612074656d7075732e2046757363652064696374756d206e657175650020736564206e69626820677261766964612c20626962656e64756d206c6f62006f727469732075726e6120616c69717565742e204375726162697475722065007420657569736d6f6420656e696d2e2050656c6c656e74657371756520696d0070657264696574206175677565206c6f72656d2c2075742068656e64726572006974206e657175652073656d7065722076656c2e2050686173656c6c75732000636f6d6d6f646f20647569206e6f6e206c6f626f727469732076656e656e61007469732e20437261732076697665727261207361676974746973206e69736c002c207669746165206c6f626f72746973206d6574757320756c747269636965007320696e2e20416c697175616d207669746165206469676e697373696d207000757275732c206661756369627573207072657469756d2072697375732e20500072616573656e74206163206d61676e6120617563746f722c206d616c65737500616461206e756c6c61206c6f626f727469732c20636f6d6d6f646f20647569002e205072616573656e7420617420746f72746f7220697073756d2e204675730063652074656d7075732c2066656c697320696e20616363756d73616e206661007563696275732c206c696265726f20656e696d206d6f6c6c697320656e696d002c20696420656c656d656e74756d206d657475732070757275732061206d6100676e612e204375726162697475722073697420616d657420636f6e64696d65006e74756d2075726e612e20496e2075726e612066656c69732c20636f6e6469006d656e74756d207669746165206e756c6c612065752c20706f73756572652000636f6e64696d656e74756d206e6962682e2050656c6c656e746573717565200067726176696461206f64696f20656c69742c2076656c20616c69717565742000726973757320636f6e7365637465747572206e6f6e2e204d616563656e6173002074656d706f722c206d61676e6120616320706861726574726120616c69710075616d2c20616e7465206c6967756c612066657567696174207175616d2c20006575206d6174746973206e756c6c61206e69736c206e6f6e206d617373612e000a0a496e746567657220756c74726963657320736f64616c6573206a757374006f2e20416c697175616d20626962656e64756d207068617265747261207269007375732c2061632076697665727261206e69736920616363756d73616e207500742e20457469616d2067726176696461206665726d656e74756d206d692069006e207363656c657269737175652e20467573636520696e74657264756d2c20006c656f207175697320626962656e64756d206d61747469732c206a7573746f00206d65747573206672696e67696c6c6120656c69742c20616320706c6163650072617420747572706973206469616d206661756369627573206e69736c2e2000457469616d206c616f72656574206c696265726f206c6f72656d2c2076656c002074656d707573206f64696f206469676e697373696d2065742e204e756c6c006120666163696c6973692e20496e74656765722064617069627573206d6f6c00657374696520656e696d2c2061632074696e636964756e742073617069656e0020636f6e76616c6c69732075742e2043726173206d6f6c6c697320636f6e73006563746574757220666163696c697369732e2043757261626974757220747200697374697175652c20726973757320706f72747469746f722076756c7075740061746520756c7472696365732c206c6f72656d2073656d206469676e69737300696d206e657175652c20657520706f72747469746f72206d61676e61206e69007369207669746165207475727069732e20446f6e656320636f6e7365717561007420657374206575206469616d20666575676961742c2076656c2076657374006962756c756d206469616d206c6163696e69612e20457469616d20756c74720069636573206c65637475732073697420616d6574206f726369207361676974007469732c2076656c20616c69717565742065726f73206c6163696e69612e2000496e74656765722070686172657472612c206172637520657520626c616e640069742064696374756d2c2076656c6974206f64696f20636f6d6d6f646f206f0064696f2c20757420636f6e7365717561742074656c6c7573207175616d206e006563206a7573746f2e2053656420656666696369747572207365642066656c0069732061206d6178696d75732e204e756c6c616d20656c656966656e6420730063656c65726973717565206c6f72656d2c20696e206d6f6c65737469652074006f72746f72206d616c6573756164612076697461652e20457469616d20636f006e64696d656e74756d2c20617567756520657420696163756c69732064617000696275732c206469616d206172637520706f72747469746f722075726e612c0020616320636f6e76616c6c6973206d61676e61206175677565207365642064006f6c6f722e2050686173656c6c75732076656c206f64696f2070757275732e000a0a457469616d20656c656966656e64206469676e697373696d206e697369002066657567696174206c6163696e69612e2051756973717565206574206c6100637573207669746165206172637520706f73756572652074656d7075732e20004e616d20636f6e73657175617420657820696e206172637520756c747269630065732c2076656c2076656e656e61746973206e756e63206672696e67696c6c00612e20496e7465676572206575206a7573746f206964206e6962682062696200656e64756d2072757472756d2e20457469616d207363656c657269737175650020747572706973206c656f2c2061632074696e636964756e74207175616d200064696374756d2065752e204475697320636f6e73657175617420636f6e67750065206a7573746f2c206469676e697373696d20626962656e64756d207361700069656e20656c656966656e6420656765742e204d616563656e617320646967006e697373696d206d6173736120757420626c616e646974206c6163696e6961002e2050726f696e2066657567696174206e756e6320736564206c6f72656d2000616c697175616d2070756c76696e61722e20416c697175616d207661726975007320616e7465207365642073617069656e206469676e697373696d2c206574002064696374756d2073617069656e20696e74657264756d2e2041656e65616e00206574206c656f2061756775652e2053656420756c74726963696573207469006e636964756e742065726f732c2073656420706f727461206d6175726973200066696e69627573206e65632e0a0a53757370656e6469737365206e6563206c006f72656d206c696265726f2e204d616563656e6173206e6563206c6967756c0061206e6f6e20657820626c616e6469742073757363697069742e2050656c6c00656e746573717565206c616375732072697375732c206f726e6172652061200063757273757320656765742c2074656d706f72207669746165206e69736c2e00204375726162697475722072757472756d20766f6c757470617420657820610020706c6163657261742e204d6f726269206d616c6573756164612074656c6c0075732065752061726375206d6f6c6573746965206d61747469732e2045746900616d207363656c6572697371756520636f6d6d6f646f2061756775652c20710075697320636f6d6d6f646f2076656c697420656c656966656e642069642e20004d617572697320617563746f72207669746165206d657475732071756973200076656e656e617469732e2050726f696e20626962656e64756d206661756369006275732074656c6c75732c20736f6c6c696369747564696e20696d7065726400696574206e69736920766f6c75747061742076656c2e20446f6e656320666100756369627573206d6f6c6573746965207175616d2c206574206672696e6769006c6c61206469616d2e0a0a446f6e656320696d706572646965742065726174002061206e6973692066696e696275732c207574206469676e697373696d206e0069736920666163696c697369732e204e756c6c6120696163756c697320757400207175616d20616c69717565742068656e6472657269742e2050656c6c656e0074657371756520757420656c656966656e64206e657175652e20446f6e656300206575206c6563747573206574206c656f20696e74657264756d2074696e63006964756e742e204e616d20756c74726963657320656c6974206e6973692c200065676574206d6178696d7573207269737573206672696e67696c6c612071750069732e205365642076656c206e69736920617420747572706973207275747200756d2074696e636964756e742e204e756c6c6120636f6e677565206572617400206c6f72656d2c207365642066696e69627573206c6163757320616c6971750065742065742e2050656c6c656e746573717565207574207175616d20696e20006f72636920736f64616c65732074656d706f72207574206575206e65717565002e2051756973717565206d616c65737561646120736167697474697320726900737573206e6f6e2076656e656e617469732e204e756e632066696e696275730020756c74726963696573206e69626820706f737565726520636f6e7365637400657475722e20496e7465676572206e6563206c6967756c61206e756e632e20005574206e6563206d617373612076656c206c6967756c612074726973746971007565206665726d656e74756d20696e2065752074656c6c75732e0a0a4d61750072697320736f64616c6573206469616d2069642066656c6973206c616f72650065742c207175697320736f6c6c696369747564696e2074757270697320756c006c616d636f727065722e204e756c6c6120636f6d6d6f646f2c207361706965006e20657420756c6c616d636f7270657220736f6c6c696369747564696e2c200073656d206c6563747573206672696e67696c6c61207175616d2c2061742070006c6163657261742065782065726f732075742073617069656e2e20496e206f0064696f206e6973692c207661726975732073697420616d657420646f6c6f72002076656c2c20756c74726963657320706c6163657261742074656c6c75732e0020557420646f6c6f72206d692c2073656d706572206e6f6e206d6178696d7500732076656c2c2070756c76696e61722061742066656c69732e20457469616d00207269737573206e756c6c612c20656666696369747572206174206c6f7265006d206c6f626f727469732c20706f72746120656c656966656e64206c6f7265006d2e20566976616d757320617420636f6e64696d656e74756d2065726f732e00204475697320657420696163756c6973206d692c20766974616520636f6e73006563746574757220617263752e20496e2065726f73206d61757269732c207400656d706f7220717569732070656c6c656e74657371756520696e2c207068610072657472612076656c206c65637475732e204d6f72626920706f7274612c20006c696265726f20617420736f64616c657320656c656966656e642c206c6163007573206c6f72656d20626962656e64756d206f64696f2c206e656320706f7200747469746f72206c65637475732074656c6c75732076656c2073656d2e204e00756c6c61207363656c657269737175652065742075726e61206575206469630074756d2e205574206f726e617265206d61747469732074656d7075732e2055007420626c616e646974206f64696f2061206d61737361206d6178696d75732c00206e6563206d616c657375616461206c696265726f2066617563696275732e000a0a5574206d6178696d757320756c7472696369657320747269737469717500652e20457469616d206163206469616d206174206e756c6c61206c75637475007320756c6c616d636f7270657220696e20657520656c69742e2053656420650074206d617373612076656c206e6962682072686f6e6375732074696e63696400756e742e2053656420636f6e677565207363656c657269737175652074656d007075732e205175697371756520766f6c7574706174206d61737361206c6f7200656d2c2076656c2072757472756d20656e696d20636f6e64696d656e74756d00206e65632e20416c697175616d2074757270697320646f6c6f722c2065666600696369747572207365642064696374756d20616c697175616d2c206d617474006973206964206c616375732e204d616563656e61732066657567696174206e006973692071756973206d6178696d757320636f6e76616c6c69732e0a0a536500642074696e636964756e74207574206a7573746f2076697461652066696e69006275732e204d617572697320626c616e6469742065726174206e756e632c2000766974616520616363756d73616e2061726375206672696e67696c6c612071007569732e2053656420756c7472696365732074696e636964756e7420646961006d2073697420616d657420626962656e64756d2e20416c697175616d20666100756369627573206c61637573206567657420766573746962756c756d206865006e6472657269742e204e756c6c616d20766172697573206e6563206e657175006520657420656c656966656e642e2053656420766974616520747572706973002065742074757270697320656c656966656e642074656d706f722e2050656c006c656e74657371756520766573746962756c756d206172637520612065756900736d6f64206d61747469732e205072616573656e74206e6563207269737573002073697420616d6574207475727069732064617069627573207375736369700069742e20446f6e656320626962656e64756d2074656d707573206d6920696e002072757472756d2e20566573746962756c756d206d61737361206d65747573002c20696d7065726469657420657520736f64616c657320717569732c2061630063756d73616e2076656e656e6174697320617263752e20496e206e6f6e2070006f7375657265206c696265726f2c2076656c2073757363697069742075726e00612e0a0a53757370656e64697373652073617069656e206d657475732c207000756c76696e6172206e6563206c61637573206d6f6c65737469652c20656765007374617320766573746962756c756d2065782e20566573746962756c756d200074656d706f7220616e7465206e6563206e756e632074696e636964756e742000666163696c697369732e20457469616d20626962656e64756d2c20616e74650020696e207072657469756d20636f6e6775652c206d61737361206c6f72656d00206c6f626f727469732065782c206e65632072686f6e63757320746f72746f0072206d61757269732061632070757275732e20496e2072686f6e637573207600756c707574617465206d61676e6120617420657569736d6f642e204d61656300656e61732076656c206c616f72656574206a7573746f2c20696e206c616369006e6961206f64696f2e2050656c6c656e74657371756520616c697175657420006c616375732061632076656e656e61746973206c75637475732e20496e7465007264756d206574206d616c6573756164612066616d657320616320616e74650020697073756d207072696d697320696e2066617563696275732e205175697300717565206c6163696e6961207072657469756d2075726e6120736f64616c650073206d6178696d75732e20496e7465676572206469676e697373696d20707200657469756d206d6f6c6c69732e20536564206c656374757320656c69742c2000616c697175616d2061206469616d2069642c20646170696275732076617269007573206c6967756c612e204d6f726269206c6163696e696120736f64616c650073206c6f72656d2c20696420616c697175616d206e69736c20706f73756572006520656765742e0a0a41656e65616e2070686172657472612c2074656c6c750073206163206469676e697373696d20656765737461732c206175677565206500737420656c656d656e74756d2066656c69732c2076656c206c6f626f7274690073206e69736920656e696d20636f6d6d6f646f207475727069732e205375730070656e6469737365206e756e63207475727069732c206c6f626f727469732000736564206d61757269732069642c20706f72746120736f6c6c69636974756400696e206a7573746f2e2050726f696e20656c656d656e74756d206d6175726900732073697420616d6574206f72636920696e74657264756d2074696e63696400756e742e2053656420706f7274612075726e612066656c69732c206964207600656e656e617469732073617069656e207363656c657269737175652065742e0020566976616d7573206461706962757320706f72747469746f72206a757374006f2c206964206d6f6c6573746965206e69736c20696163756c69732074696e00636964756e742e20496e206d6174746973206d61757269732073697420616d00657420636f6e76616c6c697320756c747269636965732e20446f6e65632063006f6d6d6f646f2065676573746173206572617420766974616520617563746f00722e204e756c6c616d2066657567696174206d61676e61206573742c2065740020706f72747469746f72206573742074656d706f722061632e20416c69717500616d20766172697573206d69206575206c61637573206d61747469732c207300697420616d6574207375736369706974206e69736920736f64616c65732e200041656e65616e2065742068656e6472657269742076656c69742c20696e2070006c616365726174206e6973692e20446f6e656320717569732076656c697420006d692e20457469616d20706c61636572617420657261742076656c2065726f0073206672696e67696c6c6120636f6d6d6f646f2e0a0a50686173656c6c757300207669746165206475692066656c69732e205072616573656e7420707265740069756d206d6174746973206e657175652c2065676574206672696e67696c6c00612066656c69732074656d706f722061742e204372617320617563746f7220006e69736c206e65632073656d206c6f626f72746973206d61747469732e205000656c6c656e746573717565206d61747469732074696e636964756e74207465006d7075732e2050726f696e206c616f726565742073656d206120766f6c7574007061742072686f6e6375732e204d6f726269206575206d6175726973207369007420616d65742072697375732074696e636964756e74206f726e6172652e200041656e65616e20756c6c616d636f72706572206c61637573206e6f6e206e75006e6320696d706572646965742c20657420656c656966656e642074656c6c75007320706c6163657261742e2043726173206574206d6920696e206469616d20006567657374617320706c616365726174206e6f6e2073697420616d6574206c0065637475732e20416c697175616d20696163756c6973207075727573206c6f00626f727469732c207363656c657269737175652065726f7320656765742c200076617269757320646f6c6f722e2043757261626974757220737573636970690074206e6571756520736564206567657374617320636f6e7365717561742e2000496e2076656c20616c697175616d206d657475732c206c756374757320636f006d6d6f646f206e6962682e2053656420636f6e7365717561742070756c7669006e6172206d692c20736167697474697320616c69717565742065726f73206d006178696d75732076756c7075746174652e2055742065742074656d70757320006c616375732e0a0a53757370656e646973736520706f74656e74692e2044750069732076656c2076756c707574617465206d61757269732c20757420736f6c006c696369747564696e206d692e20446f6e65632076656c20616c697175616d00206c6967756c612c20656765742072686f6e6375732074656c6c75732e20500072616573656e74206e65632065726f732076697461652065726f732076756c0070757461746520617563746f722e204e756e632073757363697069742c206d00617572697320696420696e74657264756d20756c6c616d636f727065722c2000746f72746f72206a7573746f20646170696275732073617069656e2c20766900746165206c6163696e6961206c656f2075726e612076697665727261206e690062682e205175697371756520626962656e64756d20617563746f722065726f00732c206964206d6174746973206d617373612064696374756d20612e20557400206964206d69206e69736c2e20566573746962756c756d206575206c756374007573206c616375732e20446f6e65632061206d6178696d75732066656c6973002e0a0a446f6e65632073656d206e69736c2c20756c7472696365732061207400656c6c75732075742c2070656c6c656e74657371756520666163696c6973690073206e756c6c612e205365642065742073617069656e2075742065726f732000636f6e64696d656e74756d20706f72747469746f722e204675736365207369007420616d6574206d657475732065782e20496e20612065782073697420616d0065742074656c6c75732070756c76696e617220636f6e73657175617420612000696420656e696d2e204d616563656e617320756c6c616d636f727065722073006f64616c6573207475727069732c207175697320756c6c616d636f72706572002065726f7320636f6e7365717561742065742e20496e746567657220736f6400616c6573206573742073697420616d657420616e74652074656d7075732c2000696420616c69717565742066656c69732072757472756d2e204c6f72656d2000697073756d20646f6c6f722073697420616d65742c20636f6e7365637465740075722061646970697363696e6720656c69742e204d616563656e61732069640020747572706973207669746165206573742076656e656e6174697320656c65006d656e74756d2e0a0a446f6e656320696163756c697320677261766964612000636f6e73656374657475722e20457469616d20657569736d6f642065726f7300206567657420766573746962756c756d206672696e67696c6c612e20496e2000706f7274612c206572617420766974616520656c656d656e74756d2067726100766964612c20747572706973206c6f72656d206d6f6c6573746965206e696200682c20696420706861726574726120746f72746f72206d65747573206c616300696e6961207475727069732e204d6175726973207072657469756d2076617200697573207475727069732c2065742063757273757320657820766976657272006120717569732e20536564206d616c657375616461206c656f206574206d61007373612074656d707573206c6163696e69612e204e756e632073697420616d00657420656e696d2073656d2e20446f6e65632076656c206772617669646120007175616d2c2076656e656e61746973207665686963756c6120657261742e0a000a496e206e6f6e206c61637573206d616c6573756164612c206d6178696d750073206e696268206e65632c20636f6e73656374657475722076656c69742e20004e756c6c61206575206772617669646120746f72746f722e2050686173656c006c757320696e74657264756d206665726d656e74756d207661726975732e20004d6f726269207661726975732076656c697420696e206c6163757320736365006c65726973717565206d616c6573756164612e2050686173656c6c75732073007573636970697420616c697175616d2065726f7320696e20747269737469710075652e20566573746962756c756d2061632075726e61206e756e632e204d610075726973207072657469756d20746f72746f72206469616d2c206120667269006e67696c6c61206c65637475732074656d7075732061632e0a0a4d6f7262690020696d70657264696574206d6f6c6c697320646f6c6f722c206e65632065660066696369747572207175616d20616c697175657420612e20566976616d757300206c75637475732070757275732076656c206e69736c20657569736d6f642000706f72747469746f722061632076697461652074656c6c75732e2043726173002073757363697069742074726973746971756520707572757320757420736300656c657269737175652e2050656c6c656e7465737175652073697420616d65007420656c6974206964206c696265726f206665726d656e74756d20736f6461006c65732e204e756c6c616d20636f6e76616c6c6973206c6967756c6120696e00207175616d207072657469756d2c20696420616c6971756574206e6962682000636f6e7365717561742e204e756c6c6120666163696c6973692e2041656e6500616e206f726369206c696265726f2c2068656e647265726974207574206c6f0072656d2076656c2c20706f72747469746f7220706f72747469746f72206c69006265726f2e20557420696420616363756d73616e206d617373612e20536564002073617069656e206c656f2c2074696e636964756e74207072657469756d200061756775652076697461652c207669766572726120766f6c7574706174207300617069656e2e204d6f726269206d6f6c6c6973206f7263692073656420756c0074726963657320636f6e64696d656e74756d2e204372617320616363756d7300616e20736167697474697320696d706572646965742e204e616d2074656d70006f7220766573746962756c756d207475727069732c20636f6e64696d656e7400756d2074656d706f72206f64696f20656c656d656e74756d2076656c2e2056006573746962756c756d20737573636970697420616e7465206120617263752000616363756d73616e2c2076656c20636f6e677565206d61757269732067726100766964612e0a0a50686173656c6c757320766f6c7574706174206d6175726900732065676574206c696265726f206c616f7265657420616c697175616d2e2000566573746962756c756d207269737573206e69736c2c2074656d7075732061007420766f6c75747061742076697461652c2074696e636964756e74207669740061652065726f732e20416c697175616d2076656e656e6174697320616e74650020626c616e64697420707572757320666575676961742c206120616c69717500616d20616e746520626962656e64756d2e2050726f696e20696e7465726475006d20697073756d206e6962682c2076656c20706f7274612066656c69732065007569736d6f642065742e20457469616d20717569732074656c6c757320646f006c6f722e2044756973206964206c616f72656574206f64696f2c20657420630075727375732072697375732e2053757370656e6469737365206c616f726565007420646f6c6f72206575206e756c6c6120666575676961742c20736564206600657567696174206e756c6c6120626c616e6469742e20416c697175616d2071007569732061726375207175697320617567756520756c7472696365732069610063756c69732e20446f6e65632069642065726f73206e6f6e206e6973692061006363756d73616e206f726e6172652076656c20757420657261742e205365640020636f6d6d6f646f206c756374757320616e746520717569732070756c7669006e61722e205072616573656e7420616c697175616d206d6f6c6c6973207075007275732072686f6e63757320636f6e7365717561742e2055742076697461650020636f6e6775652072697375732e20496e206d6f6c6c6973206120707572750073206964206c6163696e69612e0a0a467573636520616c697175616d206175006775652073697420616d6574206a7573746f2070656c6c656e746573717565002c20756c6c616d636f7270657220706f7274612064756920696163756c6973002e2050726f696e20656765737461732076756c707574617465206e69736c2c002076656c20637572737573206d6173736120706f72747469746f722061742e0020536564206e6f6e2074656c6c75732076656c206e756c6c6120626c616e6400697420666163696c697369732e204d616563656e6173206572617420656e69006d2c20736f64616c65732061206c6163696e69612076656c2c20616c697175006574207574206e756c6c612e20496e74656765722066656c69732061726375002c20736f64616c65732076656c2066617563696275732073697420616d6574002c20766573746962756c756d2065676574206c6f72656d2e204e756c6c61200076697665727261206f64696f206163206e756e63206c75637475732c2065750020706c6163657261742074656c6c757320616c697175616d2e204d6f72626900206e65632073656d20657520616e746520706f737565726520736f6c6c69630069747564696e2e204e756c6c6120616363756d73616e20636f6e7365637465007475722065737420766974616520756c747269636965732e20447569732066006163696c69736973207363656c65726973717565206d61757269732c206e6f006e20636f6e64696d656e74756d2064756920766f6c757470617420696e2e0a000a4d617572697320717569732066696e6962757320656e696d2e204e756e630020656765742065726f7320616c69717565742c206d6178696d7573206c6f7200656d206e6f6e2c2070656c6c656e746573717565206a7573746f2e204d6f720062692065676574206e756e6320696420726973757320657569736d6f642062006c616e6469742076656c20612072697375732e204d6175726973206120736f0064616c65732074656c6c75732e2043757261626974757220626c616e64697400206174206e756e63206174206566666963697475722e204475697320657520006c696265726f206e656320647569206d6174746973206d6178696d75732e200053656420636f6e7365717561742065726174206d61757269732c2075742070006f727461206c6563747573206665756769617420717569732e2056657374690062756c756d2076656c2074656c6c7573206e65632073617069656e20636f6e006775652076656e656e617469732e20446f6e656320706c6163657261742075006c747269636573206d692e204675736365206c7563747573206e6f6e206d610075726973206163206375727375732e204e756c6c612065676574206d61676e006120766974616520747572706973206d616c6573756164612076697665727200612e2050656c6c656e746573717565206174206c6563747573206964206d6100676e612064617069627573206d61747469732076697461652061207175616d002e0a0a496e206572617420657261742c20696d7065726469657420757420710075616d206e65632c20756c6c616d636f727065722072757472756d20747572007069732e204d6f72626920706c61636572617420656c6974206174206e697300692070656c6c656e74657371756520706c6163657261742e2050726f696e20007669766572726120736f6c6c696369747564696e206375727375732e204675007363652076656e656e6174697320626c616e646974206e69736c207365642000636f6e6775652e204675736365206d6f6c65737469652c2075726e61207665006c20636f6e76616c6c69732072686f6e6375732c20656c6974206d657475730020657569736d6f642065782c2071756973207665686963756c61206d6173730061207075727573206163206475692e2041656e65616e206e6f6e206c6163750073207665686963756c612c20656c656966656e6420656c697420736f64616c0065732c207661726975732073617069656e2e20536564206e756c6c61206a750073746f2c206665726d656e74756d20706f72747469746f722076697665727200612075742c20706f727461206567657420656e696d2e2050656c6c656e7465007371756520636f6e736563746574757220736167697474697320747572706900732c206174206375727375732064756920706f737565726520696e2e20517500697371756520612073757363697069742065726f732e20457469616d20616c0069717565742c20646f6c6f722061742064696374756d2072686f6e6375732c00206d692065737420756c6c616d636f727065722072697375732c2061207469006e636964756e742074757270697320746f72746f72206e6f6e206e6962682e002053656420636f6d6d6f646f206469616d206163206f72636920766f6c7574007061742c207669746165206c6f626f72746973206d61676e6120706f7375650072652e204475697320636f6d6d6f646f20656c697420696420657820766172006975732c206567657420706f737565726520697073756d20617563746f722e0020467573636520756c74726963696573206f64696f20657520636f6e6775650020616c69717565742e2055742071756973206573742070756c76696e61722c002076756c707574617465206c65637475732076756c7075746174652c20636f006e7365717561742073617069656e2e0a0a446f6e656320636f6e76616c6c690073206d61757269732074656d7075732076617269757320617563746f722e2000416c697175616d207472697374697175652064696374756d2070757275732c0020696420677261766964612075726e6120616c69717565742075742e2056690076616d75732065752076656e656e6174697320616e74652c206d6178696d7500732074696e636964756e74206f7263692e20557420617420616c697175616d00206c6f72656d2e20416c697175616d206e6f6e206c61637573206e756c6c61002e204d6f72626920766974616520656666696369747572206d617373612c200076697461652072686f6e63757320657261742e2041656e65616e206e6f6e2000657261742071756973206d617572697320657569736d6f6420626c616e646900742e205574207669746165206e756c6c612073697420616d65742074656c6c007573206567657374617320636f6e7365717561742e205574206c696265726f00206c65637475732c20626c616e6469742070756c76696e6172207375736369007069742065752c20636f6e7365637465747572207669746165207361706965006e2e2043757261626974757220706f727461206e756e632066656c69732c2000717569732070656c6c656e746573717565206c656f206469676e697373696d002061742e204d6f7262692076656c20696163756c6973206e6962682e20446f006e65632074696e636964756e742065737420657520696d706572646965742000706f72747469746f722e20566573746962756c756d20696e207475727069730020746f72746f722e0a0a50726f696e2076697461652061726375206e696268002e205072616573656e74206573742073617069656e2c2074696e636964756e007420617420617263752076697461652c2076656e656e6174697320736f6c6c00696369747564696e20746f72746f722e2050656c6c656e7465737175652066006163696c697369732c206f64696f20696e2074726973746971756520736f6400616c65732c20657374206e6571756520657569736d6f6420697073756d2c2000657520656c656d656e74756d206f726369206e65717565207669746165206c00696265726f2e20446f6e65632074656d706f72206c696265726f20696e206c00656f20636f6d6d6f646f2c2075742076756c707574617465206d61676e6120006c616f726565742e204d616563656e61732072757472756d20656c656d656e0074756d20766f6c75747061742e20536564206d6f6c65737469652c206d657400757320657520656c656d656e74756d20616363756d73616e2c2073656d20710075616d20636f6e76616c6c6973206c696265726f2c206e6f6e206d616c6573007561646120616e7465206c61637573206c6f626f7274697320746f72746f72002e205365642076656c697420646f6c6f722c20636f6e73656374657475722000617563746f7220616c697175657420696e2c206f726e617265206575207361007069656e2e204e756c6c61206574206c65637475732061207075727573207300656d706572206d61747469732e204e756c6c616d206d617474697320656c65006966656e64206d6f6c65737469652e0a0a4d6175726973206c6f626f72746900732065726174206c616375732c20757420766573746962756c756d20617567007565207072657469756d2065752e20446f6e65632065742073656d70657220006d61757269732c2073697420616d65742067726176696461206c6563747573002e20447569732076656e656e61746973206d69206f7263692c2061206566660069636974757220646f6c6f7220617563746f722069642e204e756c6c61206e006f6e2075726e612075742065726174207665686963756c612074696e63696400756e74207574206964206a7573746f2e2041656e65616e206c6163696e69610020657374206964206c7563747573206d616c6573756164612e205574206f72006e61726520647569207175697320636f6e736563746574757220707265746900756d2e20496e206163206a7573746f206163206e756c6c61207669766572720061207665686963756c612e2053757370656e646973736520696e2076657374006962756c756d206d657475732c206120736f64616c6573206c6f72656d2e20004d6f726269206e6f6e206c6967756c612076697461652074656c6c7573206600696e69627573207363656c6572697371756520617420696e20616e74652e20005175697371756520696e2073656d70657220646f6c6f722e20457469616d20006d6f6c6c69732c206d6574757320696420766f6c75747061742073656d706500722c206d61737361206e65717565206c6163696e69612073656d2c20696e2000656666696369747572206c656374757320656c6974207574206e756e632e200050726f696e206c6163696e6961206c6f72656d2071756973207475727069730020756c7472696365732c20757420666175636962757320646f6c6f7220656c00656966656e642e20446f6e6563206c6f626f7274697320697073756d20657500206572617420616c69717565742c2065752065676573746173206c6967756c006120656c656d656e74756d2e205072616573656e742069642065726f73206600696e696275732c206d6f6c6c69732074757270697320696e2c206d6f6c6c690073207175616d2e2050686173656c6c757320626c616e64697420636f6d6d6f00646f206e756e6320696e20626c616e6469742e204e616d207175697320726900737573207574206469616d206c6f626f727469732073616769747469732e0a000a50726f696e20766f6c75747061742074656d7075732072757472756d2e200050726f696e20696d7065726469657420626c616e6469742073617069656e20007175697320706c6163657261742e204e756c6c6120706f73756572652064750069206964206f64696f20657569736d6f642c20696420696163756c6973207500726e6120646170696275732e20446f6e65632070656c6c656e74657371756500206d617373612069642076697665727261206c616f726565742e204e756c6c00616d2071756973206c6163757320636f6e76616c6c69732c20626c616e64690074206c656f206e6f6e2c20616c697175616d206c696265726f2e2053656420006461706962757320617567756520696e2075726e612070686172657472612c002061742073656d706572206c656374757320706c6163657261742e205365640020756c74726963657320726973757320696420696163756c69732074656d700075732e20496e7465676572206665726d656e74756d2c2072697375732065740020636f6e736563746574757220636f6e6775652c206e756e63206573742069006163756c69732072697375732c20706f73756572652076656e656e61746973002065726f7320616e74652076656c2070757275732e20496e7465676572206c006163696e69612074656c6c7573207669766572726120726973757320736167006974746973206672696e67696c6c612e2043726173206e6f6e20697073756d002071756973206e65717565207669766572726120666163696c69736973206e006f6e20736564206475692e20467573636520636f6d6d6f646f20656c65696600656e64206a7573746f207175697320636f6e6775652e0a0a566976616d757300207363656c657269737175652074696e636964756e74206e756e6320646967006e697373696d20636f6e64696d656e74756d2e2051756973717565206172630075206e69736c2c20756c6c616d636f72706572206e6563206c65637475732000717569732c20636f6e67756520616363756d73616e20657261742e2043757200616269747572207574206e697369207475727069732e20496e20766974616500206573742071756973206d657475732074656d70757320766573746962756c00756d206575206e656320617263752e2055742073656d206a7573746f2c20660065756769617420657520636f6e73657175617420656765742c20756c6c616d00636f72706572206567657420697073756d2e205072616573656e7420707265007469756d206d6174746973206c656f2c20677261766964612068656e64726500726974206c696265726f2065666669636974757220656765742e204d61656300656e617320626c616e646974206e696268206469616d2c206e6563206c616300696e69612061726375206c6163696e69612065742e0a0a4675736365207469006e636964756e7420746f72746f722066656c69732e20536564206469616d20006e6962682c20637572737573206e6563206461706962757320656765742c20006f726e61726520656666696369747572206d692e20446f6e65632069642074006f72746f72207669746165206d692064696374756d20766573746962756c75006d2e2050726f696e206964206c696265726f20616c697175616d2076656c6900742074656d706f7220696d706572646965742073697420616d657420766974006165206c616375732e20437261732073697420616d65742065782068656e640072657269742c206672696e67696c6c6120617567756520696e2c206c616f7200656574206f7263692e204d616563656e6173206c61637573206d657475732c0020656c656966656e6420736564206d657475732075742c20657569736d6f640020657569736d6f642076656c69742e20496e746567657220696e2061636375006d73616e206d692e0a0a41656e65616e20696163756c69732076656c206a750073746f20756c7472696369657320766f6c75747061742e204372617320636f006e73656374657475722c2065726f73206e6f6e20756c6c616d636f727065720020696163756c69732c2076656c6974206578207665686963756c612076656c0069742c2073697420616d657420696163756c6973206a7573746f206469616d00206567657420657261742e20496e74656765722066696e6962757320736f6400616c6573206d617373612073697420616d6574206d616c6573756164612e2000496e2072686f6e6375732073617069656e206964207175616d207669766572007261207665686963756c612e20496e20686163206861626974617373652070006c617465612064696374756d73742e20446f6e656320616320706f7274746900746f72206e657175652c2073656420656666696369747572206c6967756c61002e20446f6e6563206567657420616c697175616d206c616375732c206e6f6e00207665686963756c61206e69736c2e2053656420706c616365726174206d61007474697320636f6e76616c6c69732e20496e746567657220736f64616c6573002c206e69736c2061207665686963756c61206469676e697373696d2c207665006c69742074656c6c7573206566666963697475722070757275732c20612076006573746962756c756d206f64696f206c61637573206964206469616d2e204e00756c6c616d20766974616520626c616e64697420656c69742e20507261657300656e742074696e636964756e74206c656374757320656c69742c206e6f6e200074656d707573206e69736c20677261766964612076697461652e204e756c6c0061206469616d2070757275732c206c616f7265657420766974616520656765007374617320696e2c20636f6e7365637465747572206574206d61757269732e002053656420766172697573206d6f6c6c697320656c656d656e74756d2e204e00616d2073697420616d6574206d61676e6120677261766964612c2068656e6400726572697420697073756d206e6f6e2c2074656d7075732073656d2e204d61006563656e6173206469676e697373696d206d6f6c6c69732072686f6e637573002e205365642066656c6973206e69736c2c2073656d7065722061742074656c006c75732065742c206d616c65737561646120616c697175616d20697073756d002e0a0a496e74656765722073757363697069742076656c6974206964207365006d206665726d656e74756d2c207175697320756c7472696365732073656d200074696e636964756e742e2041656e65616e2076656c20646f6c6f72206e6563002074757270697320656c656d656e74756d207363656c657269737175652e200050726f696e206f64696f20746f72746f722c20616c697175657420656765740020696d7065726469657420717569732c20736f6c6c696369747564696e20690064206c616375732e2050656c6c656e74657371756520656e696d20656c6974002c207375736369706974206964207175616d206e65632c206375727375732000616c697175616d2065726f732e20446f6e656320626962656e64756d207369007420616d6574206d657475732071756973207363656c657269737175652e20004e756e6320616320747572706973206a7573746f2e2053656420706c6163650072617420746f72746f72206e6563206c6163757320736f6c6c69636974756400696e207363656c657269737175652e2050686173656c6c7573207669746165002063757273757320657261742c20616320756c7472696369657320746f7274006f722e0a0a43726173206d616c6573756164612067726176696461206a757300746f2076656c207661726975732e204e756c6c616d206c616f7265657420690064206d617572697320696e20646170696275732e20437572616269747572200073757363697069742065782065676574207361676974746973206c7563747500732e20447569732071756973207669766572726120656c69742c20717569730020756c6c616d636f72706572206e756e632e204d617572697320656c65696600656e642c206d6173736120696e20626962656e64756d20616363756d73616e002c206578206e69736920766573746962756c756d206469616d2c2075742069006163756c697320647569206f72636920736564207475727069732e204e756c006c6120626962656e64756d2c2076656c697420657520636f6e76616c6c6973002073656d7065722c206d65747573206e69736c20706f7375657265206175670075652c2068656e64726572697420696163756c69732073617069656e20717500616d206574206469616d2e2050726f696e2076656c206e69736c206175677500652e20566976616d75732076656e656e61746973206d657475732073656420006d617572697320706f73756572652c20612068656e64726572697420656e69006d20766976657272612e204475697320636f6d6d6f646f206172637520657400206d61676e6120756c7472696365732070656c6c656e7465737175652e204e00616d20696e206c696265726f2076656e656e617469732c2076657374696275006c756d206175677565206c6163696e69612c20766172697573206c6f72656d002e20457469616d206574206c7563747573206c616375732e205175697371750065206d6f6c65737469652c206e69626820617420756c747269636573206d6100747469732c206c616375732075726e6120636f6e76616c6c6973206e756c6c00612c20696e206d616c657375616461206e756c6c61206c6563747573206e6f006e206469616d2e20457469616d206567657420697073756d206d61676e612e002050686173656c6c75732066656c6973207175616d2c20626962656e64756d002073697420616d657420726973757320717569732c20677261766964612065007569736d6f642066656c69732e0a0a46757363652076656e656e617469732000696e74657264756d20656c69742c20717569732072757472756d206f7263690020706f7375657265206e6f6e2e20496e20656c656966656e6420657374207100756973206469616d20666163696c697369732c206163206d616c65737561640061206d61737361206f726e6172652e204c6f72656d20697073756d20646f6c006f722073697420616d65742c20636f6e7365637465747572206164697069730063696e6720656c69742e205365642063757273757320616c697175616d206f0064696f2076656c2073757363697069742e2050656c6c656e74657371756520006163206c696265726f206163206572617420616c6971756574207361676974007469732e204d616563656e617320616e7465206c616375732c207363656c6500726973717565206574207472697374697175652076697461652c20656666690063697475722065676574207175616d2e2050686173656c6c7573207275747200756d20656c69742061756775652c2071756973206c6163696e6961206f726300692074696e636964756e74206e65632e20496e20636f6e736563746574757200206964206f726369206575207363656c657269737175652e2050656c6c656e0074657371756520616c69717565742074656d707573206f64696f207574207600756c7075746174652e2051756973717565206c696265726f206e69736c2c200072757472756d2061742073617069656e206e65632c206c616f726565742074007269737469717565206a7573746f2e2043726173206c6163696e6961206e690062682069642065726f732072757472756d207363656c657269737175652e20004e756e63206e6f6e206d6175726973206f7263692e204e616d20696d70657200646965742064617069627573206a7573746f2e20496e2076656c206c616375007320706f72747469746f722c207661726975732072697375732075742c2061006c697175616d20746f72746f722e2043757261626974757220696e206d65740075732076656c2065782076656e656e6174697320706f7274612e0a0a5375730070656e6469737365207365642070756c76696e6172206573742e205068617300656c6c7573206e6563206d6920656c656966656e642c20666575676961742000617263752061742c20706f72747469746f72206e6973692e204475697320650067657420626c616e6469742065782e20437261732061206475692065726f73002e20496e74657264756d206574206d616c6573756164612066616d65732061006320616e746520697073756d207072696d697320696e206661756369627573002e20496e2073656d206c696265726f2c20766f6c757470617420656765742000647569207365642c2070656c6c656e746573717565206c7563747573206578002e20536564206574206c656f20656765742065726f7320696e74657264756d00206d6178696d75732e2050686173656c6c7573206e6f6e206d6f6c657374690065206c65637475732c206e6f6e207665686963756c61206c65637475732e2000446f6e656320656666696369747572206d616c657375616461206d6175726900732c2065676574207472697374697175652073656d206c6f626f727469732000612e204e616d2074656c6c75732075726e612c2072686f6e63757320666572006d656e74756d20737573636970697420717569732c20696d70657264696574002071756973206f7263692e20557420637572737573206572617420766974610065206665726d656e74756d20666163696c697369732e204e756e632075742000626c616e646974206c6f72656d2e20566573746962756c756d2074656c6c750073206469616d2c20636f6e67756520657520706f73756572652075742c206c006f626f7274697320612073656d2e204e756c6c616d206163206f726369206e006f6e2075726e6120656c656966656e6420696d706572646965742e0a0a507200616573656e74207669746165206e69736c206672696e67696c6c612c207375007363697069742065726174207365642c20656c656d656e74756d207269737500732e20446f6e656320696420756c74726963696573206f64696f2e2050726f00696e206d6174746973206d61757269732061206d61737361206d6178696d750073207472697374697175652e2050686173656c6c7573206567657420706f730075657265206e6962682e2050686173656c6c757320736564206d657475732000657420657820636f6d6d6f646f20766f6c75747061742e2041656e65616e20006c6163696e69612c206175677565206e6f6e2065666669636974757220636f006e6775652c206d617373612073656d2076697665727261206469616d2c20710075697320706f737565726520647569206c6f72656d2061206c6f72656d2e2000496e2076756c7075746174652064756920657520656c6974207375736369700069742074656d706f722e204372617320696d70657264696574206d6175726900732073656420657820637572737573206c616f726565742e20566976616d750073206e65717565206573742c20666163696c6973697320717569732066656c00697320717569732c20706f72747469746f7220706f72747469746f72206e75006e632e204675736365206e6f6e206c6f626f72746973206c6f72656d2e0a0a004d616563656e617320766f6c75747061742066617563696275732074656c6c00757320756c747269636965732070756c76696e61722e2050686173656c6c750073206120706f72747469746f7220617263752e20446f6e65632076756c7075007461746520656e696d207475727069732c20612074696e636964756e7420640069616d2074656d706f722065752e20446f6e656320736f6c6c69636974756400696e2c206578207669746165206c756374757320766573746962756c756d2c00206e69736c20616e746520756c6c616d636f72706572206d692c2061742075006c7472696369657320656e696d20646f6c6f722073656420656c69742e20500072616573656e74206d6f6c6c697320656666696369747572207269737573200071756973207072657469756d2e20566573746962756c756d2071756973206600696e69627573206475692c2065676574206f726e617265206c65637475732e0020457469616d2065676574206a7573746f20766573746962756c756d2c2062006c616e6469742073656d20696e2c206d6178696d75732065726f732e0a0a5000686173656c6c7573206120697073756d206575206d69206375727375732073006f64616c6573206e656320736564206e6973692e2044756973206672696e6700696c6c6120657374206163206c6967756c612070756c76696e61722067726100766964612e2050726f696e207669766572726120616363756d73616e207365006d2c2076656c2072757472756d206e69736c20636f6e736571756174207665006c2e204e756e63206672696e67696c6c61206d657475732076656c206661750063696275732074656d706f722e205072616573656e7420636f6e73656374650074757220646170696275732061756775652c206574207363656c6572697371007565206c656374757320636f6e64696d656e74756d206e65632e204e756e630020616363756d73616e2c2075726e61206e6f6e20706c61636572617420756c007472696365732c206d617572697320617567756520736f6c6c69636974756400696e20616e74652c2073697420616d657420616c697175616d206c61637573002076656c69742061632074656c6c75732e205365642076656e656e61746973002c2074656c6c7573206e656320617563746f7220646170696275732c206c6f0072656d2073617069656e2073656d70657220657261742c206575207669766500727261207175616d2075726e61207669746165206c6f72656d2e204d61656300656e6173207375736369706974206e756e63207574206d6f6c657374696520006d61747469732e20416c697175616d20766974616520657374206469676e69007373696d2064756920656c656d656e74756d20617563746f722e0a0a4d6f72006269206e756c6c61206c616375732c2073656d7065722073697420616d6574002066656c69732065742c2076756c707574617465206d616c65737561646120006475692e2050726f696e20656765742065726f73206c65637475732e20446f006e65632074696e636964756e7420656c69742076656c20736f6c6c69636974007564696e2073616769747469732e2050726f696e206163206d6f6c6573746900652073656d2e2053757370656e646973736520696163756c69732076657374006962756c756d2073656d206574206d61747469732e2050726f696e206c6f62006f72746973206c616f72656574206469616d2c2073656420706f737565726500206573742074656d706f722065742e2053656420696e20746f72746f7220710075697320657820696d70657264696574206c6163696e69612071756973206e006563206c6f72656d2e204d616563656e617320636f6e76616c6c69732065660066696369747572206f7263692c20657420706f72747469746f72206e69736c0020666163696c69736973206e6f6e2e205365642068656e647265726974207600656e656e617469732066656c697320666175636962757320656c656d656e7400756d2e204d6f7262692061632064756920736f64616c65732c2070656c6c65006e74657371756520697073756d2076656c2c20736f64616c65732076656c6900742e20457469616d20656e696d206c6f72656d2c2076656e656e6174697320006163206c616375732065742c2065676573746173206d616c65737561646120006c65637475732e20416c697175616d20736f64616c6573206e6962682065660066696369747572206c656374757320616c697175616d20766573746962756c00756d206e6f6e2061206f64696f2e204d61757269732069642066617563696200757320656c69742c2073656d70657220706f72747469746f72206e756c6c61002e204675736365206f726e6172652c206a7573746f20696e20766568696375006c6120636f6d6d6f646f2c206c61637573206c6163757320636f6e677565200074656c6c75732c20757420666175636962757320697073756d207269737573002061206e756c6c612e20457469616d207669766572726120707572757320710075616d2c2076656c20706f72747469746f72206d6574757320696d70657264006965742065752e204d6f72626920636f6e76616c6c697320636f6e73657175006174206475692e0a0a4d61757269732074726973746971756520617263752000717569732072686f6e6375732064696374756d2e204e756e6320646f6c6f7200206c696265726f2c206d6178696d757320617420656e696d2075742c2067720061766964612072686f6e637573207175616d2e20566573746962756c756d20006d61747469732074696e636964756e7420666163696c697369732e20467573006365206e756c6c612061756775652c206567657374617320736564206c616300696e69612076697461652c206d616c657375616461206163206e756c6c612e00204d617572697320696163756c6973207072657469756d206c616375732c2000612066696e696275732075726e6120706f73756572652061632e204d6f7262006920696e74657264756d20666175636962757320657261742c2061206c616f0072656574206d61676e6120626c616e64697420612e2043726173206e656320006d61676e612071756973206c61637573206567657374617320696163756c6900732e0a0a4c6f72656d20697073756d20646f6c6f722073697420616d65742c0020636f6e73656374657475722061646970697363696e6720656c69742e2055007420756c74726963696573206f726369207175616d2c2073697420616d65740020656c656966656e6420616e7465206672696e67696c6c61206e65632e205000726f696e20616c697175616d20696e2074656c6c757320677261766964612000636f6e76616c6c69732e2050726f696e2072757472756d20636f6e7365717500617420656e696d20736564206d616c6573756164612e2041656e65616e206500676573746173206d657475732076697461652073656d20636f6e64696d656e0074756d2073757363697069742e2053757370656e6469737365206172637520006475692c206772617669646120696e2065726f732065742c206d61747469730020616c69717565742074656c6c75732e20496e74656765722070656c6c656e0074657371756520616e74652066696e69627573206d692072757472756d2061006c697175616d2e20496e7465676572206d6174746973206469616d2073656400206665756769617420696d706572646965742e2046757363652069642062690062656e64756d206d617373612e20496e74656765722061742074656d7075730020656e696d2e20416c697175616d206574206d6f6c6c6973206d61676e612e000a0a5365642073656d70657220656c656d656e74756d206d61737361206e6f006e20766976657272612e205365642073697420616d6574206d61676e612065007420697073756d207472697374697175652076756c7075746174652e205065006c6c656e74657371756520696e206c696265726f2073656d2e205375737065006e646973736520736f64616c65732074656d706f722061756775652074696e00636964756e7420666163696c697369732e204d616563656e6173207363656c006572697371756520697073756d20617420666575676961742064696374756d002e204d616563656e61732076656c2075726e6120736564206d657475732075006c74726963696573206d6f6c6c69732e204e756c6c61206c6f72656d206d6100757269732c2073757363697069742065676574206172637520696e2c207275007472756d2072757472756d206d617373612e204d616563656e61732061632000696d7065726469657420656c69742c207365642073757363697069742069700073756d2e2050726f696e206d6f6c6573746965206d6173736120617263752c00206120636f6e64696d656e74756d206f64696f20756c747269636573207369007420616d65742e205072616573656e742072686f6e637573206578207075720075732c2073656420706c616365726174206e756e63206f726e617265206574002e2050686173656c6c75732061206e696268206d616c6573756164612c2075006c6c616d636f72706572206e69736c2061742c2070656c6c656e74657371750065206c6f72656d2e2050686173656c6c7573206c6f72656d20697073756d2c0020756c6c616d636f727065722075742076756c70757461746520616c6971750065742c207661726975732065676574206c6f72656d2e0a0a4d6175726973200068656e6472657269742074696e636964756e74207175616d20616320696e7400657264756d2e20496e206120697073756d206e6f6e207175616d206d617869006d75732066696e696275732e20536564206f64696f2065782c206c6163696e00696120766974616520697073756d2073616769747469732c20766568696375006c6120656765737461732072697375732e204e756c6c616d20616320656c65006966656e6420646f6c6f722c20657520706f72747469746f722074656c6c7500732e204d616563656e617320746f72746f722076656c69742c20636f6e6469006d656e74756d20696420656e696d2076656c2c20657569736d6f64206f726e006172652072697375732e20416c697175616d206964206c6f72656d20696e7400657264756d2c20616c697175616d20707572757320696e2c20706861726574007261206a7573746f2e205574207669746165206c656f206469616d2e204e75006c6c6120656c656d656e74756d206e756e63206d657475732c206e65632076006172697573206f64696f2066696e69627573206e65632e20457469616d207100756973206e69736c20696e74657264756d2c20766f6c757470617420646f6c006f722065742c2072686f6e637573206e6962682e204d616563656e6173206e006f6e2072757472756d2061756775652c20657520656c656966656e64206d69002e20446f6e6563206c6f626f7274697320616e7465207669746165206175670075652070686172657472612c206174206c6163696e696120746f72746f7220007072657469756d2e0a0a4d616563656e61732061742074656d706f72206d6100676e612c20696e20737573636970697420656e696d2e204e756c6c6120656c00656d656e74756d2072757472756d2065782c206567657420736f64616c657300206e756c6c6120636f6e76616c6c69732076697461652e20566976616d757300206469676e697373696d2c2065726f7320657520656c656d656e74756d2073006f6c6c696369747564696e2c206c6f72656d20647569206c7563747573207300617069656e2c206163206d617474697320646f6c6f7220656e696d2073757300636970697420656c69742e204e756c6c61206567657420696d7065726469650074206d657475732e2043757261626974757220636f6e64696d656e74756d200061207075727573207363656c6572697371756520756c7472696365732e2041006c697175616d206c696265726f206d692c20766573746962756c756d206574002074656d706f722065752c2070686172657472612073697420616d65742065006c69742e20557420696420616c697175616d206c696265726f2e0a0a5365640020636f6e7365637465747572206c65637475732066696e69627573206c656300747573206f726e61726520706f7274612e20447569732073656420636f6e670075652073617069656e2c20757420696d7065726469657420656e696d2e205300656420656c656d656e74756d20696163756c6973206c6967756c612c206e6f006e2076656e656e617469732073617069656e206c75637475732069642e2053006564206566666963697475722c20616e7465207669746165206d6f6c657374006965206566666963697475722c20656c697420697073756d20636f6e64696d00656e74756d20697073756d2c2076656c206d6f6c6c6973206d61676e61206f0064696f207669746165206c616375732e2053757370656e64697373652065670065737461732073656d206f64696f2c20696e20766573746962756c756d206e0069736c20706f72747469746f722076656c2e20496e2074696e636964756e74002c206d657475732061206c6f626f7274697320756c7472696365732c2069700073756d206d6574757320766573746962756c756d206e756c6c612c2061742000696d7065726469657420746f72746f72206e6571756520736564206d692e20004d617572697320617420616e746520616e74652e20566573746962756c756d0020637572737573207665686963756c6120756c7472696365732e204d6f72620069206c7563747573206120657374206e656320696d706572646965742e20550074206e6f6e2075726e61206672696e67696c6c612c2065676573746173206d00657475732065752c2064696374756d20656c69742e20496e2064696374756d00207075727573206964206c656374757320616c69717565742074656d706f72002e20416c697175616d206572617420766f6c75747061742e204e616d206175006775652066656c69732c20696d70657264696574206174206d61676e61206e0065632c2070656c6c656e746573717565207661726975732074656c6c75732e000a0a4d616563656e617320656765742065782070656c6c656e746573717565002c20656c656d656e74756d206469616d2061742c20656c656966656e642064006f6c6f722e204e756c6c616d20626962656e64756d2065726f73206e65632000646f6c6f7220646170696275732c206174207361676974746973206573742000636f6e64696d656e74756d2e205072616573656e74206e6f6e2068656e647200657269742065726f732e204d616563656e617320636f6e736571756174206d006173736120766974616520647569207665686963756c612c20757420756c740072696365732072697375732073656d7065722e2053757370656e646973736500206461706962757320616e746520646f6c6f722c206120626962656e64756d002076656c69742074726973746971756520696e2e204d616563656e6173206e00656320696163756c697320656e696d2e20566573746962756c756d2073656400206f64696f2064696374756d2c20766573746962756c756d206f64696f2065006765742c20656c656966656e64206d657475732e204d617572697320616320006c696265726f20736564206c656f2070756c76696e617220636f6e76616c6c0069732e2044756973207665686963756c61206f72636920656c69742e2056650073746962756c756d206566666963697475722065676573746173206578206100206f726e6172652e2051756973717565206f726e617265206e6962682063750072737573206d6f6c65737469652070656c6c656e7465737175652e0a0a446f006e65632074696e636964756e7420666575676961742073757363697069742e0020566573746962756c756d20756c6c616d636f7270657220646f6c6f72206e006f6e206c6967756c6120766573746962756c756d2c20612070756c76696e610072206e756e6320636f6e7365717561742e20416c697175616d2070756c7669006e6172207661726975732074656c6c757320657520617563746f722e204d6100757269732076697665727261207665686963756c612065782c2076697461650020616c697175616d20617263752064696374756d2069642e205175697371750065207068617265747261207669746165206d61676e6120696e206f726e617200652e20566573746962756c756d207072657469756d207363656c6572697371007565206f64696f20696420636f6e73656374657475722e204e756c6c61207300656420656e696d207574207175616d20636f6e736563746574757220747269007374697175652e0a0a4e756c6c616d206f64696f206d61757269732c20666500756769617420657520666575676961742075742c20706f737565726520766900746165206d61676e612e205365642076697461652073656d70657220747572007069732c2073697420616d6574207363656c65726973717565206e756c6c61002e20517569737175652074656d707573206e6f6e206d692073656420706f7200747469746f722e2050726f696e206c656f2065782c20706f73756572652065007520656765737461732076656c2c206d6f6c657374696520736564206d65740075732e204e616d20747269737469717565206c616375732065742069707375006d206d6178696d757320756c747269636965732e204e756c6c616d20706f7300756572652073697420616d65742073617069656e206d6f6c65737469652075006c6c616d636f727065722e204d6f72626920656765737461732c20657261740020616320626c616e6469742064696374756d2c2073617069656e206e69736c002066696e69627573206e6973692c2073656420656666696369747572206c6500637475732073656d20657520697073756d2e2050686173656c6c7573206c65006f2061756775652c2076756c70757461746520706c616365726174206175670075652065752c2074656d706f722074696e636964756e74206c6f72656d2e200046757363652073697420616d65742073656d70657220746f72746f722e0a0a0053757370656e646973736520706f74656e74692e204d616563656e6173206900642064617069627573207475727069732c206e6f6e2076756c707574617465002065782e204e756c6c616d2072757472756d206c6967756c61206e65632072006973757320737573636970697420766f6c75747061742e20416c697175616d00206c7563747573206e657175652073697420616d65742061726375207472690073746971756520766f6c75747061742e205365642076697461652066656c690073206c6f72656d2e20416c697175616d20706c61636572617420656c656d65006e74756d2073617069656e2c2076697461652076756c7075746174652072690073757320766f6c757470617420696e2e204d616563656e6173207669746165002064756920657261742e2050686173656c6c7573206672696e67696c6c61200073617069656e2073656420647569207665686963756c612c207661726975730020636f6e736563746574757220616e746520736f6c6c696369747564696e2e00204372617320696163756c69732c2073617069656e20696e74657264756d2000696d70657264696574206566666963697475722c20647569206d6175726973002070756c76696e617220697073756d2c2061742076656e656e61746973206e0069736c206f64696f2071756973207175616d2e204e756e63206566666963690074757220636f6e73656374657475722073656d7065722e204e756c6c616d2000706f7375657265206e756c6c612072686f6e6375732070756c76696e61722000756c747269636965732e204e756e632074656c6c757320617263752c206865006e64726572697420736f6c6c696369747564696e206469616d207669746165002c2068656e6472657269742066696e696275732065782e0a0a536564206c6f00626f72746973206d6174746973206c6967756c612c20766974616520636f6e0076616c6c6973206c656f2064617069627573206e6f6e2e204d616563656e610073207669746165206c61637573206575206e69736c20617563746f7220656c00656d656e74756d206e6563207669746165206c65637475732e204d61656365006e6173207669746165206f726369207669746165206d6920756c6c616d636f007270657220706f72747469746f72206964206c6f626f72746973206e69736c002e20446f6e6563206964206d617572697320697073756d2e20416c69717561006d206572617420766f6c75747061742e20566976616d7573206c6f626f7274006973206e696268207574206573742076756c7075746174652066657567696100742e20496e7465676572206c696265726f207175616d2c20756c74726963650073206174206f7263692061742c20636f6e677565206665726d656e74756d20006d617373612e20457469616d2069642065726f7320696163756c69732c2063006f6e64696d656e74756d206f7263692074696e636964756e742c206d617474006973206d657475732e204d616563656e617320756c747269636573207369740020616d657420646f6c6f722069642070656c6c656e7465737175652e2056650073746962756c756d20706f727461206d6178696d7573206e69736c2c20696e002066696e6962757320746f72746f7220766f6c75747061742075742e2055740020677261766964612c20646f6c6f7220756c7472696365732068656e6472650072697420666575676961742c20656e696d2073656d20696e74657264756d20006c6967756c612c20616320656666696369747572206572617420656c697420006964206c6f72656d2e20496e2073697420616d657420756c6c616d636f7270006572206c6f72656d2e0a0a50686173656c6c7573206c6967756c612075726e00612c20636f6e736571756174206574206c756374757320612c206f726e617200652065742061756775652e20566573746962756c756d20657420616e746520006174206c6163757320626962656e64756d20696d706572646965742e2045740069616d2074757270697320617263752c2063757273757320766974616520760069766572726120612c2068656e64726572697420766974616520617263752e002050726f696e206f726e617265206d6175726973207574206d61676e61206d006f6c6573746965206d61747469732e20446f6e65632074656d706f72206c6500637475732071756973206d617373612076756c70757461746520696e7465720064756d2e2050726f696e206575206c6967756c61206469616d2e204d61656300656e6173206461706962757320747572706973206c65637475732c2075742000666163696c6973697320656c6974206469676e697373696d2075742e204e75006e6320626c616e646974206f726369206120616e746520666163696c69736900732c20617420636f6e76616c6c69732066656c697320666163696c69736973002e20437572616269747572207375736369706974206d692061206c69626572006f20706f73756572652c2071756973206f726e617265206a7573746f2076690076657272612e2050656c6c656e746573717565206861626974616e74206d6f00726269207472697374697175652073656e6563747573206574206e6574757300206574206d616c6573756164612066616d6573206163207475727069732065006765737461732e204e756c6c612070756c76696e6172207363656c6572697300717565206d61676e612c2065676574206c6f626f72746973206e6962682063006f6d6d6f646f2061742e20447569732065676574207661726975732066656c0069732c20636f6e64696d656e74756d20706c616365726174206c6563747573002e20416c697175616d20617563746f722074656d706f722075726e61206575002070756c76696e61722e204d6f726269206375727375732074656d706f7220006e657175652c206e6f6e20626c616e64697420646f6c6f7220666163696c690073697320656765742e2053656420736564206c6f626f727469732073656d2e000a0a4d617572697320756c7472696369657320656c69742075726e612c207600656c20616c697175657420707572757320617563746f722076697461652e20005072616573656e742076697665727261206f64696f2074656c6c75732c20710075697320706f7375657265206e756c6c6120616c69717565742061742e204c006f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7300656374657475722061646970697363696e6720656c69742e20437572616269007475722065676574206d65747573206174206c6967756c6120656c65696665006e6420706861726574726120696e206d616c657375616461206475692e20440075697320636f6e7365637465747572206469616d2075742066657567696174002072757472756d2e20566976616d757320657569736d6f64206e69736c207600656c206d6178696d75732073616769747469732e20496e20636f6d6d6f646f002073697420616d6574206c6f72656d2065742074696e636964756e742e205500742070656c6c656e746573717565206e756c6c61206e6f6e206d61757269730020636f6e64696d656e74756d2c2069642076756c707574617465206f64696f0020626c616e6469742e2053757370656e6469737365206e6f6e20707265746900756d206d61757269732c206e65632074696e636964756e742073617069656e002e0a0a4675736365206461706962757320657569736d6f6420747572706973002c20757420656c656d656e74756d20656e696d20657569736d6f64206e6f6e002e204e616d2061206e6962682074656c6c75732e2050656c6c656e7465737100756520696163756c697320746f72746f722073656420706f72747469746f720020636f6e64696d656e74756d2e204375726162697475722066617563696275007320747572706973206d6178696d75732c2076656e656e6174697320616e740065207365642c206d6f6c6c69732072697375732e205365642074656d70757300206d61676e612065676574206e756e6320706f72747469746f722c206174200072757472756d207175616d20636f6d6d6f646f2e20496e746567657220626c00616e646974207661726975732074656c6c75732073697420616d6574207275007472756d2e2050726f696e206d6f6c6c697320747269737469717565206e6500717565207365642074656d7075732e204475697320706c6163657261742c20006f7263692069642064696374756d20766573746962756c756d2c206c696775006c6120646f6c6f7220766f6c7574706174206c656f2c2076697461652066610075636962757320656e696d206e756c6c6120717569732065782e20437261730020666175636962757320657374206573742c2073697420616d65742061636300756d73616e206c6163757320696d706572646965742069642e204e616d206d0061747469732c206e756e6320736564206469676e697373696d20706c616365007261742c206d617373612075726e6120696163756c69732076656c69742c200071756973206c7563747573206469616d206a7573746f206575206e6973692e0020416c697175616d206572617420766f6c75747061742e0a0a50656c6c656e00746573717565206e6571756520617263752c20636f6e677565206e6f6e2061007567756520717569732c2074726973746971756520696e74657264756d206e00756e632e2050726f696e20646f6c6f7220746f72746f722c206461706962750073207365642070656c6c656e74657371756520612c2072757472756d206567006574206e6973692e20437261732065742074656d7075732074656c6c75732e00204e756c6c6120706f72747469746f722c206e69736920657520617563746f0072207661726975732c206572617420746f72746f722072757472756d20747500727069732c206e6f6e2068656e64726572697420616e7465206e6571756520007574206573742e20416c697175616d2076756c7075746174652076656c69740020766974616520657569736d6f6420656765737461732e20496e7465676572002072757472756d206d6f6c6c697320617263752c20757420756c7472696369006573206a7573746f206d6f6c6c697320656765742e20457469616d206174200066696e6962757320656e696d2c206574206d6174746973206d61757269732e00204d616563656e617320696e20616c69717565742061756775652e204e616d0020756c74726963657320656c656d656e74756d20617263752076656c20616c00697175616d2e20566573746962756c756d20696e206c6967756c6120747269007374697175652c206661756369627573206f64696f20656765742c206c6f62006f72746973206a7573746f2e204d6f726269206575206e756e63207369742000616d657420726973757320636f6e73657175617420616c697175657420736500642061632065782e20496e2068656e64726572697420756c7472696369657300206c6967756c612c2071756973207375736369706974206c6563747573206400696374756d2065752e20536564206c616f7265657420636f6e67756520756c007472696365732e2050686173656c6c7573207375736369706974206d6173730061206120666163696c6973697320696d706572646965742e0a0a44756973200074696e636964756e742065726f732071756973206772617669646120766172006975732e2053757370656e6469737365206e6f6e206475692070757275732e0020496e74657264756d206574206d616c6573756164612066616d65732061630020616e746520697073756d207072696d697320696e2066617563696275732e0020446f6e65632061742070756c76696e61722066656c69732e20446f6e656300206e656320616c697175616d2065726f732c2064696374756d20626962656e0064756d20617263752e20496e206e656320646f6c6f722066696e696275732c00207072657469756d206c6967756c612065742c20636f6e736571756174206500782e20496e206861632068616269746173736520706c61746561206469637400756d73742e20457469616d2074656c6c757320656e696d2c20696e7465726400756d2073656d70657220697073756d20736f64616c65732c206772617669640061206672696e67696c6c6120646f6c6f722e204e756c6c61206c6163696e690061206a7573746f20736f6c6c696369747564696e206c616f72656574206d6f006c65737469652e20457469616d20616320766573746962756c756d20717561006d2c20696420657569736d6f6420697073756d2e205574206174206772617600696461206c6f72656d2e2053757370656e646973736520696e74657264756d0020656c656966656e64206c65637475732c2065752073656d7065722070757200757320766f6c757470617420612e0a0a55742076656c20617567756520756c007472696365732c2074696e636964756e74206d6173736120612c20736167690074746973206e69736c2e2050726f696e206567657420616e746520616c69710075616d2c206f726e6172652061756775652070656c6c656e7465737175652c0020646170696275732070757275732e20496e206574206d657475732061726300752e2050656c6c656e74657371756520616c697175616d20626c616e6469740020617263752071756973207472697374697175652e204d617572697320746f0072746f72206d617373612c206d6178696d75732071756973207661726975730020612c20706f72747469746f7220636f6e73656374657475722073656d2e200050726f696e207665686963756c6120707572757320657420696163756c69730020636f6e73656374657475722e20557420736f6c6c696369747564696e206600696e6962757320657820696e20656c656d656e74756d2e204f7263692076610072697573206e61746f7175652070656e617469627573206574206d61676e690073206469732070617274757269656e74206d6f6e7465732c206e6173636574007572207269646963756c7573206d75732e205072616573656e74206e65632000696d70657264696574206d61676e612e205574206d616c65737561646120690064207075727573206e656320766573746962756c756d2e2053757370656e64006973736520616363756d73616e2065726174206c656f2c20696e20666175630069627573206469616d20696163756c69732073697420616d65742e20447569007320736f6c6c696369747564696e206c6563747573207175697320656e696d00206c6163696e696120657569736d6f642076656c2075742061756775652e0a000a416c697175616d20756c7472696369657320636f6e76616c6c6973207465006c6c75732c206964206567657374617320656c69742073616769747469732000696e2e204372617320706f72747469746f72206e6973692065676574207361007069656e20636f6e76616c6c697320706f73756572652e204d6175726973200067726176696461206e65717565207669746165206c696265726f20637572730075732c20696420636f6e736571756174206e657175652072686f6e6375732e0020496e746567657220616c69717565742065676574206e696268206163207000686172657472612e204e756c6c616d20696163756c6973206e69736c206665006c69732c207175697320696d70657264696574206e756c6c6120756c74726900636573207365642e205175697371756520747269737469717565206c61637500732061742072686f6e63757320706f7274612e204e616d20616320636f6e6400696d656e74756d2075726e612e20536564206e656320706f72747469746f7200206e6962682e205365642067726176696461206d61676e612069642070757200757320706f737565726520766573746962756c756d206e6f6e20736564206e006973692e20566573746962756c756d2061726375207475727069732c2069610063756c69732076656c20636f6e7365717561742069642c206c6f626f72746900732073697420616d65742065782e205072616573656e742071756973207465006d706f722061756775652e204e756c6c61206567657420656e696d20656c65006966656e642c2074696e636964756e74206c696265726f2073697420616d6500742c206d6174746973206e6973692e20446f6e65632064756920657261742c002070756c76696e61722076656c207075727573206e65632c20666163696c69007369732066696e69627573206c6f72656d2e204e756c6c616d20756c7472690063657320707572757320766573746962756c756d20636f6d6d6f646f20616c00697175616d2e0a0a4f72636920766172697573206e61746f7175652070656e00617469627573206574206d61676e6973206469732070617274757269656e7400206d6f6e7465732c206e61736365747572207269646963756c7573206d7573002e204e756e6320626c616e646974206e756c6c612072697375732c2076656c0020736f64616c6573206c6f72656d206f726e6172652061632e20496e746567006572206e6f6e20646f6c6f7220626962656e64756d2c206f726e6172652074006f72746f7220656765742c20756c7472696369657320697073756d2e204165006e65616e2066696e69627573206469676e697373696d206f726e6172652e20004d61757269732074656d7075732c206572617420617420626962656e64756d0020617563746f722c206c656f20656c6974206c6163696e6961206f64696f2c002061742074656d7075732061726375206475692071756973206573742e20500072616573656e74206672696e67696c6c61206c6f72656d206d616c6573756100646120706f72747469746f7220696d706572646965742e20496e7465726475006d206574206d616c6573756164612066616d657320616320616e74652069700073756d207072696d697320696e2066617563696275732e204d6f7262692076006974616520666163696c69736973206c6f72656d2c20766974616520636f6e0073657175617420697073756d2e20457469616d20696420656c656d656e7475006d20657261742e204e616d20646f6c6f72206c656f2c2074656d706f722061006320657820717569732c206469676e697373696d206665726d656e74756d2000616e74652e0a0a446f6e65632061206e756c6c612072697375732e204d6175007269732066617563696275732c206e756e63206163206d6178696d7573207600656e656e617469732c206d61676e612076656c6974207072657469756d2061006e74652c206e6f6e206665726d656e74756d20656c6974206d617572697320006e6f6e206e756e632e20446f6e65632068656e6472657269742075726e61200061742074656c6c757320636f6e76616c6c69732c2061632066617563696275007320656c6974206c6f626f727469732e204e756c6c616d20626962656e6475006d20656c656966656e64206d61676e612073697420616d657420696e7465720064756d2e20496e20696e20736f64616c657320746f72746f722c206e6f6e20006c6f626f72746973206d692e205072616573656e742076656c2073656d206100206f64696f2076656e656e6174697320666163696c697369732e2056657374006962756c756d206163206d6f6c657374696520646f6c6f722c206174206669006e69627573206e6973692e0a0a566573746962756c756d20616e74652069700073756d207072696d697320696e206661756369627573206f726369206c75630074757320657420756c74726963657320706f737565726520637562696c6961002063757261653b2046757363652061632074656d70757320617263752c2076006974616520696163756c6973206e657175652e2055742061206e69736c207500742076656c697420636f6e73657175617420636f6e64696d656e74756d207600697461652065676574206e6962682e2044756973206574206d61676e612061006c69717565742c20636f6e76616c6c697320656c69742069642c20756c6c61006d636f72706572206d692e20566976616d757320696d70657264696574206600656c6973207175697320636f6e7365717561742072757472756d2e204d6f7200626920757420617263752073697420616d657420617567756520636f6e677500652074696e636964756e742e2053757370656e64697373652061206d617474006973206f7263692e204e756e6320656765737461732c2076656c69742073650064206469676e697373696d2073656d7065722c20656c6974206d61757269730020626962656e64756d206e657175652c206567657420616c697175616d206e00697369206e65717565206120616e74652e204e616d2066657567696174206e006571756520646f6c6f722e20566573746962756c756d20616e74652069707300756d207072696d697320696e206661756369627573206f726369206c75637400757320657420756c74726963657320706f737565726520637562696c6961200063757261653b20557420696e20636f6e736563746574757220646f6c6f722e002051756973717565206e6f6e20636f6e677565206e657175652e0a0a4e756c006c61207363656c657269737175652c206e65717565206567657420636f6e7600616c6c697320626962656e64756d2c206c6f72656d206d65747573207068610072657472612070757275732c2073656420626c616e6469742065726174206100726375206575206e6973692e204d617572697320706c616365726174206d6100737361206575206e6571756520766f6c75747061742c2073697420616d6574002076697665727261207269737573207363656c657269737175652e20496e200076656c20766573746962756c756d206e756c6c612e20416c697175616d207200686f6e6375732061632061756775652076656c2076756c7075746174652e20004d6175726973207669746165206469616d20696d706572646965742c20766f006c7574706174206e6962682065752c206661756369627573206d657475732e0020457469616d2070656c6c656e74657371756520747572706973206964206e0069626820636f6e73657175617420736f6c6c696369747564696e2e204e756e00632065676574206a7573746f2070756c76696e6172206d65747573207275740072756d206c75637475732073697420616d65742061206d657475732e204e75006c6c6120666163696c6973692e2053757370656e646973736520657520617500677565206c65637475732e2053757370656e646973736520736f6c6c69636900747564696e20657569736d6f64207661726975732e2050686173656c6c75730020616e746520657261742c20666175636962757320696420746f72746f7220006e65632c207363656c6572697371756520766172697573206e756e632e0a0a00457469616d206672696e67696c6c6120766f6c7574706174206d692c20706f00737565726520766573746962756c756d206c6967756c6120756c7472696365007320696e2e20446f6e6563207665686963756c612074757270697320717569007320756c74726963696573207661726975732e20446f6e65632073656d7065007220616e746520657261742c20616320666575676961742074656c6c75732000626962656e64756d2069642e20446f6e656320697073756d206e69736c2c200070756c76696e6172206e6563207175616d20696e2c20736f6c6c69636974750064696e20696e74657264756d20656e696d2e20566976616d7573206c616f72006565742074656c6c75732065676574206f72636920636f6e64696d656e7475006d207363656c657269737175652e2050726f696e20657420666175636962750073206f64696f2c206163206566666963697475722061756775652e2055742000696e74657264756d20747269737469717565206475692074656d7075732070006f7274612e20416c697175616d206672696e67696c6c6120707572757320760069746165206e6962682074656d706f7220626962656e64756d2e205175697300717565206574207361676974746973206f7263692c2061742074656d706f72002076656c69742e205365642066696e696275732073617069656e20657420740075727069732073656d7065722c206e6f6e206d6f6c6573746965206e756e6300206c75637475732e20536564206a7573746f206e6973692c20736f6c6c69630069747564696e20696e20697073756d20696e2c206665726d656e74756d20700072657469756d206f64696f2e204e756c6c6120757420766f6c7574706174200073656d2e0a0a436c61737320617074656e742074616369746920736f63696f00737175206164206c69746f726120746f727175656e742070657220636f6e7500626961206e6f737472612c2070657220696e636570746f732068696d656e6100656f732e204e756c6c61206e6f6e206f726369206d692e2056657374696275006c756d207361676974746973206f72636920657520636f6e64696d656e7475006d20636f6e6775652e20446f6e656320736564206d61676e612070656c6c65006e7465737175652c20706c61636572617420697073756d207365642c20616c00697175616d2073656d2e2043757261626974757220696d706572646965742000617567756520657420656c697420706c6163657261742c2061742070756c7600696e617220617263752066617563696275732e20566573746962756c756d2000666575676961742c20697073756d20617420756c747269636573206d6f6c6500737469652c206e65717565206f64696f20656c656966656e642076656c6974002c2061742065676573746173206f72636920647569206574206573742e2049006e7465676572207574206a7573746f206c65637475732e204e756c6c616d20006665756769617420696e74657264756d206f726369206e656320617563746f00722e0a0a446f6e656320616c697175657420616363756d73616e206d61737300612c20766974616520666163696c697369732072697375732e20467573636500207072657469756d206e756e63206e6f6e20636f6e73657175617420656c65006d656e74756d2e204d616563656e617320636f6e64696d656e74756d20736300656c6572697371756520706f72747469746f722e204f7263692076617269750073206e61746f7175652070656e617469627573206574206d61676e697320640069732070617274757269656e74206d6f6e7465732c206e6173636574757220007269646963756c7573206d75732e204d6175726973206e6563207075727573002066617563696275732c2074656d707573206469616d206e65632c20756c74007269636573206f7263692e2041656e65616e2066617563696275732c207361007069656e20757420706f72747469746f7220616c69717565742c206e756e6300206572617420636f6e6775652061756775652c2071756973206469676e69730073696d2073656d20697073756d206574206469616d2e2053757370656e646900737365206772617669646120657569736d6f6420697073756d2c206120696d0070657264696574206e756c6c6120636f6e7365717561742061632e2050726f00696e207175697320636f6e73657175617420697073756d2c20696e20737573006369706974206e657175652e204e616d207669746165207669766572726120006c656f2e2041656e65616e20756c74726963657320706c6163657261742062006c616e6469742e20496e7465676572206e6571756520617263752c2066616300696c697369732073697420616d6574206f726369207365642c2076657374690062756c756d206672696e67696c6c6120746f72746f722e2050656c6c656e740065737175652066657567696174206575206c6967756c612065676574206c6f00626f727469732e20536564206575206d6f6c6c69732065782c20696e206461007069627573206c616375732e20467573636520616c697175616d2c206e657100756520636f6e73657175617420666163696c6973697320706c616365726174002c20697073756d206f72636920696163756c6973206a7573746f2c20696d700065726469657420706f7375657265206d61676e61206f64696f206e6563207500726e612e20437572616269747572206d6f6c6c69732c20657820696e2066610063696c6973697320766f6c75747061742c206e697369206a7573746f20656c00656966656e64206c696265726f2c20612070656c6c656e7465737175652065006e696d206d61676e612071756973206e6962682e204d617572697320756c7400726963696573206469616d2065676574206c616375732070756c76696e6172002c20657420636f6e64696d656e74756d206e6962682073656d7065722e0a0a00566976616d757320746f72746f72207175616d2c20616c697175657420696e00206e756e632075742c206f726e61726520756c74726963696573206e65717500652e2050656c6c656e74657371756520637572737573206163206a7573746f0020766974616520756c747269636965732e20446f6e65632065676574206e6900736c2071756973206f726369206772617669646120766f6c75747061742065007420696420656e696d2e2053656420706f72747469746f72206c616375732000717569732073656d20756c74726963657320666163696c6973697320757420006567657420656e696d2e20416c697175616d20696163756c6973206572617400206e6563206d617373612072686f6e6375732068656e6472657269742e2041006c697175616d206f726e6172652070686172657472612075726e612065752000617563746f722e20566976616d7573206964206469616d206120617567756500206567657374617320636f6e6775652e205072616573656e742068656e647200657269742073617069656e20696e206f72636920636f6e6775652c20656765007420636f6e6775652073617069656e20696d706572646965742e205365642000617563746f7220657374206163206c7563747573206c6163696e69612e2049006e7465676572206e65717565206e657175652c20656c656966656e64207665006c206c656f2069642c20626962656e64756d20756c6c616d636f72706572200073656d2e20566573746962756c756d2076656c20666163696c6973697320650073742e20536564207175697320766f6c7574706174207475727069732e0a0a004e616d206d6174746973206d6f6c6573746965206d61676e612c2076697461006520636f6e736571756174206d657475732e204e616d206d6178696d75732000657569736d6f6420656c6974206e6563206f726e6172652e204e756c6c6120006d6f6c6c697320696420707572757320717569732074656d706f722e205065006c6c656e7465737175652072686f6e63757320656765737461732066657567006961742e204475697320756c74726963657320656c6974207574206c6f7265006d2070756c76696e617220736f6c6c696369747564696e2e2043757261626900747572206672696e67696c6c612076756c7075746174652076656e656e61740069732e204d61757269732074656d706f7220617563746f722075726e612e0a000a496e206861632068616269746173736520706c617465612064696374756d0073742e204d616563656e617320617563746f72206d61747469732062696265006e64756d2e20566573746962756c756d2074656d7075732072686f6e63757300206c65637475732c2069642072686f6e637573206e69736c206d6178696d7500732061742e204475697320766172697573206672696e67696c6c6120617567007565206e656320666163696c697369732e204e756c6c6120696163756c69730020612070757275732065676574206665726d656e74756d2e20457469616d20006e6563207361676974746973206f7263692e205072616573656e74206d6174007469732066656c69732072697375732e204e616d206567657420656c656d65006e74756d206c6967756c612e20436c61737320617074656e74207461636974006920736f63696f737175206164206c69746f726120746f727175656e74207000657220636f6e75626961206e6f737472612c2070657220696e636570746f73002068696d656e61656f732e2050686173656c6c75732065676573746173207000757275732070656c6c656e7465737175652c2070656c6c656e746573717565002076656c6974206e6f6e2c206772617669646120656c69742e0a0a53656420006e6f6e2074656d7075732070757275732e2053757370656e6469737365207000756c76696e6172206d65747573206e657175652c206e6f6e207472697374690071756520697073756d20706f727461206e6f6e2e205574206567657420747500727069732074696e636964756e742c2074656d706f722073656d2071756973002c2076656e656e61746973206d61676e612e20566573746962756c756d20690064206d6178696d75732072697375732e204475697320616c69717565742070006f73756572652066656c697320696e20706c6163657261742e2051756973710075652076656c6974206f64696f2c20656666696369747572206174206d617300736120612c20747269737469717565206f726e61726520646f6c6f722e204e00756c6c616d206567657374617320706c61636572617420647569207574207300656d7065722e20416c697175616d20717569732073617069656e206d65747500732e204475697320656c656d656e74756d2c2065726174206e656320626c61006e6469742072686f6e6375732c2065726f7320656e696d207363656c65726900737175652061756775652c206e656320766976657272612065726f73206c65006f206575206c656f2e204d6f7262692073656420666163696c69736973206a007573746f2e20566976616d75732073697420616d6574206d61676e61206865006e647265726974206c656f206772617669646120617563746f722e0a0a4e75006e632063757273757320616c6971756574206f64696f2e204e756e632069610063756c69732065742074757270697320617420756c747269636965732e204e00616d2076756c70757461746520656e696d2065676574207075727573207465006d707573206f726e6172652e204e756c6c616d20636f6e736571756174206d006f6c6573746965206469616d2c20766974616520756c747269636573206e6900626820706f72747469746f722065742e20566573746962756c756d20766f6c007574706174207574206c6f72656d20656765742070656c6c656e746573717500652e204e616d2064617069627573206c696265726f206d692e2050656c6c65006e7465737175652074696e636964756e74206e696268206e657175652c20610020696e74657264756d206c6f72656d20636f6e6775652076656e656e61746900732e2050686173656c6c757320696e2073656d206574206d617373612066610075636962757320616363756d73616e2074696e636964756e742076656c206e006962682e0a0a4e756c6c61206d616c657375616461206e69736c206e69736c002c206575206d6f6c657374696520697073756d206d6f6c6c69732065676574002e20416c697175616d2076756c70757461746520707572757320736564206c006967756c6120736167697474697320616c69717565742e20496e20616c69710075616d206469616d20677261766964612072757472756d2070756c76696e6100722e20496e206d616c6573756164612075726e612065676574206f726e6172006520656765737461732e20566573746962756c756d20766974616520736365006c65726973717565206573742c206567657420766573746962756c756d206f007263692e2050656c6c656e746573717565206672696e67696c6c61206d616c0065737561646120706f73756572652e204e756c6c6120696e74657264756d20006c656f207669746165207072657469756d20706f73756572652e204e616d20006d6f6c6c69732065726f73207365642074656c6c7573206d6174746973207300616769747469732e0a0a53757370656e646973736520636f6e64696d656e7400756d206c6563747573206574206c6f72656d20657569736d6f6420637572730075732e204d6175726973206172637520617263752c2072757472756d20636f006e73657175617420707572757320696e2c206567657374617320696163756c006973206c696265726f2e204d6f726269207068617265747261206d6178696d007573206d617373612c206567657420626c616e64697420747572706973207000756c76696e61722065742e204d6175726973206e656320646f6c6f72207665006e656e617469732c2070656c6c656e746573717565206d61676e612069642c0020617563746f722075726e612e204d616563656e617320766976657272612000706f72747469746f72206e6973692c2076656c20756c74726963696573206500726174206375727375732061742e20467573636520636f6e6775652074656c006c75732076697461652073617069656e20747269737469717565206665726d00656e74756d2e20446f6e656320696d706572646965742073656d206e6f6e20006d617572697320756c7472696365732076656e656e617469732e20437261730020756c747269636573206c6f72656d206c656f2e2053656420736564207665006e656e61746973206e657175652c2076697461652065676573746173206665006c69732e205072616573656e7420617420616e746520706f7274612c20636f006e64696d656e74756d206c65637475732076697461652c20706f7274746974006f72206e657175652e204e616d2074656c6c7573206c616375732c20747269007374697175652074656d706f72206e756c6c61206e65632c20706c6163657200617420626962656e64756d2061756775652e204e756c6c616d20657569736d006f642076697665727261206f7263692c206575206772617669646120656e69006d20636f6e64696d656e74756d20626962656e64756d2e2053757370656e6400697373652065676574206c6f72656d20766974616520697073756d20706c610063657261742070656c6c656e74657371756520696420636f6d6d6f646f206f0064696f2e204675736365206d61747469732075726e61207574206475692063006f6d6d6f646f2c206e656320636f6d6d6f646f20647569207068617265747200612e0a0a496e206861632068616269746173736520706c61746561206469630074756d73742e204e616d206a7573746f206e6962682c207665686963756c61002061206c6967756c612065752c206d617474697320656c656966656e64206c006967756c612e205175697371756520656765742074757270697320612061750067756520747269737469717565206665726d656e74756d2e204e756c6c616d00207669746165206c61637573206d6f6c65737469652c207363656c65726973007175652061756775652061742c20656c656966656e64206e69736c2e204e75006c6c61206d61676e612065726f732c20636f6e76616c6c697320736564206f0064696f207363656c657269737175652c206c6f626f7274697320636f6e7661006c6c6973206e6962682e204e616d206174207361676974746973206175677500652c20657520766172697573206c6967756c612e204e756c6c616d20706f730075657265206d6178696d7573206e697369206e656320616c69717565742e2000457469616d207363656c657269737175652071756973206469616d20656765007420656765737461732e205072616573656e7420756c7472696369657320730063656c65726973717565206d69206e656320626962656e64756d2e2056657300746962756c756d20616c697175616d2074656c6c75732076656c206a757374006f206c616f726565742c207574207072657469756d2073656d206f726e617200652e204e616d20616e7465206e6962682c2066696e69627573206e6563207300617069656e20612c2076656e656e6174697320636f6e677565207269737573002e20496e2076656c206e65717565206120656e696d20636f6e7365637465740075722070656c6c656e7465737175652e20566976616d757320636f6e76616c006c697320657374207574206e756c6c6120736167697474697320706f7375650072652e2050656c6c656e74657371756520626962656e64756d20736f64616c00657320697073756d2065742068656e6472657269742e0a0a536564207269730075732066656c69732c20736f6c6c696369747564696e206575206d6f6c6573007469652065742c20657569736d6f6420656765742065782e20457469616d200065676574206e756c6c61206e6962682e2043726173206772617669646120610020746f72746f722076697665727261207661726975732e2050686173656c6c0075732066696e696275732c2073617069656e20657420616c697175616d2075006c7472696365732c206d61757269732065726f7320706f72747469746f72200065726f732c20616320636f6e677565206c656f206573742065676574206d6100757269732e20536564206e756e632076656c69742c2065676573746173207300656420656c69742065752c20657569736d6f64206d6178696d7573207361700069656e2e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b2000566573746962756c756d206c656f206a7573746f2c20636f6d6d6f646f2071007569732076756c7075746174652061742c20736f6c6c696369747564696e200073697420616d6574206573742e205365642070756c76696e61722c2076656c00697420736564206469676e697373696d20766976657272612c206d617373610020646f6c6f722073656d706572206c6f72656d2c206e6f6e206d6f6c657374006965206d6175726973206f64696f2065742070757275732e204d616563656e006173206c6f626f7274697320696e74657264756d206e756e63207574206d6f006c65737469652e20536564206d6f6c6c697320636f6d6d6f646f2076656e65006e617469732e20496e74657264756d206574206d616c657375616461206661006d657320616320616e746520697073756d207072696d697320696e206661750063696275732e2055742073656420617263752076656c69742e204d617572690073206175677565206e756c6c612c206f726e617265206e656320616c697175006574207365642c20636f6d6d6f646f20696e206475692e0a0a496e74656765007220736f6c6c696369747564696e2075726e612065676574206e756c6c61200070686172657472612c206e6f6e20766172697573206e657175652070756c7600696e61722e204e756c6c61207574206c656374757320736564206d61757269007320756c6c616d636f7270657220706f7274612e2051756973717565206e650063206469616d207472697374697175652c2064617069627573206c65637475007320612c20616c697175616d206e6962682e2043757261626974757220616c006971756574206d6f6c6c69732073617069656e207574206d6f6c6573746965002e2050686173656c6c7573207361676974746973206e69736c20766974616500206d6178696d75732066617563696275732e20446f6e6563206d6178696d750073206120647569206575207661726975732e20457469616d2072686f6e6375007320746f72746f722076656c206e756e63206665726d656e74756d2070756c0076696e617220736564206e656320657261742e20416c697175616d20757420006c656f206e6f6e206e69736920646170696275732076756c7075746174652e0020496e746567657220616363756d73616e20636f6e6775652072686f6e637500732e2055742076756c707574617465206f64696f20656c69742c20707265740069756d2073656d7065722065726174207375736369706974206e65632e205300757370656e6469737365206d6174746973207475727069732076656c206572006f732070756c76696e617220756c7472696365732072757472756d207369740020616d657420616e74652e204475697320656c656966656e64206d6178696d00757320617567756520696e207363656c657269737175652e20446f6e656320006e6f6e20746f72746f722073697420616d657420657261742066617563696200757320616c69717565742e205365642074656d70757320747269737469717500652072697375732c207072657469756d20747269737469717565206475692000636f6e76616c6c69732065752e0a0a50686173656c6c757320616c69717561006d20747572706973206174206c656f20706f73756572652c207365642061630063756d73616e206e69736c2074656d7075732e204d616563656e6173207669007461652073617069656e206a7573746f2e2050686173656c6c75732074656d00707573206672696e67696c6c612070656c6c656e7465737175652e2050656c006c656e74657371756520617420646f6c6f72206964206d6175726973206c61006f7265657420637572737573206e6f6e2071756973206d657475732e204475006973206163206d69206e6f6e2074656c6c7573206461706962757320706f7200747469746f72206e6f6e206574206c6967756c612e20457469616d20736f6400616c65732069642074757270697320696e20756c747269636965732e205365006420616e7465206c616375732c2068656e64726572697420757420706f7274007469746f722075742c206665726d656e74756d207669746165206c656f2e0a000a4372617320706861726574726120616e746520616e74652c2076756c7075007461746520666575676961742072697375732066617563696275732065676500742e2050726f696e2073697420616d65742074656c6c75732072686f6e637500732c207665686963756c61206469616d206e6f6e2c206567657374617320650073742e2043726173207669746165206c696265726f206e657175652e20446f006e656320697073756d2066656c69732c20696e74657264756d2076656c20650067657374617320656765742c20616c6971756574206e65632065726f732e2000446f6e6563206e697369206d617373612c20766573746962756c756d207665006c20656e696d2065742c206461706962757320636f6e67756520697073756d002e205072616573656e7420647569206573742c20636f6e67756520766974610065206d6f6c657374696520717569732c206d616c657375616461206567657400206469616d2e20457469616d206e6f6e2076697665727261206f7263692e2000566573746962756c756d206d6f6c6c69732065726f73206174206c65637475007320706f72747469746f7220756c6c616d636f727065722e20496e2066657500676961742066656c6973206e656320657820756c7472696365732c2073656400206665726d656e74756d206a7573746f2066696e696275732e204475697320006e6f6e20706f7375657265206e657175652c20657420636f6e73657175617400206f7263692e20416c697175616d206575206a7573746f20756c747269636500732c2076656e656e6174697320746f72746f722061632c2072757472756d2000656e696d2e0a0a496e7465676572206469676e697373696d207175616d20650075206d61757269732066696e6962757320666163696c697369732e204d617500726973206c6163696e6961206a7573746f206c65637475732c2076656c206c007563747573207175616d20766f6c757470617420766f6c75747061742e20550074206e6f6e206f726369206e756c6c612e2041656e65616e20617563746f72002073617069656e206120726973757320656c656d656e74756d206d616c657300756164612e204e616d2065676574206c6563747573206c696265726f2e2041006c697175616d20697073756d206d617373612c20736f6c6c69636974756469006e20616320696163756c697320612c206d6178696d757320657520747572700069732e204d616563656e61732076656c206e756e632076656c2065726f732000766f6c7574706174207472697374697175652076697461652061742065782e002043757261626974757220657420656e696d206d6f6c6c69732c20707265740069756d20646f6c6f7220717569732c2068656e647265726974206c61637573002e20496e2074656d70757320657569736d6f6420646f6c6f722c206964206400696374756d206d657475732072757472756d20717569732e0a0a43757261620069747572207072657469756d206c6f626f72746973207363656c65726973710075652e204d61757269732076656c206d69206120697073756d20766568696300756c61207363656c657269737175652e204e756c6c6120666163696c697369002e20446f6e656320636f6e736571756174206f64696f206120657261742075006c6c616d636f7270657220666163696c697369732e2044756973206d617373006120656e696d2c20756c74726963696573206e6f6e2075726e612071756973002c20657569736d6f64207072657469756d20746f72746f722e20457469616d002068656e647265726974206c656374757320766974616520656c656d656e7400756d2076756c7075746174652e20496e74657264756d206574206d616c657300756164612066616d657320616320616e746520697073756d207072696d69730020696e2066617563696275732e20536564206f64696f206d61676e612c2063006f6e73656374657475722073697420616d657420706f727461207669746165002c20766976657272612061206d61676e612e20437261732065752069707375006d20656c656966656e64206f64696f20766976657272612072757472756d20006574206e6f6e206c6f72656d2e20517569737175652071756973206c656f2000757420726973757320756c6c616d636f72706572207375736369706974207600656c206e6563206469616d2e20467573636520646170696275732065726f7300206e6f6e206e69736c2066617563696275732c20657420656666696369747500722073656d20706c6163657261742e20566573746962756c756d20616e74650020697073756d207072696d697320696e206661756369627573206f72636920006c756374757320657420756c74726963657320706f73756572652063756269006c69612063757261653b20416c697175616d2069642073656d206163206c6f0072656d20706f72747469746f72206c616f7265657420616320717569732065006c69742e0a0a446f6e65632076656c20646f6c6f72206d6178696d75732c20006d6f6c6c6973206d61676e612073697420616d65742c207068617265747261002076656c69742e2041656e65616e2070656c6c656e74657371756520737573006369706974206c6563747573206174207665686963756c612e20446f6e656300206e6563206661756369627573206469616d2e204e616d20656765742064750069206575206d6175726973206461706962757320616c697175616d206469630074756d206575206d61757269732e20446f6e6563206c6563747573206d65740075732c206d6f6c657374696520636f6e73657175617420756c747269636965007320656765742c206c616f72656574206e6563206475692e20446f6e656320006575206c656374757320717569732076656c697420656c656d656e74756d2000657569736d6f642e204d616563656e617320626962656e64756d206c61637500732073697420616d657420736f6c6c696369747564696e206c6163696e6961002e0a0a5175697371756520737573636970697420706f73756572652070757200757320636f6e64696d656e74756d20706f7274612e20457469616d2068656e00647265726974207574206c696265726f20696e2072757472756d2e204e756c006c616d20756c74726963696573206c696265726f20657420647569206c6f62006f72746973206672696e67696c6c612e20496e746567657220757420656c690074206d61676e612e2051756973717565207665686963756c61206d6f6c6c690073206c656f2c206964207665686963756c61206d61676e6120616c6971756500742075742e20457469616d206e6f6e20706f72747469746f72206e69736c2c002073697420616d65742076756c707574617465206469616d2e2050726f696e00206e6571756520657261742c20737573636970697420656765742066656c69007320696e2c20677261766964612066696e69627573207175616d2e205068610073656c6c7573206d617474697320746f72746f722072697375732c2075742000656c656d656e74756d206d6574757320737573636970697420626962656e6400756d2e0a0a4e756c6c616d207175616d2065782c20706f72746120696e2070007572757320696e2c206d6f6c65737469652074726973746971756520646f6c006f722e20457469616d207472697374697175652072697375732076656c206c0061637573206672696e67696c6c612c206174206c75637475732075726e612000616c697175616d2e20416c697175616d2065752066656c69732066657567690061742c20696163756c6973206c6f72656d2073697420616d65742c2070756c0076696e617220697073756d2e204e616d2076697461652074696e636964756e0074206d61676e612e204d617572697320756c6c616d636f727065722c206d650074757320636f6e64696d656e74756d20736f64616c657320756c6c616d636f00727065722c2073656d2074656c6c757320636f6e7365637465747572206c6500637475732c2061742074656d7075732073617069656e206d6175726973207600656e656e61746973206d61757269732e2041656e65616e2076657374696275006c756d20646f6c6f722065782c2076656c2076697665727261206e69626820006d6178696d7573207365642e20457469616d20636f6d6d6f646f206d616c65007375616461206f7263692e204e616d20616363756d73616e206469616d206e006563206e756e6320766f6c7574706174206566666963697475722e20467573006365207072657469756d20697073756d206c656f2c207175697320696e7465007264756d206172637520736f6c6c696369747564696e20656765742e205065006c6c656e746573717565206d617474697320617420697073756d206567657400207072657469756d2e0a0a536564206c656f206d692c207068617265747261002073697420616d657420696d706572646965742065752c2074696e63696475006e7420657420746f72746f722e2055742071756973207072657469756d206d0061676e612c20657520616c697175657420697073756d2e2050726f696e2061006320756c74726963657320697073756d2c2076656c206d6f6c6573746965200073617069656e2e20457469616d20736f64616c6573206e6571756520616320006f726e6172652070686172657472612e204d6f7262692071756973206175670075652073697420616d65742075726e6120706c6163657261742070756c7669006e61722e204375726162697475722076617269757320666163696c69736973002072697375732c206964207375736369706974207175616d20696d7065726400696574206d616c6573756164612e20416c697175616d20646170696275732c0020697073756d2076656c20636f6e64696d656e74756d206d61747469732c20006c6967756c6120657374206375727375732074656c6c75732c20657520696e0074657264756d20616e7465206c656f206e6f6e20616e74652e204e756c6c6100207175616d206e6973692c20706f737565726520657420616363756d73616e0020696e74657264756d2c2076756c707574617465206e6f6e2070757275732e00204e756e632076617269757320696d706572646965742066656c6973206e65006320696e74657264756d2e2050726f696e2076656e656e617469732061206c006967756c6120657420636f6e73656374657475722e2050686173656c6c757300206e65632065726f73206d6f6c6c69732c20756c7472696369657320656c690074206e6f6e2c206c6163696e6961206d692e2053757370656e646973736520006c6967756c6120617263752c206665726d656e74756d20617420617563746f007220717569732c20656c656966656e64207669746165206e69736c2e0a0a53006564206665726d656e74756d20707572757320696e206f64696f2070756c7600696e61722c20766573746962756c756d20656c656966656e64206573742063006f6d6d6f646f2e2046757363652076617269757320736564207475727069730020696e20666575676961742e20557420616320666163696c69736973206f6400696f2e20557420766f6c757470617420697073756d20646f6c6f722c20696e0020657569736d6f6420646f6c6f7220696e74657264756d2069642e20536564002073617069656e206573742c20696d70657264696574206575206f726e6172006520656765742c2074656d70757320656765742066656c69732e205068617300656c6c75732070656c6c656e7465737175652c206e756c6c61207369742061006d65742066696e6962757320677261766964612c207175616d206e69736c200064696374756d206a7573746f2c2073697420616d6574206672696e67696c6c0061206469616d206c616375732065676574206573742e20566573746962756c00756d20626c616e646974206d617572697320696e20616e7465206d6178696d00757320766f6c75747061742e2050656c6c656e74657371756520686162697400616e74206d6f726269207472697374697175652073656e656374757320657400206e65747573206574206d616c6573756164612066616d6573206163207475007270697320656765737461732e20566573746962756c756d2066656c6973200072697375732c2073616769747469732076656c20636f6d6d6f646f20736564002c20706f72746120617563746f722073656d2e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d616563656e6173206e65006320706f72747469746f722066656c69732e20446f6e656320656c656d656e0074756d2073656d206e756c6c612e0a0a416c697175616d20656c656d656e7400756d206575206c6f72656d206964206c75637475732e204e756e6320617420006e696268206573742e205072616573656e7420666175636962757320766172006975732065726174206e656320706f73756572652e204e756c6c616d20717500616d206c616375732c20766f6c7574706174206e6563206c616f7265657420006e6f6e2c20706f7375657265206163206c6967756c612e2050726f696e2071007569732065676573746173206e69736c2c20736564206c7563747573206665006c69732e204e756c6c61207072657469756d207175616d206e65632066696e006962757320656c656966656e642e20457469616d206d617572697320656e69006d2c2072686f6e6375732076656c206d616c657375616461207365642c2063006f6e64696d656e74756d2076697665727261206c696265726f2e20416c69710075616d207175616d2073656d2c2072757472756d2061742073617069656e20006e65632c206c616f7265657420666163696c69736973207475727069732e20004e616d206e65632074656d707573206573742e204d616563656e617320766100726975732c206e69626820617420636f6e73656374657475722074656d707500732c206e756e63206c6f72656d206672696e67696c6c6120617263752c2069006d706572646965742072757472756d206e69736c206475692061206175677500652e205072616573656e7420706c6163657261742073617069656e2073656400206d69206d6f6c6c697320666163696c697369732061206e6563207075727500732e205072616573656e7420736f6c6c696369747564696e2066656c697320006d617373612c2076656c206d6174746973206c656f2068656e647265726974002061632e2053757370656e646973736520657569736d6f642064696374756d002074696e636964756e742e0a0a416c697175616d2064617069627573206c6f0072656d20657520736f64616c65732066617563696275732e204e756c6c612000747269737469717565206f64696f2065742072697375732064696374756d2c0020756c74726963696573206c6f626f72746973206c6967756c61207361676900747469732e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e204e756e632074656d7075732076656c206572617420766974610065206c6163696e69612e204e756c6c6120696e20656765737461732065726f00732e204e756c6c616d2076656c20646f6c6f722076656c2076656c69742070006c6163657261742076756c70757461746520696e20736564206c616375732e0020416c697175616d206c6f626f7274697320616e746520696e2074656c6c75007320696163756c69732c206120636f6d6d6f646f207175616d20616363756d0073616e2e2050726f696e2066657567696174206c6967756c61206964206e75006e632076756c70757461746520646170696275732e20457469616d20707265007469756d207669746165206475692073697420616d657420616c697175616d002e2041656e65616e206c6f626f727469732072757472756d206e6973692c2000612074656d7075732065726f7320666163696c697369732069642e204d617500726973206e6f6e2061726375206174206e6973692076697665727261206375007273757320657520616320646f6c6f722e0a0a4e756e6320696e206f64696f00206d692e204e616d206d617474697320736564206c6967756c61207369742000616d65742074656d706f722e20496e74656765722064696374756d207269730075732066617563696275732c2076656e656e6174697320616e74652065752c0020756c747269636573206d61757269732e20446f6e6563206e656320636f6e0064696d656e74756d2065782e2053656420666163696c69736973206f64696f00206475692c207669746165206672696e67696c6c61206d61757269732061750063746f72206e6f6e2e20496e74657264756d206574206d616c657375616461002066616d657320616320616e746520697073756d207072696d697320696e200066617563696275732e2053757370656e646973736520717569732074656c6c007573206c616f726565742c20756c7472696365732073656d206e65632c20730063656c6572697371756520656c69742e20536564207363656c65726973717500652065737420766f6c75747061742c20636f6e64696d656e74756d20616e74006520612c2076656e656e61746973206d617373612e204d6f726269206e65630020617563746f72206c65637475732c206163207072657469756d206e696268002e204675736365207363656c65726973717565206d61737361206e6f6e206300757273757320706f7274612e20566573746962756c756d206d65747573207000757275732c20636f6e736571756174206964206672696e67696c6c6120612c002074656d707573207068617265747261206c65637475732e2056657374696200756c756d20736f64616c6573206c6f626f7274697320756c7472696365732e000a0a4e616d2073697420616d657420626c616e646974206573742e204675730063652073697420616d65742074696e636964756e7420646f6c6f722e20446f006e65632076656c206e697369206c616375732e204d617572697320706f7375006572652075726e6120616320656c656966656e6420616c69717565742e205300757370656e6469737365206661756369627573206665726d656e74756d206c00696265726f2c20616320617563746f72206d617373612068656e647265726900742074656d706f722e20467573636520706f72747469746f72206172637520006163206c656374757320626962656e64756d20636f6d6d6f646f2e205365640020617563746f72206575206f64696f2076656c20616c69717565742e20436c0061737320617074656e742074616369746920736f63696f737175206164206c0069746f726120746f727175656e742070657220636f6e75626961206e6f73740072612c2070657220696e636570746f732068696d656e61656f732e2056697600616d7573206574206c756374757320656e696d2e20566573746962756c756d002074656d706f7220616e746520736564206d61747469732064696374756d2e002051756973717565207068617265747261206172637520656765742075726e006120756c74726963657320617563746f722e204d6f72626920656c65696665006e6420636f6e736571756174206d692069642068656e6472657269742e20460075736365206d617474697320616e746520636f6e64696d656e74756d20706f00737565726520736f64616c65732e20437572616269747572206c6f626f72740069732075726e612073697420616d6574206d61747469732065676573746173002e204d6175726973206665756769617420656c69742074656c6c75732c2075006c7472696369657320696d70657264696574206469616d2074656d707573200076656c2e0a0a566573746962756c756d206672696e67696c6c6120747269730074697175652075726e6120657520706f7274612e2050726f696e206665756700696174206e69736c207475727069732c207574206c6f626f727469732072690073757320696d706572646965742061742e2050686173656c6c7573207369740020616d657420616c69717565742066656c69732c20766974616520706f737500657265206d692e20416c697175616d2073616769747469732076617269757300206e696268206e6563206f726e6172652e2050656c6c656e746573717565200074696e636964756e742076697461652065737420657520616c697175616d2e00204475697320696163756c697320757420617263752073656420656c656d65006e74756d2e20467573636520616363756d73616e2c20646f6c6f72206e6f6e002074656d70757320616363756d73616e2c20646f6c6f72207175616d2061750063746f72206e657175652c2071756973206f726e61726520616e7465206c65006f2069642070757275732e2050686173656c6c75732073656420656c65696600656e6420656c69742e204372617320657520706f737565726520616e74652e0020496e20616e7465206c6f72656d2c2070686172657472612073697420616d00657420766573746962756c756d207365642c2072686f6e637573206964206a007573746f2e2055742074656d707573206469676e697373696d20766568696300756c612e204d616563656e6173206d61757269732076656c69742c2065676500737461732073697420616d6574207661726975732076697461652c2066616300696c697369732073697420616d6574206c6967756c612e0a0a4d6175726973002067726176696461206c656f2073697420616d6574206f7263692076656e65006e617469732c207574206d6178696d75732073617069656e20636f6e736571007561742e204d6f726269206e6563206f7263692065782e20566976616d757300207665686963756c61206469676e697373696d20707572757320736564207400696e636964756e742e20467573636520657569736d6f64206e6f6e20656e69006d20657420636f6d6d6f646f2e205072616573656e7420766f6c757470617400206d6f6c6573746965206f726e6172652e20566976616d757320636f6e6469006d656e74756d2076656c697420656c656d656e74756d2c207072657469756d00207475727069732065752c20626c616e6469742072697375732e204675736300652070656c6c656e746573717565206d6178696d7573206e697369206163200073656d7065722e20416c697175616d20757420657569736d6f642076656c6900742c2073656420656c656d656e74756d206c6f72656d2e204d616563656e610073206964207269737573206e6f6e206d61737361206772617669646120636f006d6d6f646f2e204e756c6c616d20696e20707572757320696420656c69742000666163696c6973697320636f6e6775652e2041656e65616e20636f6e677565002076756c707574617465206c616f726565742e20416c697175616d20656765007420656c69742074656c6c75732e205175697371756520737573636970697400207175616d206163206d6173736120626962656e64756d2065676573746173002e20416c697175616d2071756973206578206e6f6e2076656c697420736365006c6572697371756520756c6c616d636f727065722069642065676574206d6100676e612e2041656e65616e20612073656d206e6f6e2065726174206c6f626f007274697320636f6e6775652e0a0a43726173206e6f6e20647569206f64696f002e205175697371756520766f6c7574706174207363656c657269737175652000697073756d206174207661726975732e20536564206f726e6172652073656d00207365642076656e656e6174697320636f6e7365717561742e204475697320006f726e6172652076656e656e61746973206d6f6c6c69732e2053656420657800206e657175652c2065666669636974757220626962656e64756d20706c616300657261742065742c20736f6c6c696369747564696e2076656c206f7263692e0020496e7465676572206e696268206e657175652c20666163696c6973697320006e6f6e206d61757269732076656c2c20636f6e73656374657475722074726900737469717565206e756c6c612e204e756e632073697420616d657420706861007265747261206c656f2e204e756c6c616d206c656f206f7263692c20696d70006572646965742073697420616d657420696e74657264756d20717569732c2000696163756c6973206575206e69736c2e20416c697175616d2073656420747200697374697175652073656d2c206e6563206c6f626f7274697320746f72746f00722e204d616563656e617320736f64616c6573207075727573206e65632061006c697175616d20706f72747469746f722e20447569732075742066656c69730020657261742e0a0a437261732061206d6173736120696d706572646965742c0020616363756d73616e2072697375732069642c207375736369706974206e75006e632e20446f6e65632073656d70657220656e696d206575206d61676e612000636f6e7365717561742074696e636964756e742e2053757370656e64697373006520636f6e736571756174206c6563747573207669746165206d657475732000616c6971756574206c616f726565742e20436c61737320617074656e74207400616369746920736f63696f737175206164206c69746f726120746f72717565006e742070657220636f6e75626961206e6f737472612c2070657220696e63650070746f732068696d656e61656f732e20446f6e656320696e74657264756d20006469616d206174206e69626820616363756d73616e2c20657420617563746f0072206d61737361206c6163696e69612e20467573636520696420657820766900746165207269737573206c616f7265657420706f72746120636f6e64696d65006e74756d206567657420656e696d2e2050686173656c6c7573206c656374750073206f64696f2c20666163696c6973697320612074656d707573207365642c0020736f64616c6573206575206475692e204e616d20696e206d616c65737561006461206f64696f2e205175697371756520706c61636572617420697073756d002076656e656e617469732072697375732074656d707573206661756369627500732e2050656c6c656e74657371756520656c656d656e74756d20646f6c6f72002071756973206672696e67696c6c612074656d7075732e20457469616d207400696e636964756e7420766172697573206c6f72656d20696e206f726e617265002e204e616d206120656c656d656e74756d206f7263692e2050686173656c6c0075732067726176696461206e69736c20657520656c697420756c74726963690065732c20657420626962656e64756d2074656c6c75732066696e696275732e000a0a4372617320626c616e6469742070756c76696e6172206d657475732c2000616320696e74657264756d2066656c6973206d6178696d757320626962656e0064756d2e2041656e65616e20626962656e64756d20696d706572646965742000636f6e64696d656e74756d2e204e616d206e6f6e206c61637573206c696775006c612e20517569737175652073656420766573746962756c756d207361706900656e2e20536564207665686963756c612074696e636964756e74206c656f200071756973206c6163696e69612e20536564206c61637573206c6f72656d2c2000756c747269636573206e6563206c6f72656d207365642c20706c6163657261007420766f6c7574706174206d657475732e205365642075742073656d207369007420616d657420746f72746f7220756c747269636573207375736369706974002076656c206174207475727069732e0a0a5574207669746165206175677565002073697420616d657420656c69742070756c76696e61722068656e64726572006974206e65632061206c6967756c612e20446f6e656320706f727461206e6900736920636f6d6d6f646f20616e7465207665686963756c612073656d706572002e2055742066696e696275732c20707572757320757420666175636962757300206d6f6c6c69732c2066656c6973206e65717565206d616c65737561646120006e6962682c2061632076656e656e61746973206e756c6c612076656c69742000612066656c69732e204d617572697320677261766964612c206c6967756c6100206964206c6163696e696120766976657272612c206a7573746f206c69626500726f20766172697573206c6967756c612c2073697420616d657420706f72740061206c6f72656d206c696265726f2061206d657475732e20416c697175616d0020756c6c616d636f72706572206d61757269732073617069656e2c2061206700726176696461207075727573207363656c6572697371756520717569732e20004e756c6c616d2072757472756d20746f72746f722073697420616d6574206f0064696f20656666696369747572207072657469756d2e2044756973206c616f0072656574206566666963697475722076656c69742c20612073656d706572200066656c69732e2050726f696e206e696268206c616375732c20637572737573002073697420616d6574206c656374757320717569732c2065666669636974750072207665686963756c61206475692e20446f6e65632061726375206c656f2c002072757472756d2075742063757273757320696e2c207363656c6572697371007565206574206c616375732e204d616563656e61732074696e636964756e740020617263752061206e6571756520666575676961742c2076656c206469637400756d206e69736c2073656d7065722e20446f6e6563206e756e632076656c6900742c20636f6d6d6f646f20696420746f72746f722076697461652c20616c690071756574206661756369627573206c6f72656d2e2041656e65616e2076617200697573206d61747469732073617069656e2065676574206d6f6c6c69732e2000446f6e65632076697461652075726e6120756c6c616d636f727065722c20640069676e697373696d20656e696d2076697461652c20766573746962756c756d00206d657475732e2050686173656c6c757320636f6e7365637465747572206500726f7320696d706572646965742c20677261766964612065726f732069642c00206d6f6c6c69732076656c69742e0a0a5574206163206c6163757320636f6e0076616c6c69732c207665686963756c61206e6571756520717569732c2065660066696369747572206f7263692e205574206d69206c616375732c206566666900636974757220657420736f6c6c696369747564696e2075742c206661756369006275732073697420616d657420616e74652e2053656420636f6e64696d656e0074756d206567657420656c697420617420677261766964612e20457469616d00206e6563206e69736c2073656420656e696d20706f72746120706c616365720061742e205072616573656e74206672696e67696c6c6120736167697474697300206c656f2c2076656c2074656d706f72206f64696f206d6f6c6c69732076690076657272612e20566573746962756c756d2066696e69627573206a7573746f002072697375732c2065752073656d706572206475692066696e69627573206100632e204d617572697320706c616365726174206c6563747573206e6973692c00206e6f6e20766573746962756c756d20746f72746f72206d6174746973206100632e204e756c6c61206e656320626962656e64756d207175616d2e0a0a53650064206574206469616d2065676574206c696265726f2070756c76696e617220006672696e67696c6c6120756c74726963696573206964207475727069732e20005072616573656e7420657520656e696d206672696e67696c6c612c20706c61006365726174206172637520696e2c20766573746962756c756d206e65717565002e20457469616d207665686963756c6120657261742064696374756d206e6900626820657569736d6f6420736f6c6c696369747564696e2e20507261657365006e74206e65632074757270697320616c69717565742c206c6f626f7274697300206c656f20717569732c207665686963756c61207175616d2e205068617365006c6c75732073656420626962656e64756d206e6973692e204d616563656e61007320696420646f6c6f72206567657420616e746520626c616e6469742064610070696275732e20446f6e656320656c656d656e74756d20736564206e696268002065752073616769747469732e20467573636520636f6e6775652073656d20006c6f72656d2c206e6f6e206672696e67696c6c61206f64696f20617563746f007220612e20566573746962756c756d20616e746520697073756d207072696d00697320696e206661756369627573206f726369206c75637475732065742075006c74726963657320706f737565726520637562696c69612063757261653b20004d616563656e61732073656420636f6e7365637465747572206a7573746f2e0020536564206566666963697475722061207175616d2073697420616d657420006d6178696d75732e0a0a416c697175616d20636f6d6d6f646f20616e746520006574206d6f6c657374696520706f72747469746f722e204d616563656e61730020766f6c7574706174206e69736c207363656c657269737175652c206c6f62006f72746973206d61757269732061632c2064696374756d206d617373612e200050686173656c6c7573206d616c657375616461206c6163696e6961206f6469006f2069642066696e696275732e204d616563656e61732061206d61676e6120006f64696f2e20467573636520697073756d2075726e612c2073616769747469007320666175636962757320616e7465207365642c20756c747269636573206400617069627573206d61757269732e2053757370656e6469737365207574206f0064696f20717569732073656d206461706962757320616c697175616d20696e0020696420646f6c6f722e205574206d61747469732071756973206f64696f20007669746165206c6f626f727469732e20416c697175616d20616320746f7274006f72206163206d657475732073656d70657220766976657272612e20416c69007175616d206e65632064696374756d206d617373612c2076656c2073757363006970697420656c69742e2044756973207365642073656d206575206e6962680020636f6e736563746574757220696163756c69732076656c207574206175670075652e2044756973207669746165206c75637475732075726e612e204e616d00206e756c6c61206e6962682c20626c616e6469742073697420616d6574207300656d7065722076697461652c206d6f6c6c6973206c6f626f72746973206e75006e632e2053656420757420666175636962757320746f72746f722c20656765007420696163756c6973206f7263692e20496e206120626c616e64697420647500692c206174207068617265747261206d657475732e20457469616d2068656e00647265726974206c696265726f207669746165206c656374757320737573630069706974206f726e6172652e2051756973717565206d6174746973206c6163007573206174207068617265747261207661726975732e0a0a4d616563656e61007320666163696c6973697320656c697420756c74726963657320707265746900756d206c6f626f727469732e2046757363652076656c20766573746962756c00756d20657261742e20457469616d206175677565206d617373612c20666575006769617420766974616520657261742061632c206c6f626f7274697320766f006c7574706174206d61676e612e20446f6e6563206d616c6573756164612073006564206c6967756c6120717569732066696e696275732e204e756c6c616d20006566666963697475722076697665727261206475692c206e6f6e2076657374006962756c756d20746f72746f7220696e74657264756d2076656c2e2050726f00696e20616e7465206573742c20626c616e64697420696e207363656c65726900737175652073697420616d65742c20756c74726963696573206e6563206572006f732e205365642065726174206e69736c2c2067726176696461206574207400656d706f722065742c206665726d656e74756d2073697420616d6574206578002e2053656420656666696369747572206d6920766974616520657569736d6f0064206672696e67696c6c612e2053757370656e646973736520656765742061007563746f72206e6962682e20446f6e6563206e656320706861726574726120006f64696f2c2068656e64726572697420636f6e64696d656e74756d20646f6c006f722e0a0a4d6f72626920696d706572646965742c206469616d206e6563200076756c7075746174652072757472756d2c20746f72746f72206c6f72656d2000696e74657264756d20616e74652c207669746165206375727375732074757200706973206f64696f206e6f6e206d61676e612e20446f6e6563206c616f7265006574207669746165206d61676e612073697420616d657420617563746f722e00204372617320617563746f72206e69736c2071756973207661726975732063006f6d6d6f646f2e204d6175726973206174206c6163696e6961206e756c6c61002e20566573746962756c756d20666575676961742073656d206174206d61730073612066617563696275732064696374756d2e2046757363652076656c207300617069656e2073697420616d6574206a7573746f2073757363697069742061006363756d73616e2075742076656c206f7263692e204e756c6c612066616369006c6973692e204e756c6c616d20736f6c6c696369747564696e20737573636900706974206e6973692c20657520616363756d73616e206d6574757320636f6e00736563746574757220766573746962756c756d2e2051756973717565207465006c6c7573206d657475732c2073656d7065722074656d707573206d657475730020717569732c2064696374756d20656c656d656e74756d2066656c69732e200053757370656e646973736520636f6e76616c6c697320707572757320616320006c61637573207072657469756d2c20616320616c697175657420657374206600696e696275732e2050656c6c656e74657371756520626962656e64756d20700075727573206d61676e612c2073697420616d657420637572737573206e65710075652066657567696174206e6f6e2e2043757261626974757220696e206d610078696d7573206a7573746f2e2041656e65616e20696163756c6973206c616300696e69612072686f6e6375732e0a0a536564206672696e67696c6c61207365006d206163206d61737361206d616c6573756164612c206d617474697320696d0070657264696574207175616d2073757363697069742e2043726173206c616300696e69612061632065782076697461652072757472756d2e20536564206578002066656c69732c20706f727461206e656320617263752061632c2066696e6900627573206c7563747573207475727069732e204475697320697073756d206c00696265726f2c20696e74657264756d20757420696e74657264756d2075742c0020656c656d656e74756d206163206a7573746f2e204d6f7262692074726973007469717565206c6f626f7274697320706c6163657261742e2050656c6c656e007465737175652074696e636964756e742074656d70757320656e696d2061740020636f6e6775652e204e756c6c61206d61747469732074696e636964756e7400206e6973692c2061742072686f6e63757320616e746520656c656966656e64002068656e6472657269742e204e756c6c616d2064696374756d20706861726500747261206475692e20566573746962756c756d206c75637475732065737420007574206175677565207472697374697175652c2073697420616d657420656c00656d656e74756d2074656c6c757320656c656966656e642e20496e746567650072206e6563206f726e617265206a7573746f2c207175697320706f72746120006469616d2e2051756973717565206e6f6e206e697369206e6f6e206c6f7265006d2070756c76696e617220706f73756572652061206567657420656c69742e00205365642065676574206c6163696e69612073656d2e2050686173656c6c750073206e6f6e206e756c6c612074656d7075732c207363656c6572697371756500206c696265726f2076656c2c207068617265747261206e6962682e0a0a5375007370656e6469737365206469676e697373696d20636f6e67756520657374200069642070686172657472612e20447569732076697461652066656c69732069006e206c656374757320666163696c6973697320706861726574726120736564002061632070757275732e2050656c6c656e7465737175652076656e656e617400697320706c616365726174206d61757269732c206120626962656e64756d20006d6175726973206566666963697475722076697461652e204d6f7262692065006666696369747572206d65747573206575207363656c65726973717565206600617563696275732e20566573746962756c756d20616e746520697073756d20007072696d697320696e206661756369627573206f726369206c75637475732000657420756c74726963657320706f737565726520637562696c6961206375720061653b2041656e65616e20696e74657264756d20666163696c6973697320710075616d20717569732066617563696275732e20566573746962756c756d2061006e746520697073756d207072696d697320696e206661756369627573206f72006369206c756374757320657420756c74726963657320706f73756572652063007562696c69612063757261653b205072616573656e74206c6f626f7274697300206d61676e612071756973206e697369206d616c657375616461206d617869006d75732071756973206e6f6e206c6f72656d2e20437572616269747572206e006f6e206e756c6c612073697420616d657420657261742074696e636964756e007420666163696c6973697320617420657420746f72746f722e204d6f72626900206964206175677565207669766572726120697073756d2070756c76696e610072207363656c657269737175652071756973206e65632076656c69742e204e00616d2076656c206f64696f20636f6d6d6f646f2c20706f72746120617263750020696e2c20666163696c697369732073617069656e2e204e756e63207369740020616d65742076656e656e6174697320657261742c206174206c616f72656500742061756775652e20446f6e656320617563746f722070757275732071756900732074656d706f7220666575676961742e20496e2071756973206c6f72656d002065676574206e756e63206c6163696e696120646170696275732e20446f6e00656320696163756c6973206573742076656c2072686f6e63757320616c69710075616d2e0a0a4d6f726269206d61676e61206f64696f2c2076656e656e61740069732076697461652073656d2069642c20646170696275732074656d70757300206e756e632e204d6f7262692066617563696275732074656d706f72206d610078696d75732e205175697371756520657520696d70657264696574206d6167006e612c20696420616c697175616d2075726e612e20446f6e6563207574206c00696265726f206475692e20457469616d206d6174746973206e756c6c6120710075697320617567756520696e74657264756d2c2061206d6f6c657374696520006f726369207472697374697175652e20446f6e6563206e656320756c6c616d00636f72706572206e6962682c2061742074696e636964756e74207075727573002e204475697320626c616e646974206e69626820756c74726963696573206f0072636920616363756d73616e20736f6c6c696369747564696e2e20446f6e6500632069642061756775652071756973206e65717565206c616f72656574206f00726e6172652e204e756e632072757472756d206a7573746f2075742065676500737461732068656e6472657269742e20437261732074656d70757320696e20006d617572697320612074696e636964756e742e0a0a557420706f7274746974006f722074656d70757320616c697175616d2e204d616563656e617320677261007669646120636f6e736571756174206d692c2065742074726973746971756500206c6f72656d20666575676961742073697420616d65742e20507261657365006e7420736564206d6178696d7573206f64696f2c206567657420636f6e736500637465747572206c616375732e20416c697175616d20647569206e65717565002c207669766572726120636f6e73657175617420636f6e6775652076656c2c0020636f6e736571756174206964206f7263692e2041656e65616e2066696e69006275732065782073656d706572206e69736c206d61747469732c207175697300206c756374757320656e696d206c6163696e69612e2050726f696e20696420006d61737361206d61757269732e20496e74656765722065752061726375206c006163696e6961206c656374757320657569736d6f64206c75637475732e2049006e20766f6c7574706174206e6f6e206d657475732073697420616d65742063006f6e76616c6c69732e204e616d206c6967756c61206d657475732c20666572006d656e74756d2065752074656c6c75732069642c20656c656966656e642076006172697573206e657175652e204675736365206175677565206c6f72656d2c0020706861726574726120612073656d2076656c2c20636f6e64696d656e7475006d206d617474697320646f6c6f722e2046757363652073656d706572206e6900736c20696e2075726e612073757363697069742c206567657420707265746900756d206a7573746f20736f6c6c696369747564696e2e0a0a496e7465676572002076697461652072686f6e637573206573742c207175697320626962656e6400756d2072697375732e20457469616d206d616c657375616461206175677565002065752074656d70757320636f6e76616c6c69732e205175697371756520710075697320656c697420666575676961742c20756c6c616d636f72706572206e0069626820696e2c206c7563747573206d617373612e2050686173656c6c75730020636f6e76616c6c69732073617069656e2076656c206c616375732074696e00636964756e742c206e656320657569736d6f64206573742070656c6c656e740065737175652e20416c697175616d20706f727461206a7573746f206120756c00747269636965732068656e6472657269742e204d6175726973206c756374750073206175677565206575206c656374757320646170696275732c2075742070006f72746120656c69742070656c6c656e7465737175652e20496e74656765720020736564206d61676e6120757420646f6c6f722074696e636964756e7420660072696e67696c6c61206964206174206475692e204d6f72626920656c65696600656e642072697375732073697420616d6574206d61676e612074656d707573002c207665686963756c61206c6f626f72746973206f72636920736f6c6c69630069747564696e2e204e616d2065742074656d706f72206d61676e612e204d6f007262692071756973207072657469756d2072697375732c2075742076656e65006e617469732074656c6c75732e204d617572697320706f72746120646f6c6f007220657420636f6e73656374657475722068656e6472657269742e204e616d002070656c6c656e7465737175652065676573746173206f64696f207472697300746971756520677261766964612e2050656c6c656e74657371756520696420006665726d656e74756d206469616d2e20496e20636f6e736563746574757220006d692076656c206c696265726f20657569736d6f642064696374756d2e2044006f6e656320736167697474697320616e7465206d617373612e20507261657300656e74206163206175677565206e657175652e0a0a536564206d6173736120007475727069732c20636f6e76616c6c69732065676574207665686963756c61ba020000002065752c20636f6e64696d656e74756d20736564206d657475732e205365640020636f6e64696d656e74756d20766f6c7574706174206573742c2076656c200070756c76696e6172206e69736920736f6c6c696369747564696e206e6f6e2e0020496e7465676572207574206d61676e6120657420746f72746f72206469630074756d20636f6e64696d656e74756d20696e20706f727461206573742e2049006e2073697420616d65742061756775652065782e204e756e632076657374690062756c756d206964206c616375732076656c2070756c76696e61722e205072006f696e2070756c76696e6172206d6173736120757420616e7465206d617869006d75732c207669746165206c7563747573207175616d20656765737461732e002044756973206d6178696d757320616e74652073697420616d6574206d616c00657375616461206469676e697373696d2e204675736365207574206c656f2000626c616e6469742c20666163696c69736973206d657475732061742c20636f006e736571756174206c696265726f2e20437261732076656e656e6174697320006e69736920656765742075726e61206665726d656e74756d2c206174206669006e69627573207175616d20696163756c69732e20517569737175652076656c00206c6f72656d2065782e2050726f696e206a7573746f2066656c69732c20730063656c6572697371756520736564206f64696f2069642c20666575676961740020736f6c6c696369747564696e207175616d2e20496e74656765722076617200697573206f7263692073697420616d65742076756c7075746174652068656e006472657269742e204d6f726269206d6178696d75732c2065726f73206e6f6e0020636f6e7365717561742066696e696275732c207175616d206e6962682075006c6c616d636f72706572206475692c20616320696e74657264756d2073656d0020616e746520766974616520746f72746f722e204375726162697475722076006974616520706861726574726120656e696d2e20437261732073757363697000697420636f6e677565206c656f2c20696e20736f6c6c696369747564696e20006e697369207472697374697175652061742e20566976616d757320706f7274007469746f7220746f72746f7220636f6e64696d656e74756d2c20696163756c006973206c6967756c612075742c207472697374697175652065726f732e0a0a00496e206575206c756374757320616e74652e204d6f726269206d6178696d7500732075726e61206e6f6e206c6967756c6120706f73756572652c206120766f006c7574706174206f7263692073616769747469732e204e616d20617420656c0069742065676574206d692066696e696275732073656d70657220756c747269006365732073656420616e74652e205072616573656e742065752073656d70650072206f7263692e204e616d2071756973206469616d206e65632065737420650066666963697475722073656d7065722e204d6f7262692073697420616d657400206f64696f2070656c6c656e746573717565206e69736c20626c616e6469740020736f64616c65732e20447569732067726176696461206964206c6f72656d0020657520616c69717565742e205365642065726f73207475727069732c207300757363697069742073697420616d657420736f64616c6573207365642c2066006163696c69736973206574206573742e204f72636920766172697573206e6100746f7175652070656e617469627573206574206d61676e697320646973207000617274757269656e74206d6f6e7465732c206e6173636574757220726964690063756c7573206d75732e20566976616d75732073656d7065722074656d706f0072207661726975732e20416c697175616d20696420616c697175616d20646900616d2e0a0a416c697175616d20746f72746f72206573742c206c7563747573002065752075726e6120717569732c2074656d7075732068656e6472657269740020617263752e20566573746962756c756d2073697420616d657420656c656d00656e74756d206c656f2e2053757370656e64697373652071756973206e756e006320612073617069656e2068656e64726572697420696d706572646965742e002053656420696e2065676573746173206c696265726f2e20446f6e65632063006f6e6775652073697420616d6574206e6571756520646170696275732065750069736d6f642e204675736365207363656c657269737175652076656c20707500727573206964207363656c657269737175652e2050726f696e2076656c2070006f72747469746f72206e69736c2e0a0a4d6f726269206964206475692065670065742074757270697320696163756c697320636f6e6775652e204e756c6c61006d20617563746f722c206c6967756c61206567657420636f6d6d6f646f20700072657469756d2c206c696265726f206e756c6c6120756c7472696369657320006f64696f2c2075742072757472756d2061726375206172637520696e206e690073692e204d61757269732065676574206c6163757320696e20657820766172006975732073616769747469732073656420696e20656c69742e204d617572690073206d6f6c6573746965206f64696f206574206f7263692070686172657472006120706c6163657261742e20496e746567657220696e20747572706973206500676574206c696265726f20636f6e7365637465747572206c6f626f7274697300206575206e6f6e206c616375732e204d616563656e61732064696374756d20006c656f2074656d707573206c61637573206d617474697320736f64616c6573002e20446f6e6563206a7573746f206f64696f2c2074696e636964756e7420610063206172637520656765742c20666175636962757320706f73756572652064006f6c6f722e205072616573656e742065676574206e756e63206e6563206665006c697320696e74657264756d2072686f6e6375732e20566573746962756c75006d20656c656d656e74756d206461706962757320636f6e7365637465747572002e2053757370656e6469737365206964206e756e63206d61747469732c206c007563747573206e6962682073697420616d65742c20636f6e64696d656e7475006d2065782e20496e7465676572206f726e6172652075726e6120766974616500206e697369206c7563747573206469676e697373696d2e2041656e65616e200074696e636964756e742068656e647265726974207269737573206e6f6e2061006363756d73616e2e204e756c6c6120617420736f64616c6573206e69736c2e0020496e74656765722068656e647265726974207669746165206d61676e61200076697461652073757363697069742e20437261732064617069627573206c65006374757320736564206c656f207363656c657269737175652073656d706572002e204d61757269732061207269737573206e756c6c612e0a0a5365642069610063756c69732c206c656f20757420766573746962756c756d206672696e6769006c6c612c2066656c69732073617069656e20636f6e76616c6c6973206c6563007475732c2076656c206c616f72656574207175616d206f7263692061206d6100757269732e204e756c6c616d20657520616363756d73616e2073617069656e002e2050656c6c656e746573717565206d617474697320736f64616c6573206d0061757269732c20757420636f6e64696d656e74756d206d61676e6120636f6e006775652076656c2e2041656e65616e20706f72747469746f72206e6973692000616320657261742066617563696275732073757363697069742e205068617300656c6c757320656c656d656e74756d2074696e636964756e74207175616d20006e656320636f6e64696d656e74756d2e204375726162697475722066696e6900627573206e756c6c612076656c206c6163696e696120696d70657264696574002e204d616563656e61732066657567696174206d617474697320646f6c6f72002c206e656320616363756d73616e20697073756d2074656d706f722075742e002050686173656c6c757320617563746f7220666163696c69736973207275740072756d2e20536564207669746165206d69206e6f6e206f64696f2070656c6c00656e74657371756520626c616e64697420696e2061206d61676e612e0a0a5300656420696e206469616d20636f6e6775652c20636f6d6d6f646f20746f7274006f7220612c20657569736d6f64206c6967756c612e20496e2061632065666600696369747572206e756e632c2076656c20756c6c616d636f727065722069700073756d2e20416c697175616d2076656c206469616d206665726d656e74756d002c20736f6c6c696369747564696e20617263752065742c20656c656d656e7400756d2073617069656e2e2043726173206c656f206d657475732c2072686f6e006375732071756973206d617373612065752c20677261766964612069616375006c697320657261742e2043757261626974757220756c747269636573207369007420616d657420656e696d20757420617563746f722e2041656e65616e20610074206175677565206163206a7573746f2074656d70757320626962656e6475006d2073656420696d7065726469657420746f72746f722e204e756c6c616d2000736564206d61757269732073617069656e2e20447569732070656c6c656e740065737175652075726e6120696e2066696e69627573206d6f6c65737469652e00205072616573656e74206e6f6e207072657469756d206d61676e612c206e650063206c6163696e696120746f72746f722e2050726f696e2066617563696275007320656c656d656e74756d206c6f72656d2c2072686f6e6375732076756c7000757461746520657820616c69717565742061632e0a0a416c697175616d207400696e636964756e7420617263752073617069656e2c20616c697175657420730075736369706974206c656f20656c656d656e74756d2076697461652e204372006173206d617474697320617263752076656c206f726e617265206665726d65006e74756d2e204d6f72626920636f6e76616c6c6973206e697369206d6f6c65007374696520657261742073656d7065722c20736564206c7563747573206e65007175652076756c7075746174652e2053757370656e6469737365206d616c650073756164612c20646f6c6f722076656c20756c74726963657320696d70657200646965742c206d69206e69626820756c74726963696573207475727069732c00206e6563207072657469756d206c696265726f20697073756d207669746165002072697375732e20416c697175616d20696e20636f6e677565206c61637573002c20666575676961742076756c7075746174652065726f732e20496e206c61006f72656574206e69626820696e2076756c7075746174652076657374696275006c756d2e205574206661756369627573206f726e617265206e756e63207369007420616d657420656c656966656e642e205072616573656e7420706c616365007261742073617069656e2076656c20656c69742074656d706f722062696265006e64756d2e204e756c6c612071756973207665686963756c6120617263752e002053757370656e646973736520736f64616c6573206c656f2061632075726e006120616c69717565742076756c7075746174652e20536564206d6f6c6c6973002c206c6163757320657520656c656966656e6420736f64616c65732c206d6100676e61206172637520766172697573206c656f2c20657520626c616e646974002066656c6973206572617420657420746f72746f722e205072616573656e74002074656d7075732073697420616d6574206d61676e61207669746165206f72006e6172652e20416c697175616d20656c656966656e642076656c206f64696f0020696420636f6e7365717561742e204d6175726973206574206e657175652000717569732073617069656e20706f737565726520756c74726963696573206500752073697420616d65742075726e612e20437261732072686f6e637573206500726f732076656c2073656d2070756c76696e61722066696e69627573206120006e6f6e2072697375732e0a0a536564206c6f626f72746973206f64696f20710075616d2c206e6f6e20637572737573206e756c6c6120616c697175616d206e006f6e2e20446f6e65632061726375206573742c20666163696c697369732069006e20666175636962757320612c2070686172657472612073697420616d657400206e69736c2e205175697371756520696163756c6973206c656f206e6f6e2000656c656d656e74756d20706c6163657261742e205365642076657374696275006c756d206c656f20616e74652c20616320636f6e76616c6c697320647569200073616769747469732069642e20496e20686163206861626974617373652070006c617465612064696374756d73742e20536564206d6f6c657374696520636f006e76616c6c69732066656c69732c20696e2070656c6c656e7465737175652000616e746520696e74657264756d20612e20566976616d757320706c6163657200617420656c656966656e6420616e74652e2050656c6c656e746573717565200073697420616d6574206f64696f207665686963756c612c207361676974746900732065737420656765742c20656c656d656e74756d206c6f72656d2e204d61007572697320656c6974206d61676e612c20636f6e6775652076656c2065726f0073206e65632c20696163756c6973206d616c65737561646120616e74652e2000566976616d757320696e20656666696369747572206f64696f2c20717569730020616c697175616d206e756c6c612e204e756c6c61207574206469676e69730073696d206475692e20496e206567657374617320666163696c69736973206c006f72656d2c206e6f6e20656c656d656e74756d20647569207665686963756c0061206e65632e204e756c6c61206d616c65737561646120706f72747469746f00722065782061206f726e6172652e204e756c6c61206e6f6e2076617269757300206f64696f2e2041656e65616e206e656320696d70657264696574207361700069656e2e20446f6e6563206e69736920617263752c2070756c76696e617220007072657469756d206d616c6573756164612061632c20706f72746120766974006165207175616d2e0a0a437572616269747572206d6f6c65737469652c206d006920696e74657264756d206c7563747573206375727375732c207269737573002073617069656e206c6f626f72746973206c656f2c206174206566666963690074757220617567756520656c6974207365642074656c6c75732e204e756e6300207375736369706974206c7563747573206e69736c2073697420616d65742000626962656e64756d2e20446f6e6563206e6f6e20637572737573207075727500732c206163206661756369627573206a7573746f2e2050726f696e2061756300746f7220766f6c7574706174206e756e632c20696e2074726973746971756500206e69736c20626962656e64756d2061742e2053757370656e6469737365200076656e656e61746973206e756e63206e69736c2c206e6563206772617669640061206c696265726f2074726973746971756520696e2e20517569737175652000706c6163657261742061206e69736c20616320706c6163657261742e204165006e65616e20756c74726963696573206c696265726f20696420697073756d200072686f6e6375732c2073697420616d657420616c697175616d20656e696d20006c75637475732e20447569732076656e656e6174697320646f6c6f72206574002074656c6c757320636f6e736571756174206c6f626f727469732e20446f6e00656320696e206469616d20706f73756572652c206665726d656e74756d207200697375732065742c2070756c76696e6172206e657175652e0a0a496e746567006572206e6563206e6962682065752074656c6c7573207072657469756d2069006e74657264756d206174206574206469616d2e204e756c6c612070656c6c65006e746573717565206f64696f20717569732065726f7320656765737461732000736f64616c65732e2043757261626974757220656765742074656d70757320006469616d2e2050656c6c656e74657371756520756c747269636965732061720063752065782c206120696d70657264696574206a7573746f20706f7375657200652076656c2e2050726f696e2076756c70757461746520736f64616c657320006d617373612061742070686172657472612e20496e7465676572206e6f6e20006d61737361207574206c6967756c6120666575676961742074656d7075732e0020517569737175652073616769747469732076656c206e756e6320757420740072697374697175652e2041656e65616e2075742074656d706f72206a757374006f2e20446f6e656320636f6e677565206e69736c20736564207175616d206d006f6c6573746965206d6f6c6c69732e204e756c6c616d20706c616365726174002c20747572706973206567657420677261766964612072757472756d2c206600656c69732076656c697420616c697175616d2065726f732c20696420656c65006d656e74756d206c6967756c612075726e6120696420657261742e204e756c006c61206e65632072686f6e6375732073656d2e205574206e656320766568690063756c612065782c2076656c2068656e647265726974206e657175652e2055007420706c6163657261742076656c69742076656c2076656c69742068656e640072657269742c207669746165206665726d656e74756d207269737573206d6f006c65737469652e0a0a4d6175726973206f726369206c65637475732c20696d0070657264696574207365642066696e69627573206e65632c20616c69717561006d2076656c206e6962682e20566573746962756c756d206672696e67696c6c006120616363756d73616e206e756e63206574206d6f6c65737469652e205574002065742065726174206a7573746f2e2050656c6c656e74657371756520677200617669646120617263752070757275732e2041656e65616e20696e206e6962006820766974616520617263752064696374756d2074696e636964756e74206900642065752066656c69732e205072616573656e7420657420656c697420696400206d6920636f6e736563746574757220616c697175616d2e2056657374696200756c756d20696e20656e696d2064696374756d2c20626962656e64756d206500726174206e6f6e2c20756c74726963696573206f64696f2e2050656c6c656e0074657371756520636f6e76616c6c6973206f726369206e6973692c206e65630020756c74726963696573206f64696f20706f73756572652073697420616d6500742e0a0a4d616563656e61732073697420616d6574206665726d656e74756d00206e69736c2e20566573746962756c756d20616e746520697073756d20707200696d697320696e206661756369627573206f726369206c75637475732065740020756c74726963657320706f737565726520637562696c6961206375726165003b205072616573656e74206174206e756e6320696e206d61676e6120636f6e00736571756174207363656c657269737175652e204d616563656e617320696e00207175616d207574206a7573746f2074696e636964756e7420617563746f72002e2050686173656c6c757320757420646f6c6f72206d657475732e20496e200073656d706572206d6920736564206c6f72656d207068617265747261207268006f6e6375732e204675736365206567657420657374206c616f726565742c20007361676974746973206c696265726f2073697420616d65742c206665756769006174206e6962682e204d6f72626920646170696275732075726e6120616320007175616d206665726d656e74756d2072686f6e6375732e20446f6e65632063006f6e76616c6c697320657569736d6f64206469676e697373696d2e204375720061626974757220757420747269737469717565206c6967756c612e0a0a536500642072757472756d2074696e636964756e74207472697374697175652e204e00756e63206d69207175616d2c20637572737573206574207665686963756c610020656765742c2074696e636964756e74206e6f6e20646f6c6f722e20446f6e00656320617563746f722066696e69627573206f726e6172652e204d6f72626900207665686963756c612c206e69736c2076656c20636f6d6d6f646f20706f7200747469746f722c20646f6c6f72206e756e6320736167697474697320646961006d2c20656765742066617563696275732073617069656e2065782076656c20006d61676e612e204375726162697475722076656c206c6967756c61207369740020616d6574206c6967756c6120646170696275732066696e696275732e2045007469616d2073697420616d6574206c6f72656d206c65637475732e204e756c006c616d206665726d656e74756d206e69736c206c696265726f2c207669746100652074696e636964756e74207075727573206c6163696e696120717569732e00204d6f726269207574206d6f6c657374696520697073756d2c206575206d6f006c6573746965206c6967756c612e2050686173656c6c7573206574206c656300747573206a7573746f2e20566976616d7573206578206d61676e612c20636f006e7365717561742076656c206a7573746f2076656c2c2074656d706f722061006c697175616d20616e74652e205365642066696e6962757320736564206d6100737361207175697320636f6d6d6f646f2e20446f6e656320696e206e69626800206e65632074656c6c757320636f6e677565206469676e697373696d206567006574207669746165206e756c6c612e204475697320656c656966656e642070006c616365726174207269737573206120706c6163657261742e204d617572690073206e6563206c65637475732068656e6472657269742c207361676974746900732076656c697420636f6e64696d656e74756d2c206567657374617320647500692e0a0a4e616d20696163756c69732076656c697420717569732075726e610020706f7274612073616769747469732e2041656e65616e20636f6d6d6f646f00206e69736c206e656320697073756d206c6f626f727469732c20626962656e0064756d2065666669636974757220656e696d20636f6e64696d656e74756d2e002050726f696e206172637520656c69742c206665726d656e74756d2075742000656765737461732061742c206c616f726565742076656c206e69736c2e2049006e746567657220626962656e64756d20747572706973207574206469616d20006665726d656e74756d2c2065752074656d707573206c656f206672696e6769006c6c612e204d616563656e61732076656c697420617263752c20636f6e6469006d656e74756d20696d7065726469657420657261742065742c206661756369006275732076756c707574617465206c65637475732e2043757261626974757200206d6574757320656e696d2c206672696e67696c6c6120757420666163696c00697369732061632c20616363756d73616e20696e20697073756d2e204e756c006c616d207665686963756c61206c6163696e6961206d617373612c2076656c00206661756369627573206f64696f20636f6e64696d656e74756d2061742e20004d617572697320706f72747469746f722065726f73206d61676e612c20757400206d6178696d75732074656c6c7573206665726d656e74756d2069642e2056006976616d7573207574206c6563747573206f726e6172652c20706f7274746900746f72206469616d20656765742c20756c6c616d636f72706572206e696268002e20447569732076656e656e617469732074656d706f7220657261742c207500742076617269757320657374206c6f626f727469732076656c2e205068617300656c6c757320736564206578206c65637475732e205365642076656c207361007069656e20616c697175616d2c20696e74657264756d206475692069642c2000656c656966656e64206f7263692e0a0a5072616573656e74206174206c6f62006f72746973206d657475732e204e616d2074656d707573207175616d20647500692c206e6563206c7563747573206d617373612074696e636964756e742061002e2050656c6c656e74657371756520616363756d73616e2076656c697420750074206175677565206d617474697320636f6e76616c6c69732e205574206567006573746173206f64696f20656e696d2c206163207669766572726120616e74006520636f6e76616c6c69732075742e2041656e65616e20696e2064756920610074207175616d206665726d656e74756d2072757472756d2e20566976616d750073206567657420636f6e76616c6c6973206c65637475732e20457469616d2000657569736d6f64206672696e67696c6c6120746f72746f722c206e65632069006e74657264756d206a7573746f206d61747469732065752e204e756c6c616d00206d6178696d7573206e696268206469616d2c206575206c6f626f7274697300206a7573746f207072657469756d2076697461652e2051756973717565207400696e636964756e7420646f6c6f722061742075726e6120636f6e64696d656e0074756d2c207669746165206d616c6573756164612065737420706f7274746900746f722e2050656c6c656e746573717565207669746165206475692065782e0020566976616d757320766f6c757470617420697073756d207574207475727000697320656c656d656e74756d20706f7274612e20496e74657264756d20657400206d616c6573756164612066616d657320616320616e746520697073756d20007072696d697320696e2066617563696275732e204d617572697320736564200066656c6973206e756c6c612e205072616573656e742076656c207269737573002076656c69742e0a0a446f6e656320706f727461206174206469616d207365006d70657220616c69717565742e2041656e65616e20637572737573206c6f7200656d206e6f6e2076617269757320636f6d6d6f646f2e20536564206e65717500652065726f732c20656666696369747572206e6563206469616d20696e2c20007472697374697175652076697665727261206469616d2e2053757370656e64006973736520746f72746f72206475692c20657569736d6f64206e6563206e75006c6c612061632c20616c697175657420756c74726963696573206c6f72656d002e2050686173656c6c757320636f6e7365637465747572206575206573742000616320656765737461732e204e756e6320757420656c697420696e2070757200757320616363756d73616e20657569736d6f642e2043726173206c656f206f007263692c20677261766964612076656c20626962656e64756d20656765742c0020636f6e76616c6c697320696e2072697375732e2046757363652065676574002073656d7065722073617069656e2e0a0a536564206d6f6c65737469652070006c616365726174206c6967756c61206e656320766976657272612e20496e2000617420656666696369747572206d61676e612e204e616d2066696e6962757300206c6f72656d20657420726973757320756c747269636965732c2076656c2000637572737573206e65717565207363656c657269737175652e20496e7465720064756d206574206d616c6573756164612066616d657320616320616e74652000697073756d207072696d697320696e2066617563696275732e205365642069006e20656765737461732065726f732e2041656e65616e2074656d706f722c20006e69626820636f6d6d6f646f20626962656e64756d206c75637475732c207600656c6974206e756e6320696e74657264756d206f7263692c2073697420616d0065742074656d707573206c656f207075727573207669746165207269737573002e20457469616d207669746165207269737573206e6962682e2056657374690062756c756d206d6f6c65737469652063757273757320616e74652c206567650074206c6163696e6961206c656f206d6f6c65737469652076656c2e0a0a5375007370656e646973736520757420677261766964612073617069656e2e2056650073746962756c756d20616363756d73616e206e756e6320696e2064617069620075732073656d7065722e204e756e632076656c2073656d706572207175616d002e2050656c6c656e746573717565206861626974616e74206d6f72626920740072697374697175652073656e6563747573206574206e65747573206574206d00616c6573756164612066616d6573206163207475727069732065676573746100732e204675736365206d6f6c6573746965206672696e67696c6c61206c6f7200656d2c207175697320747269737469717565206d61676e6120756c6c616d63006f727065722073697420616d65742e2043757261626974757220766974616500206c6f72656d207574206a7573746f206c616f72656574207665686963756c00612061742061206469616d2e2053757370656e646973736520616c69717565007420636f6e73656374657475722065782c20757420636f6e736563746574750072206e6571756520636f6e7365637465747572206e65632e20496e74656765007220766974616520636f6e64696d656e74756d20746f72746f722e204e756e0063207365642073757363697069742073617069656e2e2050686173656c6c75007320656c656d656e74756d20657569736d6f642076656c69742c2065676574002064696374756d20646f6c6f7220756c6c616d636f727065722065752e0a0a0050686173656c6c75732061742064756920697073756d2e204e756e63206c75006374757320617563746f72206e69736c20657520617563746f722e20446f6e00656320636f6e76616c6c69732061726375206c6163696e6961206578207361006769747469732c20736564206f726e61726520616e7465206f726e6172652e00204e616d2074696e636964756e74206a7573746f207475727069732c2073650064206d617474697320616e746520736f6c6c696369747564696e207365642e0020536564206f726e61726520697073756d206e6962682c2061632074656d70006f72206d61676e612076617269757320696e2e204e616d206672696e67696c006c61206d61676e61206d692c2075742065676573746173206c6f72656d207600617269757320696e2e20536564206575206c75637475732073617069656e2e0020496e74656765722076656c206469676e697373696d20656c69742c2061740020706c616365726174207475727069732e20446f6e656320696e206e69626800206964206a7573746f206c6f626f727469732064696374756d2e20446f6e650063207068617265747261206f726369206e656320636f6e76616c6c69732073006f6c6c696369747564696e2e0a0a50656c6c656e746573717565207369742000616d6574206672696e67696c6c612073656d2c2061632073757363697069740020656c69742e20446f6e656320612074726973746971756520697073756d2c00206e6f6e20756c7472696365732065726f732e205072616573656e7420616c00697175616d20697073756d206567657420626962656e64756d20766f6c7574007061742e20447569732073697420616d6574206469616d20626962656e6475006d2c20617563746f72206e69736920656765742c206d6f6c6c697320746f7200746f722e204d61757269732065742076656c69742075726e612e205574206600656c6973206c65637475732c207072657469756d207365642074656d707573002073697420616d65742c206d6f6c6c6973207669746165206c65637475732e00204d61757269732073697420616d6574206f7263692065752074656c6c75730020666163696c697369732074696e636964756e742e20447569732068656e640072657269742066656c69732061206e6571756520617563746f7220636f6e670075652e204d6f726269206c6967756c61206573742c2070656c6c656e746573007175652076656c2073616769747469732065742c20666175636962757320650067657420656e696d2e0a0a517569737175652064696374756d206e6973692000696420736f6c6c696369747564696e207072657469756d2e20496e7465726400756d206574206d616c6573756164612066616d657320616320616e74652069007073756d207072696d697320696e2066617563696275732e2053757370656e006469737365207665686963756c612076656e656e617469732072697375732c00206174207665686963756c61206c616375732072757472756d206e6f6e2e200050656c6c656e746573717565206861626974616e74206d6f72626920747269007374697175652073656e6563747573206574206e65747573206574206d616c006573756164612066616d65732061632074757270697320656765737461732e0020496e207075727573206d617373612c206d6f6c657374696520696e206e6900626820612c2076656e656e6174697320626c616e64697420656c69742e205000686173656c6c75732073617069656e206469616d2c2074696e636964756e740020736f64616c6573206469616d2076697461652c20636f6e67756520736167006974746973206f64696f2e2043757261626974757220657569736d6f64206e00656320616e746520736564207072657469756d2e2050656c6c656e74657371007565206d6f6c65737469652076617269757320656e696d2c206e6f6e20666100756369627573206c656f2073616769747469732061632e20437572616269740075722071756973206d61757269732071756973206c6967756c6120756c6c61006d636f72706572206d616c65737561646120736564206575206c6563747573002e0a0a53757370656e64697373652076656c206d61676e61206469676e69730073696d2c2064696374756d206e657175652073757363697069742c2062696200656e64756d206c616375732e205175697371756520717569732066656c69730020617263752e2050686173656c6c75732065726174206c656f2c2073656d7000657220617420646f6c6f7220656765742c2076656e656e617469732072686f006e6375732065782e2043726173206d6f6c6c6973206e696268207365642061007567756520736f64616c65732c2073697420616d6574206d6f6c6c6973207000757275732070686172657472612e2043726173206e6563206d69207175697300206c656f20696d7065726469657420616363756d73616e20757420696420710075616d2e204e616d206e69736c20656c69742c206f726e6172652065752075006c7472696365732076697461652c20706f72747469746f72206574206c696700756c612e2050656c6c656e746573717565207665686963756c6120656c69740020657420697073756d20636f6e7365717561742c206e6563206d6f6c6c6973002065737420696e74657264756d2e2055742074656d706f722063757273757300206d6f6c65737469652e204d61757269732074696e636964756e742061636300756d73616e206e756e6320696420696d706572646965742e20457469616d20006d616c6573756164612c206e6973692061632076756c7075746174652069610063756c69732c206e697369206f72636920706c616365726174206e756c6c61002c206e65632074696e636964756e742074656c6c757320656c69742071756900732075726e612e20457469616d206c61637573206d617373612c2068656e6400726572697420757420636f6d6d6f646f20612c20696e74657264756d20696400206e69736c2e20496e746567657220766974616520616e7465206672696e6700696c6c61206d692074696e636964756e7420636f6e73656374657475722e20004e756c6c6120636f6e7365637465747572206f726e61726520626962656e6400756d2e0a0a55742073697420616d657420657569736d6f642074656c6c7573002e2050656c6c656e746573717565207072657469756d2074696e636964756e0074206475692065752073656d7065722e205365642076656c2065726f73206e006f6e20646f6c6f7220696163756c697320696e74657264756d20736564207100756973206f7263692e20496e2073656d706572206c6f626f7274697320646900676e697373696d2e205365642066617563696275732066657567696174207000656c6c656e7465737175652e2050656c6c656e74657371756520736f6c6c69006369747564696e206f64696f20736564206c6563747573207361676974746900732c206e6f6e20756c7472696369657320697073756d2072757472756d2e200053656420736564206f726e6172652065782e0a0a5072616573656e7420766900746165206d6f6c6573746965207175616d2c20616320626c616e646974206f0064696f2e20457469616d2065676573746173206375727375732075726e612000696420657569736d6f642e204e616d20616c6971756574206172637520657500206c7563747573206c616f726565742e20457469616d20696d7065726469650074207175616d2076656c20636f6e73657175617420626c616e6469742e204d00617572697320696e74657264756d2c206469616d20766172697573206c616300696e696120616c69717565742c2076656c69742074656c6c757320706861720065747261206a7573746f2c20656765742073757363697069742075726e6120006e756c6c612071756973206c656f2e204e756c6c61206578206e69736c2c2000666175636962757320617420626c616e6469742061632c2063757273757320006120697073756d2e20566976616d75732071756973206469616d20636f6e670075652c20657569736d6f642075726e612073697420616d65742c206672696e0067696c6c6120646f6c6f722e204e616d206e6f6e206e756c6c6120636f6e67007565206c696265726f2074656d706f7220756c747269636965732e2050656c006c656e7465737175652070756c76696e61722073617069656e20766974616500206e756e63207363656c65726973717565206672696e67696c6c612e204675007363652068656e64726572697420656666696369747572206661756369627500732e20416c697175616d2070757275732061756775652c206c756374757320006e6f6e20636f6e76616c6c697320717569732c206d6178696d7573206e6f6e00206475692e0a0a446f6e65632070656c6c656e74657371756520657261742000657520657374206c6163696e696120616363756d73616e2e2050726f696e20006d6f6c6c69732073656d20646f6c6f722c206964206d6f6c6c6973206c656300747573207669766572726120696e2e204e756e632071756973206d6173736100207661726975732c206665726d656e74756d206c656f2076697461652c206c006f626f72746973206e657175652e205175697371756520756c6c616d636f7200706572206a7573746f20766974616520636f6e67756520656c656966656e64002e20457469616d206574206c61637573206573742e20496e7465676572207400757270697320617263752c20616363756d73616e2076656c20697073756d2000656765742c206d616c65737561646120756c6c616d636f72706572206a757300746f2e204d6175726973206e6f6e2065782074696e636964756e742c20756c00747269636573206c616375732061742c20626c616e646974206f64696f2e2000566573746962756c756d2067726176696461206e65632073617069656e206e006563206469676e697373696d2e2053757370656e64697373652074656d706f007220696e206e69736c2076656c206d6f6c6c69732e204d616563656e6173200067726176696461206c616375732074656c6c75732c20657420756c7472696300696573206e756c6c612074696e636964756e7420612e20416c697175616d20006572617420766f6c75747061742e20446f6e65632065726f73206c6563747500732c206469676e697373696d2069642073617069656e2061742c20706c6163006572617420666163696c697369732070757275732e20566976616d757320700072657469756d2c206d69206120756c6c616d636f727065722074696e63696400756e742c206475692074656c6c757320626c616e646974206d617373612c20006e65632066696e6962757320657374206e69736c2071756973206e6962682e0020467573636520646170696275732064756920696e20636f6e73656374657400757220706c6163657261742e20467573636520736f6c6c696369747564696e00206567657374617320657261742c2073697420616d657420616363756d7361006e206c656f2074696e636964756e7420696e2e204d6f7262692065666669630069747572206d61757269732069642064696374756d20666163696c69736973002e0a0a55742075726e61206d61676e612c20706f72747469746f722061632000656666696369747572206e6f6e2c20656666696369747572206174206d61730073612e2041656e65616e2073656420656c6974206e6f6e2065782073757363006970697420616363756d73616e2e20416c697175616d207669746165206c65006f2073616769747469732c2067726176696461206c6967756c612065742c200070756c76696e617220646f6c6f722e20457469616d20616320746f72746f7200206c6f72656d2e2050686173656c6c7573206567657374617320696163756c00697320677261766964612e204e756e63206e6f6e206e756e63206e6962682e0020566976616d757320766974616520617563746f722073617069656e2e20430072617320706f7375657265206e756c6c61206f64696f2c20657520706f727400612065782076656e656e6174697320612e204e616d207269737573206e65710075652c20657569736d6f642075742063757273757320656765742c2066617500636962757320736f6c6c696369747564696e20746f72746f722e2043757261006269747572207574206d65747573206e6f6e206469616d20617563746f72200074696e636964756e742e20496e7465676572206d616c65737561646120707200657469756d2076656e656e617469732e20566976616d75732072686f6e637500732074696e636964756e74206c6f72656d207175697320756c74726963696500732e2050686173656c6c7573206f726e6172652065726f732065742068656e0064726572697420636f6d6d6f646f2e0a0a4375726162697475722069616375006c697320636f6e7365717561742073656d20717569732070656c6c656e746500737175652e2050726f696e206d617474697320656e696d20696e2065737420007361676974746973207661726975732e204d6f726269206e65632074696e63006964756e742076656c69742c206575206469676e697373696d20657261742e0020416c697175616d206572617420766f6c75747061742e205072616573656e00742066696e696275732074656c6c757320696e2068656e6472657269742076006573746962756c756d2e20437572616269747572206d6f6c6c69732074656c006c7573206d692c206e6563206d616c6573756164612076656c6974207375730063697069742061742e205365642065726174206e657175652c207275747275006d20736564206665726d656e74756d2076656c2c2070656c6c656e74657371007565206e6f6e20616e74652e204e616d20736f64616c65732070756c76696e006172206c6f72656d2c2065742074696e636964756e74206d6173736120646900676e697373696d2061632e20457469616d206d61737361207175616d2c2076006f6c7574706174206574206c6f626f727469732073697420616d65742c207600656e656e6174697320696420656e696d2e0a0a446f6e656320706f72746120006e69736c20657520697073756d20706f72747469746f722c2065676574207000756c76696e6172206c6f72656d206d6178696d75732e205574206163206e6500717565206c6f72656d2e204e756c6c612061206c6f72656d2065676574206c00656f206d6f6c6c6973206469676e697373696d2e20566573746962756c756d0020696d706572646965742073656d706572206c65637475732e204e756c6c6100206574206469616d206574206e756c6c61206f726e61726520736f6c6c69630069747564696e2e2050726f696e206120746f72746f7220636f6d6d6f646f2c00207665686963756c61206a7573746f2061742c2074696e636964756e74207300617069656e2e2043757261626974757220657569736d6f642076697665727200612072686f6e6375732e204e756e6320766172697573206f726369206e656300206d6173736120766976657272612c2065676574206c7563747573206c616300757320756c7472696365732e20437572616269747572206375727375732065006c697420646f6c6f722e20467573636520616c6971756574206f726e617265002065726f732c20612067726176696461206578206d616c657375616461207600656c2e204e616d206163206d61676e6120636f6e7365717561742c2076617200697573206d61757269732065752c206665726d656e74756d206c696265726f002e0a0a5072616573656e7420657420646f6c6f722074656d706f7220647569002074696e636964756e742064696374756d2e2050656c6c656e74657371756500206d6178696d757320697073756d20657520656765737461732074656d707500732e20467573636520616c697175616d20696d7065726469657420616e74650020657420626c616e6469742e204d61757269732068656e647265726974206c006f626f72746973206c616f726565742e2041656e65616e20706f7274612076006f6c757470617420697073756d2c206120736f6c6c696369747564696e20610072637520756c6c616d636f72706572206e6f6e2e20536564207661726975730020706c61636572617420656e696d206575207072657469756d2e20496e206a007573746f20617263752c20656c656d656e74756d20757420616c6971756574002065752c206c616f72656574206964206c656f2e20496e7465676572207365006420617263752061206469616d206c75637475732072686f6e6375732e20550074206567657420636f6e677565206d657475732c2069642072757472756d20006c65637475732e0a0a4d6f726269207665686963756c6120616363756d7361006e206e69736c2c20617420706f727461206c616375732066617563696275730020656765742e2053757370656e64697373652076756c707574617465206d6900206e6f6e20766f6c757470617420666575676961742e2051756973717565200064696374756d20706f72747469746f72206f64696f2073697420616d65742000636f6e6775652e2041656e65616e20657569736d6f64207072657469756d2000656c697420706f72747469746f722066696e696275732e204d616563656e610073207365642076756c7075746174652072697375732e2041656e65616e206500726f7320656e696d2c2076656e656e6174697320696420636f6e7365717561007420612c2072686f6e637573206f726e6172652073656d2e20517569737175006520626962656e64756d20766f6c757470617420616e74652c20616320706f0073756572652073617069656e20737573636970697420656666696369747572002e204e756c6c61206f726e617265206e696268206163206d6175726973207600756c7075746174652c206e6f6e207068617265747261206469616d2076697600657272612e20436c61737320617074656e742074616369746920736f63696f00737175206164206c69746f726120746f727175656e742070657220636f6e7500626961206e6f737472612c2070657220696e636570746f732068696d656e6100656f732e2050726f696e20617420766573746962756c756d2076656c69742e002053656420766976657272612076656e656e61746973206d692c207574206d00616c657375616461206e756c6c612e204475697320706861726574726120690064206e69626820617420636f6e6775652e20536564206c6163696e6961206500726f732061206572617420766976657272612c20612074696e636964756e740020617567756520616363756d73616e2e2050656c6c656e746573717565206c006f626f7274697320616363756d73616e2073656d2c2065676574206d616c65007375616461206e756c6c61206665726d656e74756d2073697420616d65742e0020496e20616363756d73616e206c616f72656574206e69736c2076697461650020666575676961742e20416c697175616d206572617420766f6c7574706174002e0a0a4475697320696420616e7465206c6967756c612e2050686173656c6c00757320736167697474697320706c61636572617420706f73756572652e204d00616563656e61732076697461652076697665727261206c616375732c206d6f006c6c6973206d616c657375616461206c65637475732e2050656c6c656e7465007371756520696e20657374206c6163696e69612c20656c656d656e74756d20006e756e6320656765742c2070656c6c656e746573717565206a7573746f2e20005175697371756520636f6e67756520747572706973206e6f6e206f64696f2000626c616e64697420736167697474697320677261766964612065742069707300756d2e204e756c6c616d206c6f626f72746973206e6571756520616320656c00697420636f6e76616c6c697320616363756d73616e2073697420616d6574200070756c76696e6172206d617373612e20446f6e656320657520636f6d6d6f64006f20616e74652c2073697420616d657420756c6c616d636f7270657220646f006c6f722e2044756973206d6175726973206c6967756c612c20656c656d656e0074756d2061742066617563696275732061632c20616c697175616d20696e200066656c69732e205072616573656e74206c6f626f72746973206578207369740020616d6574206e69736c20756c74726963696573206c6163696e69612e2056006976616d757320617563746f722c2073656d20717569732076657374696275006c756d207363656c657269737175652c2073617069656e206e69736c207275007472756d206c696265726f2c2073697420616d657420696e74657264756d20006e69736c206a7573746f207669746165206c65637475732e20566976616d75007320696d70657264696574206e756c6c6120657520657261742076656e656e00617469732c20736564206d6f6c657374696520646f6c6f7220766568696375006c612e20517569737175652076656c2061726375207365642073656d207365006d706572206375727375732e2050656c6c656e746573717565206d61747469007320656c656966656e64207269737573206574206d6f6c6c69732e20557420006c6f626f727469732c2065737420736564206665726d656e74756d2073656d007065722c2075726e612072697375732064617069627573206475692c2061200074656d707573206d6175726973206e69736c206174206469616d2e2056697600616d7573206469676e697373696d20666163696c6973697320636f6e7365630074657475722e20496e20706f737565726520736f6c6c696369747564696e2000656c656d656e74756d2e0a0a457469616d20697073756d206573742c206d61006c657375616461206120666575676961742073697420616d65742c206d6f6c00657374696520656765742066656c69732e2041656e65616e2074656d70757300206672696e67696c6c61206469616d20696e20616c697175616d2e20446f6e0065632073697420616d65742072757472756d206469616d2e2050686173656c006c757320756c6c616d636f72706572206d617474697320616363756d73616e002e2053757370656e646973736520616c6971756574207669746165206e6973006920616320766f6c75747061742e2050726f696e207075727573206d6175720069732c20696d706572646965742073697420616d657420647569206e6f6e2c00207665686963756c6120637572737573206f7263692e20446f6e6563206574002074656c6c7573206574206d6574757320766573746962756c756d20656c65006d656e74756d206163206d6f6c6c6973206a7573746f2e2050656c6c656e74006573717565206c6967756c61206e69736c2c20616c697175616d206163206c006967756c6120706f73756572652c20656c656d656e74756d2068656e64726500726974206d61757269732e204d617572697320666163696c69736973206665006c697320696e2072757472756d20696163756c69732e204e756e632066657500676961742073656d20612068656e6472657269742072757472756d2e20496e007465676572206d6f6c65737469652064696374756d2066696e696275732e200041656e65616e206e656320766f6c7574706174206c6967756c612e205175690073717565206d617373612070757275732c2070686172657472612075742069006163756c6973207365642c20706f72747469746f7220616320616e74652e2000416c697175616d206d6173736120656e696d2c2076756c707574617465206e006563206d692069642c20756c6c616d636f72706572206665756769617420740075727069732e0a0a4e756e63207669766572726120647569206c6f72656d2c002073697420616d657420656666696369747572206d65747573207375736369007069742076656c2e20566573746962756c756d2073697420616d657420706f0072747469746f722065782e205574206d616c657375616461206c656374757300206e6563206d65747573206672696e67696c6c612c206e65632073656d706500722075726e61206d616c6573756164612e20557420756c6c616d636f7270650072206e697369206174206e69736c20696d706572646965742070756c76696e0061722e20566573746962756c756d2065726f7320646f6c6f722c20766f6c750074706174206964206f64696f2069642c2074656d70757320636f6e76616c6c0069732072697375732e2043726173206575206661756369627573206c69626500726f2e2050656c6c656e74657371756520696163756c69732076657374696200756c756d20646f6c6f72206964206566666963697475722e204675736365200061206e756e6320717569732075726e61206469676e697373696d2064617069006275732e2050726f696e2076656c20696163756c69732073656d2c2061742000636f6e76616c6c6973206475692e20496e2069642066656c69732074656c6c0075732e20446f6e6563207068617265747261206d6f6c65737469652061726300752c2061206d616c6573756164612065737420677261766964612069642e0a000a5175697371756520616c6971756574206c6967756c61207574206f7263690020706f73756572652c207365642074696e636964756e74206d61676e612075006c747269636965732e204d616563656e61732073697420616d657420756c6c00616d636f72706572207475727069732e20536564206e6563206d6f6c657374006965207175616d2e20566976616d7573206d617474697320636f6e64696d65006e74756d206f7263692c206e6f6e206375727375732066656c69732074656d007075732065752e2053656420656765742072697375732075726e612e2056690076616d7573206f726e61726520756c6c616d636f7270657220617263752061006320616c69717565742e205072616573656e74206d616c657375616461207000756c76696e6172206c65637475732c2073697420616d65742064696374756d00207269737573206d616c6573756164612061742e204e756c6c612061206d61006c657375616461206c65637475732c2065676573746173206d616c657375610064612066656c69732e20496e20696420696e74657264756d206e756e632e2000496e746567657220666163696c69736973206469676e697373696d20616e74006520717569732070686172657472612e0a0a446f6e65632070656c6c656e7400657371756520656e696d20766974616520616e746520756c7472696365732c0020617420657569736d6f64206d617373612066696e696275732e20517569730071756520636f6e67756520756c7472696369657320706f72747469746f722e002043757261626974757220756c7472696369657320626c616e64697420637500727375732e204675736365206567657420647569206375727375732c2070680061726574726120617263752076656c2c20706c616365726174207075727573002e2043726173206e6563206d6175726973206c656f2e204e616d20707265740069756d207072657469756d20766f6c75747061742e2050686173656c6c757300206e657175652074656c6c75732c206672696e67696c6c612073697420616d00657420666163696c6973697320717569732c20616363756d73616e20736365006c657269737175652073656d2e204e756e632076697461652066656c69732000736564206d6173736120756c747269636965732064617069627573206e6f6e0020657520656e696d2e20496e20706f72747469746f722074656d706f72206e0069736c2c206567657420666163696c697369732075726e612066696e69627500732076697461652e205365642070656c6c656e746573717565206e656320740075727069732075742073656d7065722e205072616573656e74206566666963006974757220656c656966656e64206f64696f2e0a0a4e756c6c612061756374006f7220636f6e64696d656e74756d206e756c6c612e204d616563656e617320006d616c657375616461206d61757269732061206c6967756c6120756c7472690063657320636f6d6d6f646f2065742076656c206469616d2e2053757370656e00646973736520696e74657264756d2074696e636964756e74206c6967756c61002c206120626962656e64756d206d6920696163756c697320612e2053656420006d616c657375616461206d657475732076656c206c696265726f206469676e00697373696d2c2073697420616d657420636f6e677565207175616d2074696e00636964756e742e204375726162697475722066696e696275732074696e63690064756e742073616769747469732e20517569737175652073617069656e2065006e696d2c20736f64616c6573206163206469616d20612c206469676e69737300696d206c6163696e69612074656c6c75732e20446f6e65632065666669636900747572206c616375732072686f6e637573206672696e67696c6c6120636f6d006d6f646f2e20496e20696420656c69742076656c206c6f72656d20736167690074746973206f726e6172652e204372617320757420646f6c6f72206c696775006c612e2053656420656c656966656e64206c656374757320766172697573200066696e696275732072757472756d2e204675736365206e6563206175677565002061206a7573746f207661726975732074656d706f722073656420766974610065206c6f72656d2e204d6175726973206174206c696265726f20696e2065730074206375727375732064696374756d2075742076697461652065726f732e200050686173656c6c75732072757472756d2c206c65637475732076697461652000696e74657264756d20626c616e6469742c206c6f72656d2075726e61207669007665727261206d617373612c2071756973207363656c65726973717565206600656c6973206c6563747573206574206f64696f2e204d61757269732066616300696c69736973206c656f207475727069732c20696d70657264696574206665007567696174206475692074656d706f722073697420616d65742e0a0a4d61650063656e61732061206c656f2061756775652e20437572616269747572206e6f006e20697073756d2073697420616d657420656c6974206c616f72656574207600656e656e617469732065676574206e6f6e206d61676e612e204375726162690074757220616c697175616d20696163756c697320706f72747469746f722e2000536564206163206c6f72656d206120646f6c6f7220616c6971756574206c7500637475732e2050726f696e206c6163696e696120697073756d20616e74652c002073697420616d657420696d70657264696574206c6563747573206469676e00697373696d20656765742e20566573746962756c756d20656666696369747500722073697420616d65742073656d207175697320736f64616c65732e2056690076616d75732070756c76696e6172207068617265747261206e69736c2076690074616520616363756d73616e2e204475697320696e74657264756d20636f6e00677565207661726975732e20446f6e65632061207361676974746973206e690073692c207175697320656c656d656e74756d206475692e20536564206c756300747573206c616f72656574206c656f206567657420756c7472696365732e0a000a446f6e6563206120617567756520656765737461732c2076756c70757461007465206573742076656c2c206c616f72656574206c616375732e20416c69710075616d20646f6c6f7220646f6c6f722c20706c61636572617420696e2065670065737461732073697420616d65742c20616c69717565742061206f7263692e0020496e2076756c70757461746520626c616e64697420656c69742c2068656e0064726572697420636f6d6d6f646f2075726e6120626962656e64756d206575002e20457469616d20617567756520616e74652c206d6f6c6573746965207175006973206f64696f2065752c2074656d70757320636f6d6d6f646f206e696268002e205574206d6174746973206c6163696e69612073617069656e2075742064006170696275732e20457469616d20636f6e736571756174206e6f6e206f6469006f2071756973206375727375732e204e756e6320616c69717565742062696200656e64756d20646f6c6f722065752073656d7065722e20566976616d757320006163206d692073697420616d65742061726375206c6163696e6961207275740072756d2073697420616d65742061206e756c6c612e2050686173656c6c75730020657261742072697375732c206c75637475732065676574206c6f72656d200076697461652c206d616c65737561646120626962656e64756d206d65747573002e204e616d206964206d617474697320656e696d2c206665756769617420730061676974746973206d657475732e2050686173656c6c7573206c7563747573002074757270697320657261742c20657420766172697573206d61676e61207200686f6e6375732069642e0a0a437261732076617269757320736167697474690073206f64696f20757420677261766964612e20536564206f726e6172652070006f7274612076756c7075746174652e20496e746567657220706f7375657265002061726375206c6f72656d2c206964207363656c657269737175652073656d002065666669636974757220612e205365642076656c20617563746f722069700073756d2e2050656c6c656e7465737175652069642065726f73206574206c6f0072656d20616363756d73616e20616363756d73616e20656765742071756973002065726f732e204e756e632063757273757320636f6e64696d656e74756d20006d692c206e65632066617563696275732070757275732070756c76696e6172002070686172657472612e205365642073656420736f64616c6573206e756e63002e2046757363652070756c76696e617220756c747269636573206d692c206900642072757472756d206d69206672696e67696c6c612061632e205365642069007073756d207175616d2c20756c74726963696573207669746165206c616369006e69612076697461652c206665726d656e74756d206e6f6e206d6175726973002e205072616573656e74206461706962757320756c6c616d636f7270657220006c6967756c612c206567657420756c6c616d636f727065722073656d2064610070696275732065752e2046757363652073697420616d65742076657374696200756c756d206c616375732e205072616573656e74207365642074726973746900717565206c616375732c2076656c2070756c76696e6172206573742e0a0a460075736365206e6563206e6571756520646f6c6f722e20566573746962756c75006d20616c697175616d206c6967756c612075742064696374756d2073656d700065722e20457469616d206d616c657375616461206d6574757320656765742000656c697420636f6e64696d656e74756d20636f6e7365717561742e205375730070656e646973736520736167697474697320656e696d207175616d2c20696e0020756c74726963696573206c656f206461706962757320717569732e205065006c6c656e7465737175652063757273757320766172697573206e6973692c200076656c20736167697474697320656c6974206d6178696d7573206e6f6e2e200053757370656e646973736520746f72746f72206f64696f2c207068617265740072612076656c206475692061632c20656c656d656e74756d2076756c707574006174652074656c6c75732e20416c697175616d20696420666163696c69736900732065782e2044756973206e6563206672696e67696c6c61206e69736c2e2000467573636520736564206672696e67696c6c612065782e20467573636520750074206d6175726973206574207175616d207669766572726120696e7465726400756d20612061742065726f732e20416c697175616d20616363756d73616e2000657261742075742074656c6c7573206469676e697373696d20696163756c6900732073656420657420746f72746f722e2050726f696e20736564206175677500652073697420616d6574206d657475732072757472756d20677261766964610020696e2076656c206e69736c2e20496e746567657220706f73756572652061007263752069642065726f73206665726d656e74756d2074656d706f722e0a0a00557420756c74726963657320697073756d206f7263692e204d61757269732000617563746f72206d6178696d75732072697375732c20717569732066696e6900627573206e756c6c612065666669636974757220696e2e204e616d20756c74007269636573206e6571756520616320657820666163696c697369732c20696e002074656d707573206c6967756c61206c6f626f727469732e204372617320700068617265747261206c6f72656d20696e74657264756d206e65717565206865006e64726572697420617563746f722e2050686173656c6c7573206e6f6e207200757472756d206c696265726f2c20617420736f64616c657320697073756d2e0020496e20756c6c616d636f72706572206578206c65637475732c207369742000616d6574207068617265747261206e756c6c6120636f6e76616c6c6973207200686f6e6375732e2053757370656e6469737365206e6f6e20656c6974206c6f0072656d2e205072616573656e7420756c6c616d636f72706572206e756c6c61002076656c20637572737573206469676e697373696d2e2041656e65616e2073006f64616c657320746f72746f72206f64696f2c20617420656c656966656e6400206c6967756c61206469676e697373696d2073697420616d65742e2044756900732076656c20736f6c6c696369747564696e2074656c6c75732e204d61656300656e617320717569732070656c6c656e746573717565206475692e204d6175007269732071756973207361676974746973206e756e632e2044756973207275007472756d206d616c657375616461206c6967756c612065752070756c76696e0061722e0a0a41656e65616e206772617669646120706f727461207175616d20007365642070656c6c656e7465737175652e2050656c6c656e7465737175652000766573746962756c756d20626962656e64756d207472697374697175652e2000566573746962756c756d20696e206572617420656e696d2e2050726f696e200065726f73206f7263692c2072686f6e63757320616320616c697175616d206e006f6e2c207072657469756d2061206f7263692e20566573746962756c756d200074656d7075732c2076656c6974206d616c657375616461206c6163696e69610020646170696275732c2075726e61206c6f72656d206672696e67696c6c6120006d617373612c20696e206d6178696d757320656e696d20656e696d20657420006e69736c2e204e616d207669766572726120636f6e64696d656e74756d206c006967756c6120696e20696d706572646965742e20536564207175697320656c00656d656e74756d206a7573746f2e204e756c6c61206f726e61726520636f6e00736563746574757220656e696d2061742074696e636964756e742e2045746900616d2073697420616d6574206c616f7265657420697073756d2e0a0a45746900616d20666163696c697369732065737420706f72747469746f722c2066696e00696275732066656c69732065742c207375736369706974206c65637475732e002041656e65616e20706c616365726174206567657374617320616c6971756500742e204d617572697320657420656e696d206c65637475732e204d61656365006e61732070656c6c656e746573717565206d6f6c6c6973206d69206469637400756d20636f6e6775652e205072616573656e742076656c2066656c6973206c00616f726565742c20636f6e7365637465747572206e756c6c61206e6f6e2c2000666575676961742074656c6c75732e2053656420616c697175616d2076656c006974207365642073656d20706c616365726174207361676974746973206174002073697420616d6574206c696265726f2e2051756973717565206d6174746900732072757472756d20656e696d2c2073656420656c656d656e74756d207665006c69742e2050686173656c6c7573206e6f6e206c616f72656574206f64696f002e2043757261626974757220656c656966656e64206f64696f207369742061006d657420756c7472696369657320756c6c616d636f727065722e20496e20650067657420726973757320756c7472696365732c207665686963756c61206c65006374757320696e2c20616c6971756574207475727069732e0a0a5068617365006c6c7573206e6f6e206d6574757320617563746f722c20636f6e736563746500747572206e69736c2061742c207361676974746973207175616d2e20507261006573656e7420746f72746f722074656c6c75732c2074656d706f72206e6f6e002070686172657472612069642c207661726975732061742070757275732e2000536564206120636f6e64696d656e74756d206e6962682e205072616573656e0074206c656f206e756e632c20756c6c616d636f72706572207665686963756c006120766573746962756c756d2074696e636964756e742c206665726d656e7400756d20757420616e74652e20496e206f726e617265206c61637573206e6f6e00206c696265726f20736f6c6c696369747564696e2c206575206665756769610074206e756c6c6120626c616e6469742e2050656c6c656e74657371756520680061626974616e74206d6f726269207472697374697175652073656e656374750073206574206e65747573206574206d616c6573756164612066616d6573206100632074757270697320656765737461732e204e756e632065676574206e756e00632073697420616d6574206d61757269732070686172657472612076657374006962756c756d20657520766974616520656e696d2e20496e20766f6c7574700061742073617069656e2065676574206c65637475732074696e636964756e740020766f6c75747061742e20416c697175616d207365642076697665727261200075726e612e204675736365206c6563747573206d657475732c20756c747269006365732076656c20657569736d6f642065742c20616c6971756574207365640020746f72746f722e2050686173656c6c757320626c616e6469742070656c6c00656e74657371756520756c747269636965732e204f7263692076617269757300206e61746f7175652070656e617469627573206574206d61676e697320646900732070617274757269656e74206d6f6e7465732c206e6173636574757220720069646963756c7573206d75732e204e756c6c61206469676e697373696d2c200076656c6974207175697320666163696c697369732072686f6e6375732c206e00756c6c612066656c697320747269737469717565206d61757269732c2065750020636f6d6d6f646f206c656f206f726369206174206e6973692e2046757363006520636f6e736563746574757220746f72746f7220657420706861726574720061207665686963756c612e204e756e63207665686963756c612c206d65747500732073697420616d657420657569736d6f642064696374756d2c20646f6c6f0072206d6574757320616363756d73616e206573742c20696e20696163756c690073206d61737361206c696265726f206e6f6e206c65637475732e0a0a496e2000617420636f6e736571756174207475727069732e204675736365206d69206e00756c6c612c206672696e67696c6c6120757420766172697573207669746165002c20747269737469717565206174206e6973692e204e756c6c61206964206d00692065726f732e204d6f726269206469616d20616e74652c2076656e656e610074697320696e2073757363697069742076656c2c2074696e636964756e7420007669746165206f64696f2e204d61757269732068656e647265726974206e6f006e206172637520696420636f6e73656374657475722e205072616573656e740020616c697175616d206e756e632076656c206d61676e61207665686963756c006120616c69717565742e204e616d20636f6e7365637465747572206e756c6c006120717569732075726e6120696163756c697320756c6c616d636f72706572002070656c6c656e74657371756520657420617263752e20496e746567657220006163206c616f726565742076656c69742e2050656c6c656e7465737175652000757420616e7465207175616d2e20566976616d75732061206d617474697320006c656f2c2069642074656d707573206d692e204675736365207363656c657200697371756520646170696275732070757275732073656420616c697175616d002e0a0a46757363652076656c20656e696d2070656c6c656e7465737175652c0020656c656d656e74756d206469616d2065752c2076756c707574617465207600656c69742e204e756e63206c696265726f2074656c6c75732c20656c656d65006e74756d206964207175616d2073697420616d65742c20617563746f722070006f72747469746f722070757275732e204c6f72656d20697073756d20646f6c006f722073697420616d65742c20636f6e7365637465747572206164697069730063696e6720656c69742e20457469616d206d6f6c6573746965206e756e632000736f64616c657320636f6d6d6f646f20696163756c69732e204e616d20717500697320656c69742061206c696265726f20616c697175657420636f6e64696d00656e74756d207669746165206163206d692e20457469616d20756c7472696300657320756c74726963696573206d61676e6120766974616520706f7375657200652e20566976616d757320757420657569736d6f642076656c69742e20437200617320736f64616c6573206c6163696e6961206d61676e612c207175697320006665726d656e74756d20657261742064696374756d2073697420616d65742e002046757363652074696e636964756e74206c696265726f206574206e657175006520747269737469717565206375727375732e204372617320616320646f6c006f72206c6967756c612e2050726f696e206567657420696d7065726469657400206d61757269732e20416c697175616d206469616d20646f6c6f722c2066610063696c697369732076656c206e69626820656765742c20636f6e7365717561007420766573746962756c756d206c696265726f2e20437572616269747572200076756c7075746174652066617563696275732061756775652065676574207300757363697069742e204e756e632074696e636964756e742074656c6c757320007574206d6f6c6c6973206d6178696d75732e2050726f696e2076657374696200756c756d206c616f726565742073617069656e2c206e6563206672696e6769006c6c61206e6973692074656d70757320696e2e0a0a566573746962756c756d0020616e746520697073756d207072696d697320696e20666175636962757320006f726369206c756374757320657420756c74726963657320706f73756572650020637562696c69612063757261653b20566573746962756c756d2066616369006c697369732c20707572757320657520706f7375657265206c6163696e6961002c20707572757320657374206c616f72656574206e69736c2c206e65632076006f6c757470617420616e746520657261742076697665727261206e756c6c61002e204e756c6c6120666163696c6973692e20496e206e656320706f72746120006d657475732e20446f6e656320666163696c6973697320646f6c6f72207369007420616d6574206f64696f20616c697175616d2c206567657420706f7274740069746f7220697073756d2076756c7075746174652e204d6175726973207665006e656e61746973206d61676e61206575206578206f726e6172652c2069642000736f6c6c696369747564696e20616e746520636f6e6775652e2050656c6c65006e7465737175652075726e61206f7263692c20756c747269636965732076690074616520706f73756572652075742c20756c7472696365732071756973207400656c6c75732e20536564206e6f6e20656c656966656e64206d692c20657520007472697374697175652073656d2e2041656e65616e2074656d707573206d61007373612065752067726176696461206d616c6573756164612e2050726f696e00206e65632076756c707574617465206e756e632e204e756e63206d616c657300756164612c206469616d206e6f6e20636f6d6d6f646f2064696374756d2c20007175616d206e69736c2074696e636964756e74206c616375732c207369742000616d65742066657567696174206c6f72656d206e756c6c61206e65632069700073756d2e0a0a4d617572697320736564206d6574757320617420646f6c6f720020636f6e64696d656e74756d20636f6e73657175617420616363756d73616e0020616320646f6c6f722e2053757370656e6469737365206c75637475732062006c616e6469742065782c20617420656c656d656e74756d206d69206469637400756d2065752e20416c697175616d2074696e636964756e7420656c656d656e0074756d206d61676e6120766974616520616c69717565742e20446f6e65632000696e206f726e617265206d61757269732e20496e206c6163696e6961207369007420616d6574206e756c6c61207669746165206665726d656e74756d2e2044006f6e6563206e6563206665726d656e74756d2075726e612c20617420667269006e67696c6c612076656c69742e20416c697175616d206572617420766f6c7500747061742e20566573746962756c756d2073656420747572706973206e65710075652e20496e74656765722076656c20737573636970697420747572706973002e20536564206e656320636f6e64696d656e74756d206e657175652e204165006e65616e20636f6e76616c6c697320766f6c757470617420706f7375657265002e2050686173656c6c7573206c6f626f72746973206c6967756c612076656c002072686f6e637573206c616f726565742e2041656e65616e2065676574206500737420696163756c69732c2076656e656e61746973206f64696f2075742c200064696374756d2074656c6c75732e2044756973207669746165206572617420007669746165206e69736920637572737573206d61747469732e204e756e632000626c616e6469742070656c6c656e7465737175652072697375732c206c7563007475732074696e636964756e74206d61676e6120706f7274612061632e204300726173207669766572726120616c697175657420706f73756572652e0a0a4c006f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7300656374657475722061646970697363696e6720656c69742e204e756c6c616d00206575206c61637573206c65637475732e20467573636520612074656c6c750073206c616375732e20496e74657264756d206574206d616c657375616461200066616d657320616320616e746520697073756d207072696d697320696e206600617563696275732e204e756c6c616d2070656c6c656e746573717565206c6f0072656d207175616d2c2076656c2074656d706f7220746f72746f7220707265007469756d2076697461652e20566573746962756c756d20736f6c6c69636974007564696e2071756973206d692061632072757472756d2e20496e746567657200206469676e697373696d206c696265726f20616c697175616d206672696e6700696c6c6120616363756d73616e2e20446f6e656320666163696c697369732000647569206e6f6e206c656f2074656d707573206c75637475732e2053656420006d616c657375616461207665686963756c6120756c7472696365732e2055740020616e746520616e74652c20616c69717565742073697420616d657420736f006c6c696369747564696e2066696e696275732c20626c616e64697420756c740072696365732061756775652e20536564206e6563206e6973692071756973200076656c697420636f6e64696d656e74756d20677261766964612e2041656e6500616e20616c697175657420657569736d6f64206475692c20757420766568690063756c6120697073756d2066617563696275732065752e0a0a4675736365200076656c69742073617069656e2c2073656d706572206574206469676e69737300696d2076656c2c20696163756c69732069642076656c69742e20507261657300656e74206e6f6e206e69736c206567657420616e746520736f6c6c69636974007564696e2072757472756d206e6563206e6563206573742e205365642076690076657272612066656c6973206e69736c2c206e65632065676573746173206500737420736f64616c65732065742e204e616d20636f6e67756520617567756500207375736369706974206578206c616f7265657420706f72747469746f722e0020467573636520626962656e64756d20697073756d206e657175652c20616300206d6178696d757320646f6c6f72206672696e67696c6c612075742e2043750072616269747572206120636f6e736571756174206c6967756c612e204e616d0020766f6c757470617420636f6e736571756174206c696265726f2065752062006c616e6469742e204e616d20696e74657264756d2074656c6c757320757420006f64696f20636f6e736571756174206f726e6172652e204e756c6c612066610063696c6973692e204d616563656e6173206c756374757320616e7465206567006574206f64696f20636f6e64696d656e74756d206672696e67696c6c612e2000496e74656765722065676574206d61676e612073697420616d6574206d6167006e61206665726d656e74756d20677261766964612e0a0a4d6f72626920736f0064616c65732076656c6974206e6973692c2061206d6178696d7573206475690020656c656966656e64206e6f6e2e204d61757269732070757275732065726f00732c20617563746f722075742066696e6962757320656765742c20756c7472006963696573207175697320657261742e2041656e65616e207361676974746900732074757270697320696e206f72636920706f7274612c20696420706861720065747261206578206566666963697475722e20467573636520617420636f6e0067756520657261742e20566573746962756c756d206c756374757320656e69006d206665726d656e74756d206c656f2064696374756d20747269737469717500652e20446f6e6563206e65632066656c69732073697420616d6574206475690020706f72747469746f7220656c656d656e74756d2e205072616573656e7420006c616f726565742c2066656c6973207669746165207472697374697175652000626962656e64756d2c206c6f72656d206e6962682070656c6c656e746573710075652073617069656e2c20736564207363656c65726973717565206c6f7265006d206e6962682076656c2073656d2e204675736365206e6f6e2076656e656e0061746973206e657175652e20446f6e6563207363656c6572697371756520640069676e697373696d20726973757320696420706f7274612e0a0a5375737065006e64697373652072686f6e637573206c696265726f2076656c2066656c697300206c6163696e69612074656d7075732e2046757363652064696374756d206e006571756520736564206e69626820677261766964612c20626962656e64756d00206c6f626f727469732075726e6120616c69717565742e204375726162697400757220657420657569736d6f6420656e696d2e2050656c6c656e7465737175006520696d70657264696574206175677565206c6f72656d2c2075742068656e00647265726974206e657175652073656d7065722076656c2e2050686173656c006c757320636f6d6d6f646f20647569206e6f6e206c6f626f72746973207665006e656e617469732e2043726173207669766572726120736167697474697320006e69736c2c207669746165206c6f626f72746973206d6574757320756c747200696369657320696e2e20416c697175616d207669746165206469676e69737300696d2070757275732c206661756369627573207072657469756d207269737500732e205072616573656e74206163206d61676e6120617563746f722c206d61006c657375616461206e756c6c61206c6f626f727469732c20636f6d6d6f646f00206475692e205072616573656e7420617420746f72746f7220697073756d2e002046757363652074656d7075732c2066656c697320696e20616363756d7361006e2066617563696275732c206c696265726f20656e696d206d6f6c6c69732000656e696d2c20696420656c656d656e74756d206d65747573207075727573200061206d61676e612e204375726162697475722073697420616d657420636f6e0064696d656e74756d2075726e612e20496e2075726e612066656c69732c2063006f6e64696d656e74756d207669746165206e756c6c612065752c20706f73750065726520636f6e64696d656e74756d206e6962682e2050656c6c656e746573007175652067726176696461206f64696f20656c69742c2076656c20616c69710075657420726973757320636f6e7365637465747572206e6f6e2e204d61656300656e61732074656d706f722c206d61676e612061632070686172657472612000616c697175616d2c20616e7465206c6967756c61206665756769617420717500616d2c206575206d6174746973206e756c6c61206e69736c206e6f6e206d61007373612e0a0a496e746567657220756c74726963657320736f64616c657320006a7573746f2e20416c697175616d20626962656e64756d207068617265747200612072697375732c2061632076697665727261206e69736920616363756d7300616e2075742e20457469616d2067726176696461206665726d656e74756d20006d6920696e207363656c657269737175652e20467573636520696e7465726400756d2c206c656f207175697320626962656e64756d206d61747469732c206a007573746f206d65747573206672696e67696c6c6120656c69742c2061632070006c61636572617420747572706973206469616d206661756369627573206e6900736c2e20457469616d206c616f72656574206c696265726f206c6f72656d2c002076656c2074656d707573206f64696f206469676e697373696d2065742e20004e756c6c6120666163696c6973692e20496e7465676572206461706962757300206d6f6c657374696520656e696d2c2061632074696e636964756e74207361007069656e20636f6e76616c6c69732075742e2043726173206d6f6c6c69732000636f6e736563746574757220666163696c697369732e2043757261626974750072207472697374697175652c20726973757320706f72747469746f72207675006c70757461746520756c7472696365732c206c6f72656d2073656d20646967006e697373696d206e657175652c20657520706f72747469746f72206d61676e0061206e697369207669746165207475727069732e20446f6e656320636f6e7300657175617420657374206575206469616d20666575676961742c2076656c2000766573746962756c756d206469616d206c6163696e69612e20457469616d2000756c747269636573206c65637475732073697420616d6574206f726369207300616769747469732c2076656c20616c69717565742065726f73206c6163696e0069612e20496e74656765722070686172657472612c20617263752065752062006c616e6469742064696374756d2c2076656c6974206f64696f20636f6d6d6f00646f206f64696f2c20757420636f6e7365717561742074656c6c757320717500616d206e6563206a7573746f2e205365642065666669636974757220736564002066656c69732061206d6178696d75732e204e756c6c616d20656c65696665006e64207363656c65726973717565206c6f72656d2c20696e206d6f6c65737400696520746f72746f72206d616c6573756164612076697461652e2045746961006d20636f6e64696d656e74756d2c20617567756520657420696163756c69730020646170696275732c206469616d206172637520706f72747469746f72207500726e612c20616320636f6e76616c6c6973206d61676e61206175677565207300656420646f6c6f722e2050686173656c6c75732076656c206f64696f207075007275732e0a0a457469616d20656c656966656e64206469676e697373696d20006e6973692066657567696174206c6163696e69612e205175697371756520650074206c61637573207669746165206172637520706f73756572652074656d700075732e204e616d20636f6e73657175617420657820696e206172637520756c007472696365732c2076656c2076656e656e61746973206e756e63206672696e0067696c6c612e20496e7465676572206575206a7573746f206964206e6962680020626962656e64756d2072757472756d2e20457469616d207363656c657269007371756520747572706973206c656f2c2061632074696e636964756e7420710075616d2064696374756d2065752e204475697320636f6e7365717561742063006f6e677565206a7573746f2c206469676e697373696d20626962656e64756d002073617069656e20656c656966656e6420656765742e204d616563656e617300206469676e697373696d206d6173736120757420626c616e646974206c616300696e69612e2050726f696e2066657567696174206e756e6320736564206c6f0072656d20616c697175616d2070756c76696e61722e20416c697175616d207600617269757320616e7465207365642073617069656e206469676e697373696d002c2065742064696374756d2073617069656e20696e74657264756d2e204165006e65616e206574206c656f2061756775652e2053656420756c74726963696500732074696e636964756e742065726f732c2073656420706f727461206d6175007269732066696e69627573206e65632e0a0a53757370656e6469737365206e006563206c6f72656d206c696265726f2e204d616563656e6173206e6563206c006967756c61206e6f6e20657820626c616e6469742073757363697069742e200050656c6c656e746573717565206c616375732072697375732c206f726e6172006520612063757273757320656765742c2074656d706f72207669746165206e0069736c2e204375726162697475722072757472756d20766f6c757470617420006578206120706c6163657261742e204d6f726269206d616c657375616461200074656c6c75732065752061726375206d6f6c6573746965206d61747469732e0020457469616d207363656c6572697371756520636f6d6d6f646f206175677500652c207175697320636f6d6d6f646f2076656c697420656c656966656e64200069642e204d617572697320617563746f72207669746165206d657475732071007569732076656e656e617469732e2050726f696e20626962656e64756d206600617563696275732074656c6c75732c20736f6c6c696369747564696e20696d0070657264696574206e69736920766f6c75747061742076656c2e20446f6e650063206661756369627573206d6f6c6573746965207175616d2c20657420667200696e67696c6c61206469616d2e0a0a446f6e656320696d706572646965742000657261742061206e6973692066696e696275732c207574206469676e69737300696d206e69736920666163696c697369732e204e756c6c6120696163756c690073207574207175616d20616c69717565742068656e6472657269742e205065006c6c656e74657371756520757420656c656966656e64206e657175652e2044006f6e6563206575206c6563747573206574206c656f20696e74657264756d200074696e636964756e742e204e616d20756c74726963657320656c6974206e690073692c2065676574206d6178696d7573207269737573206672696e67696c6c006120717569732e205365642076656c206e69736920617420747572706973200072757472756d2074696e636964756e742e204e756c6c6120636f6e677565200065726174206c6f72656d2c207365642066696e69627573206c616375732061006c69717565742065742e2050656c6c656e746573717565207574207175616d0020696e206f72636920736f64616c65732074656d706f72207574206575206e00657175652e2051756973717565206d616c65737561646120736167697474690073207269737573206e6f6e2076656e656e617469732e204e756e632066696e006962757320756c74726963696573206e69626820706f737565726520636f6e0073656374657475722e20496e7465676572206e6563206c6967756c61206e75006e632e205574206e6563206d617373612076656c206c6967756c612074726900737469717565206665726d656e74756d20696e2065752074656c6c75732e0a000a4d617572697320736f64616c6573206469616d2069642066656c6973206c00616f726565742c207175697320736f6c6c696369747564696e207475727069007320756c6c616d636f727065722e204e756c6c6120636f6d6d6f646f2c207300617069656e20657420756c6c616d636f7270657220736f6c6c69636974756400696e2c2073656d206c6563747573206672696e67696c6c61207175616d2c2000617420706c6163657261742065782065726f732075742073617069656e2e2000496e206f64696f206e6973692c207661726975732073697420616d65742064006f6c6f722076656c2c20756c74726963657320706c6163657261742074656c006c75732e20557420646f6c6f72206d692c2073656d706572206e6f6e206d610078696d75732076656c2c2070756c76696e61722061742066656c69732e2045007469616d207269737573206e756c6c612c2065666669636974757220617420006c6f72656d206c6f626f727469732c20706f72746120656c656966656e6420006c6f72656d2e20566976616d757320617420636f6e64696d656e74756d206500726f732e204475697320657420696163756c6973206d692c2076697461652000636f6e736563746574757220617263752e20496e2065726f73206d6175726900732c2074656d706f7220717569732070656c6c656e74657371756520696e2c002070686172657472612076656c206c65637475732e204d6f72626920706f720074612c206c696265726f20617420736f64616c657320656c656966656e642c00206c61637573206c6f72656d20626962656e64756d206f64696f2c206e65630020706f72747469746f72206c65637475732074656c6c75732076656c207365006d2e204e756c6c61207363656c657269737175652065742075726e61206575002064696374756d2e205574206f726e617265206d61747469732074656d707500732e20557420626c616e646974206f64696f2061206d61737361206d617869006d75732c206e6563206d616c657375616461206c696265726f206661756369006275732e0a0a5574206d6178696d757320756c7472696369657320747269730074697175652e20457469616d206163206469616d206174206e756c6c61206c00756374757320756c6c616d636f7270657220696e20657520656c69742e2053006564206574206d617373612076656c206e6962682072686f6e637573207469006e636964756e742e2053656420636f6e677565207363656c65726973717565002074656d7075732e205175697371756520766f6c7574706174206d6173736100206c6f72656d2c2076656c2072757472756d20656e696d20636f6e64696d65006e74756d206e65632e20416c697175616d2074757270697320646f6c6f722c0020656666696369747572207365642064696374756d20616c697175616d2c20006d6174746973206964206c616375732e204d616563656e6173206665756769006174206e6973692071756973206d6178696d757320636f6e76616c6c69732e000a0a5365642074696e636964756e74207574206a7573746f207669746165200066696e696275732e204d617572697320626c616e6469742065726174206e75006e632c20766974616520616363756d73616e2061726375206672696e67696c006c6120717569732e2053656420756c7472696365732074696e636964756e7400206469616d2073697420616d657420626962656e64756d2e20416c69717561006d206661756369627573206c61637573206567657420766573746962756c75006d2068656e6472657269742e204e756c6c616d20766172697573206e656320006e6571756520657420656c656966656e642e2053656420766974616520747500727069732065742074757270697320656c656966656e642074656d706f722e002050656c6c656e74657371756520766573746962756c756d206172637520610020657569736d6f64206d61747469732e205072616573656e74206e6563207200697375732073697420616d6574207475727069732064617069627573207375007363697069742e20446f6e656320626962656e64756d2074656d707573206d006920696e2072757472756d2e20566573746962756c756d206d61737361206d00657475732c20696d7065726469657420657520736f64616c65732071756973002c20616363756d73616e2076656e656e6174697320617263752e20496e206e006f6e20706f7375657265206c696265726f2c2076656c207375736369706974002075726e612e0a0a53757370656e64697373652073617069656e206d65747500732c2070756c76696e6172206e6563206c61637573206d6f6c65737469652c00206567657374617320766573746962756c756d2065782e2056657374696275006c756d2074656d706f7220616e7465206e6563206e756e632074696e63696400756e7420666163696c697369732e20457469616d20626962656e64756d2c2000616e746520696e207072657469756d20636f6e6775652c206d61737361206c006f72656d206c6f626f727469732065782c206e65632072686f6e6375732074006f72746f72206d61757269732061632070757275732e20496e2072686f6e630075732076756c707574617465206d61676e6120617420657569736d6f642e20004d616563656e61732076656c206c616f72656574206a7573746f2c20696e20006c6163696e6961206f64696f2e2050656c6c656e74657371756520616c697100756574206c616375732061632076656e656e61746973206c75637475732e2000496e74657264756d206574206d616c6573756164612066616d65732061632000616e746520697073756d207072696d697320696e2066617563696275732e200051756973717565206c6163696e6961207072657469756d2075726e6120736f0064616c6573206d6178696d75732e20496e7465676572206469676e69737369006d207072657469756d206d6f6c6c69732e20536564206c656374757320656c0069742c20616c697175616d2061206469616d2069642c20646170696275732000766172697573206c6967756c612e204d6f726269206c6163696e696120736f0064616c6573206c6f72656d2c20696420616c697175616d206e69736c20706f00737565726520656765742e0a0a41656e65616e2070686172657472612c207400656c6c7573206163206469676e697373696d20656765737461732c206175670075652065737420656c656d656e74756d2066656c69732c2076656c206c6f62006f72746973206e69736920656e696d20636f6d6d6f646f207475727069732e002053757370656e6469737365206e756e63207475727069732c206c6f626f720074697320736564206d61757269732069642c20706f72746120736f6c6c69630069747564696e206a7573746f2e2050726f696e20656c656d656e74756d206d0061757269732073697420616d6574206f72636920696e74657264756d207469006e636964756e742e2053656420706f7274612075726e612066656c69732c200069642076656e656e617469732073617069656e207363656c65726973717565002065742e20566976616d7573206461706962757320706f72747469746f7220006a7573746f2c206964206d6f6c6573746965206e69736c20696163756c6973002074696e636964756e742e20496e206d6174746973206d6175726973207369007420616d657420636f6e76616c6c697320756c747269636965732e20446f6e00656320636f6d6d6f646f206567657374617320657261742076697461652061007563746f722e204e756c6c616d2066657567696174206d61676e6120657374002c20657420706f72747469746f72206573742074656d706f722061632e2041006c697175616d20766172697573206d69206575206c61637573206d6174746900732c2073697420616d6574207375736369706974206e69736920736f64616c0065732e2041656e65616e2065742068656e6472657269742076656c69742c2000696e20706c616365726174206e6973692e20446f6e65632071756973207665006c6974206d692e20457469616d20706c61636572617420657261742076656c002065726f73206672696e67696c6c6120636f6d6d6f646f2e0a0a5068617365006c6c7573207669746165206475692066656c69732e205072616573656e7420007072657469756d206d6174746973206e657175652c2065676574206672696e0067696c6c612066656c69732074656d706f722061742e20437261732061756300746f72206e69736c206e65632073656d206c6f626f72746973206d6174746900732e2050656c6c656e746573717565206d61747469732074696e636964756e00742074656d7075732e2050726f696e206c616f726565742073656d20612076006f6c75747061742072686f6e6375732e204d6f726269206575206d6175726900732073697420616d65742072697375732074696e636964756e74206f726e610072652e2041656e65616e20756c6c616d636f72706572206c61637573206e6f006e206e756e6320696d706572646965742c20657420656c656966656e64207400656c6c757320706c6163657261742e2043726173206574206d6920696e20640069616d206567657374617320706c616365726174206e6f6e2073697420616d006574206c65637475732e20416c697175616d20696163756c697320707572750073206c6f626f727469732c207363656c657269737175652065726f732065670065742c2076617269757320646f6c6f722e2043757261626974757220737573006369706974206e6571756520736564206567657374617320636f6e736571750061742e20496e2076656c20616c697175616d206d657475732c206c75637475007320636f6d6d6f646f206e6962682e2053656420636f6e736571756174207000756c76696e6172206d692c20736167697474697320616c6971756574206572006f73206d6178696d75732076756c7075746174652e2055742065742074656d00707573206c616375732e0a0a53757370656e646973736520706f74656e7469002e20447569732076656c2076756c707574617465206d61757269732c2075740020736f6c6c696369747564696e206d692e20446f6e65632076656c20616c69007175616d206c6967756c612c20656765742072686f6e6375732074656c6c7500732e205072616573656e74206e65632065726f732076697461652065726f73002076756c70757461746520617563746f722e204e756e63207375736369706900742c206d617572697320696420696e74657264756d20756c6c616d636f72700065722c20746f72746f72206a7573746f20646170696275732073617069656e002c207669746165206c6163696e6961206c656f2075726e61207669766572720061206e6962682e205175697371756520626962656e64756d20617563746f72002065726f732c206964206d6174746973206d617373612064696374756d2061002e205574206964206d69206e69736c2e20566573746962756c756d20657520006c7563747573206c616375732e20446f6e65632061206d6178696d7573206600656c69732e0a0a446f6e65632073656d206e69736c2c20756c7472696365730020612074656c6c75732075742c2070656c6c656e7465737175652066616369006c69736973206e756c6c612e205365642065742073617069656e207574206500726f7320636f6e64696d656e74756d20706f72747469746f722e204675736300652073697420616d6574206d657475732065782e20496e2061206578207369007420616d65742074656c6c75732070756c76696e617220636f6e73657175610074206120696420656e696d2e204d616563656e617320756c6c616d636f727000657220736f64616c6573207475727069732c207175697320756c6c616d636f00727065722065726f7320636f6e7365717561742065742e20496e74656765720020736f64616c6573206573742073697420616d657420616e74652074656d700075732c20696420616c69717565742066656c69732072757472756d2e204c6f0072656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365006374657475722061646970697363696e6720656c69742e204d616563656e61007320696420747572706973207669746165206573742076656e656e617469730020656c656d656e74756d2e0a0a446f6e656320696163756c697320677261760069646120636f6e73656374657475722e20457469616d20657569736d6f64200065726f73206567657420766573746962756c756d206672696e67696c6c612e0020496e20706f7274612c206572617420766974616520656c656d656e74756d0020677261766964612c20747572706973206c6f72656d206d6f6c657374696500206e6962682c20696420706861726574726120746f72746f72206d6574757300206c6163696e6961207475727069732e204d6175726973207072657469756d0020766172697573207475727069732c2065742063757273757320657820766900766572726120717569732e20536564206d616c657375616461206c656f20650074206d617373612074656d707573206c6163696e69612e204e756e63207369007420616d657420656e696d2073656d2e20446f6e65632076656c206772617600696461207175616d2c2076656e656e61746973207665686963756c612065720061742e0a0a496e206e6f6e206c61637573206d616c6573756164612c206d610078696d7573206e696268206e65632c20636f6e73656374657475722076656c0069742e204e756c6c61206575206772617669646120746f72746f722e205068006173656c6c757320696e74657264756d206665726d656e74756d20766172690075732e204d6f726269207661726975732076656c697420696e206c6163757300207363656c65726973717565206d616c6573756164612e2050686173656c6c00757320737573636970697420616c697175616d2065726f7320696e20747269007374697175652e20566573746962756c756d2061632075726e61206e756e63002e204d6175726973207072657469756d20746f72746f72206469616d2c206100206672696e67696c6c61206c65637475732074656d7075732061632e0a0a4d006f72626920696d70657264696574206d6f6c6c697320646f6c6f722c206e65006320656666696369747572207175616d20616c697175657420612e2056697600616d7573206c75637475732070757275732076656c206e69736c2065756973006d6f6420706f72747469746f722061632076697461652074656c6c75732e2000437261732073757363697069742074726973746971756520707572757320750074207363656c657269737175652e2050656c6c656e746573717565207369740020616d657420656c6974206964206c696265726f206665726d656e74756d2000736f64616c65732e204e756c6c616d20636f6e76616c6c6973206c6967756c006120696e207175616d207072657469756d2c20696420616c6971756574206e0069626820636f6e7365717561742e204e756c6c6120666163696c6973692e200041656e65616e206f726369206c696265726f2c2068656e64726572697420750074206c6f72656d2076656c2c20706f72747469746f7220706f72747469746f0072206c696265726f2e20557420696420616363756d73616e206d617373612e00205365642073617069656e206c656f2c2074696e636964756e7420707265740069756d2061756775652076697461652c207669766572726120766f6c7574700061742073617069656e2e204d6f726269206d6f6c6c6973206f726369207365006420756c74726963657320636f6e64696d656e74756d2e20437261732061630063756d73616e20736167697474697320696d706572646965742e204e616d200074656d706f7220766573746962756c756d207475727069732c20636f6e6469006d656e74756d2074656d706f72206f64696f20656c656d656e74756d207665006c2e20566573746962756c756d20737573636970697420616e7465206120610072637520616363756d73616e2c2076656c20636f6e677565206d61757269730020677261766964612e0a0a50686173656c6c757320766f6c7574706174206d0061757269732065676574206c696265726f206c616f7265657420616c69717500616d2e20566573746962756c756d207269737573206e69736c2c2074656d7000757320617420766f6c75747061742076697461652c2074696e636964756e74002076697461652065726f732e20416c697175616d2076656e656e617469732000616e746520626c616e64697420707572757320666575676961742c20612061006c697175616d20616e746520626962656e64756d2e2050726f696e20696e7400657264756d20697073756d206e6962682c2076656c20706f7274612066656c00697320657569736d6f642065742e20457469616d20717569732074656c6c75007320646f6c6f722e2044756973206964206c616f72656574206f64696f2c20006574206375727375732072697375732e2053757370656e6469737365206c61006f7265657420646f6c6f72206575206e756c6c6120666575676961742c20730065642066657567696174206e756c6c6120626c616e6469742e20416c69717500616d20717569732061726375207175697320617567756520756c7472696365007320696163756c69732e20446f6e65632069642065726f73206e6f6e206e6900736920616363756d73616e206f726e6172652076656c20757420657261742e002053656420636f6d6d6f646f206c756374757320616e74652071756973207000756c76696e61722e205072616573656e7420616c697175616d206d6f6c6c6900732070757275732072686f6e63757320636f6e7365717561742e2055742076006974616520636f6e6775652072697375732e20496e206d6f6c6c6973206120007075727573206964206c6163696e69612e0a0a467573636520616c69717561006d2061756775652073697420616d6574206a7573746f2070656c6c656e746500737175652c20756c6c616d636f7270657220706f727461206475692069616300756c69732e2050726f696e20656765737461732076756c707574617465206e0069736c2c2076656c20637572737573206d6173736120706f72747469746f72002061742e20536564206e6f6e2074656c6c75732076656c206e756c6c612062006c616e64697420666163696c697369732e204d616563656e617320657261740020656e696d2c20736f64616c65732061206c6163696e69612076656c2c2061006c6971756574207574206e756c6c612e20496e74656765722066656c69732000617263752c20736f64616c65732076656c206661756369627573207369742000616d65742c20766573746962756c756d2065676574206c6f72656d2e204e75006c6c612076697665727261206f64696f206163206e756e63206c7563747573002c20657520706c6163657261742074656c6c757320616c697175616d2e204d006f726269206e65632073656d20657520616e746520706f737565726520736f006c6c696369747564696e2e204e756c6c6120616363756d73616e20636f6e7300656374657475722065737420766974616520756c747269636965732e20447500697320666163696c69736973207363656c65726973717565206d6175726973002c206e6f6e20636f6e64696d656e74756d2064756920766f6c75747061742000696e2e0a0a4d617572697320717569732066696e6962757320656e696d2e20004e756e6320656765742065726f7320616c69717565742c206d6178696d757300206c6f72656d206e6f6e2c2070656c6c656e746573717565206a7573746f2e00204d6f7262692065676574206e756e6320696420726973757320657569736d006f6420626c616e6469742076656c20612072697375732e204d617572697320006120736f64616c65732074656c6c75732e2043757261626974757220626c61006e646974206174206e756e63206174206566666963697475722e204475697300206575206c696265726f206e656320647569206d6174746973206d6178696d0075732e2053656420636f6e7365717561742065726174206d61757269732c2000757420706f727461206c6563747573206665756769617420717569732e2056006573746962756c756d2076656c2074656c6c7573206e65632073617069656e0020636f6e6775652076656e656e617469732e20446f6e656320706c6163657200617420756c747269636573206d692e204675736365206c7563747573206e6f006e206d6175726973206163206375727375732e204e756c6c61206567657420006d61676e6120766974616520747572706973206d616c6573756164612076690076657272612e2050656c6c656e746573717565206174206c656374757320690064206d61676e612064617069627573206d6174746973207669746165206120007175616d2e0a0a496e206572617420657261742c20696d7065726469657420007574207175616d206e65632c20756c6c616d636f727065722072757472756d00207475727069732e204d6f72626920706c61636572617420656c697420617400206e6973692070656c6c656e74657371756520706c6163657261742e205072006f696e207669766572726120736f6c6c696369747564696e20637572737573002e2046757363652076656e656e6174697320626c616e646974206e69736c200073656420636f6e6775652e204675736365206d6f6c65737469652c2075726e00612076656c20636f6e76616c6c69732072686f6e6375732c20656c6974206d006574757320657569736d6f642065782c2071756973207665686963756c6120006d61737361207075727573206163206475692e2041656e65616e206e6f6e20006c61637573207665686963756c612c20656c656966656e6420656c69742073006f64616c65732c207661726975732073617069656e2e20536564206e756c6c0061206a7573746f2c206665726d656e74756d20706f72747469746f722076690076657272612075742c20706f727461206567657420656e696d2e2050656c6c00656e74657371756520636f6e736563746574757220736167697474697320740075727069732c206174206375727375732064756920706f737565726520696e002e205175697371756520612073757363697069742065726f732e2045746961006d20616c69717565742c20646f6c6f722061742064696374756d2072686f6e006375732c206d692065737420756c6c616d636f727065722072697375732c2000612074696e636964756e742074757270697320746f72746f72206e6f6e206e006962682e2053656420636f6d6d6f646f206469616d206163206f7263692076006f6c75747061742c207669746165206c6f626f72746973206d61676e612070006f73756572652e204475697320636f6d6d6f646f20656c697420696420657800207661726975732c206567657420706f737565726520697073756d2061756300746f722e20467573636520756c74726963696573206f64696f20657520636f006e67756520616c69717565742e2055742071756973206573742070756c7669006e61722c2076756c707574617465206c65637475732076756c707574617465002c20636f6e7365717561742073617069656e2e0a0a446f6e656320636f6e7600616c6c6973206d61757269732074656d707573207661726975732061756374006f722e20416c697175616d207472697374697175652064696374756d207075007275732c20696420677261766964612075726e6120616c6971756574207574002e20566976616d75732065752076656e656e6174697320616e74652c206d610078696d75732074696e636964756e74206f7263692e20557420617420616c69007175616d206c6f72656d2e20416c697175616d206e6f6e206c61637573206e00756c6c612e204d6f72626920766974616520656666696369747572206d61730073612c2076697461652072686f6e63757320657261742e2041656e65616e20006e6f6e20657261742071756973206d617572697320657569736d6f6420626c00616e6469742e205574207669746165206e756c6c612073697420616d6574200074656c6c7573206567657374617320636f6e7365717561742e205574206c69006265726f206c65637475732c20626c616e6469742070756c76696e6172207300757363697069742065752c20636f6e7365637465747572207669746165207300617069656e2e2043757261626974757220706f727461206e756e632066656c0069732c20717569732070656c6c656e746573717565206c656f206469676e69007373696d2061742e204d6f7262692076656c20696163756c6973206e696268002e20446f6e65632074696e636964756e742065737420657520696d706572640069657420706f72747469746f722e20566573746962756c756d20696e207475007270697320746f72746f722e0a0a50726f696e207669746165206172637520006e6962682e205072616573656e74206573742073617069656e2c2074696e63006964756e7420617420617263752076697461652c2076656e656e617469732000736f6c6c696369747564696e20746f72746f722e2050656c6c656e7465737100756520666163696c697369732c206f64696f20696e207472697374697175650020736f64616c65732c20657374206e6571756520657569736d6f642069707300756d2c20657520656c656d656e74756d206f726369206e6571756520766974006165206c696265726f2e20446f6e65632074656d706f72206c696265726f2000696e206c656f20636f6d6d6f646f2c2075742076756c707574617465206d6100676e61206c616f726565742e204d616563656e61732072757472756d20656c00656d656e74756d20766f6c75747061742e20536564206d6f6c65737469652c00206d6574757320657520656c656d656e74756d20616363756d73616e2c207300656d207175616d20636f6e76616c6c6973206c696265726f2c206e6f6e206d00616c65737561646120616e7465206c61637573206c6f626f7274697320746f0072746f722e205365642076656c697420646f6c6f722c20636f6e73656374650074757220617563746f7220616c697175657420696e2c206f726e617265206500752073617069656e2e204e756c6c61206574206c65637475732061207075720075732073656d706572206d61747469732e204e756c6c616d206d61747469730020656c656966656e64206d6f6c65737469652e0a0a4d6175726973206c6f62006f727469732065726174206c616375732c20757420766573746962756c756d00206175677565207072657469756d2065752e20446f6e65632065742073656d00706572206d61757269732c2073697420616d65742067726176696461206c6500637475732e20447569732076656e656e61746973206d69206f7263692c2061002065666669636974757220646f6c6f7220617563746f722069642e204e756c006c61206e6f6e2075726e612075742065726174207665686963756c61207469006e636964756e74207574206964206a7573746f2e2041656e65616e206c616300696e696120657374206964206c7563747573206d616c6573756164612e20550074206f726e61726520647569207175697320636f6e736563746574757220700072657469756d2e20496e206163206a7573746f206163206e756c6c61207669007665727261207665686963756c612e2053757370656e646973736520696e2000766573746962756c756d206d657475732c206120736f64616c6573206c6f7200656d2e204d6f726269206e6f6e206c6967756c612076697461652074656c6c0075732066696e69627573207363656c6572697371756520617420696e20616e0074652e205175697371756520696e2073656d70657220646f6c6f722e2045740069616d206d6f6c6c69732c206d6574757320696420766f6c7574706174207300656d7065722c206d61737361206e65717565206c6163696e69612073656d2c0020696e20656666696369747572206c656374757320656c6974207574206e75006e632e2050726f696e206c6163696e6961206c6f72656d2071756973207475007270697320756c7472696365732c20757420666175636962757320646f6c6f007220656c656966656e642e20446f6e6563206c6f626f727469732069707375006d206575206572617420616c69717565742c2065752065676573746173206c006967756c6120656c656d656e74756d2e205072616573656e74206964206572006f732066696e696275732c206d6f6c6c69732074757270697320696e2c206d006f6c6c6973207175616d2e2050686173656c6c757320626c616e6469742063006f6d6d6f646f206e756e6320696e20626c616e6469742e204e616d207175690073207269737573207574206469616d206c6f626f72746973207361676974740069732e0a0a50726f696e20766f6c75747061742074656d707573207275747200756d2e2050726f696e20696d7065726469657420626c616e646974207361700069656e207175697320706c6163657261742e204e756c6c6120706f73756572006520647569206964206f64696f20657569736d6f642c20696420696163756c0069732075726e6120646170696275732e20446f6e65632070656c6c656e74650073717565206d617373612069642076697665727261206c616f726565742e20004e756c6c616d2071756973206c6163757320636f6e76616c6c69732c20626c00616e646974206c656f206e6f6e2c20616c697175616d206c696265726f2e2000536564206461706962757320617567756520696e2075726e61207068617265007472612c2061742073656d706572206c656374757320706c6163657261742e002053656420756c74726963657320726973757320696420696163756c6973200074656d7075732e20496e7465676572206665726d656e74756d2c2072697375007320657420636f6e736563746574757220636f6e6775652c206e756e63206500737420696163756c69732072697375732c20706f73756572652076656e656e00617469732065726f7320616e74652076656c2070757275732e20496e746567006572206c6163696e69612074656c6c7573207669766572726120726973757300207361676974746973206672696e67696c6c612e2043726173206e6f6e2069007073756d2071756973206e65717565207669766572726120666163696c6973006973206e6f6e20736564206475692e20467573636520636f6d6d6f646f2065006c656966656e64206a7573746f207175697320636f6e6775652e0a0a56697600616d7573207363656c657269737175652074696e636964756e74206e756e6300206469676e697373696d20636f6e64696d656e74756d2e2051756973717565002061726375206e69736c2c20756c6c616d636f72706572206e6563206c65630074757320717569732c20636f6e67756520616363756d73616e20657261742e0020437572616269747572207574206e697369207475727069732e20496e20760069746165206573742071756973206d657475732074656d7075732076657374006962756c756d206575206e656320617263752e2055742073656d206a757374006f2c206665756769617420657520636f6e73657175617420656765742c2075006c6c616d636f72706572206567657420697073756d2e205072616573656e7400207072657469756d206d6174746973206c656f2c2067726176696461206865006e647265726974206c696265726f2065666669636974757220656765742e20004d616563656e617320626c616e646974206e696268206469616d2c206e656300206c6163696e69612061726375206c6163696e69612065742e0a0a4675736300652074696e636964756e7420746f72746f722066656c69732e2053656420640069616d206e6962682c20637572737573206e656320646170696275732065670065742c206f726e61726520656666696369747572206d692e20446f6e65632000696420746f72746f72207669746165206d692064696374756d2076657374690062756c756d2e2050726f696e206964206c696265726f20616c697175616d200076656c69742074656d706f7220696d706572646965742073697420616d657400207669746165206c616375732e20437261732073697420616d6574206578200068656e6472657269742c206672696e67696c6c6120617567756520696e2c20006c616f72656574206f7263692e204d616563656e6173206c61637573206d65007475732c20656c656966656e6420736564206d657475732075742c2065756900736d6f6420657569736d6f642076656c69742e20496e746567657220696e2000616363756d73616e206d692e0a0a41656e65616e20696163756c6973207665006c206a7573746f20756c7472696369657320766f6c75747061742e20437261007320636f6e73656374657475722c2065726f73206e6f6e20756c6c616d636f007270657220696163756c69732c2076656c6974206578207665686963756c61002076656c69742c2073697420616d657420696163756c6973206a7573746f20006469616d206567657420657261742e20496e74656765722066696e696275730020736f64616c6573206d617373612073697420616d6574206d616c657375610064612e20496e2072686f6e6375732073617069656e206964207175616d207600697665727261207665686963756c612e20496e20686163206861626974617300736520706c617465612064696374756d73742e20446f6e656320616320706f0072747469746f72206e657175652c2073656420656666696369747572206c690067756c612e20446f6e6563206567657420616c697175616d206c616375732c00206e6f6e207665686963756c61206e69736c2e2053656420706c61636572610074206d617474697320636f6e76616c6c69732e20496e746567657220736f6400616c65732c206e69736c2061207665686963756c61206469676e697373696d002c2076656c69742074656c6c7573206566666963697475722070757275732c00206120766573746962756c756d206f64696f206c6163757320696420646961006d2e204e756c6c616d20766974616520626c616e64697420656c69742e20500072616573656e742074696e636964756e74206c656374757320656c69742c20006e6f6e2074656d707573206e69736c20677261766964612076697461652e20004e756c6c61206469616d2070757275732c206c616f7265657420766974616500206567657374617320696e2c20636f6e7365637465747572206574206d6175007269732e2053656420766172697573206d6f6c6c697320656c656d656e7475006d2e204e616d2073697420616d6574206d61676e6120677261766964612c200068656e64726572697420697073756d206e6f6e2c2074656d7075732073656d002e204d616563656e6173206469676e697373696d206d6f6c6c69732072686f006e6375732e205365642066656c6973206e69736c2c2073656d706572206174002074656c6c75732065742c206d616c65737561646120616c697175616d2069007073756d2e0a0a496e74656765722073757363697069742076656c6974206900642073656d206665726d656e74756d2c207175697320756c747269636573200073656d2074696e636964756e742e2041656e65616e2076656c20646f6c6f7200206e65632074757270697320656c656d656e74756d207363656c65726973710075652e2050726f696e206f64696f20746f72746f722c20616c697175657420006567657420696d7065726469657420717569732c20736f6c6c69636974756400696e206964206c616375732e2050656c6c656e74657371756520656e696d2000656c69742c207375736369706974206964207175616d206e65632c206375720073757320616c697175616d2065726f732e20446f6e656320626962656e6475006d2073697420616d6574206d657475732071756973207363656c65726973710075652e204e756e6320616320747572706973206a7573746f2e205365642070006c61636572617420746f72746f72206e6563206c6163757320736f6c6c69630069747564696e207363656c657269737175652e2050686173656c6c7573207600697461652063757273757320657261742c20616320756c747269636965732000746f72746f722e0a0a43726173206d616c657375616461206772617669646100206a7573746f2076656c207661726975732e204e756c6c616d206c616f7265006574206964206d617572697320696e20646170696275732e20437572616269007475722073757363697069742065782065676574207361676974746973206c0075637475732e20447569732071756973207669766572726120656c69742c20007175697320756c6c616d636f72706572206e756e632e204d61757269732065006c656966656e642c206d6173736120696e20626962656e64756d2061636375006d73616e2c206578206e69736920766573746962756c756d206469616d2c2000757420696163756c697320647569206f72636920736564207475727069732e00204e756c6c6120626962656e64756d2c2076656c697420657520636f6e7661006c6c69732073656d7065722c206d65747573206e69736c20706f7375657265002061756775652c2068656e64726572697420696163756c6973207361706965006e207175616d206574206469616d2e2050726f696e2076656c206e69736c200061756775652e20566976616d75732076656e656e61746973206d657475732000736564206d617572697320706f73756572652c20612068656e6472657269740020656e696d20766976657272612e204475697320636f6d6d6f646f206172630075206574206d61676e6120756c7472696365732070656c6c656e746573717500652e204e616d20696e206c696265726f2076656e656e617469732c2076657300746962756c756d206175677565206c6163696e69612c20766172697573206c006f72656d2e20457469616d206574206c7563747573206c616375732e205175006973717565206d6f6c65737469652c206e69626820617420756c74726963650073206d61747469732c206c616375732075726e6120636f6e76616c6c697320006e756c6c612c20696e206d616c657375616461206e756c6c61206c656374750073206e6f6e206469616d2e20457469616d206567657420697073756d206d6100676e612e2050686173656c6c75732066656c6973207175616d2c2062696265006e64756d2073697420616d657420726973757320717569732c20677261766900646120657569736d6f642066656c69732e0a0a46757363652076656e656e610074697320696e74657264756d20656c69742c20717569732072757472756d20006f72636920706f7375657265206e6f6e2e20496e20656c656966656e6420650073742071756973206469616d20666163696c697369732c206163206d616c65007375616461206d61737361206f726e6172652e204c6f72656d20697073756d0020646f6c6f722073697420616d65742c20636f6e7365637465747572206164006970697363696e6720656c69742e205365642063757273757320616c69717500616d206f64696f2076656c2073757363697069742e2050656c6c656e74657300717565206163206c696265726f206163206572617420616c6971756574207300616769747469732e204d616563656e617320616e7465206c616375732c20730063656c65726973717565206574207472697374697175652076697461652c20006566666963697475722065676574207175616d2e2050686173656c6c7573200072757472756d20656c69742061756775652c2071756973206c6163696e696100206f7263692074696e636964756e74206e65632e20496e20636f6e736563740065747572206964206f726369206575207363656c657269737175652e205065006c6c656e74657371756520616c69717565742074656d707573206f64696f200075742076756c7075746174652e2051756973717565206c696265726f206e6900736c2c2072757472756d2061742073617069656e206e65632c206c616f726500657420747269737469717565206a7573746f2e2043726173206c6163696e690061206e6962682069642065726f732072757472756d207363656c65726973710075652e204e756e63206e6f6e206d6175726973206f7263692e204e616d2069006d706572646965742064617069627573206a7573746f2e20496e2076656c20006c6163757320706f72747469746f722c20766172697573207269737573207500742c20616c697175616d20746f72746f722e2043757261626974757220696e00206d657475732076656c2065782076656e656e6174697320706f7274612e0a000a53757370656e6469737365207365642070756c76696e6172206573742e200050686173656c6c7573206e6563206d6920656c656966656e642c20666575670069617420617263752061742c20706f72747469746f72206e6973692e204475006973206567657420626c616e6469742065782e2043726173206120647569200065726f732e20496e74657264756d206574206d616c6573756164612066616d00657320616320616e746520697073756d207072696d697320696e206661756300696275732e20496e2073656d206c696265726f2c20766f6c757470617420650067657420647569207365642c2070656c6c656e746573717565206c7563747500732065782e20536564206574206c656f20656765742065726f7320696e7465007264756d206d6178696d75732e2050686173656c6c7573206e6f6e206d6f6c006573746965206c65637475732c206e6f6e207665686963756c61206c6563740075732e20446f6e656320656666696369747572206d616c657375616461206d0061757269732c2065676574207472697374697175652073656d206c6f626f720074697320612e204e616d2074656c6c75732075726e612c2072686f6e63757300206665726d656e74756d20737573636970697420717569732c20696d70657200646965742071756973206f7263692e20557420637572737573206572617420007669746165206665726d656e74756d20666163696c697369732e204e756e630020757420626c616e646974206c6f72656d2e20566573746962756c756d207400656c6c7573206469616d2c20636f6e67756520657520706f7375657265207500742c206c6f626f7274697320612073656d2e204e756c6c616d206163206f72006369206e6f6e2075726e6120656c656966656e6420696d706572646965742e000a0a5072616573656e74207669746165206e69736c206672696e67696c6c61002c2073757363697069742065726174207365642c20656c656d656e74756d200072697375732e20446f6e656320696420756c74726963696573206f64696f2e002050726f696e206d6174746973206d61757269732061206d61737361206d610078696d7573207472697374697175652e2050686173656c6c757320656765740020706f7375657265206e6962682e2050686173656c6c757320736564206d650074757320657420657820636f6d6d6f646f20766f6c75747061742e2041656e0065616e206c6163696e69612c206175677565206e6f6e206566666963697475007220636f6e6775652c206d617373612073656d207669766572726120646961006d2c207175697320706f737565726520647569206c6f72656d2061206c6f7200656d2e20496e2076756c7075746174652064756920657520656c6974207375007363697069742074656d706f722e204372617320696d70657264696574206d0061757269732073656420657820637572737573206c616f726565742e2056690076616d7573206e65717565206573742c20666163696c697369732071756973002066656c697320717569732c20706f72747469746f7220706f72747469746f0072206e756e632e204675736365206e6f6e206c6f626f72746973206c6f7265006d2e0a0a4d616563656e617320766f6c7574706174206661756369627573200074656c6c757320756c747269636965732070756c76696e61722e205068617300656c6c7573206120706f72747469746f7220617263752e20446f6e6563207600756c70757461746520656e696d207475727069732c20612074696e63696475006e74206469616d2074656d706f722065752e20446f6e656320736f6c6c69630069747564696e2c206578207669746165206c75637475732076657374696275006c756d2c206e69736c20616e746520756c6c616d636f72706572206d692c2000617420756c7472696369657320656e696d20646f6c6f722073656420656c6900742e205072616573656e74206d6f6c6c697320656666696369747572207269007375732071756973207072657469756d2e20566573746962756c756d2071750069732066696e69627573206475692c2065676574206f726e617265206c6563007475732e20457469616d2065676574206a7573746f20766573746962756c75006d2c20626c616e6469742073656d20696e2c206d6178696d75732065726f73002e0a0a50686173656c6c7573206120697073756d206575206d69206375727300757320736f64616c6573206e656320736564206e6973692e204475697320660072696e67696c6c6120657374206163206c6967756c612070756c76696e61720020677261766964612e2050726f696e207669766572726120616363756d7361006e2073656d2c2076656c2072757472756d206e69736c20636f6e736571756100742076656c2e204e756e63206672696e67696c6c61206d657475732076656c002066617563696275732074656d706f722e205072616573656e7420636f6e73006563746574757220646170696275732061756775652c206574207363656c6500726973717565206c656374757320636f6e64696d656e74756d206e65632e20004e756e6320616363756d73616e2c2075726e61206e6f6e20706c6163657261007420756c7472696365732c206d617572697320617567756520736f6c6c69630069747564696e20616e74652c2073697420616d657420616c697175616d206c00616375732076656c69742061632074656c6c75732e205365642076656e656e00617469732c2074656c6c7573206e656320617563746f722064617069627573002c206c6f72656d2073617069656e2073656d70657220657261742c206575200076697665727261207175616d2075726e61207669746165206c6f72656d2e20004d616563656e6173207375736369706974206e756e63207574206d6f6c657300746965206d61747469732e20416c697175616d2076697461652065737420640069676e697373696d2064756920656c656d656e74756d20617563746f722e0a000a4d6f726269206e756c6c61206c616375732c2073656d706572207369742000616d65742066656c69732065742c2076756c707574617465206d616c65737500616461206475692e2050726f696e20656765742065726f73206c6563747573002e20446f6e65632074696e636964756e7420656c69742076656c20736f6c6c00696369747564696e2073616769747469732e2050726f696e206163206d6f6c0065737469652073656d2e2053757370656e646973736520696163756c69732000766573746962756c756d2073656d206574206d61747469732e2050726f696e00206c6f626f72746973206c616f72656574206469616d2c2073656420706f730075657265206573742074656d706f722065742e2053656420696e20746f7274006f72207175697320657820696d70657264696574206c6163696e6961207175006973206e6563206c6f72656d2e204d616563656e617320636f6e76616c6c69007320656666696369747572206f7263692c20657420706f72747469746f7220006e69736c20666163696c69736973206e6f6e2e205365642068656e647265720069742076656e656e617469732066656c697320666175636962757320656c65006d656e74756d2e204d6f7262692061632064756920736f64616c65732c207000656c6c656e74657371756520697073756d2076656c2c20736f64616c6573200076656c69742e20457469616d20656e696d206c6f72656d2c2076656e656e6100746973206163206c616375732065742c2065676573746173206d616c65737500616461206c65637475732e20416c697175616d20736f64616c6573206e6962006820656666696369747572206c656374757320616c697175616d2076657374006962756c756d206e6f6e2061206f64696f2e204d61757269732069642066610075636962757320656c69742c2073656d70657220706f72747469746f72206e00756c6c612e204675736365206f726e6172652c206a7573746f20696e20766500686963756c6120636f6d6d6f646f2c206c61637573206c6163757320636f6e006775652074656c6c75732c20757420666175636962757320697073756d207200697375732061206e756c6c612e20457469616d207669766572726120707572007573207175616d2c2076656c20706f72747469746f72206d6574757320696d00706572646965742065752e204d6f72626920636f6e76616c6c697320636f6e00736571756174206475692e0a0a4d61757269732074726973746971756520610072637520717569732072686f6e6375732064696374756d2e204e756e632064006f6c6f72206c696265726f2c206d6178696d757320617420656e696d207574002c20677261766964612072686f6e637573207175616d2e2056657374696275006c756d206d61747469732074696e636964756e7420666163696c697369732e00204675736365206e756c6c612061756775652c20656765737461732073656400206c6163696e69612076697461652c206d616c657375616461206163206e75006c6c612e204d617572697320696163756c6973207072657469756d206c61630075732c20612066696e696275732075726e6120706f73756572652061632e20004d6f72626920696e74657264756d20666175636962757320657261742c206100206c616f72656574206d61676e6120626c616e64697420612e204372617320006e6563206d61676e612071756973206c6163757320656765737461732069610063756c69732e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f862b093fd6807e033db6b24db5485814f79a98c7e241432e95c2e327042f821f24f4a59315cf4e881205f472e99835729977ab0aa9da85a334c2935e670bd44e9b734481fc5ab72859c76f741008a92c2836932af9e60697b6319f3454a141154fcd583f862b091a6c5d19e50b1b85ae2ef07477160381babf00f0906f5219ce09dee2e00d7d347cb0586d90b491637cdb1715e62d152b0a660592b94033f9c5f7987005fa5d1f84435585ddaaf4b3adc0a198b983f2ae007db73b90067a96ec214b24d7b9820b9"`; diff --git a/src/actions/wallet/prepareTransactionRequest.test.ts b/src/actions/wallet/prepareTransactionRequest.test.ts index fbe7b0c879..ed28575287 100644 --- a/src/actions/wallet/prepareTransactionRequest.test.ts +++ b/src/actions/wallet/prepareTransactionRequest.test.ts @@ -684,27 +684,27 @@ test('args: parameters', async () => { value: parseEther('1'), }) expect(result3).toMatchInlineSnapshot(` - { - "account": { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "nonceManager": undefined, - "publicKey": "0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5", - "signMessage": [Function], - "signTransaction": [Function], - "signTypedData": [Function], - "source": "privateKey", - "type": "local", - }, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "gas": 21000n, - "maxFeePerGas": 13000000000n, - "maxPriorityFeePerGas": 1000000000n, - "nonce": 655, - "to": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", - "type": "eip1559", - "value": 1000000000000000000n, - } - `) + { + "account": { + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "nonceManager": undefined, + "publicKey": "0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5", + "signMessage": [Function], + "signTransaction": [Function], + "signTypedData": [Function], + "source": "privateKey", + "type": "local", + }, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "gas": 21000n, + "maxFeePerGas": 13000000000n, + "maxPriorityFeePerGas": 1000000000n, + "nonce": 663, + "to": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "type": "eip1559", + "value": 1000000000000000000n, + } + `) const result4 = await prepareTransactionRequest(client, { account: privateKeyToAccount(sourceAccount.privateKey), @@ -713,27 +713,27 @@ test('args: parameters', async () => { value: parseEther('1'), }) expect(result4).toMatchInlineSnapshot(` - { - "account": { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "nonceManager": undefined, - "publicKey": "0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5", - "signMessage": [Function], - "signTransaction": [Function], - "signTypedData": [Function], - "source": "privateKey", - "type": "local", - }, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "gas": 21000n, - "maxFeePerGas": 13000000000n, - "maxPriorityFeePerGas": 1000000000n, - "nonce": 655, - "to": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", - "type": "eip1559", - "value": 1000000000000000000n, - } - `) + { + "account": { + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "nonceManager": undefined, + "publicKey": "0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5", + "signMessage": [Function], + "signTransaction": [Function], + "signTypedData": [Function], + "source": "privateKey", + "type": "local", + }, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "gas": 21000n, + "maxFeePerGas": 13000000000n, + "maxPriorityFeePerGas": 1000000000n, + "nonce": 663, + "to": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "type": "eip1559", + "value": 1000000000000000000n, + } + `) const { blobs: _blobs, @@ -936,10 +936,10 @@ test('behavior: nonce manager', async () => { } as const const request_1 = await prepareTransactionRequest(client, args) - expect(request_1.nonce).toBe(655) + expect(request_1.nonce).toBe(663) const request_2 = await prepareTransactionRequest(client, args) - expect(request_2.nonce).toBe(656) + expect(request_2.nonce).toBe(664) const [request_3, request_4, request_5] = await Promise.all([ prepareTransactionRequest(client, args), @@ -947,7 +947,7 @@ test('behavior: nonce manager', async () => { prepareTransactionRequest(client, args), ]) - expect(request_3.nonce).toBe(657) - expect(request_4.nonce).toBe(658) - expect(request_5.nonce).toBe(659) + expect(request_3.nonce).toBe(665) + expect(request_4.nonce).toBe(666) + expect(request_5.nonce).toBe(667) }) diff --git a/src/actions/wallet/sendTransaction.test.ts b/src/actions/wallet/sendTransaction.test.ts index 5794ad2128..06f03d09f2 100644 --- a/src/actions/wallet/sendTransaction.test.ts +++ b/src/actions/wallet/sendTransaction.test.ts @@ -179,7 +179,7 @@ test('sends transaction (w/ serializer)', async () => { ).rejects.toThrowError() expect(serializer).toReturnWith( - '0x08f30182028f843b9aca008501a786b06a825208809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0', + '0x08f301820297843b9aca008502ae1107ec825208809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0', ) }) @@ -973,11 +973,11 @@ describe('local account', () => { }), ]) - expect((await getTransaction(client, { hash: hash_1 })).nonce).toBe(671) - expect((await getTransaction(client, { hash: hash_2 })).nonce).toBe(105) - expect((await getTransaction(client, { hash: hash_3 })).nonce).toBe(672) - expect((await getTransaction(client, { hash: hash_4 })).nonce).toBe(673) - expect((await getTransaction(client, { hash: hash_5 })).nonce).toBe(106) + expect((await getTransaction(client, { hash: hash_1 })).nonce).toBe(679) + expect((await getTransaction(client, { hash: hash_2 })).nonce).toBe(112) + expect((await getTransaction(client, { hash: hash_3 })).nonce).toBe(680) + expect((await getTransaction(client, { hash: hash_4 })).nonce).toBe(681) + expect((await getTransaction(client, { hash: hash_5 })).nonce).toBe(113) const hash_6 = await sendTransaction(client, { account: account_1, @@ -990,8 +990,8 @@ describe('local account', () => { value: parseEther('1'), }) - expect((await getTransaction(client, { hash: hash_6 })).nonce).toBe(674) - expect((await getTransaction(client, { hash: hash_7 })).nonce).toBe(675) + expect((await getTransaction(client, { hash: hash_6 })).nonce).toBe(682) + expect((await getTransaction(client, { hash: hash_7 })).nonce).toBe(683) }) }) }) diff --git a/src/actions/wallet/signTransaction.test.ts b/src/actions/wallet/signTransaction.test.ts index 1f72b9ca12..befe01f1f7 100644 --- a/src/actions/wallet/signTransaction.test.ts +++ b/src/actions/wallet/signTransaction.test.ts @@ -73,7 +73,7 @@ describe('eip1559', () => { ...baseEip1559, }) expect(signature).toMatchInlineSnapshot( - `"0x02f855018203118085016b25dda6825208808080c001a0894d2e76b7b356750c81d8912d2f7e18dffa7cc49a3ceaa124f586814f981b59a016ab3f7fb02995af583cc345a7a5f1268da9c016dc1ac203a8565e0e7502af12"`, + `"0x02f855018203118085023fcf074c825208808080c080a0377bbfa08e94c5e78aecb79096d2198c1493cb2f1947052c437e1f976cb2dbe4a017ce1425a8efbe51ff2e283bec62522824b2ebdaa503ce22409699097300458c"`, ) }) diff --git a/src/clients/decorators/public.test.ts b/src/clients/decorators/public.test.ts index b5bc9a6a46..c81fb5acdb 100644 --- a/src/clients/decorators/public.test.ts +++ b/src/clients/decorators/public.test.ts @@ -203,7 +203,7 @@ describe('smoke test', () => { "chainId": 1, "name": "Mock4337Account", "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "verifyingContract": "0x8a00708a83D977494139D21D618C6C2A71fA8ed1", + "verifyingContract": "0xE911628bF8428C23f179a07b081325cAe376DE1f", "version": "1", }, "extensions": [], diff --git a/src/errors/request.test.ts b/src/errors/request.test.ts index ea1ee2167e..8fccc24823 100644 --- a/src/errors/request.test.ts +++ b/src/errors/request.test.ts @@ -42,7 +42,7 @@ test('HttpRequestError', () => { Status: 500 URL: http://localhost - Request body: {"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]} + Request body: {"method":"eth_getBlockByNumber","params":["0x12f2974",false]} Details: Some error Version: viem@x.y.z] @@ -62,7 +62,7 @@ test('WebSocketRequestError', () => { [WebSocketRequestError: WebSocket request failed. URL: http://localhost - Request body: {"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]} + Request body: {"method":"eth_getBlockByNumber","params":["0x12f2974",false]} Details: Some error Version: viem@x.y.z] @@ -81,7 +81,7 @@ test('TimeoutError', () => { [TimeoutError: The request took too long to respond. URL: http://localhost - Request body: {"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]} + Request body: {"method":"eth_getBlockByNumber","params":["0x12f2974",false]} Details: The request timed out. Version: viem@x.y.z] diff --git a/src/experimental/eip5792/actions/getCallsStatus.test.ts b/src/experimental/eip5792/actions/getCallsStatus.test.ts index 9a6cac81e2..c81b0f88ea 100644 --- a/src/experimental/eip5792/actions/getCallsStatus.test.ts +++ b/src/experimental/eip5792/actions/getCallsStatus.test.ts @@ -129,27 +129,27 @@ test('default', async () => { [ { "blockHash": undefined, - "blockNumber": 19808251n, + "blockNumber": 19868021n, "gasUsed": 21000n, "logs": [], "status": "success", - "transactionHash": "0x7d9298348068dfebaf342330ed23b514062eecd54a3fc099dee2ff02c1270a4f", + "transactionHash": "0x7818e87e5d2bc021d109f81e0b40e06f5dcc845399cd77f4cf67cbcaafdae5f3", }, { "blockHash": undefined, - "blockNumber": 19808251n, + "blockNumber": 19868021n, "gasUsed": 21000n, "logs": [], "status": "success", - "transactionHash": "0x3d51245022fbdcd373b690fce6a2c6b24a9b1ef6f417402c0876a9d526d14b22", + "transactionHash": "0xb4ac29a9fdd3baff0fe572a24d506d795bf96248c672eeb47c738fa23133121d", }, { "blockHash": undefined, - "blockNumber": 19808251n, + "blockNumber": 19868021n, "gasUsed": 21064n, "logs": [], "status": "success", - "transactionHash": "0xa25ecff28ff38ba36fee9f63eee72a84551d1a502407c92b7f00fd76d071ff85", + "transactionHash": "0x81449b64d551257c061b74357d033c4d892e18af1e247e951dea2c797476c460", }, ] `) diff --git a/src/experimental/eip5792/actions/writeContracts.test.ts b/src/experimental/eip5792/actions/writeContracts.test.ts index 50c4fb2cf4..787b168e41 100644 --- a/src/experimental/eip5792/actions/writeContracts.test.ts +++ b/src/experimental/eip5792/actions/writeContracts.test.ts @@ -198,12 +198,12 @@ test('default', async () => { "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x0000000000000000000000000000000000000000000000000000000000000221", ], - "transactionHash": "0x217f9a45ed86f0f83ec4215b2bb7d644300df2be450abdeb33426f0e65b4ae48", + "transactionHash": "0x82a761a2a38f2ff85cf8153f9c11a21995499010ba5376f8fe44fee59a80e61d", "transactionIndex": "0x0", }, ], "status": "success", - "transactionHash": "0x217f9a45ed86f0f83ec4215b2bb7d644300df2be450abdeb33426f0e65b4ae48", + "transactionHash": "0x82a761a2a38f2ff85cf8153f9c11a21995499010ba5376f8fe44fee59a80e61d", }, { "blockHash": undefined, @@ -224,12 +224,12 @@ test('default', async () => { "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x0000000000000000000000000000000000000000000000000000000000000222", ], - "transactionHash": "0x874f10d07221479f1244da376044194d706215c4bef981f4ac0082ff0c297ebb", + "transactionHash": "0x2858f710639cd4f15fc827597fb6d8ac272b23de31f498bfa56c3e5d43cb8a91", "transactionIndex": "0x1", }, ], "status": "success", - "transactionHash": "0x874f10d07221479f1244da376044194d706215c4bef981f4ac0082ff0c297ebb", + "transactionHash": "0x2858f710639cd4f15fc827597fb6d8ac272b23de31f498bfa56c3e5d43cb8a91", }, { "blockHash": undefined, @@ -250,12 +250,12 @@ test('default', async () => { "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x0000000000000000000000000000000000000000000000000000000000000223", ], - "transactionHash": "0xa8a36afb7307ef6fbd74979ee53e89c7f19140c603cb9acbfbbf7250f904caeb", + "transactionHash": "0x4fe8ecaac2a2d41e33235a8673e629c67b0e5a18c129df8ef782fa7476753d1a", "transactionIndex": "0x2", }, ], "status": "success", - "transactionHash": "0xa8a36afb7307ef6fbd74979ee53e89c7f19140c603cb9acbfbbf7250f904caeb", + "transactionHash": "0x4fe8ecaac2a2d41e33235a8673e629c67b0e5a18c129df8ef782fa7476753d1a", }, ] `) diff --git a/src/experimental/solady/decorators/solady.test.ts b/src/experimental/solady/decorators/solady.test.ts index c5d82d12e9..4391241ee1 100644 --- a/src/experimental/solady/decorators/solady.test.ts +++ b/src/experimental/solady/decorators/solady.test.ts @@ -46,7 +46,7 @@ test('signMessage', async () => { verifier, }) expect(result).toMatchInlineSnapshot( - `"0x2fd7a8fe17e1e364f3527263a1e0963f2bf1c1e12c0889347f7633351cb7d8060a1a87099c3ed804bd31405705946dc9266744574b1153f2905948a6967d67a11b"`, + `"0x70f581c85c8d5f84d7e5ae496afda8789b87c42293f881c6f382dcba35b5b57f59e181f93b98d51e4454aa8a4f43113f957f68cdf66eac7e06f5eeef224a85601b"`, ) const clientWithAccount = anvilMainnet @@ -56,7 +56,7 @@ test('signMessage', async () => { message: 'Hello, world!', }) expect(result_2).toMatchInlineSnapshot( - `"0x2fd7a8fe17e1e364f3527263a1e0963f2bf1c1e12c0889347f7633351cb7d8060a1a87099c3ed804bd31405705946dc9266744574b1153f2905948a6967d67a11b"`, + `"0x70f581c85c8d5f84d7e5ae496afda8789b87c42293f881c6f382dcba35b5b57f59e181f93b98d51e4454aa8a4f43113f957f68cdf66eac7e06f5eeef224a85601b"`, ) }) @@ -68,7 +68,7 @@ test('signTypedData', async () => { verifier, }) expect(result).toMatchInlineSnapshot( - `"0x17f7e62a3921a11100b1f9631ed17c176767719fcc6e6178bf05e44fe0def85274e45a4f27940e9bc53f55d8c6934524d461f031059ba41bc0991e52093e53a71c1788ede5301fb0c4b95dda42eabe811ba83dc3cde96087b00c9b72a4d26a379ac2972c4c4323c6d7ee73e319350f290c6549b6eb516b5e5354128413342332154d61696c2875696e743235362074696d657374616d702c506572736f6e2066726f6d2c506572736f6e20746f2c737472696e6720636f6e74656e74732c62797465732068617368294e616d6528737472696e672066697273742c737472696e67206c61737429506572736f6e284e616d65206e616d652c616464726573732077616c6c65742c737472696e675b335d206661766f72697465436f6c6f72732c75696e7432353620666f6f2c75696e7438206167652c626f6f6c206973436f6f6c2900c1"`, + `"0x6a3011fea94a44f91941b76abc4490ef6b27343cdb7588361af17efa0bbfc7b03f4e21b59a588f8d169fbd838003a1065162a623faca2b3ab4683c4750e883001b1788ede5301fb0c4b95dda42eabe811ba83dc3cde96087b00c9b72a4d26a379ac2972c4c4323c6d7ee73e319350f290c6549b6eb516b5e5354128413342332154d61696c2875696e743235362074696d657374616d702c506572736f6e2066726f6d2c506572736f6e20746f2c737472696e6720636f6e74656e74732c62797465732068617368294e616d6528737472696e672066697273742c737472696e67206c61737429506572736f6e284e616d65206e616d652c616464726573732077616c6c65742c737472696e675b335d206661766f72697465436f6c6f72732c75696e7432353620666f6f2c75696e7438206167652c626f6f6c206973436f6f6c2900c1"`, ) const clientWithAccount = anvilMainnet @@ -79,6 +79,6 @@ test('signTypedData', async () => { primaryType: 'Mail', }) expect(result_2).toMatchInlineSnapshot( - `"0x17f7e62a3921a11100b1f9631ed17c176767719fcc6e6178bf05e44fe0def85274e45a4f27940e9bc53f55d8c6934524d461f031059ba41bc0991e52093e53a71c1788ede5301fb0c4b95dda42eabe811ba83dc3cde96087b00c9b72a4d26a379ac2972c4c4323c6d7ee73e319350f290c6549b6eb516b5e5354128413342332154d61696c2875696e743235362074696d657374616d702c506572736f6e2066726f6d2c506572736f6e20746f2c737472696e6720636f6e74656e74732c62797465732068617368294e616d6528737472696e672066697273742c737472696e67206c61737429506572736f6e284e616d65206e616d652c616464726573732077616c6c65742c737472696e675b335d206661766f72697465436f6c6f72732c75696e7432353620666f6f2c75696e7438206167652c626f6f6c206973436f6f6c2900c1"`, + `"0x6a3011fea94a44f91941b76abc4490ef6b27343cdb7588361af17efa0bbfc7b03f4e21b59a588f8d169fbd838003a1065162a623faca2b3ab4683c4750e883001b1788ede5301fb0c4b95dda42eabe811ba83dc3cde96087b00c9b72a4d26a379ac2972c4c4323c6d7ee73e319350f290c6549b6eb516b5e5354128413342332154d61696c2875696e743235362074696d657374616d702c506572736f6e2066726f6d2c506572736f6e20746f2c737472696e6720636f6e74656e74732c62797465732068617368294e616d6528737472696e672066697273742c737472696e67206c61737429506572736f6e284e616d65206e616d652c616464726573732077616c6c65742c737472696e675b335d206661766f72697465436f6c6f72732c75696e7432353620666f6f2c75696e7438206167652c626f6f6c206973436f6f6c2900c1"`, ) }) diff --git a/src/utils/abi/parseEventLogs.test.ts b/src/utils/abi/parseEventLogs.test.ts index ad9feb6fbb..6c60d01e73 100644 --- a/src/utils/abi/parseEventLogs.test.ts +++ b/src/utils/abi/parseEventLogs.test.ts @@ -62,27 +62,27 @@ test('default', async () => { abi, logs, }) - expect(parsedLogs.length).toBe(811) + expect(parsedLogs.length).toBe(1135) expect(parsedLogs[0]).toMatchInlineSnapshot(` { - "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "address": "0xc56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8", "args": { - "from": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", - "to": "0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8", - "value": 100000000000000000n, + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, }, - "blockHash": "0xec0395936bc0113ff8a734eafb8883a21f2bb4489814a331213cf41f8a8dff2b", - "blockNumber": 19808245n, - "data": "0x000000000000000000000000000000000000000000000000016345785d8a0000", + "blockHash": "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b", + "blockNumber": 19868015n, + "data": "0x000000000000000000000000000000000000000000000000003feb1f97bb0c57", "eventName": "Transfer", "logIndex": 1, "removed": false, "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d", - "0x0000000000000000000000003785ca1128d2efddfec1a87ddb5686b59c7138f8", + "0x0000000000000000000000009f1fdab6458c5fc642fa0f4c5af7473c46837357", + "0x0000000000000000000000002aeee741fa1e21120a21e57db9ee545428e683c9", ], - "transactionHash": "0x1f83dcc30cc4a2649a95ca04b47a2b1fe9524991a2c7858acb560d4b8e717d53", + "transactionHash": "0xcdd096880f66c302c214338b8f860f39757aa10bc5f14561b21a42be88ef3f6a", "transactionIndex": 0, } `) @@ -99,27 +99,27 @@ test('args: eventName', async () => { eventName: 'Transfer', logs, }) - expect(transferLogs.length).toBe(698) + expect(transferLogs.length).toBe(958) expect(transferLogs[0]).toMatchInlineSnapshot(` { - "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "address": "0xc56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8", "args": { - "from": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", - "to": "0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8", - "value": 100000000000000000n, + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, }, - "blockHash": "0xec0395936bc0113ff8a734eafb8883a21f2bb4489814a331213cf41f8a8dff2b", - "blockNumber": 19808245n, - "data": "0x000000000000000000000000000000000000000000000000016345785d8a0000", + "blockHash": "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b", + "blockNumber": 19868015n, + "data": "0x000000000000000000000000000000000000000000000000003feb1f97bb0c57", "eventName": "Transfer", "logIndex": 1, "removed": false, "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d", - "0x0000000000000000000000003785ca1128d2efddfec1a87ddb5686b59c7138f8", + "0x0000000000000000000000009f1fdab6458c5fc642fa0f4c5af7473c46837357", + "0x0000000000000000000000002aeee741fa1e21120a21e57db9ee545428e683c9", ], - "transactionHash": "0x1f83dcc30cc4a2649a95ca04b47a2b1fe9524991a2c7858acb560d4b8e717d53", + "transactionHash": "0xcdd096880f66c302c214338b8f860f39757aa10bc5f14561b21a42be88ef3f6a", "transactionIndex": 0, } `) @@ -129,28 +129,28 @@ test('args: eventName', async () => { eventName: 'Approval', logs, }) - expect(approvalLogs.length).toBe(113) + expect(approvalLogs.length).toBe(177) expect(approvalLogs[0]).toMatchInlineSnapshot(` { - "address": "0x55c3a56e638e96c91f98735cc86f60a6820e6a44", + "address": "0xc56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8", "args": { - "owner": "0xD40d02d0CccFD8302149104DCc72eBF1af5034Bc", - "spender": "0x80a64c6D7f12C47B7c66c5B4E20E72bc1FCd5d9e", - "value": 115792089237316195423570985008687907853269984665640564039429318831067397538272n, + "owner": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "spender": "0x40aA958dd87FC8305b97f2BA922CDdCa374bcD7f", + "value": 115792089237316195423570985008687907853269984665640564039457566016468674737064n, }, - "blockHash": "0xec0395936bc0113ff8a734eafb8883a21f2bb4489814a331213cf41f8a8dff2b", - "blockNumber": 19808245n, - "data": "0xfffffffffffffffffffffffffffffffffffffffffffffffe77bdeb6a048ac1e0", + "blockHash": "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b", + "blockNumber": 19868015n, + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffc014e06844f3a8", "eventName": "Approval", - "logIndex": 6, + "logIndex": 2, "removed": false, "topics": [ "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", - "0x000000000000000000000000d40d02d0cccfd8302149104dcc72ebf1af5034bc", - "0x00000000000000000000000080a64c6d7f12c47b7c66c5b4e20e72bc1fcd5d9e", + "0x0000000000000000000000009f1fdab6458c5fc642fa0f4c5af7473c46837357", + "0x00000000000000000000000040aa958dd87fc8305b97f2ba922cddca374bcd7f", ], - "transactionHash": "0x3139f407c34c78f4c66298aa88082120328e3fdd2e3a12ff42af82c6cc8fb6c4", - "transactionIndex": 1, + "transactionHash": "0xcdd096880f66c302c214338b8f860f39757aa10bc5f14561b21a42be88ef3f6a", + "transactionIndex": 0, } `) @@ -159,27 +159,27 @@ test('args: eventName', async () => { eventName: ['Approval', 'Transfer'], logs, }) - expect(contractLogs.length).toBe(811) + expect(contractLogs.length).toBe(1135) expect(contractLogs[0]).toMatchInlineSnapshot(` { - "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "address": "0xc56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8", "args": { - "from": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", - "to": "0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8", - "value": 100000000000000000n, + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, }, - "blockHash": "0xec0395936bc0113ff8a734eafb8883a21f2bb4489814a331213cf41f8a8dff2b", - "blockNumber": 19808245n, - "data": "0x000000000000000000000000000000000000000000000000016345785d8a0000", + "blockHash": "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b", + "blockNumber": 19868015n, + "data": "0x000000000000000000000000000000000000000000000000003feb1f97bb0c57", "eventName": "Transfer", "logIndex": 1, "removed": false, "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d", - "0x0000000000000000000000003785ca1128d2efddfec1a87ddb5686b59c7138f8", + "0x0000000000000000000000009f1fdab6458c5fc642fa0f4c5af7473c46837357", + "0x0000000000000000000000002aeee741fa1e21120a21e57db9ee545428e683c9", ], - "transactionHash": "0x1f83dcc30cc4a2649a95ca04b47a2b1fe9524991a2c7858acb560d4b8e717d53", + "transactionHash": "0xcdd096880f66c302c214338b8f860f39757aa10bc5f14561b21a42be88ef3f6a", "transactionIndex": 0, } `) @@ -196,27 +196,27 @@ test('args: strict', async () => { logs, strict: false, }) - expect(parsedLogs.length).toBe(1008) + expect(parsedLogs.length).toBe(1152) expect(parsedLogs[0]).toMatchInlineSnapshot(` { - "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "address": "0xc56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8", "args": { - "from": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", - "to": "0x3785ca1128D2EfdDFec1a87ddb5686B59C7138F8", - "value": 100000000000000000n, + "from": "0x9F1fdAb6458c5fc642fa0F4C5af7473C46837357", + "to": "0x2aEEe741fa1e21120a21E57Db9ee545428E683C9", + "value": 17991444454902871n, }, - "blockHash": "0xec0395936bc0113ff8a734eafb8883a21f2bb4489814a331213cf41f8a8dff2b", - "blockNumber": 19808245n, - "data": "0x000000000000000000000000000000000000000000000000016345785d8a0000", + "blockHash": "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b", + "blockNumber": 19868015n, + "data": "0x000000000000000000000000000000000000000000000000003feb1f97bb0c57", "eventName": "Transfer", "logIndex": 1, "removed": false, "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d", - "0x0000000000000000000000003785ca1128d2efddfec1a87ddb5686b59c7138f8", + "0x0000000000000000000000009f1fdab6458c5fc642fa0f4c5af7473c46837357", + "0x0000000000000000000000002aeee741fa1e21120a21e57db9ee545428e683c9", ], - "transactionHash": "0x1f83dcc30cc4a2649a95ca04b47a2b1fe9524991a2c7858acb560d4b8e717d53", + "transactionHash": "0xcdd096880f66c302c214338b8f860f39757aa10bc5f14561b21a42be88ef3f6a", "transactionIndex": 0, } `) diff --git a/src/utils/nonceManager.test.ts b/src/utils/nonceManager.test.ts index 69c5f5fb51..0b7a77d889 100644 --- a/src/utils/nonceManager.test.ts +++ b/src/utils/nonceManager.test.ts @@ -28,12 +28,12 @@ test('get next', async () => { source: jsonRpc(), }) - expect(await nonceManager.get(mainnetArgs)).toBe(655) + expect(await nonceManager.get(mainnetArgs)).toBe(663) await sendTransaction(mainnetClient, { to: accounts[0].address, value: 0n, }) - expect(await nonceManager.get(mainnetArgs)).toBe(656) + expect(await nonceManager.get(mainnetArgs)).toBe(664) expect(await nonceManager.get(optimismArgs)).toBe(66) await sendTransaction(optimismClient, { @@ -49,31 +49,31 @@ test('consume (sequence)', async () => { }) const nonce_1 = await nonceManager.consume(mainnetArgs) - expect(nonce_1).toBe(656) + expect(nonce_1).toBe(664) const promise_1 = sendTransaction(mainnetClient, { to: accounts[0].address, nonce: nonce_1, value: 0n, }) - expect(await nonceManager.get(mainnetArgs)).toBe(657) + expect(await nonceManager.get(mainnetArgs)).toBe(665) const nonce_2 = await nonceManager.consume(mainnetArgs) - expect(nonce_2).toBe(657) + expect(nonce_2).toBe(665) const promise_2 = sendTransaction(mainnetClient, { to: accounts[0].address, nonce: nonce_2, value: 0n, }) - expect(await nonceManager.get(mainnetArgs)).toBe(658) + expect(await nonceManager.get(mainnetArgs)).toBe(666) const nonce_3 = await nonceManager.consume(mainnetArgs) - expect(nonce_3).toBe(658) + expect(nonce_3).toBe(666) const promise_3 = sendTransaction(mainnetClient, { to: accounts[0].address, nonce: nonce_3, value: 0n, }) - expect(await nonceManager.get(mainnetArgs)).toBe(659) + expect(await nonceManager.get(mainnetArgs)).toBe(667) const [hash_1, hash_2, hash_3] = await Promise.all([ promise_1, @@ -83,17 +83,17 @@ test('consume (sequence)', async () => { expect( (await getTransaction(mainnetClient, { hash: hash_1 })).nonce, - ).toMatchObject(656) + ).toMatchObject(664) expect( (await getTransaction(mainnetClient, { hash: hash_2 })).nonce, - ).toMatchObject(657) + ).toMatchObject(665) expect( (await getTransaction(mainnetClient, { hash: hash_3 })).nonce, - ).toMatchObject(658) - expect(await nonceManager.get(mainnetArgs)).toBe(659) + ).toMatchObject(666) + expect(await nonceManager.get(mainnetArgs)).toBe(667) const nonce_4 = await nonceManager.consume(mainnetArgs) - expect(nonce_4).toBe(659) + expect(nonce_4).toBe(667) const hash_4 = await sendTransaction(mainnetClient, { to: accounts[0].address, nonce: nonce_4, @@ -101,9 +101,9 @@ test('consume (sequence)', async () => { }) expect( (await getTransaction(mainnetClient, { hash: hash_4 })).nonce, - ).toMatchObject(659) + ).toMatchObject(667) - expect(await nonceManager.get(mainnetArgs)).toBe(660) + expect(await nonceManager.get(mainnetArgs)).toBe(668) }) test('consume (parallel)', async () => { @@ -121,13 +121,13 @@ test('consume (parallel)', async () => { nonceManager.get(mainnetArgs), ]) - expect(n_1).toBe(660) - expect(nonce_1).toBe(660) - expect(n_2).toBe(661) - expect(nonce_2).toBe(661) - expect(n_3).toBe(662) - expect(nonce_3).toBe(662) - expect(n_4).toBe(663) + expect(n_1).toBe(668) + expect(nonce_1).toBe(668) + expect(n_2).toBe(669) + expect(nonce_2).toBe(669) + expect(n_3).toBe(670) + expect(nonce_3).toBe(670) + expect(n_4).toBe(671) const [hash_1, hash_2, hash_3] = await Promise.all([ sendTransaction(mainnetClient, { @@ -149,17 +149,17 @@ test('consume (parallel)', async () => { expect( (await getTransaction(mainnetClient, { hash: hash_1 })).nonce, - ).toMatchObject(660) + ).toMatchObject(668) expect( (await getTransaction(mainnetClient, { hash: hash_2 })).nonce, - ).toMatchObject(661) + ).toMatchObject(669) expect( (await getTransaction(mainnetClient, { hash: hash_3 })).nonce, - ).toMatchObject(662) - expect(await nonceManager.get(mainnetArgs)).toBe(663) + ).toMatchObject(670) + expect(await nonceManager.get(mainnetArgs)).toBe(671) const nonce_4 = await nonceManager.consume(mainnetArgs) - expect(nonce_4).toBe(663) + expect(nonce_4).toBe(671) const hash_4 = await sendTransaction(mainnetClient, { to: accounts[0].address, nonce: nonce_4, @@ -167,14 +167,14 @@ test('consume (parallel)', async () => { }) expect( (await getTransaction(mainnetClient, { hash: hash_4 })).nonce, - ).toMatchObject(663) - expect(await nonceManager.get(mainnetArgs)).toBe(664) + ).toMatchObject(671) + expect(await nonceManager.get(mainnetArgs)).toBe(672) }) test('nonceManager export', async () => { - expect(await nonceManager.get(mainnetArgs)).toBe(664) - expect(await nonceManager.consume(mainnetArgs)).toBe(664) - expect(await nonceManager.get(mainnetArgs)).toBe(665) + expect(await nonceManager.get(mainnetArgs)).toBe(672) + expect(await nonceManager.consume(mainnetArgs)).toBe(672) + expect(await nonceManager.get(mainnetArgs)).toBe(673) const nonces = await Promise.all([ nonceManager.consume(mainnetArgs), @@ -186,12 +186,12 @@ test('nonceManager export', async () => { ]) expect(nonces).toMatchInlineSnapshot(` [ - 665, - 666, - 666, - 667, - 667, - 668, + 673, + 674, + 674, + 675, + 675, + 676, ] `) }) @@ -208,35 +208,35 @@ test('dropped tx', async () => { } const nonce_1 = await nonceManager.consume(args) - expect(nonce_1).toBe(105) + expect(nonce_1).toBe(112) const hash_1 = await sendTransaction(mainnetClient, { account: privateKeyToAccount(accounts[1].privateKey), to: accounts[0].address, nonce: nonce_1, value: 0n, }) - expect(await nonceManager.get(args)).toBe(106) + expect(await nonceManager.get(args)).toBe(113) const nonce_2 = await nonceManager.consume(args) - expect(nonce_2).toBe(106) + expect(nonce_2).toBe(113) const hash_2 = await sendTransaction(mainnetClient, { account: privateKeyToAccount(accounts[1].privateKey), to: accounts[0].address, nonce: nonce_2, value: 0n, }) - expect(await nonceManager.get(args)).toBe(107) + expect(await nonceManager.get(args)).toBe(114) await dropTransaction(mainnetClient, { hash: hash_1 }) await dropTransaction(mainnetClient, { hash: hash_2 }) const nonce_3 = await nonceManager.consume(args) - expect(nonce_3).toBe(105) + expect(nonce_3).toBe(112) await sendTransaction(mainnetClient, { account: privateKeyToAccount(accounts[1].privateKey), to: accounts[0].address, nonce: nonce_3, value: 0n, }) - expect(await nonceManager.get(args)).toBe(106) + expect(await nonceManager.get(args)).toBe(113) }) diff --git a/src/utils/rpc/http.test.ts b/src/utils/rpc/http.test.ts index dab97d2519..ad7ce3d43b 100644 --- a/src/utils/rpc/http.test.ts +++ b/src/utils/rpc/http.test.ts @@ -267,7 +267,7 @@ describe('request', () => { Status: 500 URL: http://localhost - Request body: {"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]} + Request body: {"method":"eth_getBlockByNumber","params":["0x12f2974",false]} Details: "ngmi" Version: viem@x.y.z] @@ -295,7 +295,7 @@ describe('request', () => { Status: 500 URL: http://localhost - Request body: {"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]} + Request body: {"method":"eth_getBlockByNumber","params":["0x12f2974",false]} Details: Internal Server Error Version: viem@x.y.z] @@ -368,7 +368,7 @@ describe('request', () => { [HttpRequestError: HTTP request failed. URL: http://localhost - Request body: {"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]} + Request body: {"method":"eth_getBlockByNumber","params":["0x12f2974",false]} Details: foo Version: viem@x.y.z] @@ -485,7 +485,7 @@ describe('http (batch)', () => { Status: 500 URL: http://localhost - Request body: [{"method":"web3_clientVersion"},{"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]}] + Request body: [{"method":"web3_clientVersion"},{"method":"eth_getBlockByNumber","params":["0x12f2974",false]}] Details: "ngmi" Version: viem@x.y.z] @@ -516,7 +516,7 @@ describe('http (batch)', () => { Status: 500 URL: http://localhost - Request body: [{"method":"web3_clientVersion"},{"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]}] + Request body: [{"method":"web3_clientVersion"},{"method":"eth_getBlockByNumber","params":["0x12f2974",false]}] Details: Internal Server Error Version: viem@x.y.z] @@ -546,7 +546,7 @@ describe('http (batch)', () => { [HttpRequestError: HTTP request failed. URL: http://localhost - Request body: [{"method":"web3_clientVersion"},{"method":"eth_getBlockByNumber","params":["0x12e3ffa",false]}] + Request body: [{"method":"web3_clientVersion"},{"method":"eth_getBlockByNumber","params":["0x12f2974",false]}] Details: foo Version: viem@x.y.z] diff --git a/src/utils/rpc/ipc.test.ts b/src/utils/rpc/ipc.test.ts index f13c5e4ab9..dfc108d62b 100644 --- a/src/utils/rpc/ipc.test.ts +++ b/src/utils/rpc/ipc.test.ts @@ -87,270 +87,273 @@ describe('request', () => { { "jsonrpc": "2.0", "result": { - "baseFeePerGas": "0x12f449559", - "blobGasUsed": "0x20000", + "baseFeePerGas": "0x20a0d339a", + "blobGasUsed": "0x0", "difficulty": "0x0", - "excessBlobGas": "0x60000", + "excessBlobGas": "0x0", "extraData": "0x6265617665726275696c642e6f7267", "gasLimit": "0x1c9c380", - "gasUsed": "0xe68b5f", - "hash": "0x33a7971472539aa0ffab0ee330347acd56ca7d2682bfbc80872110ee15e7d8f7", - "logsBloom": "0x80a715cbad9a534e26a01218c885fc2384c7418ebb08610ce30b692726685230a8d1d4be7c512b1963d50bc3fa9b310512532f52ba86229ee000e6a941fab0a45026e41f4f8a4baa2993f06d4ce308fe84b4026b0b4f8cd4d6445240806750615ed8433dae4e24e01d4183978821ac9f00123297008a2648f269c41f7c98d1059a63ba6aa345d42410d70250213a65761258b78143d4709c100282df6a523a79bec1036e5814f9583cdb81c519d7b70016976e8ae1c98346091840262b154741d999907beade05423823ff7a09cd783c06cd621795d85112bf7ffc0620a1a0da5854e4897c2014ea02f596915c43902c9ca0532193797747712152267d0057cc", + "gasUsed": "0xd05f46", + "hash": "0x0c3e51fc62e1dd7401c8884882755b72e1c5720d0b01c75443cdfa8a129d3fc9", + "logsBloom": "0xd123054441c15c9d30998061c8899fbdb40be9b00b9c9b73202d015aef6a92b80e6a1520ca498004de50db02f992518322199054de076a903019e47aa1a8b018a046a6c95d2d39a92c06e33ea9a225aa80c5408964c57f5fe083d5dc8a7051e5e92f4844e244023e90cc74c040236e49c31b9aa023596ec5aa1c0e1458593c036dbe9f7cbaa69538a2ed205c0ae2145e441b1319eb6946a9d82da46e6e9c0ca85f9688c6fa946b844bbdd4cc3f225ce09641d62220214a7cb9744c66340c807013f0315212455a000620a3b27359c8c13e1000130da23e141107d28a4900e1909470a80b03d746114b1596d3a4430b68b4ff3e219bac38d8dfa1680ae4005d4d", "miner": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5", - "mixHash": "0x0403c5067873bff3108703e127c63a2882509ee91006d921e2955c2420470958", + "mixHash": "0x7702b2acc3443bd74c0b3ff142414f9d51e4caa0f111d57d319f4d46e21dedf7", "nonce": "0x0000000000000000", - "number": "0x12e3ffa", - "parentBeaconBlockRoot": "0xed1c13ebb84bf75b852cb3e703f8a7d7c8465a039ce058e2390ece725a54ca47", - "parentHash": "0x72e938fa6ab225be2ce940db9aea7d670b50b3320b8deaeea1084ab645a1db81", - "receiptsRoot": "0x649c9570fc198f14fa93c9b3fb0d7bda1f75a2a05761ffd832768841fc274aca", + "number": "0x12f2974", + "parentBeaconBlockRoot": "0xd472790dc1fd2d1b1cc9e208706266196f261e4c1a74f535d86981670c0d5f99", + "parentHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "receiptsRoot": "0xe2822bc9663118439077ad806cd7a2a1a75bf1d70bf61d901199cf599c46f9d7", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x132bb", - "stateRoot": "0xb821f1259927e7c699f2b06cd550d45e8cb322c06256f17ba36caaec33ae865e", - "timestamp": "0x6638490b", + "size": "0xdad8", + "stateRoot": "0x115fd5eac921e6728825958b2b87da8aaf17edc0085164f11de798f6ed00abbd", + "timestamp": "0x66434e43", "totalDifficulty": "0xc70d815d562d3cfa955", "transactions": [ - "0x12860ead0532b3a4f4aa5f8187d7d0365f6ae93764c8771ac13c6d38560033d6", - "0xed513dcfd2a4f635bfaa476c78919cdd116090513e73ae6b369fa2012ee5a9b0", - "0xc72e7c15c972b5e4e2ccde950691426dd5a725cb63fa2e9784df0f98bc4c1751", - "0x258c636c6d237e14c081c57e7e49043cbc1c81dc7d0b9628ff2c7c6b9a3ffca8", - "0x0800e07eafdb3c33bacd4511503110953d231342a7c29c88c3706b70210d3079", - "0x7fb43c8bba50ffaa4e5b679e0bb55213d55def53e86524b50cd929d69d25a11a", - "0xce5ae725bcf217588fea1f50a5e90b73be01be20a0c280a74992365b84a0e1dc", - "0x39014032f86eb1c043ecf794e04b2a03127a41a1a65b3ab232705a7bf7ccd3d8", - "0x54c8ed510339118a344942a487b46d8627c8627f35cd24efd924e5d39a0bbbaf", - "0x10fe93d2263dd06a9ebf720b2987f07032fe3c4371c8f0c47f92969e19d638b1", - "0x9126f9bc92a2abcd95c35916d45258490d9743a536fa98b7da0f6bd878aa40c3", - "0xaf7690eb86ab1e3e0622454477b7048081ad555d398ec7d3ee7ea80e7b7136a5", - "0x2812d7e89b861cb2b6654ae85728bf046ea1b651d558f984e22df08357958d46", - "0x0351d36488fb798fd81d65de7adbaed0b3de372ecb1dcfb7722281d4595b27dc", - "0xc5fa349a9fe36be632e9ee0da47cd1f585cee05027ac7d241a12ca7e59ac01c5", - "0x9a2e22ac7b57614bc59d69f0cf6d8cd664e625a39b4bd3518fe02174fb36b53e", - "0x40b80ab435c5d21ac7a8607cd19dd90bae1abfdd45727726a0027c0a6d0f0f40", - "0x3caf97e1c0d81062c8047bdbac7c427e0c2b4a0bc6f860cc3892ec884444b9b0", - "0x350bcf3893818beae014118a42a6666559d7ff21ee9824b88a287f0efd734627", - "0x7588537e4c3f06d40e4efc1a495dbfbe042b6064b81104de82f5ef0987b64cdf", - "0xbc20d73ee056c066705c7cbe3fea6eb1b7caea7b56ca53fc3298396f1fb70d57", - "0x2f08911326a2c5c60a7f86ef99084d5b73d2393dfe00622f627459bcdbd62e10", - "0xfb6055df069e04ae38c2d553f891d3ee6ab9eadec01d5fd8bf0c8b477c7c89af", - "0xdf7a8624a9d3b9fd3cf65363243b9db1226199e2035cfc9188208f89d7e38cbc", - "0xb986e24702b5a08144261a64a2e189f872edaaed979082d33f31069cbaf82420", - "0x472adb3a051dc3dd82db424786c900dc1d87f3803d0ce6502bc709687114f98a", - "0xdbc480aaba9b60b3b464adf78a4220446775490cabbc5952f1ec57318608a81f", - "0x7b2770dbe042ad96bf6a91855b635e78c5d027f3798424356d3c45c3002cf499", - "0x12459c7ce4a983588e168351f2206843a4b11eddda203fd3a6a2d4580f7d23bd", - "0x9d8b25edb003dc088028133efe714ce235b1f6ee1768cdbd7ff69ada032d4a21", - "0x370c36c4292fe4d437618e4a045c6fb2c6bc22621411f40ebfb82fcfa2f7b9e0", - "0x8145af3796c4964e5a6ff964de8ab23b615112ca280ea7beea97753b6c849280", - "0xefc0bfa3a0c44ef04d36335054a41ede3cc507c759be41a1cfe83b18f5fd129c", - "0xc79e7863bb792590dd0b3c4622a180bf70f767591eacaad48a0af10930332679", - "0xf47931c3a313968e1cd137b5067ad1b90c54bccc2ce16ca01318bacada4b4a31", - "0xd54f767e01c4267be2c0fbe8db9e4d845fda4cb113a3899ada4289480dd5f859", - "0x2cd97e83ebbd33bc8d7d2d39aa9cdcec1ac261bab1702548ede4ebead14c47e8", - "0x80c0d28d0ccf69dca51d263e0a4107c8a554c40dfcb207c1eb2c95a07618a5ac", - "0xe5033b68abcf549b32ca59903c655e12007d96e8dbd53e37d2ee00501d2b7de1", - "0x4ad9f131b26daf8424a72a58ffdb82014eefdcf4ac1473f504777dab84b87535", - "0xaca6f6a0a1f94e265d31be0ec2d6b5f7da27e6df40595b067c71ac65eac50e94", - "0x1d356bf7c11ab24a8b6c51b38b1f822e2deed2c9dc4bba515bfd46e27b20d5ba", - "0xe58b2851229cfd243981f0e3a10a6b1dc7a9df7e2a5afae1f0e61505e960375c", - "0x931c4dacb13e711a8578f02df6df51a381cfb05fa81da5f766638952910a3286", - "0xb199838a7add300d484e03f452a09c7cdb0afb0e7c67e5884367b9c8a674d182", - "0x2110462201aee32e8d9ddb5c9dd9513592ffde32382da1aabf007630ccf77ea1", - "0xf5ac56284d6d4aa75fa67ccfc58a5658d2cae41d01f412cdab962e91276e06a0", - "0x4ec6f73e1245c247ff6868795b7f0b6789f6a9342c8580b7f9a80d34c3959c6b", - "0xcf77dbfe46f7c12dd9f8042e4b86e7c28a519f1a833cc30f4b581418a3440103", - "0xd4ad311394d0d0a06be4bb32f85ee6f5f6b5f2a688b252e4fb89c3dc374b8bd6", - "0x5f998e622a5ecdd34ac52e89cac0e8959e734a4afb850c18b7829a4c1c30fde6", - "0xac150958348194a84cf894631ecca299cc1ba46b92d36222906f1695d45ff127", - "0x029101258e3a0d66780f2ec8a6c74e93f1f574466af72a771bf4452ed4a36f58", - "0x9d986ebbcfae4e31be2aa5fa5c7f2fcd7f0856ca6521a7e397b7a2bbc48d8ba4", - "0xc39c67e7efb378137a47dec994ac018f3b9674a1fd0dcb2c8d39ed41c8655206", - "0x9a416e3dd237f7f9b5c696197f18a53390f52fe2971658f284704167365c9e35", - "0xe9305e739cf066fd8e1468dd25f460db18f33b8ea171c95a9c424c5aa7e3c235", - "0x8832a517ca2deb2a66b5e0681fe0c85c5c1af12aeb94d50b531a264ae1eb9e33", - "0xa9f74c7b27928f1e4b6344889e22939409d07a602619b62903c5776120e0a558", - "0xa10590ec01af9f837be9d6b3ad688acbdbbb3fc8b03bc2cfd9248ba20c6c64ea", - "0x4ed77d7ad8b1ac8fdf1bab5e03a8d8c73687b8a7788b8040a0c1bdce2931f0d4", - "0x406705bbec19171a8d5699522732698255b122a495bb4141e2c11605972495f5", - "0x0847427ddcdae27ed2029ecfc9a0fd27cdd919c5648ae715b8c25f336a3f92d4", - "0x6256806522d5dfd39f9a7fd8a2aef44c73a555c24a3fac6ab1570771e641a05e", - "0xfe1a5fa2b637212e86d593b3d7ae041babad31b866d054e901f2ff33c468e418", - "0x6a9576201f7c85a2c327581f30702e94d2a350caef89c8400d9569aa91951bfe", - "0x5f77b63367a427cc620ca5e3a660b1dde2beb5ca98e56adfd55a4861ae14e1b5", - "0xe31b66b16d8a41d32dc6f422502bdee12bc747d9314b1856b4b4bc9cb3dd9403", - "0x3531698211550e8674966e596c678f8953e58b304ed7811c4fe663b7b9c7cffd", - "0xeb2c5a76791d6ff1c11bf730253658f51daeb00906e394b47aea835c9fdba77b", - "0x86d1ddc92753c1c1f0302a690d2063c6e0dfd2d6862c592274fd7905efa49eec", - "0xfc574ead986bf97b1f8a2f238d88727f3d4a72046c63f83290fb37dba3201b5c", - "0x325936f0be7ea6043238e77bd1bdeabccd759967879908fd627f72727518931e", - "0x20364ae1ea8b9801894ffe225d7d976f80e7362dab1f5a7130d25243b8889eec", - "0x279735ea4729dc90a118266648a2feebce7ca64cb1afa9545e19ea13da0cf83b", - "0x0fa0f631fd043dacfc8d46a5928abeecad3f78364b82e7186c60875837bdbbbd", - "0x4bc7e1074376aa78335f8b4b8f62e9292cace9dae0aed6d26a203a03cddd4109", - "0x775e28757ae6e072cd3b81d85e4de4bc924b69341585ffa644898fd954808aa0", - "0xd08f902819d47dd5b7d2d34273aea34562d7d3e6e696087625a6654055ef655f", - "0x4f11a66edea360f5f27f462a11f93d817cee7a870c9449814f96dbd155cc5bc8", - "0xbc4798ebf06e8de6f41f3266e38eba95c4fb1a26476bb1e33029d8cdb7036a24", - "0x4b1cf02ef289636671481e8364afc84bc79cc1f196c75d59bcd8e6442190e9e3", - "0x08e9a2c505d6975f87dbb3fd680a748bc3a10894a6c05d045d7cead1311daa50", - "0x9c18c613880668be568156190381fc36662369e49e8a436243eaaeeb5caf42b0", - "0xe935bd3ef799f26b7efcb0796fcd6762aa2736b6241a5ddd4de90ff9acb5600a", - "0xa2dac6abd420580dbe113c0c64190f731519f3ad51f37426c377022aeb9ddc44", - "0x3b20edf7281bf115eea7287643f68ddf70b464baa26ab493e906a8b4cc0bd183", - "0x6bba175b959f2af9fe4d89a92e55e259ee7ca98207739ff9e86ddf8f1a90fc75", - "0xcc34030e9d69b6f7813ee9647cde4ab4bd23fb3c4cd76dd1d3b0a9b5b72b124d", - "0xaf28bbd7c9eea390ecf90b0ba6cd7074bbfd202956b80a411a72a29bf1d0a065", - "0x8126d643814b5d013674ead269132aa4b223074afcd406ad0d7ca07d598b3e52", - "0x781de3d23e65f4f7369b07795ad1f1237b53d8f054a2d58aa24eadb7e42ee07d", - "0xd01c2a8c4020ac9faced0d25476622ea82030ffeeb7c69ffeec6004827c70f07", - "0x133d37de851fbbc8f6496519012e4ae17d60e3ac58c8987d4de3142161b8dc6b", - "0xcd21c5e94e1362390688c541be600a53f318a299e7fba155fe032e61a85c87db", - "0x1a03c128b6b6a4348f56ebf4076f5c051ecd22f0c3534216fb02b1bc33a0602c", - "0xbb486632d0c2fb6fab0a17a0b39258695f9a178f5e27e9a72c36df76cc1263d8", - "0xa59bb99d7c0becdc070c02ea453409dda451b5e6c66ca42a081d01607691c68e", - "0x6b8701f8bf6a5bf853cfe765d5d86153cecbbd46c41e6afb81d26d1e79031cfe", - "0x8399c2f547d7abfb99dbc586250134b57e46577f7a2e55e9c7c2618e56239292", - "0xd37d12d8518dc02e8b3cbb5fa0b59f56fe6c0a70805c755ffff6b74edfcae2f4", - "0x765ea9c689e67f4f773e4058a2fea01edf70da6db50064507e684877394aa502", - "0x89675014845e26847ef059d21ea4af749975a7ec3f4a6976e6c6e8c53b0b145c", - "0x2ffd985bbae3b9ff11f8451b8bb19515a449115abdfab09474515d1cdc5ce124", - "0xc6c58abde0a22e572bf6e16180dc968f02dc3afa3d15d0aa8f4215e42f757a62", - "0x37b84f52321c2d4c81efec686237f125b770a2a3c103a684d63ed590e90431b7", - "0x3706bc60b4a99c01097c06f39512247448abdb0d15f5f609220811da018ae17e", - "0x7d2eab2fec674e1c7e370eeb167ecb74029c0a232f1235e845963fc7d3dda954", - "0xd4c6ab4c94c53e5aadfee12542526d55630690ee7e8402a5c992a000950be6fb", - "0x3d0517ea747fc46a1af3e8bd66a5e9c1baec849a3e8d6ec8c0cfe065a42cccf3", - "0xcfd5693a2101852aec988e057da93871f453f758cecdd38b9194652dbd9b9c25", - "0xc097c97e4acc5360de98e4d72af55333c05d154eac3424059e7848d32013e025", - "0x7527429baf457ba3644188a75a109960ae0d845449386ad4aa8e5581cd7b1a41", - "0x061e3b2a4c0cd6490993ea94fd4e7563d362585af12bb3458952b752426886ce", - "0xf9af3398ad3edde0ca7f4603e5851d302f39b617e4aa1eb3568392bf5144bcf4", - "0x7f478c943917b27a3441d42ddce13838efe3926ed6ca87e812be441501b37016", - "0x94f5ebf04e6d04d89dca2643daa02439833b153460d3f33de578047d0f04ff8e", - "0x2e03c81dc609ccbf0e91b6b67b79f3088028b736679de46f51caafbc9dd6a488", - "0xfc6472d85609fbbb6ac8dec4bf069f51d3a96f59f163738e38724aefcb5d9423", - "0xf70cfd8d0721b13b8e75c8aa24e6fa984576b1916fa14edc932fc8f53132d9df", - "0xbf6190304df41dafe26113b37dc45a9812ccfe9ee40a1dfb97bf85e71c5e9829", - "0xa59cffc13207fe46b3c41ff728f3e1fe8172492854208ed6ee34485a4a452638", - "0xa0447569ee667995ccdf4edbe77abbb9e499741b7d084928a2cd4fec010ae3af", - "0x38de793ad609ad9774dc298e1b3050eb022858125e22640ac6f4ba4713004320", - "0xd83b345b4a6cc0ce214d987ba4a39d2f981ee7e54bba697138cb9a2e3f354a31", - "0xc58657f3919410d504d0b3e16cd8baa1a38a2405b490a288eb64635c86038848", - "0xf49b53d2c68f855bbb828109d66cf75952fa16d6d21a6aa8fe04cba4ae54e91a", - "0x98559bbb58decddbfddb8f074e4e681fda52ee5e41d9b230af4ad054c6b05448", - "0x0cda4b71587108b814822df6e4ee65e466716c634c5a080c87bb9c92d0a01304", - "0xb5dc2541610f061f46d81ad092e7222a85bc6d208044b8d57ba2381334901536", - "0x6de7c83368dacd692c865fb42fcca63ade071e98717cb62424bdd256f1368d26", - "0xc553a57130c5877337bbae3150b497fff994a1150494911659c1fca1cc8aabd6", - "0x9fa1899b30b6da8079838aa0b597ed5a48a1182006b28053babafab8ac3b796d", - "0x545d5046aa19ce6f402e93bd77d0c29f9ae58f07856ace50e91e9fdcb15b0bee", - "0x6a8698facdbed4b6659ad745fd4eb434bc129cecaffad99c3f08f4d688b1df02", - "0xeb1269ed5c9a4945c0725be8b986212057a19bf9127c8252949270a3e1996f1a", - "0xf4792b8be1496300e500d7a702b4ae2824c14d5f438604fdfe94388867c7c9c5", - "0x64c6a2e4cea7d4784d12677704549df5bb8b27ebeabe41891781b9a641430848", - "0x45bda137a2426603437ad1e393bfc93855c84c9eb116299640f842ae15beb46a", - "0x77374a47adc133e93d9661b8ce8e672a343cd5a2b2a079034de69211a0ab0893", + "0x5d374a026007c13e901765497b9164d44822902463efdf7b574b10c476ee2ad6", + "0x2762a7fb7c973e888edc457a3808d3882b5c8fc4f6c43a082d823319b126b91a", + "0xe637d86545a9b508b373fdd46cc71682ac4a5dba222d7c9ac01380306cc96cd9", + "0xecdfec41e9859fa217c5467debc9a5fa95290c3273f0ecf282f802983d2ca105", + "0x75f544151f040710f96a2c8cd6da6cd7bb60e461bfc9b4f87d015562d9a55328", + "0x07e609166382b05cd4cfd59764226374af8457a5dc0cea255721e5570cb32844", + "0x08109ccb2b1609d10cd929594ba3a131d59c7aa6eb174cc7bf578670a8198405", + "0x932fb264036b15e8a9704501e4f1ae34a9ac7543c498223c3456f03ebbefe221", + "0x4773aaf55c914947aeefe6c996b961c900bddd82b4e809d47a5f99af22b014ef", + "0x04d0728690604a7ec930782021704bb5d75d16d2c3330f8ab051348c906c52d4", + "0x61d5fc3a8aa4f5e802dcd54a7fceaad89a97c873578b845ad12b34a96540aeb7", + "0xd14bf1505356f83e55d4baffa315e0e9210479dff7486c4164a050c935d5bccf", + "0x6c4e8a1e9484ad717ef42df12a6cb9655216b6a2f7420f52dc540ed952860fdb", + "0x1d2361b3ec4fcb498732048e348fec130f15fb7e05187d8878985681c506b32a", + "0xc3da74a44904c29c9046587cbade10386db5aed500d7ead58335a9757fc64c93", + "0xc8632c7648b32e86023d8b585145bda62e5f8c160a5e6c8c02ec183297d05d2d", + "0xb6a79dcd720a72d2ea5728a8e58885304202535b00861113dce00d07bca7f3ab", + "0xc8b9a208eccabd84320946527cb1df897ec48318c1ca67e5fedc48388152518a", + "0xd5b0feea2d8e474913d280c45c4a6e365ec2bd8ab09982f0b07a7e6e2e433526", + "0xd67fa075f7abde07de71273e227856b43373276f18eb1446d1566cfafe896947", + "0xca96b4905a5854d52f3152dc2f86b1e8ef0891ce82b8a6d0622d4470fa980c03", + "0xd80b94b3d5e72e1cc74b3acbf6bec79bde51d6341f021a1259fe2e3303a919f4", + "0x0e034d76d3593f1f07baf2452e337da912dfc06fd61704e658797eaf5c33222e", + "0x755a7415073e029b231d575f935a10ae657eb30d3aa3edd32fcfc812ba2075b9", + "0x082bebb8c90bc915b6931d6d135ae7016a41b01e6d07151b5d11d2e3cc15868c", + "0x5a550298d163c3a6b1ca91412076781462a6e77825a7a34789e514f566a2ddd2", + "0x7f5523181ea3b7b83577e2de0ff3edf0b7bed050436fd6958274a0a6882a487d", + "0xc63aa388331f5016643dc4744dc47f0b79ac2dc30f2837f36058959de5c6d97b", + "0xa1cdde08be62979fb2d51e3d1447e67ef9a72e7e9ad6c70834b6667ab4b25b2f", + "0xeaf27f121d562cf7d6ba5fe04cb7477c2eae917f6ed0d254c474595334e1e61b", + "0x4d3a2c0aa20291ec2a3e9663676770bb1cb1c33c8caa7308ec9b0e180df42039", + "0x1f13065bd8d6bd0ff04592f8216576eb2ce38d766cf1fd4114392b4e622a7658", + "0x220ce318063ac4496ba1e7946b78fd1574f95518ac920563531b124bbc3ec22d", + "0x6c258638f3e25d325a1f73075a338ce02e57b4fac1b2a810a544d40b24e8b9f9", + "0xa2a5fdce0672a32e04908e9a12a683697057855a33da8ab3cfc5275094f270fe", + "0xfeb465bea0d19e832b87965440a36b3ea1d8bffda29d27ab72bf196f5a3954c0", + "0x20b39aed43810bfc46a279f91e2814ae5a56906f7b7505c499850f2605c82dac", + "0xd75f805748cdf37402c13b685d9dd9884ba1c0b0e3189f9f613a3a9ed223dbc8", + "0x46bb82c63a8a2e29d01360f78d5ee871178847627774756ca6efc614c9710cee", + "0x37a217624ca5724463612bc0a4f0943a3bf8599a05e9d4dc82da20bb0df79867", + "0xca8ec3dfca0e43c79a9a32cdd8a01c161a8fbbed07d6f5b4231dc7b4086d1380", + "0x12f7e01f6efcfb1c56bb3d4bf4358c32df847303c92d4f646996d4c601e1bd2f", + "0x50a0a2e7abaeee10aa9ec6ca0303a019acd2b09279357a480fd37c2c03e177f1", + "0x0c0134f6a1f68649f4777c86668ac2c3d348cd5ee9f71adaf5a783a3852a2e1c", + "0x740fb5ab5762b25c2be2f3590cb0811d74b54dae5e40f52bf1e68c8fe2cb6e92", + "0xa2218d513e2ca93a8acb3652d638af7be7e62711f48e81bf255fff3cfbe3a0dd", + "0x413a7f87acffc04ef34261ae47737ab2f5f461d0af5d57269c5f6cdf78275159", + "0x60d81ea9118a9d8075101f22e09d0646f155f23c2f4b84804f7ffc5afb203a68", + "0x2ff7f513238717f264521c91bc457fb17800beda940eaf6d7e56b1c866b42c06", + "0xda6dc1ae732e7ecbcac5765fc442fcee5a3617b5d575f5103b4fd9f706847c07", + "0xf59ef60c1d9dda81fc22a8e985b6d3e589f512eb8b2518b3511a43908a460294", + "0x81c6e17337cabd304c329a799b02e02245f37ece12a413f5c49282d18b1883cb", + "0x18fb9299e78ffe36bfea65442d790288937a4d1d5b69138525dadaa70dc42367", + "0x9db74bf461bb809717866699fb8b5d6bbe33b5bcc967dec46357331272e20df2", + "0xc59eefbe4041f7dc7fdf2c86c9cfc0f1706993dcee80de6b27f25489cb8e10a9", + "0x38b2207a133bfc3aec210fb386a199efb9087d13330fa0f637bfe37df59c312f", + "0xd35ffbf38934b54a900e35c65c07fc3081993ebf5a55bc67977b73410abc211f", + "0xa13e7a446c7f3ddaa8555c5d3437e8d827303b152a4dbb09ff01bde01a0585b0", + "0x0bb1b3eea492459f2796fb9b3f7022417860f3a5450374220c0c9c3bd2e63512", + "0xd9ebb04da1035f95bf3ed0bd06268f53737001f3f292ac825852875c57a6c4be", + "0xe07cf18aa356d0134f2e0da6f68de7c9f28af854455fbdd38770b44be98a1dc6", + "0x9be4c6c6a3c5622fcd0a1bbe13e21b8612eb39932f05b42972edf2ed184804dc", + "0x9cf9a53f37175b3eba970af4b06a9fa98042e08882b2ed96dd285c0eaaa8e13c", + "0x23f3b4e0dad22684741df92bba387be4e5c05414aca5bf54383e74a4b24b30eb", + "0x4dcfcf6353596c9665fd94b7b9281b65e0a94b45f98ddff681db9ffc5c561602", + "0x460b33043b87067727977ec7daea667bf440f482f0e77ab5a86745832c05d09e", + "0x2fd8ab214c757b69349f10a86d94ccdae0a2c692f3408ea4d65bf5a58c710166", + "0x6627f34e22dec201d70e4304375e60b0703a992610487356a7af6812c4ae89f0", + "0x6a2ac6c7b4f140443ea9190beba68706aa0828055cc0a49c037f6bed4a3b94c9", + "0xbadc35a3b5eb2524ddea54babbc6a7c531f94c845b499e2773f0d82f347976df", + "0x258972ea1dced55b6b95ed07085de981786401d4da790000d7bd8739b0132cd9", + "0x2b70ba122ab93b5b020a3e0ede3e5170d91b2fd8c429c4909b025a68e50a0a2a", + "0xa1f2796fbf29d6cb19d541bb9e2ac1bdb8ecf4f64e9d4068a77b18325d736be8", + "0x297b30d9b997e375d6d560c9670449c4ab9fc9e6cbfcfb094c659d053bd74fae", + "0x4f2058432f7e90bde5ac4661e66dd4ddb4865a31a015b5da7a74f1ed682d4471", + "0x88777368f2847a5a370cb5c6113b25841987168e1d60eff8f5e622b608c073b1", + "0x4b6de4690fed6b924865cf234a94b74f8765c969d821bbddeb4333936c558aa9", + "0x89db01005aa4cd9b60c481763f21dffe39a7ba2da6a4df80e1649fe71952ef70", + "0x888b2ccb261734919308c792c458dcafbaf5ec09b35ff490b77e55304d8f6352", + "0x847e03a9a940c74f151694bed14c82fc53eaaae5e4236e7f0525ab438f5e9d77", + "0x176f3b0b49ee54ec554dc3a4dea00b3d115e48a8c0d5d3c6f328d7da8f6beff7", + "0x009d634f81d6cbefe083d48d0741ab332f238bf496aafca838095e6fde0b541f", + "0xaec2cd6a1cf8954187174f4a62c07b021293cac8b69d1b48cd206ba3244292ba", + "0xc914a43546e51a0d4ab116e8fc86bd639c14b563474c9c247bb406404b6241c3", + "0xdd7f4c16cc0512e308b521c944e11b852d652652656ba5c30589fbbd4454002d", + "0x0329301ecb0cca138d687a07c3fc0e13358d10fb73f7ddac636fe1940d45be8b", + "0x2f569a19dff21bc2674064a636b3f87689f3e0ed0ef69a0d99bbedb5721e154c", + "0x06f42e2ae50574d560a495411ed504d3ca1c34ff5fe9f6f74a4327a9ada801f5", + "0x04db2f50573f591543a42ad27ad89efe7182ff286b6d2c75e8787cdfd67682ad", + "0xcac34907d292c7d1e8e307a3c669e9867977630b6667aa8ed0db0d0cb0e757f8", + "0xe043631e0d3d42dfacb87783a95d9a7fb6d1b4a6b556ad5ffd9724dfec8a05dd", + "0x163bd1073a5e99e886ae0ca8a469a58096e9992f772d8cf03c12897bc759ebf9", + "0xe468530ce156f65bf52574d52c7b55489ae9a4a7bc3df7710e3ef8fd47d72386", + "0xc19059a3d7e5f89c1bd674b798c5ff3860748acd9ccb7d684785358bc5a12d20", + "0x73f819dd32e6679910453dafe4976b5724749fcd18407078e46864a22e47181d", + "0xfe592761d1dc1bd893e0f8fdc548eaa3f5b441fda87ee71826d2d498a19b1f33", + "0x291c84340609f89adc913f236425e23792af8728f6320f5e67f936384e02debc", + "0x48aafb002e34c51e578c57e780ef52676301c44ce359c943238e56188c9be970", + "0xb3790060ee3927e51a8415bf742287ed54fefd32e8e5e0e6e6d8327504f67e3f", + "0x3fb1be8cec3734f7f261eee9bb67e16f89bd5e3836822cb30b79c3661fbbe00e", + "0x32ca794db2e8bb3a6ce2fee48506541397112c3deea2dfe46deeae71ee9f663a", + "0x81dc670fb945eb8c35b00b50f015fd9cef8c4560a855563364d01f2ef4508e14", + "0xbd6556b6d46cca1b2b17a19a3a59c240b0ef3cf48a64dec4d3998c9cc24c1a8e", + "0x90ad6135bfdf67e34c8f73238d31cc0986af1cb489bcfe81fc3eee05d9c29b97", + "0x6e1cb115a90aabc2808bc7322acd7b3c34545f4aa8038f5c6d730da941c2e676", + "0xf3f3af837c7e33b56008a0c04e8ab247210934cb6f3c5067e3a7a37f3e5dafe1", + "0xc9d4ceee42f0ec528c1a63eb9d44098fd23beeedba9604f9e083afb2d505fdef", + "0x17e4dea18b087b93f1215bcfad045ec54713658ebc484fe4e8986a771b0852a9", + "0xfb649abb7e83c2cd08e1e30f0604d06186e3d34901206b1d4c409b26b0510d08", + "0xcf248cf3701057459fc2347f9a9c3dc75332df6cfe002a8befe950ec2aa41b8c", + "0xe355fea96b01d1f58a9ad11787f347ab05da938b8ae8355fb4a4811c1791ddf2", + "0xf41a9728a3c5beb95bd54d48781fc5989608892c59cdf58545787581d7ef86a3", + "0x974a1c129883d3d47d8faaae93cb8a0559b095ec5440f2e876b1ee12588be268", + "0x7902398372de025e2a389ab30720d9219a48e0c843800fe2a117870b8588514e", + "0x3858c51d5edd299685ce0ac9aa398d572eba7a25afe941580e9ff281f3ef4b96", + "0x1a1a0c85194c4ceba80a6266fd6cf9977ace734c0bbe36fdb3f3b14fe185dbfc", + "0xfc0faddbc7dfa5939e91d6759c1a58bc8fb19ee24fb19aa31d05cbf8cada3cf2", + "0x99a9b35bfa30a6546895c6d134041b1564f7d404693619cf94fd6d5087559c2e", + "0x9689c75b7fa465187f1723e96ae4a1092f6f6aa86e187882acced16882682e46", + "0x70c6c50149f0bc6fd7c685bc9fab53dfd3f484a3c9bf206578951684a7e78d22", + "0x1c2b3e1326bc24046d45e3c626ce5e865e9f0f4807f129994558caeccc7e4c40", + "0x41491514a58d6db155b09d99c21e935f60aabdcb0b2bfd0ac3c7a66add88c8dc", + "0x120d2916730adbd56c3a6fd6fd4618af561c81b73952b9f247ebd6fb0d253a01", + "0xc65bb3d2984276ad902ed5d790cdbc5cfb953d5ff01dd0790532b2214dfb2f78", + "0xbdf1cf02af245b580cf20f728fddfa39c6eb5b0ed70e0487c1074fbf28ebc0b0", + "0xcbd578f01e8b5feba2ab69487c979e551c33ce2b73902c63943df9945dd23b9b", + "0xc8c42876c9f093326fd24262be17af1ec0a1030693f7e4a24201c28b3b90d82c", + "0x0b8839b2d0aa101cc2e8887c2d20c83d813559e7800f7ad9ce9af8be697a9a18", + "0xf621df816c070c7f0091dda13b34e6a46a7a86dab6852500351d4f5e2ae9eefe", + "0x8418a842e94ae25f54f427b389cee45d06da8cd3f55e41be9332c56241d48962", + "0xac58a960f5db3cc0570a20f8ca307ef444d9a90f630c7b629e66e4313aad45b3", + "0xf66d09329c4db75279f910ebe6d7a1c643632668a711dfb8069f47cf00d7a57a", + "0xdcacf0e0951030d0f733cbbb46b5f0b3b45840953525b757001ceb74bae9fa4b", + "0x941e10e4fde951acfbc184d76a51823b6ab04214b297e7e52bee236d8f66b8b9", + "0xd1dd9fbed648c9d93f590a91ef9922b6256878a498e61055d8fec739395ce0e9", + "0xe7eae47cd583cab13d7d684adc6e443ef38d83c7d2120171eecf7b0c9168a77b", + "0x08a6ff7d42b3056bc571e9c16607b373d37565a71cac95b9a85bf5788f08ea0d", + "0x3bae2e6ec6af9bbffe37b395df67769b234cdd743bd848764420ff2799ea673c", + "0xaa0b772f59055d8dfbef446352b2d08fbacd97968643a300e03e520c50ffdcbf", + "0xd8d29dfd14ab5068e615662b3580d191663f64cc15557873194d7b2718dc0425", + "0x0561ae8390935eece56ca93e3ea5feaa187e3777418fc19134649726c9519f41", + "0xe3c8dc3145997086caf05a06d4209d10096df09379fce4819f40c13cad005d3e", + "0x02d87b27d2a9e5cb47a71051ef0ef3202e2a86373807753e8603807e43ecf4f5", ], - "transactionsRoot": "0x17429d391ba2a1d033a60a9bdb2899a1c06e25747fcb4c9bc8476c3c72cc357a", + "transactionsRoot": "0xec75fee6c90538b6b5d846f5fd25f550591eaccbb366fc393c4a693f8370d0b4", "uncles": [], "withdrawals": [ { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b7ed9", - "index": "0x2a5128b", - "validatorIndex": "0x4e940", + "amount": "0x11cdffd", + "index": "0x2b3aa2b", + "validatorIndex": "0x36315", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b37eb", - "index": "0x2a5128c", - "validatorIndex": "0x4e941", + "amount": "0x11bee1f", + "index": "0x2b3aa2c", + "validatorIndex": "0x36316", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1c7ee99", - "index": "0x2a5128d", - "validatorIndex": "0x4e942", + "amount": "0x11c8a4c", + "index": "0x2b3aa2d", + "validatorIndex": "0x36317", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aab91", - "index": "0x2a5128e", - "validatorIndex": "0x4e943", + "amount": "0x11bfb57", + "index": "0x2b3aa2e", + "validatorIndex": "0x36318", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a6e72", - "index": "0x2a5128f", - "validatorIndex": "0x4e944", + "amount": "0x11becdc", + "index": "0x2b3aa2f", + "validatorIndex": "0x36319", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b2baf", - "index": "0x2a51290", - "validatorIndex": "0x4e945", + "amount": "0x11c0882", + "index": "0x2b3aa30", + "validatorIndex": "0x3631a", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11bd042", - "index": "0x2a51291", - "validatorIndex": "0x4e946", + "amount": "0x11c12c5", + "index": "0x2b3aa31", + "validatorIndex": "0x3631b", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9593", - "index": "0x2a51292", - "validatorIndex": "0x4e947", + "amount": "0x11caadf", + "index": "0x2b3aa32", + "validatorIndex": "0x3631c", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad611", - "index": "0x2a51293", - "validatorIndex": "0x4e948", + "amount": "0x11c47d5", + "index": "0x2b3aa33", + "validatorIndex": "0x3631d", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b8446", - "index": "0x2a51294", - "validatorIndex": "0x4e949", + "amount": "0x3c9a1eb", + "index": "0x2b3aa34", + "validatorIndex": "0x3631e", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x119349e", - "index": "0x2a51295", - "validatorIndex": "0x4e94a", + "amount": "0x11c1404", + "index": "0x2b3aa35", + "validatorIndex": "0x3631f", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad839", - "index": "0x2a51296", - "validatorIndex": "0x4e94b", + "amount": "0x11c22d9", + "index": "0x2b3aa36", + "validatorIndex": "0x36320", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9715", - "index": "0x2a51297", - "validatorIndex": "0x4e94c", + "amount": "0x11c2dab", + "index": "0x2b3aa37", + "validatorIndex": "0x36321", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b820b", - "index": "0x2a51298", - "validatorIndex": "0x4e94d", + "amount": "0x11bfdf6", + "index": "0x2b3aa38", + "validatorIndex": "0x36322", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aad2b", - "index": "0x2a51299", - "validatorIndex": "0x4e94e", + "amount": "0x11bafb3", + "index": "0x2b3aa39", + "validatorIndex": "0x36323", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b090a", - "index": "0x2a5129a", - "validatorIndex": "0x4e94f", + "amount": "0x11b9154", + "index": "0x2b3aa3a", + "validatorIndex": "0x36324", }, ], - "withdrawalsRoot": "0x158cc8e8a444e3f70658da20714882c73b2c8932eb09b691271da474471d137b", + "withdrawalsRoot": "0x3f196863f2d0d52b020c33d1ac2fb588f257ac153baa09fbee2cc1cce42fadef", }, } `) @@ -605,270 +608,273 @@ describe('requestAsync', () => { { "jsonrpc": "2.0", "result": { - "baseFeePerGas": "0x12f449559", - "blobGasUsed": "0x20000", + "baseFeePerGas": "0x20a0d339a", + "blobGasUsed": "0x0", "difficulty": "0x0", - "excessBlobGas": "0x60000", + "excessBlobGas": "0x0", "extraData": "0x6265617665726275696c642e6f7267", "gasLimit": "0x1c9c380", - "gasUsed": "0xe68b5f", - "hash": "0x33a7971472539aa0ffab0ee330347acd56ca7d2682bfbc80872110ee15e7d8f7", - "logsBloom": "0x80a715cbad9a534e26a01218c885fc2384c7418ebb08610ce30b692726685230a8d1d4be7c512b1963d50bc3fa9b310512532f52ba86229ee000e6a941fab0a45026e41f4f8a4baa2993f06d4ce308fe84b4026b0b4f8cd4d6445240806750615ed8433dae4e24e01d4183978821ac9f00123297008a2648f269c41f7c98d1059a63ba6aa345d42410d70250213a65761258b78143d4709c100282df6a523a79bec1036e5814f9583cdb81c519d7b70016976e8ae1c98346091840262b154741d999907beade05423823ff7a09cd783c06cd621795d85112bf7ffc0620a1a0da5854e4897c2014ea02f596915c43902c9ca0532193797747712152267d0057cc", + "gasUsed": "0xd05f46", + "hash": "0x0c3e51fc62e1dd7401c8884882755b72e1c5720d0b01c75443cdfa8a129d3fc9", + "logsBloom": "0xd123054441c15c9d30998061c8899fbdb40be9b00b9c9b73202d015aef6a92b80e6a1520ca498004de50db02f992518322199054de076a903019e47aa1a8b018a046a6c95d2d39a92c06e33ea9a225aa80c5408964c57f5fe083d5dc8a7051e5e92f4844e244023e90cc74c040236e49c31b9aa023596ec5aa1c0e1458593c036dbe9f7cbaa69538a2ed205c0ae2145e441b1319eb6946a9d82da46e6e9c0ca85f9688c6fa946b844bbdd4cc3f225ce09641d62220214a7cb9744c66340c807013f0315212455a000620a3b27359c8c13e1000130da23e141107d28a4900e1909470a80b03d746114b1596d3a4430b68b4ff3e219bac38d8dfa1680ae4005d4d", "miner": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5", - "mixHash": "0x0403c5067873bff3108703e127c63a2882509ee91006d921e2955c2420470958", + "mixHash": "0x7702b2acc3443bd74c0b3ff142414f9d51e4caa0f111d57d319f4d46e21dedf7", "nonce": "0x0000000000000000", - "number": "0x12e3ffa", - "parentBeaconBlockRoot": "0xed1c13ebb84bf75b852cb3e703f8a7d7c8465a039ce058e2390ece725a54ca47", - "parentHash": "0x72e938fa6ab225be2ce940db9aea7d670b50b3320b8deaeea1084ab645a1db81", - "receiptsRoot": "0x649c9570fc198f14fa93c9b3fb0d7bda1f75a2a05761ffd832768841fc274aca", + "number": "0x12f2974", + "parentBeaconBlockRoot": "0xd472790dc1fd2d1b1cc9e208706266196f261e4c1a74f535d86981670c0d5f99", + "parentHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "receiptsRoot": "0xe2822bc9663118439077ad806cd7a2a1a75bf1d70bf61d901199cf599c46f9d7", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x132bb", - "stateRoot": "0xb821f1259927e7c699f2b06cd550d45e8cb322c06256f17ba36caaec33ae865e", - "timestamp": "0x6638490b", + "size": "0xdad8", + "stateRoot": "0x115fd5eac921e6728825958b2b87da8aaf17edc0085164f11de798f6ed00abbd", + "timestamp": "0x66434e43", "totalDifficulty": "0xc70d815d562d3cfa955", "transactions": [ - "0x12860ead0532b3a4f4aa5f8187d7d0365f6ae93764c8771ac13c6d38560033d6", - "0xed513dcfd2a4f635bfaa476c78919cdd116090513e73ae6b369fa2012ee5a9b0", - "0xc72e7c15c972b5e4e2ccde950691426dd5a725cb63fa2e9784df0f98bc4c1751", - "0x258c636c6d237e14c081c57e7e49043cbc1c81dc7d0b9628ff2c7c6b9a3ffca8", - "0x0800e07eafdb3c33bacd4511503110953d231342a7c29c88c3706b70210d3079", - "0x7fb43c8bba50ffaa4e5b679e0bb55213d55def53e86524b50cd929d69d25a11a", - "0xce5ae725bcf217588fea1f50a5e90b73be01be20a0c280a74992365b84a0e1dc", - "0x39014032f86eb1c043ecf794e04b2a03127a41a1a65b3ab232705a7bf7ccd3d8", - "0x54c8ed510339118a344942a487b46d8627c8627f35cd24efd924e5d39a0bbbaf", - "0x10fe93d2263dd06a9ebf720b2987f07032fe3c4371c8f0c47f92969e19d638b1", - "0x9126f9bc92a2abcd95c35916d45258490d9743a536fa98b7da0f6bd878aa40c3", - "0xaf7690eb86ab1e3e0622454477b7048081ad555d398ec7d3ee7ea80e7b7136a5", - "0x2812d7e89b861cb2b6654ae85728bf046ea1b651d558f984e22df08357958d46", - "0x0351d36488fb798fd81d65de7adbaed0b3de372ecb1dcfb7722281d4595b27dc", - "0xc5fa349a9fe36be632e9ee0da47cd1f585cee05027ac7d241a12ca7e59ac01c5", - "0x9a2e22ac7b57614bc59d69f0cf6d8cd664e625a39b4bd3518fe02174fb36b53e", - "0x40b80ab435c5d21ac7a8607cd19dd90bae1abfdd45727726a0027c0a6d0f0f40", - "0x3caf97e1c0d81062c8047bdbac7c427e0c2b4a0bc6f860cc3892ec884444b9b0", - "0x350bcf3893818beae014118a42a6666559d7ff21ee9824b88a287f0efd734627", - "0x7588537e4c3f06d40e4efc1a495dbfbe042b6064b81104de82f5ef0987b64cdf", - "0xbc20d73ee056c066705c7cbe3fea6eb1b7caea7b56ca53fc3298396f1fb70d57", - "0x2f08911326a2c5c60a7f86ef99084d5b73d2393dfe00622f627459bcdbd62e10", - "0xfb6055df069e04ae38c2d553f891d3ee6ab9eadec01d5fd8bf0c8b477c7c89af", - "0xdf7a8624a9d3b9fd3cf65363243b9db1226199e2035cfc9188208f89d7e38cbc", - "0xb986e24702b5a08144261a64a2e189f872edaaed979082d33f31069cbaf82420", - "0x472adb3a051dc3dd82db424786c900dc1d87f3803d0ce6502bc709687114f98a", - "0xdbc480aaba9b60b3b464adf78a4220446775490cabbc5952f1ec57318608a81f", - "0x7b2770dbe042ad96bf6a91855b635e78c5d027f3798424356d3c45c3002cf499", - "0x12459c7ce4a983588e168351f2206843a4b11eddda203fd3a6a2d4580f7d23bd", - "0x9d8b25edb003dc088028133efe714ce235b1f6ee1768cdbd7ff69ada032d4a21", - "0x370c36c4292fe4d437618e4a045c6fb2c6bc22621411f40ebfb82fcfa2f7b9e0", - "0x8145af3796c4964e5a6ff964de8ab23b615112ca280ea7beea97753b6c849280", - "0xefc0bfa3a0c44ef04d36335054a41ede3cc507c759be41a1cfe83b18f5fd129c", - "0xc79e7863bb792590dd0b3c4622a180bf70f767591eacaad48a0af10930332679", - "0xf47931c3a313968e1cd137b5067ad1b90c54bccc2ce16ca01318bacada4b4a31", - "0xd54f767e01c4267be2c0fbe8db9e4d845fda4cb113a3899ada4289480dd5f859", - "0x2cd97e83ebbd33bc8d7d2d39aa9cdcec1ac261bab1702548ede4ebead14c47e8", - "0x80c0d28d0ccf69dca51d263e0a4107c8a554c40dfcb207c1eb2c95a07618a5ac", - "0xe5033b68abcf549b32ca59903c655e12007d96e8dbd53e37d2ee00501d2b7de1", - "0x4ad9f131b26daf8424a72a58ffdb82014eefdcf4ac1473f504777dab84b87535", - "0xaca6f6a0a1f94e265d31be0ec2d6b5f7da27e6df40595b067c71ac65eac50e94", - "0x1d356bf7c11ab24a8b6c51b38b1f822e2deed2c9dc4bba515bfd46e27b20d5ba", - "0xe58b2851229cfd243981f0e3a10a6b1dc7a9df7e2a5afae1f0e61505e960375c", - "0x931c4dacb13e711a8578f02df6df51a381cfb05fa81da5f766638952910a3286", - "0xb199838a7add300d484e03f452a09c7cdb0afb0e7c67e5884367b9c8a674d182", - "0x2110462201aee32e8d9ddb5c9dd9513592ffde32382da1aabf007630ccf77ea1", - "0xf5ac56284d6d4aa75fa67ccfc58a5658d2cae41d01f412cdab962e91276e06a0", - "0x4ec6f73e1245c247ff6868795b7f0b6789f6a9342c8580b7f9a80d34c3959c6b", - "0xcf77dbfe46f7c12dd9f8042e4b86e7c28a519f1a833cc30f4b581418a3440103", - "0xd4ad311394d0d0a06be4bb32f85ee6f5f6b5f2a688b252e4fb89c3dc374b8bd6", - "0x5f998e622a5ecdd34ac52e89cac0e8959e734a4afb850c18b7829a4c1c30fde6", - "0xac150958348194a84cf894631ecca299cc1ba46b92d36222906f1695d45ff127", - "0x029101258e3a0d66780f2ec8a6c74e93f1f574466af72a771bf4452ed4a36f58", - "0x9d986ebbcfae4e31be2aa5fa5c7f2fcd7f0856ca6521a7e397b7a2bbc48d8ba4", - "0xc39c67e7efb378137a47dec994ac018f3b9674a1fd0dcb2c8d39ed41c8655206", - "0x9a416e3dd237f7f9b5c696197f18a53390f52fe2971658f284704167365c9e35", - "0xe9305e739cf066fd8e1468dd25f460db18f33b8ea171c95a9c424c5aa7e3c235", - "0x8832a517ca2deb2a66b5e0681fe0c85c5c1af12aeb94d50b531a264ae1eb9e33", - "0xa9f74c7b27928f1e4b6344889e22939409d07a602619b62903c5776120e0a558", - "0xa10590ec01af9f837be9d6b3ad688acbdbbb3fc8b03bc2cfd9248ba20c6c64ea", - "0x4ed77d7ad8b1ac8fdf1bab5e03a8d8c73687b8a7788b8040a0c1bdce2931f0d4", - "0x406705bbec19171a8d5699522732698255b122a495bb4141e2c11605972495f5", - "0x0847427ddcdae27ed2029ecfc9a0fd27cdd919c5648ae715b8c25f336a3f92d4", - "0x6256806522d5dfd39f9a7fd8a2aef44c73a555c24a3fac6ab1570771e641a05e", - "0xfe1a5fa2b637212e86d593b3d7ae041babad31b866d054e901f2ff33c468e418", - "0x6a9576201f7c85a2c327581f30702e94d2a350caef89c8400d9569aa91951bfe", - "0x5f77b63367a427cc620ca5e3a660b1dde2beb5ca98e56adfd55a4861ae14e1b5", - "0xe31b66b16d8a41d32dc6f422502bdee12bc747d9314b1856b4b4bc9cb3dd9403", - "0x3531698211550e8674966e596c678f8953e58b304ed7811c4fe663b7b9c7cffd", - "0xeb2c5a76791d6ff1c11bf730253658f51daeb00906e394b47aea835c9fdba77b", - "0x86d1ddc92753c1c1f0302a690d2063c6e0dfd2d6862c592274fd7905efa49eec", - "0xfc574ead986bf97b1f8a2f238d88727f3d4a72046c63f83290fb37dba3201b5c", - "0x325936f0be7ea6043238e77bd1bdeabccd759967879908fd627f72727518931e", - "0x20364ae1ea8b9801894ffe225d7d976f80e7362dab1f5a7130d25243b8889eec", - "0x279735ea4729dc90a118266648a2feebce7ca64cb1afa9545e19ea13da0cf83b", - "0x0fa0f631fd043dacfc8d46a5928abeecad3f78364b82e7186c60875837bdbbbd", - "0x4bc7e1074376aa78335f8b4b8f62e9292cace9dae0aed6d26a203a03cddd4109", - "0x775e28757ae6e072cd3b81d85e4de4bc924b69341585ffa644898fd954808aa0", - "0xd08f902819d47dd5b7d2d34273aea34562d7d3e6e696087625a6654055ef655f", - "0x4f11a66edea360f5f27f462a11f93d817cee7a870c9449814f96dbd155cc5bc8", - "0xbc4798ebf06e8de6f41f3266e38eba95c4fb1a26476bb1e33029d8cdb7036a24", - "0x4b1cf02ef289636671481e8364afc84bc79cc1f196c75d59bcd8e6442190e9e3", - "0x08e9a2c505d6975f87dbb3fd680a748bc3a10894a6c05d045d7cead1311daa50", - "0x9c18c613880668be568156190381fc36662369e49e8a436243eaaeeb5caf42b0", - "0xe935bd3ef799f26b7efcb0796fcd6762aa2736b6241a5ddd4de90ff9acb5600a", - "0xa2dac6abd420580dbe113c0c64190f731519f3ad51f37426c377022aeb9ddc44", - "0x3b20edf7281bf115eea7287643f68ddf70b464baa26ab493e906a8b4cc0bd183", - "0x6bba175b959f2af9fe4d89a92e55e259ee7ca98207739ff9e86ddf8f1a90fc75", - "0xcc34030e9d69b6f7813ee9647cde4ab4bd23fb3c4cd76dd1d3b0a9b5b72b124d", - "0xaf28bbd7c9eea390ecf90b0ba6cd7074bbfd202956b80a411a72a29bf1d0a065", - "0x8126d643814b5d013674ead269132aa4b223074afcd406ad0d7ca07d598b3e52", - "0x781de3d23e65f4f7369b07795ad1f1237b53d8f054a2d58aa24eadb7e42ee07d", - "0xd01c2a8c4020ac9faced0d25476622ea82030ffeeb7c69ffeec6004827c70f07", - "0x133d37de851fbbc8f6496519012e4ae17d60e3ac58c8987d4de3142161b8dc6b", - "0xcd21c5e94e1362390688c541be600a53f318a299e7fba155fe032e61a85c87db", - "0x1a03c128b6b6a4348f56ebf4076f5c051ecd22f0c3534216fb02b1bc33a0602c", - "0xbb486632d0c2fb6fab0a17a0b39258695f9a178f5e27e9a72c36df76cc1263d8", - "0xa59bb99d7c0becdc070c02ea453409dda451b5e6c66ca42a081d01607691c68e", - "0x6b8701f8bf6a5bf853cfe765d5d86153cecbbd46c41e6afb81d26d1e79031cfe", - "0x8399c2f547d7abfb99dbc586250134b57e46577f7a2e55e9c7c2618e56239292", - "0xd37d12d8518dc02e8b3cbb5fa0b59f56fe6c0a70805c755ffff6b74edfcae2f4", - "0x765ea9c689e67f4f773e4058a2fea01edf70da6db50064507e684877394aa502", - "0x89675014845e26847ef059d21ea4af749975a7ec3f4a6976e6c6e8c53b0b145c", - "0x2ffd985bbae3b9ff11f8451b8bb19515a449115abdfab09474515d1cdc5ce124", - "0xc6c58abde0a22e572bf6e16180dc968f02dc3afa3d15d0aa8f4215e42f757a62", - "0x37b84f52321c2d4c81efec686237f125b770a2a3c103a684d63ed590e90431b7", - "0x3706bc60b4a99c01097c06f39512247448abdb0d15f5f609220811da018ae17e", - "0x7d2eab2fec674e1c7e370eeb167ecb74029c0a232f1235e845963fc7d3dda954", - "0xd4c6ab4c94c53e5aadfee12542526d55630690ee7e8402a5c992a000950be6fb", - "0x3d0517ea747fc46a1af3e8bd66a5e9c1baec849a3e8d6ec8c0cfe065a42cccf3", - "0xcfd5693a2101852aec988e057da93871f453f758cecdd38b9194652dbd9b9c25", - "0xc097c97e4acc5360de98e4d72af55333c05d154eac3424059e7848d32013e025", - "0x7527429baf457ba3644188a75a109960ae0d845449386ad4aa8e5581cd7b1a41", - "0x061e3b2a4c0cd6490993ea94fd4e7563d362585af12bb3458952b752426886ce", - "0xf9af3398ad3edde0ca7f4603e5851d302f39b617e4aa1eb3568392bf5144bcf4", - "0x7f478c943917b27a3441d42ddce13838efe3926ed6ca87e812be441501b37016", - "0x94f5ebf04e6d04d89dca2643daa02439833b153460d3f33de578047d0f04ff8e", - "0x2e03c81dc609ccbf0e91b6b67b79f3088028b736679de46f51caafbc9dd6a488", - "0xfc6472d85609fbbb6ac8dec4bf069f51d3a96f59f163738e38724aefcb5d9423", - "0xf70cfd8d0721b13b8e75c8aa24e6fa984576b1916fa14edc932fc8f53132d9df", - "0xbf6190304df41dafe26113b37dc45a9812ccfe9ee40a1dfb97bf85e71c5e9829", - "0xa59cffc13207fe46b3c41ff728f3e1fe8172492854208ed6ee34485a4a452638", - "0xa0447569ee667995ccdf4edbe77abbb9e499741b7d084928a2cd4fec010ae3af", - "0x38de793ad609ad9774dc298e1b3050eb022858125e22640ac6f4ba4713004320", - "0xd83b345b4a6cc0ce214d987ba4a39d2f981ee7e54bba697138cb9a2e3f354a31", - "0xc58657f3919410d504d0b3e16cd8baa1a38a2405b490a288eb64635c86038848", - "0xf49b53d2c68f855bbb828109d66cf75952fa16d6d21a6aa8fe04cba4ae54e91a", - "0x98559bbb58decddbfddb8f074e4e681fda52ee5e41d9b230af4ad054c6b05448", - "0x0cda4b71587108b814822df6e4ee65e466716c634c5a080c87bb9c92d0a01304", - "0xb5dc2541610f061f46d81ad092e7222a85bc6d208044b8d57ba2381334901536", - "0x6de7c83368dacd692c865fb42fcca63ade071e98717cb62424bdd256f1368d26", - "0xc553a57130c5877337bbae3150b497fff994a1150494911659c1fca1cc8aabd6", - "0x9fa1899b30b6da8079838aa0b597ed5a48a1182006b28053babafab8ac3b796d", - "0x545d5046aa19ce6f402e93bd77d0c29f9ae58f07856ace50e91e9fdcb15b0bee", - "0x6a8698facdbed4b6659ad745fd4eb434bc129cecaffad99c3f08f4d688b1df02", - "0xeb1269ed5c9a4945c0725be8b986212057a19bf9127c8252949270a3e1996f1a", - "0xf4792b8be1496300e500d7a702b4ae2824c14d5f438604fdfe94388867c7c9c5", - "0x64c6a2e4cea7d4784d12677704549df5bb8b27ebeabe41891781b9a641430848", - "0x45bda137a2426603437ad1e393bfc93855c84c9eb116299640f842ae15beb46a", - "0x77374a47adc133e93d9661b8ce8e672a343cd5a2b2a079034de69211a0ab0893", + "0x5d374a026007c13e901765497b9164d44822902463efdf7b574b10c476ee2ad6", + "0x2762a7fb7c973e888edc457a3808d3882b5c8fc4f6c43a082d823319b126b91a", + "0xe637d86545a9b508b373fdd46cc71682ac4a5dba222d7c9ac01380306cc96cd9", + "0xecdfec41e9859fa217c5467debc9a5fa95290c3273f0ecf282f802983d2ca105", + "0x75f544151f040710f96a2c8cd6da6cd7bb60e461bfc9b4f87d015562d9a55328", + "0x07e609166382b05cd4cfd59764226374af8457a5dc0cea255721e5570cb32844", + "0x08109ccb2b1609d10cd929594ba3a131d59c7aa6eb174cc7bf578670a8198405", + "0x932fb264036b15e8a9704501e4f1ae34a9ac7543c498223c3456f03ebbefe221", + "0x4773aaf55c914947aeefe6c996b961c900bddd82b4e809d47a5f99af22b014ef", + "0x04d0728690604a7ec930782021704bb5d75d16d2c3330f8ab051348c906c52d4", + "0x61d5fc3a8aa4f5e802dcd54a7fceaad89a97c873578b845ad12b34a96540aeb7", + "0xd14bf1505356f83e55d4baffa315e0e9210479dff7486c4164a050c935d5bccf", + "0x6c4e8a1e9484ad717ef42df12a6cb9655216b6a2f7420f52dc540ed952860fdb", + "0x1d2361b3ec4fcb498732048e348fec130f15fb7e05187d8878985681c506b32a", + "0xc3da74a44904c29c9046587cbade10386db5aed500d7ead58335a9757fc64c93", + "0xc8632c7648b32e86023d8b585145bda62e5f8c160a5e6c8c02ec183297d05d2d", + "0xb6a79dcd720a72d2ea5728a8e58885304202535b00861113dce00d07bca7f3ab", + "0xc8b9a208eccabd84320946527cb1df897ec48318c1ca67e5fedc48388152518a", + "0xd5b0feea2d8e474913d280c45c4a6e365ec2bd8ab09982f0b07a7e6e2e433526", + "0xd67fa075f7abde07de71273e227856b43373276f18eb1446d1566cfafe896947", + "0xca96b4905a5854d52f3152dc2f86b1e8ef0891ce82b8a6d0622d4470fa980c03", + "0xd80b94b3d5e72e1cc74b3acbf6bec79bde51d6341f021a1259fe2e3303a919f4", + "0x0e034d76d3593f1f07baf2452e337da912dfc06fd61704e658797eaf5c33222e", + "0x755a7415073e029b231d575f935a10ae657eb30d3aa3edd32fcfc812ba2075b9", + "0x082bebb8c90bc915b6931d6d135ae7016a41b01e6d07151b5d11d2e3cc15868c", + "0x5a550298d163c3a6b1ca91412076781462a6e77825a7a34789e514f566a2ddd2", + "0x7f5523181ea3b7b83577e2de0ff3edf0b7bed050436fd6958274a0a6882a487d", + "0xc63aa388331f5016643dc4744dc47f0b79ac2dc30f2837f36058959de5c6d97b", + "0xa1cdde08be62979fb2d51e3d1447e67ef9a72e7e9ad6c70834b6667ab4b25b2f", + "0xeaf27f121d562cf7d6ba5fe04cb7477c2eae917f6ed0d254c474595334e1e61b", + "0x4d3a2c0aa20291ec2a3e9663676770bb1cb1c33c8caa7308ec9b0e180df42039", + "0x1f13065bd8d6bd0ff04592f8216576eb2ce38d766cf1fd4114392b4e622a7658", + "0x220ce318063ac4496ba1e7946b78fd1574f95518ac920563531b124bbc3ec22d", + "0x6c258638f3e25d325a1f73075a338ce02e57b4fac1b2a810a544d40b24e8b9f9", + "0xa2a5fdce0672a32e04908e9a12a683697057855a33da8ab3cfc5275094f270fe", + "0xfeb465bea0d19e832b87965440a36b3ea1d8bffda29d27ab72bf196f5a3954c0", + "0x20b39aed43810bfc46a279f91e2814ae5a56906f7b7505c499850f2605c82dac", + "0xd75f805748cdf37402c13b685d9dd9884ba1c0b0e3189f9f613a3a9ed223dbc8", + "0x46bb82c63a8a2e29d01360f78d5ee871178847627774756ca6efc614c9710cee", + "0x37a217624ca5724463612bc0a4f0943a3bf8599a05e9d4dc82da20bb0df79867", + "0xca8ec3dfca0e43c79a9a32cdd8a01c161a8fbbed07d6f5b4231dc7b4086d1380", + "0x12f7e01f6efcfb1c56bb3d4bf4358c32df847303c92d4f646996d4c601e1bd2f", + "0x50a0a2e7abaeee10aa9ec6ca0303a019acd2b09279357a480fd37c2c03e177f1", + "0x0c0134f6a1f68649f4777c86668ac2c3d348cd5ee9f71adaf5a783a3852a2e1c", + "0x740fb5ab5762b25c2be2f3590cb0811d74b54dae5e40f52bf1e68c8fe2cb6e92", + "0xa2218d513e2ca93a8acb3652d638af7be7e62711f48e81bf255fff3cfbe3a0dd", + "0x413a7f87acffc04ef34261ae47737ab2f5f461d0af5d57269c5f6cdf78275159", + "0x60d81ea9118a9d8075101f22e09d0646f155f23c2f4b84804f7ffc5afb203a68", + "0x2ff7f513238717f264521c91bc457fb17800beda940eaf6d7e56b1c866b42c06", + "0xda6dc1ae732e7ecbcac5765fc442fcee5a3617b5d575f5103b4fd9f706847c07", + "0xf59ef60c1d9dda81fc22a8e985b6d3e589f512eb8b2518b3511a43908a460294", + "0x81c6e17337cabd304c329a799b02e02245f37ece12a413f5c49282d18b1883cb", + "0x18fb9299e78ffe36bfea65442d790288937a4d1d5b69138525dadaa70dc42367", + "0x9db74bf461bb809717866699fb8b5d6bbe33b5bcc967dec46357331272e20df2", + "0xc59eefbe4041f7dc7fdf2c86c9cfc0f1706993dcee80de6b27f25489cb8e10a9", + "0x38b2207a133bfc3aec210fb386a199efb9087d13330fa0f637bfe37df59c312f", + "0xd35ffbf38934b54a900e35c65c07fc3081993ebf5a55bc67977b73410abc211f", + "0xa13e7a446c7f3ddaa8555c5d3437e8d827303b152a4dbb09ff01bde01a0585b0", + "0x0bb1b3eea492459f2796fb9b3f7022417860f3a5450374220c0c9c3bd2e63512", + "0xd9ebb04da1035f95bf3ed0bd06268f53737001f3f292ac825852875c57a6c4be", + "0xe07cf18aa356d0134f2e0da6f68de7c9f28af854455fbdd38770b44be98a1dc6", + "0x9be4c6c6a3c5622fcd0a1bbe13e21b8612eb39932f05b42972edf2ed184804dc", + "0x9cf9a53f37175b3eba970af4b06a9fa98042e08882b2ed96dd285c0eaaa8e13c", + "0x23f3b4e0dad22684741df92bba387be4e5c05414aca5bf54383e74a4b24b30eb", + "0x4dcfcf6353596c9665fd94b7b9281b65e0a94b45f98ddff681db9ffc5c561602", + "0x460b33043b87067727977ec7daea667bf440f482f0e77ab5a86745832c05d09e", + "0x2fd8ab214c757b69349f10a86d94ccdae0a2c692f3408ea4d65bf5a58c710166", + "0x6627f34e22dec201d70e4304375e60b0703a992610487356a7af6812c4ae89f0", + "0x6a2ac6c7b4f140443ea9190beba68706aa0828055cc0a49c037f6bed4a3b94c9", + "0xbadc35a3b5eb2524ddea54babbc6a7c531f94c845b499e2773f0d82f347976df", + "0x258972ea1dced55b6b95ed07085de981786401d4da790000d7bd8739b0132cd9", + "0x2b70ba122ab93b5b020a3e0ede3e5170d91b2fd8c429c4909b025a68e50a0a2a", + "0xa1f2796fbf29d6cb19d541bb9e2ac1bdb8ecf4f64e9d4068a77b18325d736be8", + "0x297b30d9b997e375d6d560c9670449c4ab9fc9e6cbfcfb094c659d053bd74fae", + "0x4f2058432f7e90bde5ac4661e66dd4ddb4865a31a015b5da7a74f1ed682d4471", + "0x88777368f2847a5a370cb5c6113b25841987168e1d60eff8f5e622b608c073b1", + "0x4b6de4690fed6b924865cf234a94b74f8765c969d821bbddeb4333936c558aa9", + "0x89db01005aa4cd9b60c481763f21dffe39a7ba2da6a4df80e1649fe71952ef70", + "0x888b2ccb261734919308c792c458dcafbaf5ec09b35ff490b77e55304d8f6352", + "0x847e03a9a940c74f151694bed14c82fc53eaaae5e4236e7f0525ab438f5e9d77", + "0x176f3b0b49ee54ec554dc3a4dea00b3d115e48a8c0d5d3c6f328d7da8f6beff7", + "0x009d634f81d6cbefe083d48d0741ab332f238bf496aafca838095e6fde0b541f", + "0xaec2cd6a1cf8954187174f4a62c07b021293cac8b69d1b48cd206ba3244292ba", + "0xc914a43546e51a0d4ab116e8fc86bd639c14b563474c9c247bb406404b6241c3", + "0xdd7f4c16cc0512e308b521c944e11b852d652652656ba5c30589fbbd4454002d", + "0x0329301ecb0cca138d687a07c3fc0e13358d10fb73f7ddac636fe1940d45be8b", + "0x2f569a19dff21bc2674064a636b3f87689f3e0ed0ef69a0d99bbedb5721e154c", + "0x06f42e2ae50574d560a495411ed504d3ca1c34ff5fe9f6f74a4327a9ada801f5", + "0x04db2f50573f591543a42ad27ad89efe7182ff286b6d2c75e8787cdfd67682ad", + "0xcac34907d292c7d1e8e307a3c669e9867977630b6667aa8ed0db0d0cb0e757f8", + "0xe043631e0d3d42dfacb87783a95d9a7fb6d1b4a6b556ad5ffd9724dfec8a05dd", + "0x163bd1073a5e99e886ae0ca8a469a58096e9992f772d8cf03c12897bc759ebf9", + "0xe468530ce156f65bf52574d52c7b55489ae9a4a7bc3df7710e3ef8fd47d72386", + "0xc19059a3d7e5f89c1bd674b798c5ff3860748acd9ccb7d684785358bc5a12d20", + "0x73f819dd32e6679910453dafe4976b5724749fcd18407078e46864a22e47181d", + "0xfe592761d1dc1bd893e0f8fdc548eaa3f5b441fda87ee71826d2d498a19b1f33", + "0x291c84340609f89adc913f236425e23792af8728f6320f5e67f936384e02debc", + "0x48aafb002e34c51e578c57e780ef52676301c44ce359c943238e56188c9be970", + "0xb3790060ee3927e51a8415bf742287ed54fefd32e8e5e0e6e6d8327504f67e3f", + "0x3fb1be8cec3734f7f261eee9bb67e16f89bd5e3836822cb30b79c3661fbbe00e", + "0x32ca794db2e8bb3a6ce2fee48506541397112c3deea2dfe46deeae71ee9f663a", + "0x81dc670fb945eb8c35b00b50f015fd9cef8c4560a855563364d01f2ef4508e14", + "0xbd6556b6d46cca1b2b17a19a3a59c240b0ef3cf48a64dec4d3998c9cc24c1a8e", + "0x90ad6135bfdf67e34c8f73238d31cc0986af1cb489bcfe81fc3eee05d9c29b97", + "0x6e1cb115a90aabc2808bc7322acd7b3c34545f4aa8038f5c6d730da941c2e676", + "0xf3f3af837c7e33b56008a0c04e8ab247210934cb6f3c5067e3a7a37f3e5dafe1", + "0xc9d4ceee42f0ec528c1a63eb9d44098fd23beeedba9604f9e083afb2d505fdef", + "0x17e4dea18b087b93f1215bcfad045ec54713658ebc484fe4e8986a771b0852a9", + "0xfb649abb7e83c2cd08e1e30f0604d06186e3d34901206b1d4c409b26b0510d08", + "0xcf248cf3701057459fc2347f9a9c3dc75332df6cfe002a8befe950ec2aa41b8c", + "0xe355fea96b01d1f58a9ad11787f347ab05da938b8ae8355fb4a4811c1791ddf2", + "0xf41a9728a3c5beb95bd54d48781fc5989608892c59cdf58545787581d7ef86a3", + "0x974a1c129883d3d47d8faaae93cb8a0559b095ec5440f2e876b1ee12588be268", + "0x7902398372de025e2a389ab30720d9219a48e0c843800fe2a117870b8588514e", + "0x3858c51d5edd299685ce0ac9aa398d572eba7a25afe941580e9ff281f3ef4b96", + "0x1a1a0c85194c4ceba80a6266fd6cf9977ace734c0bbe36fdb3f3b14fe185dbfc", + "0xfc0faddbc7dfa5939e91d6759c1a58bc8fb19ee24fb19aa31d05cbf8cada3cf2", + "0x99a9b35bfa30a6546895c6d134041b1564f7d404693619cf94fd6d5087559c2e", + "0x9689c75b7fa465187f1723e96ae4a1092f6f6aa86e187882acced16882682e46", + "0x70c6c50149f0bc6fd7c685bc9fab53dfd3f484a3c9bf206578951684a7e78d22", + "0x1c2b3e1326bc24046d45e3c626ce5e865e9f0f4807f129994558caeccc7e4c40", + "0x41491514a58d6db155b09d99c21e935f60aabdcb0b2bfd0ac3c7a66add88c8dc", + "0x120d2916730adbd56c3a6fd6fd4618af561c81b73952b9f247ebd6fb0d253a01", + "0xc65bb3d2984276ad902ed5d790cdbc5cfb953d5ff01dd0790532b2214dfb2f78", + "0xbdf1cf02af245b580cf20f728fddfa39c6eb5b0ed70e0487c1074fbf28ebc0b0", + "0xcbd578f01e8b5feba2ab69487c979e551c33ce2b73902c63943df9945dd23b9b", + "0xc8c42876c9f093326fd24262be17af1ec0a1030693f7e4a24201c28b3b90d82c", + "0x0b8839b2d0aa101cc2e8887c2d20c83d813559e7800f7ad9ce9af8be697a9a18", + "0xf621df816c070c7f0091dda13b34e6a46a7a86dab6852500351d4f5e2ae9eefe", + "0x8418a842e94ae25f54f427b389cee45d06da8cd3f55e41be9332c56241d48962", + "0xac58a960f5db3cc0570a20f8ca307ef444d9a90f630c7b629e66e4313aad45b3", + "0xf66d09329c4db75279f910ebe6d7a1c643632668a711dfb8069f47cf00d7a57a", + "0xdcacf0e0951030d0f733cbbb46b5f0b3b45840953525b757001ceb74bae9fa4b", + "0x941e10e4fde951acfbc184d76a51823b6ab04214b297e7e52bee236d8f66b8b9", + "0xd1dd9fbed648c9d93f590a91ef9922b6256878a498e61055d8fec739395ce0e9", + "0xe7eae47cd583cab13d7d684adc6e443ef38d83c7d2120171eecf7b0c9168a77b", + "0x08a6ff7d42b3056bc571e9c16607b373d37565a71cac95b9a85bf5788f08ea0d", + "0x3bae2e6ec6af9bbffe37b395df67769b234cdd743bd848764420ff2799ea673c", + "0xaa0b772f59055d8dfbef446352b2d08fbacd97968643a300e03e520c50ffdcbf", + "0xd8d29dfd14ab5068e615662b3580d191663f64cc15557873194d7b2718dc0425", + "0x0561ae8390935eece56ca93e3ea5feaa187e3777418fc19134649726c9519f41", + "0xe3c8dc3145997086caf05a06d4209d10096df09379fce4819f40c13cad005d3e", + "0x02d87b27d2a9e5cb47a71051ef0ef3202e2a86373807753e8603807e43ecf4f5", ], - "transactionsRoot": "0x17429d391ba2a1d033a60a9bdb2899a1c06e25747fcb4c9bc8476c3c72cc357a", + "transactionsRoot": "0xec75fee6c90538b6b5d846f5fd25f550591eaccbb366fc393c4a693f8370d0b4", "uncles": [], "withdrawals": [ { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b7ed9", - "index": "0x2a5128b", - "validatorIndex": "0x4e940", + "amount": "0x11cdffd", + "index": "0x2b3aa2b", + "validatorIndex": "0x36315", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b37eb", - "index": "0x2a5128c", - "validatorIndex": "0x4e941", + "amount": "0x11bee1f", + "index": "0x2b3aa2c", + "validatorIndex": "0x36316", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1c7ee99", - "index": "0x2a5128d", - "validatorIndex": "0x4e942", + "amount": "0x11c8a4c", + "index": "0x2b3aa2d", + "validatorIndex": "0x36317", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aab91", - "index": "0x2a5128e", - "validatorIndex": "0x4e943", + "amount": "0x11bfb57", + "index": "0x2b3aa2e", + "validatorIndex": "0x36318", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a6e72", - "index": "0x2a5128f", - "validatorIndex": "0x4e944", + "amount": "0x11becdc", + "index": "0x2b3aa2f", + "validatorIndex": "0x36319", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b2baf", - "index": "0x2a51290", - "validatorIndex": "0x4e945", + "amount": "0x11c0882", + "index": "0x2b3aa30", + "validatorIndex": "0x3631a", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11bd042", - "index": "0x2a51291", - "validatorIndex": "0x4e946", + "amount": "0x11c12c5", + "index": "0x2b3aa31", + "validatorIndex": "0x3631b", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9593", - "index": "0x2a51292", - "validatorIndex": "0x4e947", + "amount": "0x11caadf", + "index": "0x2b3aa32", + "validatorIndex": "0x3631c", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad611", - "index": "0x2a51293", - "validatorIndex": "0x4e948", + "amount": "0x11c47d5", + "index": "0x2b3aa33", + "validatorIndex": "0x3631d", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b8446", - "index": "0x2a51294", - "validatorIndex": "0x4e949", + "amount": "0x3c9a1eb", + "index": "0x2b3aa34", + "validatorIndex": "0x3631e", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x119349e", - "index": "0x2a51295", - "validatorIndex": "0x4e94a", + "amount": "0x11c1404", + "index": "0x2b3aa35", + "validatorIndex": "0x3631f", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad839", - "index": "0x2a51296", - "validatorIndex": "0x4e94b", + "amount": "0x11c22d9", + "index": "0x2b3aa36", + "validatorIndex": "0x36320", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9715", - "index": "0x2a51297", - "validatorIndex": "0x4e94c", + "amount": "0x11c2dab", + "index": "0x2b3aa37", + "validatorIndex": "0x36321", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b820b", - "index": "0x2a51298", - "validatorIndex": "0x4e94d", + "amount": "0x11bfdf6", + "index": "0x2b3aa38", + "validatorIndex": "0x36322", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aad2b", - "index": "0x2a51299", - "validatorIndex": "0x4e94e", + "amount": "0x11bafb3", + "index": "0x2b3aa39", + "validatorIndex": "0x36323", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b090a", - "index": "0x2a5129a", - "validatorIndex": "0x4e94f", + "amount": "0x11b9154", + "index": "0x2b3aa3a", + "validatorIndex": "0x36324", }, ], - "withdrawalsRoot": "0x158cc8e8a444e3f70658da20714882c73b2c8932eb09b691271da474471d137b", + "withdrawalsRoot": "0x3f196863f2d0d52b020c33d1ac2fb588f257ac153baa09fbee2cc1cce42fadef", }, } `) diff --git a/src/utils/rpc/webSocket.test.ts b/src/utils/rpc/webSocket.test.ts index b32a8e583c..d190775e0d 100644 --- a/src/utils/rpc/webSocket.test.ts +++ b/src/utils/rpc/webSocket.test.ts @@ -68,270 +68,273 @@ describe('request', () => { { "jsonrpc": "2.0", "result": { - "baseFeePerGas": "0x12f449559", - "blobGasUsed": "0x20000", + "baseFeePerGas": "0x20a0d339a", + "blobGasUsed": "0x0", "difficulty": "0x0", - "excessBlobGas": "0x60000", + "excessBlobGas": "0x0", "extraData": "0x6265617665726275696c642e6f7267", "gasLimit": "0x1c9c380", - "gasUsed": "0xe68b5f", - "hash": "0x33a7971472539aa0ffab0ee330347acd56ca7d2682bfbc80872110ee15e7d8f7", - "logsBloom": "0x80a715cbad9a534e26a01218c885fc2384c7418ebb08610ce30b692726685230a8d1d4be7c512b1963d50bc3fa9b310512532f52ba86229ee000e6a941fab0a45026e41f4f8a4baa2993f06d4ce308fe84b4026b0b4f8cd4d6445240806750615ed8433dae4e24e01d4183978821ac9f00123297008a2648f269c41f7c98d1059a63ba6aa345d42410d70250213a65761258b78143d4709c100282df6a523a79bec1036e5814f9583cdb81c519d7b70016976e8ae1c98346091840262b154741d999907beade05423823ff7a09cd783c06cd621795d85112bf7ffc0620a1a0da5854e4897c2014ea02f596915c43902c9ca0532193797747712152267d0057cc", + "gasUsed": "0xd05f46", + "hash": "0x0c3e51fc62e1dd7401c8884882755b72e1c5720d0b01c75443cdfa8a129d3fc9", + "logsBloom": "0xd123054441c15c9d30998061c8899fbdb40be9b00b9c9b73202d015aef6a92b80e6a1520ca498004de50db02f992518322199054de076a903019e47aa1a8b018a046a6c95d2d39a92c06e33ea9a225aa80c5408964c57f5fe083d5dc8a7051e5e92f4844e244023e90cc74c040236e49c31b9aa023596ec5aa1c0e1458593c036dbe9f7cbaa69538a2ed205c0ae2145e441b1319eb6946a9d82da46e6e9c0ca85f9688c6fa946b844bbdd4cc3f225ce09641d62220214a7cb9744c66340c807013f0315212455a000620a3b27359c8c13e1000130da23e141107d28a4900e1909470a80b03d746114b1596d3a4430b68b4ff3e219bac38d8dfa1680ae4005d4d", "miner": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5", - "mixHash": "0x0403c5067873bff3108703e127c63a2882509ee91006d921e2955c2420470958", + "mixHash": "0x7702b2acc3443bd74c0b3ff142414f9d51e4caa0f111d57d319f4d46e21dedf7", "nonce": "0x0000000000000000", - "number": "0x12e3ffa", - "parentBeaconBlockRoot": "0xed1c13ebb84bf75b852cb3e703f8a7d7c8465a039ce058e2390ece725a54ca47", - "parentHash": "0x72e938fa6ab225be2ce940db9aea7d670b50b3320b8deaeea1084ab645a1db81", - "receiptsRoot": "0x649c9570fc198f14fa93c9b3fb0d7bda1f75a2a05761ffd832768841fc274aca", + "number": "0x12f2974", + "parentBeaconBlockRoot": "0xd472790dc1fd2d1b1cc9e208706266196f261e4c1a74f535d86981670c0d5f99", + "parentHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "receiptsRoot": "0xe2822bc9663118439077ad806cd7a2a1a75bf1d70bf61d901199cf599c46f9d7", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x132bb", - "stateRoot": "0xb821f1259927e7c699f2b06cd550d45e8cb322c06256f17ba36caaec33ae865e", - "timestamp": "0x6638490b", + "size": "0xdad8", + "stateRoot": "0x115fd5eac921e6728825958b2b87da8aaf17edc0085164f11de798f6ed00abbd", + "timestamp": "0x66434e43", "totalDifficulty": "0xc70d815d562d3cfa955", "transactions": [ - "0x12860ead0532b3a4f4aa5f8187d7d0365f6ae93764c8771ac13c6d38560033d6", - "0xed513dcfd2a4f635bfaa476c78919cdd116090513e73ae6b369fa2012ee5a9b0", - "0xc72e7c15c972b5e4e2ccde950691426dd5a725cb63fa2e9784df0f98bc4c1751", - "0x258c636c6d237e14c081c57e7e49043cbc1c81dc7d0b9628ff2c7c6b9a3ffca8", - "0x0800e07eafdb3c33bacd4511503110953d231342a7c29c88c3706b70210d3079", - "0x7fb43c8bba50ffaa4e5b679e0bb55213d55def53e86524b50cd929d69d25a11a", - "0xce5ae725bcf217588fea1f50a5e90b73be01be20a0c280a74992365b84a0e1dc", - "0x39014032f86eb1c043ecf794e04b2a03127a41a1a65b3ab232705a7bf7ccd3d8", - "0x54c8ed510339118a344942a487b46d8627c8627f35cd24efd924e5d39a0bbbaf", - "0x10fe93d2263dd06a9ebf720b2987f07032fe3c4371c8f0c47f92969e19d638b1", - "0x9126f9bc92a2abcd95c35916d45258490d9743a536fa98b7da0f6bd878aa40c3", - "0xaf7690eb86ab1e3e0622454477b7048081ad555d398ec7d3ee7ea80e7b7136a5", - "0x2812d7e89b861cb2b6654ae85728bf046ea1b651d558f984e22df08357958d46", - "0x0351d36488fb798fd81d65de7adbaed0b3de372ecb1dcfb7722281d4595b27dc", - "0xc5fa349a9fe36be632e9ee0da47cd1f585cee05027ac7d241a12ca7e59ac01c5", - "0x9a2e22ac7b57614bc59d69f0cf6d8cd664e625a39b4bd3518fe02174fb36b53e", - "0x40b80ab435c5d21ac7a8607cd19dd90bae1abfdd45727726a0027c0a6d0f0f40", - "0x3caf97e1c0d81062c8047bdbac7c427e0c2b4a0bc6f860cc3892ec884444b9b0", - "0x350bcf3893818beae014118a42a6666559d7ff21ee9824b88a287f0efd734627", - "0x7588537e4c3f06d40e4efc1a495dbfbe042b6064b81104de82f5ef0987b64cdf", - "0xbc20d73ee056c066705c7cbe3fea6eb1b7caea7b56ca53fc3298396f1fb70d57", - "0x2f08911326a2c5c60a7f86ef99084d5b73d2393dfe00622f627459bcdbd62e10", - "0xfb6055df069e04ae38c2d553f891d3ee6ab9eadec01d5fd8bf0c8b477c7c89af", - "0xdf7a8624a9d3b9fd3cf65363243b9db1226199e2035cfc9188208f89d7e38cbc", - "0xb986e24702b5a08144261a64a2e189f872edaaed979082d33f31069cbaf82420", - "0x472adb3a051dc3dd82db424786c900dc1d87f3803d0ce6502bc709687114f98a", - "0xdbc480aaba9b60b3b464adf78a4220446775490cabbc5952f1ec57318608a81f", - "0x7b2770dbe042ad96bf6a91855b635e78c5d027f3798424356d3c45c3002cf499", - "0x12459c7ce4a983588e168351f2206843a4b11eddda203fd3a6a2d4580f7d23bd", - "0x9d8b25edb003dc088028133efe714ce235b1f6ee1768cdbd7ff69ada032d4a21", - "0x370c36c4292fe4d437618e4a045c6fb2c6bc22621411f40ebfb82fcfa2f7b9e0", - "0x8145af3796c4964e5a6ff964de8ab23b615112ca280ea7beea97753b6c849280", - "0xefc0bfa3a0c44ef04d36335054a41ede3cc507c759be41a1cfe83b18f5fd129c", - "0xc79e7863bb792590dd0b3c4622a180bf70f767591eacaad48a0af10930332679", - "0xf47931c3a313968e1cd137b5067ad1b90c54bccc2ce16ca01318bacada4b4a31", - "0xd54f767e01c4267be2c0fbe8db9e4d845fda4cb113a3899ada4289480dd5f859", - "0x2cd97e83ebbd33bc8d7d2d39aa9cdcec1ac261bab1702548ede4ebead14c47e8", - "0x80c0d28d0ccf69dca51d263e0a4107c8a554c40dfcb207c1eb2c95a07618a5ac", - "0xe5033b68abcf549b32ca59903c655e12007d96e8dbd53e37d2ee00501d2b7de1", - "0x4ad9f131b26daf8424a72a58ffdb82014eefdcf4ac1473f504777dab84b87535", - "0xaca6f6a0a1f94e265d31be0ec2d6b5f7da27e6df40595b067c71ac65eac50e94", - "0x1d356bf7c11ab24a8b6c51b38b1f822e2deed2c9dc4bba515bfd46e27b20d5ba", - "0xe58b2851229cfd243981f0e3a10a6b1dc7a9df7e2a5afae1f0e61505e960375c", - "0x931c4dacb13e711a8578f02df6df51a381cfb05fa81da5f766638952910a3286", - "0xb199838a7add300d484e03f452a09c7cdb0afb0e7c67e5884367b9c8a674d182", - "0x2110462201aee32e8d9ddb5c9dd9513592ffde32382da1aabf007630ccf77ea1", - "0xf5ac56284d6d4aa75fa67ccfc58a5658d2cae41d01f412cdab962e91276e06a0", - "0x4ec6f73e1245c247ff6868795b7f0b6789f6a9342c8580b7f9a80d34c3959c6b", - "0xcf77dbfe46f7c12dd9f8042e4b86e7c28a519f1a833cc30f4b581418a3440103", - "0xd4ad311394d0d0a06be4bb32f85ee6f5f6b5f2a688b252e4fb89c3dc374b8bd6", - "0x5f998e622a5ecdd34ac52e89cac0e8959e734a4afb850c18b7829a4c1c30fde6", - "0xac150958348194a84cf894631ecca299cc1ba46b92d36222906f1695d45ff127", - "0x029101258e3a0d66780f2ec8a6c74e93f1f574466af72a771bf4452ed4a36f58", - "0x9d986ebbcfae4e31be2aa5fa5c7f2fcd7f0856ca6521a7e397b7a2bbc48d8ba4", - "0xc39c67e7efb378137a47dec994ac018f3b9674a1fd0dcb2c8d39ed41c8655206", - "0x9a416e3dd237f7f9b5c696197f18a53390f52fe2971658f284704167365c9e35", - "0xe9305e739cf066fd8e1468dd25f460db18f33b8ea171c95a9c424c5aa7e3c235", - "0x8832a517ca2deb2a66b5e0681fe0c85c5c1af12aeb94d50b531a264ae1eb9e33", - "0xa9f74c7b27928f1e4b6344889e22939409d07a602619b62903c5776120e0a558", - "0xa10590ec01af9f837be9d6b3ad688acbdbbb3fc8b03bc2cfd9248ba20c6c64ea", - "0x4ed77d7ad8b1ac8fdf1bab5e03a8d8c73687b8a7788b8040a0c1bdce2931f0d4", - "0x406705bbec19171a8d5699522732698255b122a495bb4141e2c11605972495f5", - "0x0847427ddcdae27ed2029ecfc9a0fd27cdd919c5648ae715b8c25f336a3f92d4", - "0x6256806522d5dfd39f9a7fd8a2aef44c73a555c24a3fac6ab1570771e641a05e", - "0xfe1a5fa2b637212e86d593b3d7ae041babad31b866d054e901f2ff33c468e418", - "0x6a9576201f7c85a2c327581f30702e94d2a350caef89c8400d9569aa91951bfe", - "0x5f77b63367a427cc620ca5e3a660b1dde2beb5ca98e56adfd55a4861ae14e1b5", - "0xe31b66b16d8a41d32dc6f422502bdee12bc747d9314b1856b4b4bc9cb3dd9403", - "0x3531698211550e8674966e596c678f8953e58b304ed7811c4fe663b7b9c7cffd", - "0xeb2c5a76791d6ff1c11bf730253658f51daeb00906e394b47aea835c9fdba77b", - "0x86d1ddc92753c1c1f0302a690d2063c6e0dfd2d6862c592274fd7905efa49eec", - "0xfc574ead986bf97b1f8a2f238d88727f3d4a72046c63f83290fb37dba3201b5c", - "0x325936f0be7ea6043238e77bd1bdeabccd759967879908fd627f72727518931e", - "0x20364ae1ea8b9801894ffe225d7d976f80e7362dab1f5a7130d25243b8889eec", - "0x279735ea4729dc90a118266648a2feebce7ca64cb1afa9545e19ea13da0cf83b", - "0x0fa0f631fd043dacfc8d46a5928abeecad3f78364b82e7186c60875837bdbbbd", - "0x4bc7e1074376aa78335f8b4b8f62e9292cace9dae0aed6d26a203a03cddd4109", - "0x775e28757ae6e072cd3b81d85e4de4bc924b69341585ffa644898fd954808aa0", - "0xd08f902819d47dd5b7d2d34273aea34562d7d3e6e696087625a6654055ef655f", - "0x4f11a66edea360f5f27f462a11f93d817cee7a870c9449814f96dbd155cc5bc8", - "0xbc4798ebf06e8de6f41f3266e38eba95c4fb1a26476bb1e33029d8cdb7036a24", - "0x4b1cf02ef289636671481e8364afc84bc79cc1f196c75d59bcd8e6442190e9e3", - "0x08e9a2c505d6975f87dbb3fd680a748bc3a10894a6c05d045d7cead1311daa50", - "0x9c18c613880668be568156190381fc36662369e49e8a436243eaaeeb5caf42b0", - "0xe935bd3ef799f26b7efcb0796fcd6762aa2736b6241a5ddd4de90ff9acb5600a", - "0xa2dac6abd420580dbe113c0c64190f731519f3ad51f37426c377022aeb9ddc44", - "0x3b20edf7281bf115eea7287643f68ddf70b464baa26ab493e906a8b4cc0bd183", - "0x6bba175b959f2af9fe4d89a92e55e259ee7ca98207739ff9e86ddf8f1a90fc75", - "0xcc34030e9d69b6f7813ee9647cde4ab4bd23fb3c4cd76dd1d3b0a9b5b72b124d", - "0xaf28bbd7c9eea390ecf90b0ba6cd7074bbfd202956b80a411a72a29bf1d0a065", - "0x8126d643814b5d013674ead269132aa4b223074afcd406ad0d7ca07d598b3e52", - "0x781de3d23e65f4f7369b07795ad1f1237b53d8f054a2d58aa24eadb7e42ee07d", - "0xd01c2a8c4020ac9faced0d25476622ea82030ffeeb7c69ffeec6004827c70f07", - "0x133d37de851fbbc8f6496519012e4ae17d60e3ac58c8987d4de3142161b8dc6b", - "0xcd21c5e94e1362390688c541be600a53f318a299e7fba155fe032e61a85c87db", - "0x1a03c128b6b6a4348f56ebf4076f5c051ecd22f0c3534216fb02b1bc33a0602c", - "0xbb486632d0c2fb6fab0a17a0b39258695f9a178f5e27e9a72c36df76cc1263d8", - "0xa59bb99d7c0becdc070c02ea453409dda451b5e6c66ca42a081d01607691c68e", - "0x6b8701f8bf6a5bf853cfe765d5d86153cecbbd46c41e6afb81d26d1e79031cfe", - "0x8399c2f547d7abfb99dbc586250134b57e46577f7a2e55e9c7c2618e56239292", - "0xd37d12d8518dc02e8b3cbb5fa0b59f56fe6c0a70805c755ffff6b74edfcae2f4", - "0x765ea9c689e67f4f773e4058a2fea01edf70da6db50064507e684877394aa502", - "0x89675014845e26847ef059d21ea4af749975a7ec3f4a6976e6c6e8c53b0b145c", - "0x2ffd985bbae3b9ff11f8451b8bb19515a449115abdfab09474515d1cdc5ce124", - "0xc6c58abde0a22e572bf6e16180dc968f02dc3afa3d15d0aa8f4215e42f757a62", - "0x37b84f52321c2d4c81efec686237f125b770a2a3c103a684d63ed590e90431b7", - "0x3706bc60b4a99c01097c06f39512247448abdb0d15f5f609220811da018ae17e", - "0x7d2eab2fec674e1c7e370eeb167ecb74029c0a232f1235e845963fc7d3dda954", - "0xd4c6ab4c94c53e5aadfee12542526d55630690ee7e8402a5c992a000950be6fb", - "0x3d0517ea747fc46a1af3e8bd66a5e9c1baec849a3e8d6ec8c0cfe065a42cccf3", - "0xcfd5693a2101852aec988e057da93871f453f758cecdd38b9194652dbd9b9c25", - "0xc097c97e4acc5360de98e4d72af55333c05d154eac3424059e7848d32013e025", - "0x7527429baf457ba3644188a75a109960ae0d845449386ad4aa8e5581cd7b1a41", - "0x061e3b2a4c0cd6490993ea94fd4e7563d362585af12bb3458952b752426886ce", - "0xf9af3398ad3edde0ca7f4603e5851d302f39b617e4aa1eb3568392bf5144bcf4", - "0x7f478c943917b27a3441d42ddce13838efe3926ed6ca87e812be441501b37016", - "0x94f5ebf04e6d04d89dca2643daa02439833b153460d3f33de578047d0f04ff8e", - "0x2e03c81dc609ccbf0e91b6b67b79f3088028b736679de46f51caafbc9dd6a488", - "0xfc6472d85609fbbb6ac8dec4bf069f51d3a96f59f163738e38724aefcb5d9423", - "0xf70cfd8d0721b13b8e75c8aa24e6fa984576b1916fa14edc932fc8f53132d9df", - "0xbf6190304df41dafe26113b37dc45a9812ccfe9ee40a1dfb97bf85e71c5e9829", - "0xa59cffc13207fe46b3c41ff728f3e1fe8172492854208ed6ee34485a4a452638", - "0xa0447569ee667995ccdf4edbe77abbb9e499741b7d084928a2cd4fec010ae3af", - "0x38de793ad609ad9774dc298e1b3050eb022858125e22640ac6f4ba4713004320", - "0xd83b345b4a6cc0ce214d987ba4a39d2f981ee7e54bba697138cb9a2e3f354a31", - "0xc58657f3919410d504d0b3e16cd8baa1a38a2405b490a288eb64635c86038848", - "0xf49b53d2c68f855bbb828109d66cf75952fa16d6d21a6aa8fe04cba4ae54e91a", - "0x98559bbb58decddbfddb8f074e4e681fda52ee5e41d9b230af4ad054c6b05448", - "0x0cda4b71587108b814822df6e4ee65e466716c634c5a080c87bb9c92d0a01304", - "0xb5dc2541610f061f46d81ad092e7222a85bc6d208044b8d57ba2381334901536", - "0x6de7c83368dacd692c865fb42fcca63ade071e98717cb62424bdd256f1368d26", - "0xc553a57130c5877337bbae3150b497fff994a1150494911659c1fca1cc8aabd6", - "0x9fa1899b30b6da8079838aa0b597ed5a48a1182006b28053babafab8ac3b796d", - "0x545d5046aa19ce6f402e93bd77d0c29f9ae58f07856ace50e91e9fdcb15b0bee", - "0x6a8698facdbed4b6659ad745fd4eb434bc129cecaffad99c3f08f4d688b1df02", - "0xeb1269ed5c9a4945c0725be8b986212057a19bf9127c8252949270a3e1996f1a", - "0xf4792b8be1496300e500d7a702b4ae2824c14d5f438604fdfe94388867c7c9c5", - "0x64c6a2e4cea7d4784d12677704549df5bb8b27ebeabe41891781b9a641430848", - "0x45bda137a2426603437ad1e393bfc93855c84c9eb116299640f842ae15beb46a", - "0x77374a47adc133e93d9661b8ce8e672a343cd5a2b2a079034de69211a0ab0893", + "0x5d374a026007c13e901765497b9164d44822902463efdf7b574b10c476ee2ad6", + "0x2762a7fb7c973e888edc457a3808d3882b5c8fc4f6c43a082d823319b126b91a", + "0xe637d86545a9b508b373fdd46cc71682ac4a5dba222d7c9ac01380306cc96cd9", + "0xecdfec41e9859fa217c5467debc9a5fa95290c3273f0ecf282f802983d2ca105", + "0x75f544151f040710f96a2c8cd6da6cd7bb60e461bfc9b4f87d015562d9a55328", + "0x07e609166382b05cd4cfd59764226374af8457a5dc0cea255721e5570cb32844", + "0x08109ccb2b1609d10cd929594ba3a131d59c7aa6eb174cc7bf578670a8198405", + "0x932fb264036b15e8a9704501e4f1ae34a9ac7543c498223c3456f03ebbefe221", + "0x4773aaf55c914947aeefe6c996b961c900bddd82b4e809d47a5f99af22b014ef", + "0x04d0728690604a7ec930782021704bb5d75d16d2c3330f8ab051348c906c52d4", + "0x61d5fc3a8aa4f5e802dcd54a7fceaad89a97c873578b845ad12b34a96540aeb7", + "0xd14bf1505356f83e55d4baffa315e0e9210479dff7486c4164a050c935d5bccf", + "0x6c4e8a1e9484ad717ef42df12a6cb9655216b6a2f7420f52dc540ed952860fdb", + "0x1d2361b3ec4fcb498732048e348fec130f15fb7e05187d8878985681c506b32a", + "0xc3da74a44904c29c9046587cbade10386db5aed500d7ead58335a9757fc64c93", + "0xc8632c7648b32e86023d8b585145bda62e5f8c160a5e6c8c02ec183297d05d2d", + "0xb6a79dcd720a72d2ea5728a8e58885304202535b00861113dce00d07bca7f3ab", + "0xc8b9a208eccabd84320946527cb1df897ec48318c1ca67e5fedc48388152518a", + "0xd5b0feea2d8e474913d280c45c4a6e365ec2bd8ab09982f0b07a7e6e2e433526", + "0xd67fa075f7abde07de71273e227856b43373276f18eb1446d1566cfafe896947", + "0xca96b4905a5854d52f3152dc2f86b1e8ef0891ce82b8a6d0622d4470fa980c03", + "0xd80b94b3d5e72e1cc74b3acbf6bec79bde51d6341f021a1259fe2e3303a919f4", + "0x0e034d76d3593f1f07baf2452e337da912dfc06fd61704e658797eaf5c33222e", + "0x755a7415073e029b231d575f935a10ae657eb30d3aa3edd32fcfc812ba2075b9", + "0x082bebb8c90bc915b6931d6d135ae7016a41b01e6d07151b5d11d2e3cc15868c", + "0x5a550298d163c3a6b1ca91412076781462a6e77825a7a34789e514f566a2ddd2", + "0x7f5523181ea3b7b83577e2de0ff3edf0b7bed050436fd6958274a0a6882a487d", + "0xc63aa388331f5016643dc4744dc47f0b79ac2dc30f2837f36058959de5c6d97b", + "0xa1cdde08be62979fb2d51e3d1447e67ef9a72e7e9ad6c70834b6667ab4b25b2f", + "0xeaf27f121d562cf7d6ba5fe04cb7477c2eae917f6ed0d254c474595334e1e61b", + "0x4d3a2c0aa20291ec2a3e9663676770bb1cb1c33c8caa7308ec9b0e180df42039", + "0x1f13065bd8d6bd0ff04592f8216576eb2ce38d766cf1fd4114392b4e622a7658", + "0x220ce318063ac4496ba1e7946b78fd1574f95518ac920563531b124bbc3ec22d", + "0x6c258638f3e25d325a1f73075a338ce02e57b4fac1b2a810a544d40b24e8b9f9", + "0xa2a5fdce0672a32e04908e9a12a683697057855a33da8ab3cfc5275094f270fe", + "0xfeb465bea0d19e832b87965440a36b3ea1d8bffda29d27ab72bf196f5a3954c0", + "0x20b39aed43810bfc46a279f91e2814ae5a56906f7b7505c499850f2605c82dac", + "0xd75f805748cdf37402c13b685d9dd9884ba1c0b0e3189f9f613a3a9ed223dbc8", + "0x46bb82c63a8a2e29d01360f78d5ee871178847627774756ca6efc614c9710cee", + "0x37a217624ca5724463612bc0a4f0943a3bf8599a05e9d4dc82da20bb0df79867", + "0xca8ec3dfca0e43c79a9a32cdd8a01c161a8fbbed07d6f5b4231dc7b4086d1380", + "0x12f7e01f6efcfb1c56bb3d4bf4358c32df847303c92d4f646996d4c601e1bd2f", + "0x50a0a2e7abaeee10aa9ec6ca0303a019acd2b09279357a480fd37c2c03e177f1", + "0x0c0134f6a1f68649f4777c86668ac2c3d348cd5ee9f71adaf5a783a3852a2e1c", + "0x740fb5ab5762b25c2be2f3590cb0811d74b54dae5e40f52bf1e68c8fe2cb6e92", + "0xa2218d513e2ca93a8acb3652d638af7be7e62711f48e81bf255fff3cfbe3a0dd", + "0x413a7f87acffc04ef34261ae47737ab2f5f461d0af5d57269c5f6cdf78275159", + "0x60d81ea9118a9d8075101f22e09d0646f155f23c2f4b84804f7ffc5afb203a68", + "0x2ff7f513238717f264521c91bc457fb17800beda940eaf6d7e56b1c866b42c06", + "0xda6dc1ae732e7ecbcac5765fc442fcee5a3617b5d575f5103b4fd9f706847c07", + "0xf59ef60c1d9dda81fc22a8e985b6d3e589f512eb8b2518b3511a43908a460294", + "0x81c6e17337cabd304c329a799b02e02245f37ece12a413f5c49282d18b1883cb", + "0x18fb9299e78ffe36bfea65442d790288937a4d1d5b69138525dadaa70dc42367", + "0x9db74bf461bb809717866699fb8b5d6bbe33b5bcc967dec46357331272e20df2", + "0xc59eefbe4041f7dc7fdf2c86c9cfc0f1706993dcee80de6b27f25489cb8e10a9", + "0x38b2207a133bfc3aec210fb386a199efb9087d13330fa0f637bfe37df59c312f", + "0xd35ffbf38934b54a900e35c65c07fc3081993ebf5a55bc67977b73410abc211f", + "0xa13e7a446c7f3ddaa8555c5d3437e8d827303b152a4dbb09ff01bde01a0585b0", + "0x0bb1b3eea492459f2796fb9b3f7022417860f3a5450374220c0c9c3bd2e63512", + "0xd9ebb04da1035f95bf3ed0bd06268f53737001f3f292ac825852875c57a6c4be", + "0xe07cf18aa356d0134f2e0da6f68de7c9f28af854455fbdd38770b44be98a1dc6", + "0x9be4c6c6a3c5622fcd0a1bbe13e21b8612eb39932f05b42972edf2ed184804dc", + "0x9cf9a53f37175b3eba970af4b06a9fa98042e08882b2ed96dd285c0eaaa8e13c", + "0x23f3b4e0dad22684741df92bba387be4e5c05414aca5bf54383e74a4b24b30eb", + "0x4dcfcf6353596c9665fd94b7b9281b65e0a94b45f98ddff681db9ffc5c561602", + "0x460b33043b87067727977ec7daea667bf440f482f0e77ab5a86745832c05d09e", + "0x2fd8ab214c757b69349f10a86d94ccdae0a2c692f3408ea4d65bf5a58c710166", + "0x6627f34e22dec201d70e4304375e60b0703a992610487356a7af6812c4ae89f0", + "0x6a2ac6c7b4f140443ea9190beba68706aa0828055cc0a49c037f6bed4a3b94c9", + "0xbadc35a3b5eb2524ddea54babbc6a7c531f94c845b499e2773f0d82f347976df", + "0x258972ea1dced55b6b95ed07085de981786401d4da790000d7bd8739b0132cd9", + "0x2b70ba122ab93b5b020a3e0ede3e5170d91b2fd8c429c4909b025a68e50a0a2a", + "0xa1f2796fbf29d6cb19d541bb9e2ac1bdb8ecf4f64e9d4068a77b18325d736be8", + "0x297b30d9b997e375d6d560c9670449c4ab9fc9e6cbfcfb094c659d053bd74fae", + "0x4f2058432f7e90bde5ac4661e66dd4ddb4865a31a015b5da7a74f1ed682d4471", + "0x88777368f2847a5a370cb5c6113b25841987168e1d60eff8f5e622b608c073b1", + "0x4b6de4690fed6b924865cf234a94b74f8765c969d821bbddeb4333936c558aa9", + "0x89db01005aa4cd9b60c481763f21dffe39a7ba2da6a4df80e1649fe71952ef70", + "0x888b2ccb261734919308c792c458dcafbaf5ec09b35ff490b77e55304d8f6352", + "0x847e03a9a940c74f151694bed14c82fc53eaaae5e4236e7f0525ab438f5e9d77", + "0x176f3b0b49ee54ec554dc3a4dea00b3d115e48a8c0d5d3c6f328d7da8f6beff7", + "0x009d634f81d6cbefe083d48d0741ab332f238bf496aafca838095e6fde0b541f", + "0xaec2cd6a1cf8954187174f4a62c07b021293cac8b69d1b48cd206ba3244292ba", + "0xc914a43546e51a0d4ab116e8fc86bd639c14b563474c9c247bb406404b6241c3", + "0xdd7f4c16cc0512e308b521c944e11b852d652652656ba5c30589fbbd4454002d", + "0x0329301ecb0cca138d687a07c3fc0e13358d10fb73f7ddac636fe1940d45be8b", + "0x2f569a19dff21bc2674064a636b3f87689f3e0ed0ef69a0d99bbedb5721e154c", + "0x06f42e2ae50574d560a495411ed504d3ca1c34ff5fe9f6f74a4327a9ada801f5", + "0x04db2f50573f591543a42ad27ad89efe7182ff286b6d2c75e8787cdfd67682ad", + "0xcac34907d292c7d1e8e307a3c669e9867977630b6667aa8ed0db0d0cb0e757f8", + "0xe043631e0d3d42dfacb87783a95d9a7fb6d1b4a6b556ad5ffd9724dfec8a05dd", + "0x163bd1073a5e99e886ae0ca8a469a58096e9992f772d8cf03c12897bc759ebf9", + "0xe468530ce156f65bf52574d52c7b55489ae9a4a7bc3df7710e3ef8fd47d72386", + "0xc19059a3d7e5f89c1bd674b798c5ff3860748acd9ccb7d684785358bc5a12d20", + "0x73f819dd32e6679910453dafe4976b5724749fcd18407078e46864a22e47181d", + "0xfe592761d1dc1bd893e0f8fdc548eaa3f5b441fda87ee71826d2d498a19b1f33", + "0x291c84340609f89adc913f236425e23792af8728f6320f5e67f936384e02debc", + "0x48aafb002e34c51e578c57e780ef52676301c44ce359c943238e56188c9be970", + "0xb3790060ee3927e51a8415bf742287ed54fefd32e8e5e0e6e6d8327504f67e3f", + "0x3fb1be8cec3734f7f261eee9bb67e16f89bd5e3836822cb30b79c3661fbbe00e", + "0x32ca794db2e8bb3a6ce2fee48506541397112c3deea2dfe46deeae71ee9f663a", + "0x81dc670fb945eb8c35b00b50f015fd9cef8c4560a855563364d01f2ef4508e14", + "0xbd6556b6d46cca1b2b17a19a3a59c240b0ef3cf48a64dec4d3998c9cc24c1a8e", + "0x90ad6135bfdf67e34c8f73238d31cc0986af1cb489bcfe81fc3eee05d9c29b97", + "0x6e1cb115a90aabc2808bc7322acd7b3c34545f4aa8038f5c6d730da941c2e676", + "0xf3f3af837c7e33b56008a0c04e8ab247210934cb6f3c5067e3a7a37f3e5dafe1", + "0xc9d4ceee42f0ec528c1a63eb9d44098fd23beeedba9604f9e083afb2d505fdef", + "0x17e4dea18b087b93f1215bcfad045ec54713658ebc484fe4e8986a771b0852a9", + "0xfb649abb7e83c2cd08e1e30f0604d06186e3d34901206b1d4c409b26b0510d08", + "0xcf248cf3701057459fc2347f9a9c3dc75332df6cfe002a8befe950ec2aa41b8c", + "0xe355fea96b01d1f58a9ad11787f347ab05da938b8ae8355fb4a4811c1791ddf2", + "0xf41a9728a3c5beb95bd54d48781fc5989608892c59cdf58545787581d7ef86a3", + "0x974a1c129883d3d47d8faaae93cb8a0559b095ec5440f2e876b1ee12588be268", + "0x7902398372de025e2a389ab30720d9219a48e0c843800fe2a117870b8588514e", + "0x3858c51d5edd299685ce0ac9aa398d572eba7a25afe941580e9ff281f3ef4b96", + "0x1a1a0c85194c4ceba80a6266fd6cf9977ace734c0bbe36fdb3f3b14fe185dbfc", + "0xfc0faddbc7dfa5939e91d6759c1a58bc8fb19ee24fb19aa31d05cbf8cada3cf2", + "0x99a9b35bfa30a6546895c6d134041b1564f7d404693619cf94fd6d5087559c2e", + "0x9689c75b7fa465187f1723e96ae4a1092f6f6aa86e187882acced16882682e46", + "0x70c6c50149f0bc6fd7c685bc9fab53dfd3f484a3c9bf206578951684a7e78d22", + "0x1c2b3e1326bc24046d45e3c626ce5e865e9f0f4807f129994558caeccc7e4c40", + "0x41491514a58d6db155b09d99c21e935f60aabdcb0b2bfd0ac3c7a66add88c8dc", + "0x120d2916730adbd56c3a6fd6fd4618af561c81b73952b9f247ebd6fb0d253a01", + "0xc65bb3d2984276ad902ed5d790cdbc5cfb953d5ff01dd0790532b2214dfb2f78", + "0xbdf1cf02af245b580cf20f728fddfa39c6eb5b0ed70e0487c1074fbf28ebc0b0", + "0xcbd578f01e8b5feba2ab69487c979e551c33ce2b73902c63943df9945dd23b9b", + "0xc8c42876c9f093326fd24262be17af1ec0a1030693f7e4a24201c28b3b90d82c", + "0x0b8839b2d0aa101cc2e8887c2d20c83d813559e7800f7ad9ce9af8be697a9a18", + "0xf621df816c070c7f0091dda13b34e6a46a7a86dab6852500351d4f5e2ae9eefe", + "0x8418a842e94ae25f54f427b389cee45d06da8cd3f55e41be9332c56241d48962", + "0xac58a960f5db3cc0570a20f8ca307ef444d9a90f630c7b629e66e4313aad45b3", + "0xf66d09329c4db75279f910ebe6d7a1c643632668a711dfb8069f47cf00d7a57a", + "0xdcacf0e0951030d0f733cbbb46b5f0b3b45840953525b757001ceb74bae9fa4b", + "0x941e10e4fde951acfbc184d76a51823b6ab04214b297e7e52bee236d8f66b8b9", + "0xd1dd9fbed648c9d93f590a91ef9922b6256878a498e61055d8fec739395ce0e9", + "0xe7eae47cd583cab13d7d684adc6e443ef38d83c7d2120171eecf7b0c9168a77b", + "0x08a6ff7d42b3056bc571e9c16607b373d37565a71cac95b9a85bf5788f08ea0d", + "0x3bae2e6ec6af9bbffe37b395df67769b234cdd743bd848764420ff2799ea673c", + "0xaa0b772f59055d8dfbef446352b2d08fbacd97968643a300e03e520c50ffdcbf", + "0xd8d29dfd14ab5068e615662b3580d191663f64cc15557873194d7b2718dc0425", + "0x0561ae8390935eece56ca93e3ea5feaa187e3777418fc19134649726c9519f41", + "0xe3c8dc3145997086caf05a06d4209d10096df09379fce4819f40c13cad005d3e", + "0x02d87b27d2a9e5cb47a71051ef0ef3202e2a86373807753e8603807e43ecf4f5", ], - "transactionsRoot": "0x17429d391ba2a1d033a60a9bdb2899a1c06e25747fcb4c9bc8476c3c72cc357a", + "transactionsRoot": "0xec75fee6c90538b6b5d846f5fd25f550591eaccbb366fc393c4a693f8370d0b4", "uncles": [], "withdrawals": [ { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b7ed9", - "index": "0x2a5128b", - "validatorIndex": "0x4e940", + "amount": "0x11cdffd", + "index": "0x2b3aa2b", + "validatorIndex": "0x36315", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b37eb", - "index": "0x2a5128c", - "validatorIndex": "0x4e941", + "amount": "0x11bee1f", + "index": "0x2b3aa2c", + "validatorIndex": "0x36316", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1c7ee99", - "index": "0x2a5128d", - "validatorIndex": "0x4e942", + "amount": "0x11c8a4c", + "index": "0x2b3aa2d", + "validatorIndex": "0x36317", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aab91", - "index": "0x2a5128e", - "validatorIndex": "0x4e943", + "amount": "0x11bfb57", + "index": "0x2b3aa2e", + "validatorIndex": "0x36318", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a6e72", - "index": "0x2a5128f", - "validatorIndex": "0x4e944", + "amount": "0x11becdc", + "index": "0x2b3aa2f", + "validatorIndex": "0x36319", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b2baf", - "index": "0x2a51290", - "validatorIndex": "0x4e945", + "amount": "0x11c0882", + "index": "0x2b3aa30", + "validatorIndex": "0x3631a", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11bd042", - "index": "0x2a51291", - "validatorIndex": "0x4e946", + "amount": "0x11c12c5", + "index": "0x2b3aa31", + "validatorIndex": "0x3631b", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9593", - "index": "0x2a51292", - "validatorIndex": "0x4e947", + "amount": "0x11caadf", + "index": "0x2b3aa32", + "validatorIndex": "0x3631c", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad611", - "index": "0x2a51293", - "validatorIndex": "0x4e948", + "amount": "0x11c47d5", + "index": "0x2b3aa33", + "validatorIndex": "0x3631d", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b8446", - "index": "0x2a51294", - "validatorIndex": "0x4e949", + "amount": "0x3c9a1eb", + "index": "0x2b3aa34", + "validatorIndex": "0x3631e", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x119349e", - "index": "0x2a51295", - "validatorIndex": "0x4e94a", + "amount": "0x11c1404", + "index": "0x2b3aa35", + "validatorIndex": "0x3631f", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad839", - "index": "0x2a51296", - "validatorIndex": "0x4e94b", + "amount": "0x11c22d9", + "index": "0x2b3aa36", + "validatorIndex": "0x36320", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9715", - "index": "0x2a51297", - "validatorIndex": "0x4e94c", + "amount": "0x11c2dab", + "index": "0x2b3aa37", + "validatorIndex": "0x36321", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b820b", - "index": "0x2a51298", - "validatorIndex": "0x4e94d", + "amount": "0x11bfdf6", + "index": "0x2b3aa38", + "validatorIndex": "0x36322", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aad2b", - "index": "0x2a51299", - "validatorIndex": "0x4e94e", + "amount": "0x11bafb3", + "index": "0x2b3aa39", + "validatorIndex": "0x36323", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b090a", - "index": "0x2a5129a", - "validatorIndex": "0x4e94f", + "amount": "0x11b9154", + "index": "0x2b3aa3a", + "validatorIndex": "0x36324", }, ], - "withdrawalsRoot": "0x158cc8e8a444e3f70658da20714882c73b2c8932eb09b691271da474471d137b", + "withdrawalsRoot": "0x3f196863f2d0d52b020c33d1ac2fb588f257ac153baa09fbee2cc1cce42fadef", }, } `) @@ -583,270 +586,273 @@ describe('requestAsync', () => { { "jsonrpc": "2.0", "result": { - "baseFeePerGas": "0x12f449559", - "blobGasUsed": "0x20000", + "baseFeePerGas": "0x20a0d339a", + "blobGasUsed": "0x0", "difficulty": "0x0", - "excessBlobGas": "0x60000", + "excessBlobGas": "0x0", "extraData": "0x6265617665726275696c642e6f7267", "gasLimit": "0x1c9c380", - "gasUsed": "0xe68b5f", - "hash": "0x33a7971472539aa0ffab0ee330347acd56ca7d2682bfbc80872110ee15e7d8f7", - "logsBloom": "0x80a715cbad9a534e26a01218c885fc2384c7418ebb08610ce30b692726685230a8d1d4be7c512b1963d50bc3fa9b310512532f52ba86229ee000e6a941fab0a45026e41f4f8a4baa2993f06d4ce308fe84b4026b0b4f8cd4d6445240806750615ed8433dae4e24e01d4183978821ac9f00123297008a2648f269c41f7c98d1059a63ba6aa345d42410d70250213a65761258b78143d4709c100282df6a523a79bec1036e5814f9583cdb81c519d7b70016976e8ae1c98346091840262b154741d999907beade05423823ff7a09cd783c06cd621795d85112bf7ffc0620a1a0da5854e4897c2014ea02f596915c43902c9ca0532193797747712152267d0057cc", + "gasUsed": "0xd05f46", + "hash": "0x0c3e51fc62e1dd7401c8884882755b72e1c5720d0b01c75443cdfa8a129d3fc9", + "logsBloom": "0xd123054441c15c9d30998061c8899fbdb40be9b00b9c9b73202d015aef6a92b80e6a1520ca498004de50db02f992518322199054de076a903019e47aa1a8b018a046a6c95d2d39a92c06e33ea9a225aa80c5408964c57f5fe083d5dc8a7051e5e92f4844e244023e90cc74c040236e49c31b9aa023596ec5aa1c0e1458593c036dbe9f7cbaa69538a2ed205c0ae2145e441b1319eb6946a9d82da46e6e9c0ca85f9688c6fa946b844bbdd4cc3f225ce09641d62220214a7cb9744c66340c807013f0315212455a000620a3b27359c8c13e1000130da23e141107d28a4900e1909470a80b03d746114b1596d3a4430b68b4ff3e219bac38d8dfa1680ae4005d4d", "miner": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5", - "mixHash": "0x0403c5067873bff3108703e127c63a2882509ee91006d921e2955c2420470958", + "mixHash": "0x7702b2acc3443bd74c0b3ff142414f9d51e4caa0f111d57d319f4d46e21dedf7", "nonce": "0x0000000000000000", - "number": "0x12e3ffa", - "parentBeaconBlockRoot": "0xed1c13ebb84bf75b852cb3e703f8a7d7c8465a039ce058e2390ece725a54ca47", - "parentHash": "0x72e938fa6ab225be2ce940db9aea7d670b50b3320b8deaeea1084ab645a1db81", - "receiptsRoot": "0x649c9570fc198f14fa93c9b3fb0d7bda1f75a2a05761ffd832768841fc274aca", + "number": "0x12f2974", + "parentBeaconBlockRoot": "0xd472790dc1fd2d1b1cc9e208706266196f261e4c1a74f535d86981670c0d5f99", + "parentHash": "0xa93b995575bda48d4cf45a4f72593a48a744786b5e32e5ff92a21372f7a60875", + "receiptsRoot": "0xe2822bc9663118439077ad806cd7a2a1a75bf1d70bf61d901199cf599c46f9d7", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x132bb", - "stateRoot": "0xb821f1259927e7c699f2b06cd550d45e8cb322c06256f17ba36caaec33ae865e", - "timestamp": "0x6638490b", + "size": "0xdad8", + "stateRoot": "0x115fd5eac921e6728825958b2b87da8aaf17edc0085164f11de798f6ed00abbd", + "timestamp": "0x66434e43", "totalDifficulty": "0xc70d815d562d3cfa955", "transactions": [ - "0x12860ead0532b3a4f4aa5f8187d7d0365f6ae93764c8771ac13c6d38560033d6", - "0xed513dcfd2a4f635bfaa476c78919cdd116090513e73ae6b369fa2012ee5a9b0", - "0xc72e7c15c972b5e4e2ccde950691426dd5a725cb63fa2e9784df0f98bc4c1751", - "0x258c636c6d237e14c081c57e7e49043cbc1c81dc7d0b9628ff2c7c6b9a3ffca8", - "0x0800e07eafdb3c33bacd4511503110953d231342a7c29c88c3706b70210d3079", - "0x7fb43c8bba50ffaa4e5b679e0bb55213d55def53e86524b50cd929d69d25a11a", - "0xce5ae725bcf217588fea1f50a5e90b73be01be20a0c280a74992365b84a0e1dc", - "0x39014032f86eb1c043ecf794e04b2a03127a41a1a65b3ab232705a7bf7ccd3d8", - "0x54c8ed510339118a344942a487b46d8627c8627f35cd24efd924e5d39a0bbbaf", - "0x10fe93d2263dd06a9ebf720b2987f07032fe3c4371c8f0c47f92969e19d638b1", - "0x9126f9bc92a2abcd95c35916d45258490d9743a536fa98b7da0f6bd878aa40c3", - "0xaf7690eb86ab1e3e0622454477b7048081ad555d398ec7d3ee7ea80e7b7136a5", - "0x2812d7e89b861cb2b6654ae85728bf046ea1b651d558f984e22df08357958d46", - "0x0351d36488fb798fd81d65de7adbaed0b3de372ecb1dcfb7722281d4595b27dc", - "0xc5fa349a9fe36be632e9ee0da47cd1f585cee05027ac7d241a12ca7e59ac01c5", - "0x9a2e22ac7b57614bc59d69f0cf6d8cd664e625a39b4bd3518fe02174fb36b53e", - "0x40b80ab435c5d21ac7a8607cd19dd90bae1abfdd45727726a0027c0a6d0f0f40", - "0x3caf97e1c0d81062c8047bdbac7c427e0c2b4a0bc6f860cc3892ec884444b9b0", - "0x350bcf3893818beae014118a42a6666559d7ff21ee9824b88a287f0efd734627", - "0x7588537e4c3f06d40e4efc1a495dbfbe042b6064b81104de82f5ef0987b64cdf", - "0xbc20d73ee056c066705c7cbe3fea6eb1b7caea7b56ca53fc3298396f1fb70d57", - "0x2f08911326a2c5c60a7f86ef99084d5b73d2393dfe00622f627459bcdbd62e10", - "0xfb6055df069e04ae38c2d553f891d3ee6ab9eadec01d5fd8bf0c8b477c7c89af", - "0xdf7a8624a9d3b9fd3cf65363243b9db1226199e2035cfc9188208f89d7e38cbc", - "0xb986e24702b5a08144261a64a2e189f872edaaed979082d33f31069cbaf82420", - "0x472adb3a051dc3dd82db424786c900dc1d87f3803d0ce6502bc709687114f98a", - "0xdbc480aaba9b60b3b464adf78a4220446775490cabbc5952f1ec57318608a81f", - "0x7b2770dbe042ad96bf6a91855b635e78c5d027f3798424356d3c45c3002cf499", - "0x12459c7ce4a983588e168351f2206843a4b11eddda203fd3a6a2d4580f7d23bd", - "0x9d8b25edb003dc088028133efe714ce235b1f6ee1768cdbd7ff69ada032d4a21", - "0x370c36c4292fe4d437618e4a045c6fb2c6bc22621411f40ebfb82fcfa2f7b9e0", - "0x8145af3796c4964e5a6ff964de8ab23b615112ca280ea7beea97753b6c849280", - "0xefc0bfa3a0c44ef04d36335054a41ede3cc507c759be41a1cfe83b18f5fd129c", - "0xc79e7863bb792590dd0b3c4622a180bf70f767591eacaad48a0af10930332679", - "0xf47931c3a313968e1cd137b5067ad1b90c54bccc2ce16ca01318bacada4b4a31", - "0xd54f767e01c4267be2c0fbe8db9e4d845fda4cb113a3899ada4289480dd5f859", - "0x2cd97e83ebbd33bc8d7d2d39aa9cdcec1ac261bab1702548ede4ebead14c47e8", - "0x80c0d28d0ccf69dca51d263e0a4107c8a554c40dfcb207c1eb2c95a07618a5ac", - "0xe5033b68abcf549b32ca59903c655e12007d96e8dbd53e37d2ee00501d2b7de1", - "0x4ad9f131b26daf8424a72a58ffdb82014eefdcf4ac1473f504777dab84b87535", - "0xaca6f6a0a1f94e265d31be0ec2d6b5f7da27e6df40595b067c71ac65eac50e94", - "0x1d356bf7c11ab24a8b6c51b38b1f822e2deed2c9dc4bba515bfd46e27b20d5ba", - "0xe58b2851229cfd243981f0e3a10a6b1dc7a9df7e2a5afae1f0e61505e960375c", - "0x931c4dacb13e711a8578f02df6df51a381cfb05fa81da5f766638952910a3286", - "0xb199838a7add300d484e03f452a09c7cdb0afb0e7c67e5884367b9c8a674d182", - "0x2110462201aee32e8d9ddb5c9dd9513592ffde32382da1aabf007630ccf77ea1", - "0xf5ac56284d6d4aa75fa67ccfc58a5658d2cae41d01f412cdab962e91276e06a0", - "0x4ec6f73e1245c247ff6868795b7f0b6789f6a9342c8580b7f9a80d34c3959c6b", - "0xcf77dbfe46f7c12dd9f8042e4b86e7c28a519f1a833cc30f4b581418a3440103", - "0xd4ad311394d0d0a06be4bb32f85ee6f5f6b5f2a688b252e4fb89c3dc374b8bd6", - "0x5f998e622a5ecdd34ac52e89cac0e8959e734a4afb850c18b7829a4c1c30fde6", - "0xac150958348194a84cf894631ecca299cc1ba46b92d36222906f1695d45ff127", - "0x029101258e3a0d66780f2ec8a6c74e93f1f574466af72a771bf4452ed4a36f58", - "0x9d986ebbcfae4e31be2aa5fa5c7f2fcd7f0856ca6521a7e397b7a2bbc48d8ba4", - "0xc39c67e7efb378137a47dec994ac018f3b9674a1fd0dcb2c8d39ed41c8655206", - "0x9a416e3dd237f7f9b5c696197f18a53390f52fe2971658f284704167365c9e35", - "0xe9305e739cf066fd8e1468dd25f460db18f33b8ea171c95a9c424c5aa7e3c235", - "0x8832a517ca2deb2a66b5e0681fe0c85c5c1af12aeb94d50b531a264ae1eb9e33", - "0xa9f74c7b27928f1e4b6344889e22939409d07a602619b62903c5776120e0a558", - "0xa10590ec01af9f837be9d6b3ad688acbdbbb3fc8b03bc2cfd9248ba20c6c64ea", - "0x4ed77d7ad8b1ac8fdf1bab5e03a8d8c73687b8a7788b8040a0c1bdce2931f0d4", - "0x406705bbec19171a8d5699522732698255b122a495bb4141e2c11605972495f5", - "0x0847427ddcdae27ed2029ecfc9a0fd27cdd919c5648ae715b8c25f336a3f92d4", - "0x6256806522d5dfd39f9a7fd8a2aef44c73a555c24a3fac6ab1570771e641a05e", - "0xfe1a5fa2b637212e86d593b3d7ae041babad31b866d054e901f2ff33c468e418", - "0x6a9576201f7c85a2c327581f30702e94d2a350caef89c8400d9569aa91951bfe", - "0x5f77b63367a427cc620ca5e3a660b1dde2beb5ca98e56adfd55a4861ae14e1b5", - "0xe31b66b16d8a41d32dc6f422502bdee12bc747d9314b1856b4b4bc9cb3dd9403", - "0x3531698211550e8674966e596c678f8953e58b304ed7811c4fe663b7b9c7cffd", - "0xeb2c5a76791d6ff1c11bf730253658f51daeb00906e394b47aea835c9fdba77b", - "0x86d1ddc92753c1c1f0302a690d2063c6e0dfd2d6862c592274fd7905efa49eec", - "0xfc574ead986bf97b1f8a2f238d88727f3d4a72046c63f83290fb37dba3201b5c", - "0x325936f0be7ea6043238e77bd1bdeabccd759967879908fd627f72727518931e", - "0x20364ae1ea8b9801894ffe225d7d976f80e7362dab1f5a7130d25243b8889eec", - "0x279735ea4729dc90a118266648a2feebce7ca64cb1afa9545e19ea13da0cf83b", - "0x0fa0f631fd043dacfc8d46a5928abeecad3f78364b82e7186c60875837bdbbbd", - "0x4bc7e1074376aa78335f8b4b8f62e9292cace9dae0aed6d26a203a03cddd4109", - "0x775e28757ae6e072cd3b81d85e4de4bc924b69341585ffa644898fd954808aa0", - "0xd08f902819d47dd5b7d2d34273aea34562d7d3e6e696087625a6654055ef655f", - "0x4f11a66edea360f5f27f462a11f93d817cee7a870c9449814f96dbd155cc5bc8", - "0xbc4798ebf06e8de6f41f3266e38eba95c4fb1a26476bb1e33029d8cdb7036a24", - "0x4b1cf02ef289636671481e8364afc84bc79cc1f196c75d59bcd8e6442190e9e3", - "0x08e9a2c505d6975f87dbb3fd680a748bc3a10894a6c05d045d7cead1311daa50", - "0x9c18c613880668be568156190381fc36662369e49e8a436243eaaeeb5caf42b0", - "0xe935bd3ef799f26b7efcb0796fcd6762aa2736b6241a5ddd4de90ff9acb5600a", - "0xa2dac6abd420580dbe113c0c64190f731519f3ad51f37426c377022aeb9ddc44", - "0x3b20edf7281bf115eea7287643f68ddf70b464baa26ab493e906a8b4cc0bd183", - "0x6bba175b959f2af9fe4d89a92e55e259ee7ca98207739ff9e86ddf8f1a90fc75", - "0xcc34030e9d69b6f7813ee9647cde4ab4bd23fb3c4cd76dd1d3b0a9b5b72b124d", - "0xaf28bbd7c9eea390ecf90b0ba6cd7074bbfd202956b80a411a72a29bf1d0a065", - "0x8126d643814b5d013674ead269132aa4b223074afcd406ad0d7ca07d598b3e52", - "0x781de3d23e65f4f7369b07795ad1f1237b53d8f054a2d58aa24eadb7e42ee07d", - "0xd01c2a8c4020ac9faced0d25476622ea82030ffeeb7c69ffeec6004827c70f07", - "0x133d37de851fbbc8f6496519012e4ae17d60e3ac58c8987d4de3142161b8dc6b", - "0xcd21c5e94e1362390688c541be600a53f318a299e7fba155fe032e61a85c87db", - "0x1a03c128b6b6a4348f56ebf4076f5c051ecd22f0c3534216fb02b1bc33a0602c", - "0xbb486632d0c2fb6fab0a17a0b39258695f9a178f5e27e9a72c36df76cc1263d8", - "0xa59bb99d7c0becdc070c02ea453409dda451b5e6c66ca42a081d01607691c68e", - "0x6b8701f8bf6a5bf853cfe765d5d86153cecbbd46c41e6afb81d26d1e79031cfe", - "0x8399c2f547d7abfb99dbc586250134b57e46577f7a2e55e9c7c2618e56239292", - "0xd37d12d8518dc02e8b3cbb5fa0b59f56fe6c0a70805c755ffff6b74edfcae2f4", - "0x765ea9c689e67f4f773e4058a2fea01edf70da6db50064507e684877394aa502", - "0x89675014845e26847ef059d21ea4af749975a7ec3f4a6976e6c6e8c53b0b145c", - "0x2ffd985bbae3b9ff11f8451b8bb19515a449115abdfab09474515d1cdc5ce124", - "0xc6c58abde0a22e572bf6e16180dc968f02dc3afa3d15d0aa8f4215e42f757a62", - "0x37b84f52321c2d4c81efec686237f125b770a2a3c103a684d63ed590e90431b7", - "0x3706bc60b4a99c01097c06f39512247448abdb0d15f5f609220811da018ae17e", - "0x7d2eab2fec674e1c7e370eeb167ecb74029c0a232f1235e845963fc7d3dda954", - "0xd4c6ab4c94c53e5aadfee12542526d55630690ee7e8402a5c992a000950be6fb", - "0x3d0517ea747fc46a1af3e8bd66a5e9c1baec849a3e8d6ec8c0cfe065a42cccf3", - "0xcfd5693a2101852aec988e057da93871f453f758cecdd38b9194652dbd9b9c25", - "0xc097c97e4acc5360de98e4d72af55333c05d154eac3424059e7848d32013e025", - "0x7527429baf457ba3644188a75a109960ae0d845449386ad4aa8e5581cd7b1a41", - "0x061e3b2a4c0cd6490993ea94fd4e7563d362585af12bb3458952b752426886ce", - "0xf9af3398ad3edde0ca7f4603e5851d302f39b617e4aa1eb3568392bf5144bcf4", - "0x7f478c943917b27a3441d42ddce13838efe3926ed6ca87e812be441501b37016", - "0x94f5ebf04e6d04d89dca2643daa02439833b153460d3f33de578047d0f04ff8e", - "0x2e03c81dc609ccbf0e91b6b67b79f3088028b736679de46f51caafbc9dd6a488", - "0xfc6472d85609fbbb6ac8dec4bf069f51d3a96f59f163738e38724aefcb5d9423", - "0xf70cfd8d0721b13b8e75c8aa24e6fa984576b1916fa14edc932fc8f53132d9df", - "0xbf6190304df41dafe26113b37dc45a9812ccfe9ee40a1dfb97bf85e71c5e9829", - "0xa59cffc13207fe46b3c41ff728f3e1fe8172492854208ed6ee34485a4a452638", - "0xa0447569ee667995ccdf4edbe77abbb9e499741b7d084928a2cd4fec010ae3af", - "0x38de793ad609ad9774dc298e1b3050eb022858125e22640ac6f4ba4713004320", - "0xd83b345b4a6cc0ce214d987ba4a39d2f981ee7e54bba697138cb9a2e3f354a31", - "0xc58657f3919410d504d0b3e16cd8baa1a38a2405b490a288eb64635c86038848", - "0xf49b53d2c68f855bbb828109d66cf75952fa16d6d21a6aa8fe04cba4ae54e91a", - "0x98559bbb58decddbfddb8f074e4e681fda52ee5e41d9b230af4ad054c6b05448", - "0x0cda4b71587108b814822df6e4ee65e466716c634c5a080c87bb9c92d0a01304", - "0xb5dc2541610f061f46d81ad092e7222a85bc6d208044b8d57ba2381334901536", - "0x6de7c83368dacd692c865fb42fcca63ade071e98717cb62424bdd256f1368d26", - "0xc553a57130c5877337bbae3150b497fff994a1150494911659c1fca1cc8aabd6", - "0x9fa1899b30b6da8079838aa0b597ed5a48a1182006b28053babafab8ac3b796d", - "0x545d5046aa19ce6f402e93bd77d0c29f9ae58f07856ace50e91e9fdcb15b0bee", - "0x6a8698facdbed4b6659ad745fd4eb434bc129cecaffad99c3f08f4d688b1df02", - "0xeb1269ed5c9a4945c0725be8b986212057a19bf9127c8252949270a3e1996f1a", - "0xf4792b8be1496300e500d7a702b4ae2824c14d5f438604fdfe94388867c7c9c5", - "0x64c6a2e4cea7d4784d12677704549df5bb8b27ebeabe41891781b9a641430848", - "0x45bda137a2426603437ad1e393bfc93855c84c9eb116299640f842ae15beb46a", - "0x77374a47adc133e93d9661b8ce8e672a343cd5a2b2a079034de69211a0ab0893", + "0x5d374a026007c13e901765497b9164d44822902463efdf7b574b10c476ee2ad6", + "0x2762a7fb7c973e888edc457a3808d3882b5c8fc4f6c43a082d823319b126b91a", + "0xe637d86545a9b508b373fdd46cc71682ac4a5dba222d7c9ac01380306cc96cd9", + "0xecdfec41e9859fa217c5467debc9a5fa95290c3273f0ecf282f802983d2ca105", + "0x75f544151f040710f96a2c8cd6da6cd7bb60e461bfc9b4f87d015562d9a55328", + "0x07e609166382b05cd4cfd59764226374af8457a5dc0cea255721e5570cb32844", + "0x08109ccb2b1609d10cd929594ba3a131d59c7aa6eb174cc7bf578670a8198405", + "0x932fb264036b15e8a9704501e4f1ae34a9ac7543c498223c3456f03ebbefe221", + "0x4773aaf55c914947aeefe6c996b961c900bddd82b4e809d47a5f99af22b014ef", + "0x04d0728690604a7ec930782021704bb5d75d16d2c3330f8ab051348c906c52d4", + "0x61d5fc3a8aa4f5e802dcd54a7fceaad89a97c873578b845ad12b34a96540aeb7", + "0xd14bf1505356f83e55d4baffa315e0e9210479dff7486c4164a050c935d5bccf", + "0x6c4e8a1e9484ad717ef42df12a6cb9655216b6a2f7420f52dc540ed952860fdb", + "0x1d2361b3ec4fcb498732048e348fec130f15fb7e05187d8878985681c506b32a", + "0xc3da74a44904c29c9046587cbade10386db5aed500d7ead58335a9757fc64c93", + "0xc8632c7648b32e86023d8b585145bda62e5f8c160a5e6c8c02ec183297d05d2d", + "0xb6a79dcd720a72d2ea5728a8e58885304202535b00861113dce00d07bca7f3ab", + "0xc8b9a208eccabd84320946527cb1df897ec48318c1ca67e5fedc48388152518a", + "0xd5b0feea2d8e474913d280c45c4a6e365ec2bd8ab09982f0b07a7e6e2e433526", + "0xd67fa075f7abde07de71273e227856b43373276f18eb1446d1566cfafe896947", + "0xca96b4905a5854d52f3152dc2f86b1e8ef0891ce82b8a6d0622d4470fa980c03", + "0xd80b94b3d5e72e1cc74b3acbf6bec79bde51d6341f021a1259fe2e3303a919f4", + "0x0e034d76d3593f1f07baf2452e337da912dfc06fd61704e658797eaf5c33222e", + "0x755a7415073e029b231d575f935a10ae657eb30d3aa3edd32fcfc812ba2075b9", + "0x082bebb8c90bc915b6931d6d135ae7016a41b01e6d07151b5d11d2e3cc15868c", + "0x5a550298d163c3a6b1ca91412076781462a6e77825a7a34789e514f566a2ddd2", + "0x7f5523181ea3b7b83577e2de0ff3edf0b7bed050436fd6958274a0a6882a487d", + "0xc63aa388331f5016643dc4744dc47f0b79ac2dc30f2837f36058959de5c6d97b", + "0xa1cdde08be62979fb2d51e3d1447e67ef9a72e7e9ad6c70834b6667ab4b25b2f", + "0xeaf27f121d562cf7d6ba5fe04cb7477c2eae917f6ed0d254c474595334e1e61b", + "0x4d3a2c0aa20291ec2a3e9663676770bb1cb1c33c8caa7308ec9b0e180df42039", + "0x1f13065bd8d6bd0ff04592f8216576eb2ce38d766cf1fd4114392b4e622a7658", + "0x220ce318063ac4496ba1e7946b78fd1574f95518ac920563531b124bbc3ec22d", + "0x6c258638f3e25d325a1f73075a338ce02e57b4fac1b2a810a544d40b24e8b9f9", + "0xa2a5fdce0672a32e04908e9a12a683697057855a33da8ab3cfc5275094f270fe", + "0xfeb465bea0d19e832b87965440a36b3ea1d8bffda29d27ab72bf196f5a3954c0", + "0x20b39aed43810bfc46a279f91e2814ae5a56906f7b7505c499850f2605c82dac", + "0xd75f805748cdf37402c13b685d9dd9884ba1c0b0e3189f9f613a3a9ed223dbc8", + "0x46bb82c63a8a2e29d01360f78d5ee871178847627774756ca6efc614c9710cee", + "0x37a217624ca5724463612bc0a4f0943a3bf8599a05e9d4dc82da20bb0df79867", + "0xca8ec3dfca0e43c79a9a32cdd8a01c161a8fbbed07d6f5b4231dc7b4086d1380", + "0x12f7e01f6efcfb1c56bb3d4bf4358c32df847303c92d4f646996d4c601e1bd2f", + "0x50a0a2e7abaeee10aa9ec6ca0303a019acd2b09279357a480fd37c2c03e177f1", + "0x0c0134f6a1f68649f4777c86668ac2c3d348cd5ee9f71adaf5a783a3852a2e1c", + "0x740fb5ab5762b25c2be2f3590cb0811d74b54dae5e40f52bf1e68c8fe2cb6e92", + "0xa2218d513e2ca93a8acb3652d638af7be7e62711f48e81bf255fff3cfbe3a0dd", + "0x413a7f87acffc04ef34261ae47737ab2f5f461d0af5d57269c5f6cdf78275159", + "0x60d81ea9118a9d8075101f22e09d0646f155f23c2f4b84804f7ffc5afb203a68", + "0x2ff7f513238717f264521c91bc457fb17800beda940eaf6d7e56b1c866b42c06", + "0xda6dc1ae732e7ecbcac5765fc442fcee5a3617b5d575f5103b4fd9f706847c07", + "0xf59ef60c1d9dda81fc22a8e985b6d3e589f512eb8b2518b3511a43908a460294", + "0x81c6e17337cabd304c329a799b02e02245f37ece12a413f5c49282d18b1883cb", + "0x18fb9299e78ffe36bfea65442d790288937a4d1d5b69138525dadaa70dc42367", + "0x9db74bf461bb809717866699fb8b5d6bbe33b5bcc967dec46357331272e20df2", + "0xc59eefbe4041f7dc7fdf2c86c9cfc0f1706993dcee80de6b27f25489cb8e10a9", + "0x38b2207a133bfc3aec210fb386a199efb9087d13330fa0f637bfe37df59c312f", + "0xd35ffbf38934b54a900e35c65c07fc3081993ebf5a55bc67977b73410abc211f", + "0xa13e7a446c7f3ddaa8555c5d3437e8d827303b152a4dbb09ff01bde01a0585b0", + "0x0bb1b3eea492459f2796fb9b3f7022417860f3a5450374220c0c9c3bd2e63512", + "0xd9ebb04da1035f95bf3ed0bd06268f53737001f3f292ac825852875c57a6c4be", + "0xe07cf18aa356d0134f2e0da6f68de7c9f28af854455fbdd38770b44be98a1dc6", + "0x9be4c6c6a3c5622fcd0a1bbe13e21b8612eb39932f05b42972edf2ed184804dc", + "0x9cf9a53f37175b3eba970af4b06a9fa98042e08882b2ed96dd285c0eaaa8e13c", + "0x23f3b4e0dad22684741df92bba387be4e5c05414aca5bf54383e74a4b24b30eb", + "0x4dcfcf6353596c9665fd94b7b9281b65e0a94b45f98ddff681db9ffc5c561602", + "0x460b33043b87067727977ec7daea667bf440f482f0e77ab5a86745832c05d09e", + "0x2fd8ab214c757b69349f10a86d94ccdae0a2c692f3408ea4d65bf5a58c710166", + "0x6627f34e22dec201d70e4304375e60b0703a992610487356a7af6812c4ae89f0", + "0x6a2ac6c7b4f140443ea9190beba68706aa0828055cc0a49c037f6bed4a3b94c9", + "0xbadc35a3b5eb2524ddea54babbc6a7c531f94c845b499e2773f0d82f347976df", + "0x258972ea1dced55b6b95ed07085de981786401d4da790000d7bd8739b0132cd9", + "0x2b70ba122ab93b5b020a3e0ede3e5170d91b2fd8c429c4909b025a68e50a0a2a", + "0xa1f2796fbf29d6cb19d541bb9e2ac1bdb8ecf4f64e9d4068a77b18325d736be8", + "0x297b30d9b997e375d6d560c9670449c4ab9fc9e6cbfcfb094c659d053bd74fae", + "0x4f2058432f7e90bde5ac4661e66dd4ddb4865a31a015b5da7a74f1ed682d4471", + "0x88777368f2847a5a370cb5c6113b25841987168e1d60eff8f5e622b608c073b1", + "0x4b6de4690fed6b924865cf234a94b74f8765c969d821bbddeb4333936c558aa9", + "0x89db01005aa4cd9b60c481763f21dffe39a7ba2da6a4df80e1649fe71952ef70", + "0x888b2ccb261734919308c792c458dcafbaf5ec09b35ff490b77e55304d8f6352", + "0x847e03a9a940c74f151694bed14c82fc53eaaae5e4236e7f0525ab438f5e9d77", + "0x176f3b0b49ee54ec554dc3a4dea00b3d115e48a8c0d5d3c6f328d7da8f6beff7", + "0x009d634f81d6cbefe083d48d0741ab332f238bf496aafca838095e6fde0b541f", + "0xaec2cd6a1cf8954187174f4a62c07b021293cac8b69d1b48cd206ba3244292ba", + "0xc914a43546e51a0d4ab116e8fc86bd639c14b563474c9c247bb406404b6241c3", + "0xdd7f4c16cc0512e308b521c944e11b852d652652656ba5c30589fbbd4454002d", + "0x0329301ecb0cca138d687a07c3fc0e13358d10fb73f7ddac636fe1940d45be8b", + "0x2f569a19dff21bc2674064a636b3f87689f3e0ed0ef69a0d99bbedb5721e154c", + "0x06f42e2ae50574d560a495411ed504d3ca1c34ff5fe9f6f74a4327a9ada801f5", + "0x04db2f50573f591543a42ad27ad89efe7182ff286b6d2c75e8787cdfd67682ad", + "0xcac34907d292c7d1e8e307a3c669e9867977630b6667aa8ed0db0d0cb0e757f8", + "0xe043631e0d3d42dfacb87783a95d9a7fb6d1b4a6b556ad5ffd9724dfec8a05dd", + "0x163bd1073a5e99e886ae0ca8a469a58096e9992f772d8cf03c12897bc759ebf9", + "0xe468530ce156f65bf52574d52c7b55489ae9a4a7bc3df7710e3ef8fd47d72386", + "0xc19059a3d7e5f89c1bd674b798c5ff3860748acd9ccb7d684785358bc5a12d20", + "0x73f819dd32e6679910453dafe4976b5724749fcd18407078e46864a22e47181d", + "0xfe592761d1dc1bd893e0f8fdc548eaa3f5b441fda87ee71826d2d498a19b1f33", + "0x291c84340609f89adc913f236425e23792af8728f6320f5e67f936384e02debc", + "0x48aafb002e34c51e578c57e780ef52676301c44ce359c943238e56188c9be970", + "0xb3790060ee3927e51a8415bf742287ed54fefd32e8e5e0e6e6d8327504f67e3f", + "0x3fb1be8cec3734f7f261eee9bb67e16f89bd5e3836822cb30b79c3661fbbe00e", + "0x32ca794db2e8bb3a6ce2fee48506541397112c3deea2dfe46deeae71ee9f663a", + "0x81dc670fb945eb8c35b00b50f015fd9cef8c4560a855563364d01f2ef4508e14", + "0xbd6556b6d46cca1b2b17a19a3a59c240b0ef3cf48a64dec4d3998c9cc24c1a8e", + "0x90ad6135bfdf67e34c8f73238d31cc0986af1cb489bcfe81fc3eee05d9c29b97", + "0x6e1cb115a90aabc2808bc7322acd7b3c34545f4aa8038f5c6d730da941c2e676", + "0xf3f3af837c7e33b56008a0c04e8ab247210934cb6f3c5067e3a7a37f3e5dafe1", + "0xc9d4ceee42f0ec528c1a63eb9d44098fd23beeedba9604f9e083afb2d505fdef", + "0x17e4dea18b087b93f1215bcfad045ec54713658ebc484fe4e8986a771b0852a9", + "0xfb649abb7e83c2cd08e1e30f0604d06186e3d34901206b1d4c409b26b0510d08", + "0xcf248cf3701057459fc2347f9a9c3dc75332df6cfe002a8befe950ec2aa41b8c", + "0xe355fea96b01d1f58a9ad11787f347ab05da938b8ae8355fb4a4811c1791ddf2", + "0xf41a9728a3c5beb95bd54d48781fc5989608892c59cdf58545787581d7ef86a3", + "0x974a1c129883d3d47d8faaae93cb8a0559b095ec5440f2e876b1ee12588be268", + "0x7902398372de025e2a389ab30720d9219a48e0c843800fe2a117870b8588514e", + "0x3858c51d5edd299685ce0ac9aa398d572eba7a25afe941580e9ff281f3ef4b96", + "0x1a1a0c85194c4ceba80a6266fd6cf9977ace734c0bbe36fdb3f3b14fe185dbfc", + "0xfc0faddbc7dfa5939e91d6759c1a58bc8fb19ee24fb19aa31d05cbf8cada3cf2", + "0x99a9b35bfa30a6546895c6d134041b1564f7d404693619cf94fd6d5087559c2e", + "0x9689c75b7fa465187f1723e96ae4a1092f6f6aa86e187882acced16882682e46", + "0x70c6c50149f0bc6fd7c685bc9fab53dfd3f484a3c9bf206578951684a7e78d22", + "0x1c2b3e1326bc24046d45e3c626ce5e865e9f0f4807f129994558caeccc7e4c40", + "0x41491514a58d6db155b09d99c21e935f60aabdcb0b2bfd0ac3c7a66add88c8dc", + "0x120d2916730adbd56c3a6fd6fd4618af561c81b73952b9f247ebd6fb0d253a01", + "0xc65bb3d2984276ad902ed5d790cdbc5cfb953d5ff01dd0790532b2214dfb2f78", + "0xbdf1cf02af245b580cf20f728fddfa39c6eb5b0ed70e0487c1074fbf28ebc0b0", + "0xcbd578f01e8b5feba2ab69487c979e551c33ce2b73902c63943df9945dd23b9b", + "0xc8c42876c9f093326fd24262be17af1ec0a1030693f7e4a24201c28b3b90d82c", + "0x0b8839b2d0aa101cc2e8887c2d20c83d813559e7800f7ad9ce9af8be697a9a18", + "0xf621df816c070c7f0091dda13b34e6a46a7a86dab6852500351d4f5e2ae9eefe", + "0x8418a842e94ae25f54f427b389cee45d06da8cd3f55e41be9332c56241d48962", + "0xac58a960f5db3cc0570a20f8ca307ef444d9a90f630c7b629e66e4313aad45b3", + "0xf66d09329c4db75279f910ebe6d7a1c643632668a711dfb8069f47cf00d7a57a", + "0xdcacf0e0951030d0f733cbbb46b5f0b3b45840953525b757001ceb74bae9fa4b", + "0x941e10e4fde951acfbc184d76a51823b6ab04214b297e7e52bee236d8f66b8b9", + "0xd1dd9fbed648c9d93f590a91ef9922b6256878a498e61055d8fec739395ce0e9", + "0xe7eae47cd583cab13d7d684adc6e443ef38d83c7d2120171eecf7b0c9168a77b", + "0x08a6ff7d42b3056bc571e9c16607b373d37565a71cac95b9a85bf5788f08ea0d", + "0x3bae2e6ec6af9bbffe37b395df67769b234cdd743bd848764420ff2799ea673c", + "0xaa0b772f59055d8dfbef446352b2d08fbacd97968643a300e03e520c50ffdcbf", + "0xd8d29dfd14ab5068e615662b3580d191663f64cc15557873194d7b2718dc0425", + "0x0561ae8390935eece56ca93e3ea5feaa187e3777418fc19134649726c9519f41", + "0xe3c8dc3145997086caf05a06d4209d10096df09379fce4819f40c13cad005d3e", + "0x02d87b27d2a9e5cb47a71051ef0ef3202e2a86373807753e8603807e43ecf4f5", ], - "transactionsRoot": "0x17429d391ba2a1d033a60a9bdb2899a1c06e25747fcb4c9bc8476c3c72cc357a", + "transactionsRoot": "0xec75fee6c90538b6b5d846f5fd25f550591eaccbb366fc393c4a693f8370d0b4", "uncles": [], "withdrawals": [ { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b7ed9", - "index": "0x2a5128b", - "validatorIndex": "0x4e940", + "amount": "0x11cdffd", + "index": "0x2b3aa2b", + "validatorIndex": "0x36315", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b37eb", - "index": "0x2a5128c", - "validatorIndex": "0x4e941", + "amount": "0x11bee1f", + "index": "0x2b3aa2c", + "validatorIndex": "0x36316", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1c7ee99", - "index": "0x2a5128d", - "validatorIndex": "0x4e942", + "amount": "0x11c8a4c", + "index": "0x2b3aa2d", + "validatorIndex": "0x36317", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aab91", - "index": "0x2a5128e", - "validatorIndex": "0x4e943", + "amount": "0x11bfb57", + "index": "0x2b3aa2e", + "validatorIndex": "0x36318", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a6e72", - "index": "0x2a5128f", - "validatorIndex": "0x4e944", + "amount": "0x11becdc", + "index": "0x2b3aa2f", + "validatorIndex": "0x36319", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b2baf", - "index": "0x2a51290", - "validatorIndex": "0x4e945", + "amount": "0x11c0882", + "index": "0x2b3aa30", + "validatorIndex": "0x3631a", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11bd042", - "index": "0x2a51291", - "validatorIndex": "0x4e946", + "amount": "0x11c12c5", + "index": "0x2b3aa31", + "validatorIndex": "0x3631b", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9593", - "index": "0x2a51292", - "validatorIndex": "0x4e947", + "amount": "0x11caadf", + "index": "0x2b3aa32", + "validatorIndex": "0x3631c", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad611", - "index": "0x2a51293", - "validatorIndex": "0x4e948", + "amount": "0x11c47d5", + "index": "0x2b3aa33", + "validatorIndex": "0x3631d", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b8446", - "index": "0x2a51294", - "validatorIndex": "0x4e949", + "amount": "0x3c9a1eb", + "index": "0x2b3aa34", + "validatorIndex": "0x3631e", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x119349e", - "index": "0x2a51295", - "validatorIndex": "0x4e94a", + "amount": "0x11c1404", + "index": "0x2b3aa35", + "validatorIndex": "0x3631f", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11ad839", - "index": "0x2a51296", - "validatorIndex": "0x4e94b", + "amount": "0x11c22d9", + "index": "0x2b3aa36", + "validatorIndex": "0x36320", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11a9715", - "index": "0x2a51297", - "validatorIndex": "0x4e94c", + "amount": "0x11c2dab", + "index": "0x2b3aa37", + "validatorIndex": "0x36321", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b820b", - "index": "0x2a51298", - "validatorIndex": "0x4e94d", + "amount": "0x11bfdf6", + "index": "0x2b3aa38", + "validatorIndex": "0x36322", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11aad2b", - "index": "0x2a51299", - "validatorIndex": "0x4e94e", + "amount": "0x11bafb3", + "index": "0x2b3aa39", + "validatorIndex": "0x36323", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11b090a", - "index": "0x2a5129a", - "validatorIndex": "0x4e94f", + "amount": "0x11b9154", + "index": "0x2b3aa3a", + "validatorIndex": "0x36324", }, ], - "withdrawalsRoot": "0x158cc8e8a444e3f70658da20714882c73b2c8932eb09b691271da474471d137b", + "withdrawalsRoot": "0x3f196863f2d0d52b020c33d1ac2fb588f257ac153baa09fbee2cc1cce42fadef", }, } `) diff --git a/test/src/anvil.ts b/test/src/anvil.ts index ed0b8e2d4a..e15fb082fe 100644 --- a/test/src/anvil.ts +++ b/test/src/anvil.ts @@ -27,7 +27,7 @@ import { accounts, poolId } from './constants.js' export const anvilMainnet = defineAnvil({ chain: mainnet, forkUrl: getEnv('VITE_ANVIL_FORK_URL', 'https://cloudflare-eth.com'), - forkBlockNumber: 19808250n, + forkBlockNumber: 19868020n, noMining: true, port: 8545, }) From ec3b0e08f0a379249224e65092277191f1a8502b Mon Sep 17 00:00:00 2001 From: jxom Date: Mon, 8 Jul 2024 09:31:49 +1000 Subject: [PATCH 26/68] fix: resolves #2484 --- .changeset/bright-camels-lick.md | 5 +++++ src/actions/public/verifyHash.test.ts | 23 +++++++++++++++++++++++ src/actions/public/verifyHash.ts | 12 ++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 .changeset/bright-camels-lick.md diff --git a/.changeset/bright-camels-lick.md b/.changeset/bright-camels-lick.md new file mode 100644 index 0000000000..aa6b794b32 --- /dev/null +++ b/.changeset/bright-camels-lick.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added fallback verification in `verifyHash`. diff --git a/src/actions/public/verifyHash.test.ts b/src/actions/public/verifyHash.test.ts index 49603eb49e..f089e472d7 100644 --- a/src/actions/public/verifyHash.test.ts +++ b/src/actions/public/verifyHash.test.ts @@ -7,6 +7,9 @@ import { anvilMainnet } from '../../../test/src/anvil.js' import { Mock4337AccountFactory } from '../../../test/contracts/generated.js' import { deployMock4337Account } from '../../../test/src/utils.js' import { privateKeyToAccount } from '../../accounts/privateKeyToAccount.js' +import { zkSync } from '../../chains/index.js' +import { createClient } from '../../clients/createClient.js' +import { http } from '../../clients/transports/http.js' import { serializeErc6492Signature } from '../../experimental/index.js' import { signMessage as signMessageErc1271 } from '../../experimental/solady/actions/signMessage.js' import type { Hex } from '../../types/misc.js' @@ -299,3 +302,23 @@ test('unexpected errors still get thrown', async () => { }), ).rejects.toThrow() }) + +test('https://github.com/wevm/viem/issues/2484', async () => { + const client = createClient({ + chain: zkSync, + transport: http(), + }) + + const signature = await signMessage(client, { + account: localAccount, + message: 'hello world', + }) + + expect( + verifyHash(client, { + address: localAccount.address, + hash: hashMessage('hello world'), + signature, + }), + ).resolves.toBe(true) +}) diff --git a/src/actions/public/verifyHash.ts b/src/actions/public/verifyHash.ts index e5d7124269..ba4be8e00a 100644 --- a/src/actions/public/verifyHash.ts +++ b/src/actions/public/verifyHash.ts @@ -13,6 +13,8 @@ import { type EncodeDeployDataErrorType, encodeDeployData, } from '../../utils/abi/encodeDeployData.js' +import { getAddress } from '../../utils/address/getAddress.js' +import { isAddressEqual } from '../../utils/address/isAddressEqual.js' import { type IsBytesEqualErrorType, isBytesEqual, @@ -21,6 +23,7 @@ import { type IsHexErrorType, isHex } from '../../utils/data/isHex.js' import { type ToHexErrorType, bytesToHex } from '../../utils/encoding/toHex.js' import { getAction } from '../../utils/getAction.js' import { isErc6492Signature } from '../../utils/signature/isErc6492Signature.js' +import { recoverAddress } from '../../utils/signature/recoverAddress.js' import { serializeErc6492Signature } from '../../utils/signature/serializeErc6492Signature.js' import { serializeSignature } from '../../utils/signature/serializeSignature.js' import { type CallErrorType, type CallParameters, call } from './call.js' @@ -105,6 +108,15 @@ export async function verifyHash( return isBytesEqual(data ?? '0x0', '0x1') } catch (error) { + // Fallback attempt to verify the signature via ECDSA recovery. + try { + const verified = isAddressEqual( + getAddress(address), + await recoverAddress({ hash, signature }), + ) + if (verified) return true + } catch {} + if (error instanceof CallExecutionError) { // if the execution fails, the signature was not valid and an internal method inside of the validator reverted // this can happen for many reasons, for example if signer can not be recovered from the signature From 963877cd43083260a4399d6f0bbf142ccede53b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:30:28 +1000 Subject: [PATCH 27/68] chore: version package (#2485) Co-authored-by: github-actions[bot] --- .changeset/bright-camels-lick.md | 5 ---- pnpm-lock.yaml | 40 ++++++++++++++++---------------- src/CHANGELOG.md | 6 +++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 6 files changed, 29 insertions(+), 28 deletions(-) delete mode 100644 .changeset/bright-camels-lick.md diff --git a/.changeset/bright-camels-lick.md b/.changeset/bright-camels-lick.md deleted file mode 100644 index aa6b794b32..0000000000 --- a/.changeset/bright-camels-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added fallback verification in `verifyHash`. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 272d3395ba..e845485b10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.1(typescript@5.4.2)(zod@3.22.4) + version: 2.17.2(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -6007,8 +6007,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.17.1: - resolution: {integrity: sha512-iLwFAfn7aWfvc1KY176YNTJQpPdepRhvaltae6TomZ+DU5M7LdASP2ywdAHw/rezdEmrH/ytwG2WWnjWioE0fA==} + viem@2.17.2: + resolution: {integrity: sha512-76BMUK5nenFX8klvQrS4srHN1aa+j1/Z8PajQFCOZHy1UjfCtsFs7W1VSw58uB530COxswbtnEv2NvNVVxKrag==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -12712,7 +12712,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.17.1(typescript@5.4.2)(zod@3.22.4): + viem@2.17.2(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 198bd9384d..f3e9de605e 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,11 @@ # viem +## 2.17.3 + +### Patch Changes + +- [`ec3b0e0`](https://github.com/wevm/viem/commit/ec3b0e08f0a379249224e65092277191f1a8502b) Thanks [@jxom](https://github.com/jxom)! - Added fallback verification in `verifyHash`. + ## 2.17.2 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index e291f4b23c..6f4070650a 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.2' +export const version = '2.17.3' diff --git a/src/jsr.json b/src/jsr.json index d2f01b1ce5..f415814fc0 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.2", + "version": "2.17.3", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index 4236cb5811..316b33ddcc 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.2", + "version": "2.17.3", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 34cf84273274fcd11ed53ee18f90be355665ba68 Mon Sep 17 00:00:00 2001 From: jxom Date: Tue, 9 Jul 2024 12:50:51 +1000 Subject: [PATCH 28/68] chore: update site --- site/pages/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/pages/index.mdx b/site/pages/index.mdx index a966540f10..adf31dfc3a 100644 --- a/site/pages/index.mdx +++ b/site/pages/index.mdx @@ -49,7 +49,7 @@ import { HomePage } from 'vocs/components' stars
- 1.9k + 2.3k
From 888501f2da3c7925f5f871e2726e67a2485b2aa0 Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 10 Jul 2024 11:41:21 +1000 Subject: [PATCH 29/68] chore: format generics --- src/accounts/toAccount.ts | 16 +- src/accounts/types.ts | 16 +- src/actions/ens/getEnsAddress.ts | 4 +- src/actions/ens/getEnsAvatar.ts | 4 +- src/actions/ens/getEnsName.ts | 4 +- src/actions/ens/getEnsResolver.ts | 4 +- src/actions/ens/getEnsText.ts | 4 +- src/actions/getContract.ts | 602 +++++++++--------- src/actions/public/call.ts | 24 +- src/actions/public/createBlockFilter.ts | 4 +- .../public/createContractEventFilter.ts | 6 +- src/actions/public/createEventFilter.ts | 129 ++-- .../public/createPendingTransactionFilter.ts | 6 +- src/actions/public/estimateGas.ts | 17 +- src/actions/public/getBalance.ts | 4 +- src/actions/public/getBlobBaseFee.ts | 6 +- src/actions/public/getBlock.ts | 30 +- src/actions/public/getBlockNumber.ts | 4 +- .../public/getBlockTransactionCount.ts | 6 +- src/actions/public/getChainId.ts | 6 +- src/actions/public/getCode.ts | 4 +- src/actions/public/getContractEvents.ts | 20 +- src/actions/public/getFeeHistory.ts | 4 +- src/actions/public/getFilterChanges.ts | 126 ++-- src/actions/public/getFilterLogs.ts | 72 +-- src/actions/public/getGasPrice.ts | 6 +- src/actions/public/getLogs.ts | 100 ++- src/actions/public/getProof.ts | 4 +- src/actions/public/getStorageAt.ts | 4 +- src/actions/public/getTransaction.ts | 20 +- .../public/getTransactionConfirmations.ts | 10 +- src/actions/public/getTransactionCount.ts | 6 +- src/actions/public/getTransactionReceipt.ts | 10 +- src/actions/public/uninstallFilter.ts | 6 +- src/actions/public/verifyHash.ts | 4 +- src/actions/public/verifyMessage.ts | 4 +- .../public/waitForTransactionReceipt.ts | 28 +- src/actions/public/watchBlockNumber.ts | 12 +- src/actions/public/watchBlocks.ts | 52 +- src/actions/public/watchEvent.ts | 76 +-- .../public/watchPendingTransactions.ts | 12 +- src/actions/test/dropTransaction.ts | 6 +- src/actions/test/dumpState.ts | 6 +- src/actions/test/getAutomine.ts | 6 +- src/actions/test/getTxpoolContent.ts | 6 +- src/actions/test/getTxpoolStatus.ts | 6 +- src/actions/test/impersonateAccount.ts | 6 +- src/actions/test/increaseTime.ts | 6 +- src/actions/test/inspectTxpool.ts | 6 +- src/actions/test/loadState.ts | 6 +- src/actions/test/mine.ts | 6 +- .../test/removeBlockTimestampInterval.ts | 6 +- src/actions/test/reset.ts | 6 +- src/actions/test/revert.ts | 6 +- src/actions/test/sendUnsignedTransaction.ts | 12 +- src/actions/test/setAutomine.ts | 6 +- src/actions/test/setBalance.ts | 6 +- src/actions/test/setBlockGasLimit.ts | 6 +- src/actions/test/setBlockTimestampInterval.ts | 6 +- src/actions/test/setCode.ts | 6 +- src/actions/test/setCoinbase.ts | 6 +- src/actions/test/setIntervalMining.ts | 6 +- src/actions/test/setLoggingEnabled.ts | 6 +- src/actions/test/setMinGasPrice.ts | 6 +- src/actions/test/setNextBlockBaseFeePerGas.ts | 6 +- src/actions/test/setNextBlockTimestamp.ts | 6 +- src/actions/test/setNonce.ts | 6 +- src/actions/test/setRpcUrl.ts | 6 +- src/actions/test/setStorageAt.ts | 6 +- src/actions/test/snapshot.ts | 6 +- src/actions/test/stopImpersonatingAccount.ts | 6 +- src/actions/wallet/addChain.ts | 6 +- src/actions/wallet/getAddresses.ts | 8 +- src/actions/wallet/getPermissions.ts | 6 +- src/actions/wallet/requestAddresses.ts | 6 +- src/actions/wallet/requestPermissions.ts | 6 +- src/actions/wallet/sendRawTransaction.ts | 4 +- src/actions/wallet/signMessage.ts | 12 +- src/actions/wallet/switchChain.ts | 6 +- src/actions/wallet/watchAsset.ts | 6 +- src/celo/parsers.ts | 20 +- src/celo/types.ts | 4 +- src/clients/createClient.test-d.ts | 2 +- src/clients/decorators/public.ts | 268 ++++---- src/clients/decorators/test.ts | 24 +- src/clients/decorators/wallet.ts | 70 +- src/clients/transports/createTransport.ts | 34 +- src/clients/transports/custom.ts | 4 +- src/errors/rpc.ts | 12 +- src/op-stack/actions/estimateL1Gas.ts | 20 +- src/op-stack/actions/estimateTotalFee.ts | 18 +- src/op-stack/actions/estimateTotalGas.ts | 18 +- src/op-stack/actions/getL1BaseFee.ts | 14 +- src/op-stack/decorators/publicL1.ts | 10 +- src/op-stack/decorators/publicL2.ts | 10 +- src/op-stack/decorators/walletL1.ts | 10 +- src/op-stack/decorators/walletL2.ts | 10 +- src/op-stack/parsers.ts | 18 +- src/op-stack/types/block.ts | 20 +- src/op-stack/types/transaction.ts | 38 +- src/types/account.ts | 24 +- src/types/block.ts | 28 +- src/types/contract.ts | 116 ++-- src/types/eip1193.ts | 107 ++-- src/types/filter.ts | 50 +- src/types/log.ts | 100 +-- src/types/proof.ts | 12 +- src/types/rpc.ts | 18 +- src/types/transport.ts | 4 +- src/types/utils.ts | 4 +- src/utils/abi/decodeAbiParameters.ts | 12 +- src/utils/abi/decodeErrorResult.ts | 8 +- src/utils/abi/encodeAbiParameters.ts | 36 +- src/utils/abi/encodePacked.ts | 16 +- src/utils/ccip.ts | 4 +- src/utils/data/concat.ts | 15 +- src/utils/data/pad.ts | 12 +- src/utils/data/slice.ts | 12 +- src/utils/data/trim.ts | 12 +- src/utils/encoding/fromBytes.ts | 32 +- src/utils/encoding/fromHex.ts | 30 +- src/utils/ens/avatar/parseAvatarRecord.ts | 8 +- src/utils/ens/avatar/utils.ts | 4 +- src/utils/filters/createFilterRequestScope.ts | 4 +- src/utils/formatters/block.ts | 18 +- src/utils/formatters/formatter.ts | 22 +- src/utils/formatters/transaction.ts | 10 +- src/utils/formatters/transactionReceipt.ts | 4 +- src/utils/formatters/transactionRequest.ts | 4 +- src/utils/hash/keccak256.ts | 16 +- src/utils/hash/ripemd160.ts | 16 +- src/utils/hash/sha256.ts | 16 +- src/utils/observe.ts | 16 +- src/utils/poll.ts | 12 +- src/utils/promise/createBatchScheduler.ts | 57 +- src/utils/promise/withCache.ts | 16 +- src/utils/promise/withRetry.ts | 6 +- src/utils/promise/withTimeout.ts | 6 +- src/utils/rpc/http.ts | 14 +- src/utils/signature/hashMessage.ts | 12 +- src/utils/transaction/parseTransaction.ts | 26 +- src/zksync/actions/getAllBalances.ts | 12 +- src/zksync/actions/getBaseTokenL1Address.ts | 6 +- src/zksync/actions/getBlockDetails.ts | 6 +- .../actions/getBridgehubContractAddress.ts | 6 +- .../actions/getDefaultBridgeAddresses.ts | 6 +- src/zksync/actions/getL1Allowance.ts | 12 +- src/zksync/actions/getL1Balance.ts | 18 +- src/zksync/actions/getL1BatchBlockRange.ts | 6 +- src/zksync/actions/getL1BatchDetails.ts | 6 +- src/zksync/actions/getL1BatchNumber.ts | 6 +- src/zksync/actions/getL1ChainId.ts | 6 +- src/zksync/actions/getL1TokenBalance.ts | 12 +- src/zksync/actions/getLogProof.ts | 6 +- src/zksync/actions/getMainContractAddress.ts | 6 +- src/zksync/actions/getRawBlockTransactions.ts | 6 +- .../actions/getTestnetPaymasterAddress.ts | 6 +- src/zksync/actions/getTransactionDetails.ts | 6 +- src/zksync/actions/signEip712Transaction.ts | 26 +- src/zksync/actions/signTransaction.ts | 26 +- src/zksync/decorators/publicL1.ts | 20 +- src/zksync/decorators/publicL2.ts | 18 +- src/zksync/types/block.ts | 20 +- src/zksync/types/eip712.ts | 10 +- src/zksync/types/fee.ts | 18 +- src/zksync/types/log.ts | 24 +- src/zksync/types/transaction.ts | 105 ++- test/src/utils.ts | 4 +- 168 files changed, 1830 insertions(+), 1858 deletions(-) diff --git a/src/accounts/toAccount.ts b/src/accounts/toAccount.ts index 64bd483833..efccf31ed1 100644 --- a/src/accounts/toAccount.ts +++ b/src/accounts/toAccount.ts @@ -17,9 +17,9 @@ import type { LocalAccount, } from './types.js' -type GetAccountReturnType = - | (TAccountSource extends Address ? JsonRpcAccount : never) - | (TAccountSource extends CustomSource ? LocalAccount : never) +type GetAccountReturnType = + | (accountSource extends Address ? JsonRpcAccount : never) + | (accountSource extends CustomSource ? LocalAccount : never) export type ToAccountErrorType = | InvalidAddressErrorType @@ -31,16 +31,16 @@ export type ToAccountErrorType = * * @returns A Local Account. */ -export function toAccount( - source: TAccountSource, -): GetAccountReturnType { +export function toAccount( + source: accountSource, +): GetAccountReturnType { if (typeof source === 'string') { if (!isAddress(source, { strict: false })) throw new InvalidAddressError({ address: source }) return { address: source, type: 'json-rpc', - } as GetAccountReturnType + } as GetAccountReturnType } if (!isAddress(source.address, { strict: false })) @@ -53,5 +53,5 @@ export function toAccount( signTypedData: source.signTypedData, source: 'custom', type: 'local', - } as GetAccountReturnType + } as GetAccountReturnType } diff --git a/src/accounts/types.ts b/src/accounts/types.ts index bddbc8f49b..d24235e47b 100644 --- a/src/accounts/types.ts +++ b/src/accounts/types.ts @@ -12,8 +12,8 @@ import type { NonceManager } from '../utils/nonceManager.js' import type { GetTransactionType } from '../utils/transaction/getTransactionType.js' import type { SerializeTransactionFn } from '../utils/transaction/serializeTransaction.js' -export type Account = OneOf< - JsonRpcAccount | LocalAccount +export type Account
= OneOf< + JsonRpcAccount
| LocalAccount > export type AccountSource = Address | CustomSource @@ -48,18 +48,18 @@ export type CustomSource = { ) => Promise } -export type JsonRpcAccount = { - address: TAddress +export type JsonRpcAccount
= { + address: address type: 'json-rpc' } export type LocalAccount< - TSource extends string = string, - TAddress extends Address = Address, + source extends string = string, + address extends Address = Address, > = CustomSource & { - address: TAddress + address: address publicKey: Hex - source: TSource + source: source type: 'local' } diff --git a/src/actions/ens/getEnsAddress.ts b/src/actions/ens/getEnsAddress.ts index 0df7f94948..29277b4726 100644 --- a/src/actions/ens/getEnsAddress.ts +++ b/src/actions/ens/getEnsAddress.ts @@ -90,8 +90,8 @@ export type GetEnsAddressErrorType = * }) * // '0xd2135CfB216b74109775236E36d4b433F1DF507B' */ -export async function getEnsAddress( - client: Client, +export async function getEnsAddress( + client: Client, { blockNumber, blockTag, diff --git a/src/actions/ens/getEnsAvatar.ts b/src/actions/ens/getEnsAvatar.ts index de9de571c9..0551bafaf8 100644 --- a/src/actions/ens/getEnsAvatar.ts +++ b/src/actions/ens/getEnsAvatar.ts @@ -58,8 +58,8 @@ export type GetEnsAvatarErrorType = * }) * // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio' */ -export async function getEnsAvatar( - client: Client, +export async function getEnsAvatar( + client: Client, { blockNumber, blockTag, diff --git a/src/actions/ens/getEnsName.ts b/src/actions/ens/getEnsName.ts index 5dffe4a2c4..ef892a66b1 100644 --- a/src/actions/ens/getEnsName.ts +++ b/src/actions/ens/getEnsName.ts @@ -71,8 +71,8 @@ export type GetEnsNameErrorType = * }) * // 'wevm.eth' */ -export async function getEnsName( - client: Client, +export async function getEnsName( + client: Client, { address, blockNumber, diff --git a/src/actions/ens/getEnsResolver.ts b/src/actions/ens/getEnsResolver.ts index fa5bf3ea38..72c07a67fb 100644 --- a/src/actions/ens/getEnsResolver.ts +++ b/src/actions/ens/getEnsResolver.ts @@ -65,8 +65,8 @@ export type GetEnsResolverErrorType = * }) * // '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41' */ -export async function getEnsResolver( - client: Client, +export async function getEnsResolver( + client: Client, { blockNumber, blockTag, diff --git a/src/actions/ens/getEnsText.ts b/src/actions/ens/getEnsText.ts index 6b99cdeee3..6b6d7ed2c9 100644 --- a/src/actions/ens/getEnsText.ts +++ b/src/actions/ens/getEnsText.ts @@ -89,8 +89,8 @@ export type GetEnsTextErrorType = * }) * // 'wevm_dev' */ -export async function getEnsText( - client: Client, +export async function getEnsText( + client: Client, { blockNumber, blockTag, diff --git a/src/actions/getContract.ts b/src/actions/getContract.ts index 3a60aadd70..4e5f74a2eb 100644 --- a/src/actions/getContract.ts +++ b/src/actions/getContract.ts @@ -69,35 +69,35 @@ import { } from './wallet/writeContract.js' type KeyedClient< - TTransport extends Transport = Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport = Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, > = | { - public?: Client | undefined - wallet: Client + public?: Client | undefined + wallet: Client } | { - public: Client - wallet?: Client | undefined + public: Client + wallet?: Client | undefined } export type GetContractParameters< - TTransport extends Transport = Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, - TAbi extends Abi | readonly unknown[] = Abi, - TClient extends - | Client - | KeyedClient = - | Client - | KeyedClient, - TAddress extends Address = Address, + transport extends Transport = Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, + abi extends Abi | readonly unknown[] = Abi, + client extends + | Client + | KeyedClient = + | Client + | KeyedClient, + address extends Address = Address, > = { /** Contract ABI */ - abi: TAbi + abi: abi /** Contract address */ - address: TAddress + address: address /** The Client. * * If you pass in a [`publicClient`](https://viem.sh/docs/clients/public), the following methods are available: @@ -114,43 +114,44 @@ export type GetContractParameters< * - [`estimateGas`](https://viem.sh/docs/contract/estimateContractGas) * - [`write`](https://viem.sh/docs/contract/writeContract) */ - client: TClient + client: client } export type GetContractReturnType< - TAbi extends Abi | readonly unknown[] = Abi, - TClient extends Client | KeyedClient = Client | KeyedClient, - TAddress extends Address = Address, - _EventNames extends string = TAbi extends Abi - ? Abi extends TAbi + abi extends Abi | readonly unknown[] = Abi, + client extends Client | KeyedClient = Client | KeyedClient, + address extends Address = Address, + // + _eventNames extends string = abi extends Abi + ? Abi extends abi ? string - : ExtractAbiEventNames + : ExtractAbiEventNames : string, - _ReadFunctionNames extends string = TAbi extends Abi - ? Abi extends TAbi + _readFunctionNames extends string = abi extends Abi + ? Abi extends abi ? string - : ExtractAbiFunctionNames + : ExtractAbiFunctionNames : string, - _WriteFunctionNames extends string = TAbi extends Abi - ? Abi extends TAbi + _writeFunctionNames extends string = abi extends Abi + ? Abi extends abi ? string - : ExtractAbiFunctionNames + : ExtractAbiFunctionNames : string, - _Narrowable extends boolean = IsNarrowable, - _PublicClient extends Client | unknown = TClient extends { + _narrowable extends boolean = IsNarrowable, + _publicClient extends Client | unknown = client extends { public: Client } - ? TClient['public'] - : TClient, - _WalletClient extends Client | unknown = TClient extends { + ? client['public'] + : client, + _walletClient extends Client | unknown = client extends { wallet: Client } - ? TClient['wallet'] - : TClient, + ? client['wallet'] + : client, > = Prettify< Prettify< - (_PublicClient extends Client - ? (IsNever<_ReadFunctionNames> extends true + (_publicClient extends Client + ? (IsNever<_readFunctionNames> extends true ? unknown : { /** @@ -179,11 +180,11 @@ export type GetContractReturnType< * // 424122n */ read: { - [functionName in _ReadFunctionNames]: GetReadFunction< - _Narrowable, - TAbi, + [functionName in _readFunctionNames]: GetReadFunction< + _narrowable, + abi, functionName extends ContractFunctionName< - TAbi, + abi, 'pure' | 'view' > ? functionName @@ -191,7 +192,7 @@ export type GetContractReturnType< > } }) & - (IsNever<_WriteFunctionNames> extends true + (IsNever<_writeFunctionNames> extends true ? unknown : { /** @@ -215,13 +216,13 @@ export type GetContractReturnType< * }) */ estimateGas: { - [functionName in _WriteFunctionNames]: GetEstimateFunction< - _Narrowable, - _PublicClient['chain'], + [functionName in _writeFunctionNames]: GetEstimateFunction< + _narrowable, + _publicClient['chain'], undefined, - TAbi, + abi, functionName extends ContractFunctionName< - TAbi, + abi, 'nonpayable' | 'payable' > ? functionName @@ -253,15 +254,15 @@ export type GetContractReturnType< * }) */ simulate: { - [functionName in _WriteFunctionNames]: GetSimulateFunction< - _Narrowable, - _PublicClient['chain'], - _WalletClient extends Client - ? _WalletClient['account'] - : _PublicClient['account'], - TAbi, + [functionName in _writeFunctionNames]: GetSimulateFunction< + _narrowable, + _publicClient['chain'], + _walletClient extends Client + ? _walletClient['account'] + : _publicClient['account'], + abi, functionName extends ContractFunctionName< - TAbi, + abi, 'nonpayable' | 'payable' > ? functionName @@ -269,7 +270,7 @@ export type GetContractReturnType< > } }) & - (IsNever<_EventNames> extends true + (IsNever<_eventNames> extends true ? unknown : { /** @@ -291,12 +292,10 @@ export type GetContractReturnType< * const filter = await contract.createEventFilter.Transfer() */ createEventFilter: { - [EventName in _EventNames]: GetEventFilter< - _Narrowable, - TAbi, - EventName extends ContractEventName - ? EventName - : never + [EventName in _eventNames]: GetEventFilter< + _narrowable, + abi, + EventName extends ContractEventName ? EventName : never > } /** @@ -318,12 +317,10 @@ export type GetContractReturnType< * const filter = await contract.createEventFilter.Transfer() */ getEvents: { - [EventName in _EventNames]: GetEventsFunction< - _Narrowable, - TAbi, - EventName extends ContractEventName - ? EventName - : never + [EventName in _eventNames]: GetEventsFunction< + _narrowable, + abi, + EventName extends ContractEventName ? EventName : never > } /** @@ -353,18 +350,16 @@ export type GetContractReturnType< * ) */ watchEvent: { - [EventName in _EventNames]: GetWatchEvent< - _Narrowable, - TAbi, - EventName extends ContractEventName - ? EventName - : never + [EventName in _eventNames]: GetWatchEvent< + _narrowable, + abi, + EventName extends ContractEventName ? EventName : never > } }) : unknown) & - (_WalletClient extends Client - ? IsNever<_WriteFunctionNames> extends true + (_walletClient extends Client + ? IsNever<_writeFunctionNames> extends true ? unknown : { /** @@ -388,13 +383,13 @@ export type GetContractReturnType< * }) */ estimateGas: { - [functionName in _WriteFunctionNames]: GetEstimateFunction< - _Narrowable, - _WalletClient['chain'], - _WalletClient['account'], - TAbi, + [functionName in _writeFunctionNames]: GetEstimateFunction< + _narrowable, + _walletClient['chain'], + _walletClient['account'], + abi, functionName extends ContractFunctionName< - TAbi, + abi, 'nonpayable' | 'payable' > ? functionName @@ -428,13 +423,13 @@ export type GetContractReturnType< * }) */ write: { - [functionName in _WriteFunctionNames]: GetWriteFunction< - _Narrowable, - _WalletClient['chain'], - _WalletClient['account'], - TAbi, + [functionName in _writeFunctionNames]: GetWriteFunction< + _narrowable, + _walletClient['chain'], + _walletClient['account'], + abi, functionName extends ContractFunctionName< - TAbi, + abi, 'nonpayable' | 'payable' > ? functionName @@ -443,7 +438,7 @@ export type GetContractReturnType< } } : unknown) - > & { address: TAddress; abi: TAbi } + > & { address: address; abi: abi } > export type GetContractErrorType = ErrorType @@ -474,29 +469,29 @@ export type GetContractErrorType = ErrorType * }) */ export function getContract< - TTransport extends Transport, - TAddress extends Address, - const TAbi extends Abi | readonly unknown[], - const TClient extends - | Client - | KeyedClient, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport, + address extends Address, + const abi extends Abi | readonly unknown[], + const client extends + | Client + | KeyedClient, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >({ abi, address, client: client_, }: GetContractParameters< - TTransport, - TChain, - TAccount, - TAbi, - TClient, - TAddress ->): GetContractReturnType { + transport, + chain, + account, + abi, + client, + address +>): GetContractReturnType { const client = client_ as - | Client - | KeyedClient + | Client + | KeyedClient const [publicClient, walletClient] = (() => { if (!client) return [undefined, undefined] @@ -779,7 +774,7 @@ export function getContract< contract.address = address contract.abi = abi - return contract as unknown as GetContractReturnType + return contract as unknown as GetContractReturnType } /** @@ -819,158 +814,161 @@ export function getEventParameters( } type GetReadFunction< - Narrowable extends boolean, - TAbi extends Abi | readonly unknown[], - TFunctionName extends ContractFunctionName, - TArgs extends ContractFunctionArgs< - TAbi, + narrowable extends boolean, + abi extends Abi | readonly unknown[], + functionName extends ContractFunctionName, + args extends ContractFunctionArgs< + abi, 'pure' | 'view', - TFunctionName - > = ContractFunctionArgs, - TAbiFunction extends AbiFunction = TAbi extends Abi - ? ExtractAbiFunction + functionName + > = ContractFunctionArgs, + abiFunction extends AbiFunction = abi extends Abi + ? ExtractAbiFunction : AbiFunction, - Args = AbiParametersToPrimitiveTypes, - Options = Prettify< + // + _args = AbiParametersToPrimitiveTypes, + _options = Prettify< UnionOmit< - ReadContractParameters, + ReadContractParameters, 'abi' | 'address' | 'args' | 'functionName' > >, -> = Narrowable extends true +> = narrowable extends true ? ( - ...parameters: Args extends readonly [] - ? [options?: Options] - : [args: Args, options?: Options] - ) => Promise> + ...parameters: _args extends readonly [] + ? [options?: _options] + : [args: _args, options?: _options] + ) => Promise> : ( ...parameters: - | [options?: Options] - | [args: readonly unknown[], options?: Options] + | [options?: _options] + | [args: readonly unknown[], options?: _options] ) => Promise type GetEstimateFunction< - Narrowable extends boolean, - TChain extends Chain | undefined, - TAccount extends Account | undefined, - TAbi extends Abi | readonly unknown[], - TFunctionName extends ContractFunctionName, - TArgs extends ContractFunctionArgs< - TAbi, + narrowable extends boolean, + chain extends Chain | undefined, + account extends Account | undefined, + abi extends Abi | readonly unknown[], + functionName extends ContractFunctionName, + args extends ContractFunctionArgs< + abi, 'nonpayable' | 'payable', - TFunctionName - > = ContractFunctionArgs, - TAbiFunction extends AbiFunction = TAbi extends Abi - ? ExtractAbiFunction + functionName + > = ContractFunctionArgs, + abiFunction extends AbiFunction = abi extends Abi + ? ExtractAbiFunction : AbiFunction, - Args = AbiParametersToPrimitiveTypes, - Options = Prettify< + // + _args = AbiParametersToPrimitiveTypes, + _options = Prettify< UnionOmit< - EstimateContractGasParameters, + EstimateContractGasParameters, 'abi' | 'address' | 'args' | 'functionName' > >, - // For making `options` parameter required if `TAccount` - IsOptionsRequired = IsUndefined, -> = Narrowable extends true + // For making `options` parameter required if `account` + IsOptionsRequired = IsUndefined, +> = narrowable extends true ? ( - ...parameters: Args extends readonly [] + ...parameters: _args extends readonly [] ? IsOptionsRequired extends true - ? [options: Options] - : [options?: Options] + ? [options: _options] + : [options?: _options] : [ - args: Args, + args: _args, ...parameters: IsOptionsRequired extends true - ? [options: Options] - : [options?: Options], + ? [options: _options] + : [options?: _options], ] ) => Promise : ( ...parameters: | (IsOptionsRequired extends true - ? [options: Options] - : [options?: Options]) + ? [options: _options] + : [options?: _options]) | [ args: readonly unknown[], ...parameters: IsOptionsRequired extends true - ? [options: Options] - : [options?: Options], + ? [options: _options] + : [options?: _options], ] ) => Promise type GetSimulateFunction< - Narrowable extends boolean, - TChain extends Chain | undefined, - TAccount extends Account | undefined, - TAbi extends Abi | readonly unknown[], - TFunctionName extends ContractFunctionName, - TArgs extends ContractFunctionArgs< - TAbi, + narrowable extends boolean, + chain extends Chain | undefined, + account extends Account | undefined, + abi extends Abi | readonly unknown[], + functionName extends ContractFunctionName, + args extends ContractFunctionArgs< + abi, 'nonpayable' | 'payable', - TFunctionName - > = ContractFunctionArgs, - TAbiFunction extends AbiFunction = TAbi extends Abi - ? ExtractAbiFunction + functionName + > = ContractFunctionArgs, + abiFunction extends AbiFunction = abi extends Abi + ? ExtractAbiFunction : AbiFunction, - Args = AbiParametersToPrimitiveTypes, -> = Narrowable extends true + // + _args = AbiParametersToPrimitiveTypes, +> = narrowable extends true ? < - TChainOverride extends Chain | undefined = undefined, - TAccountOverride extends Account | Address | undefined = undefined, + chainOverride extends Chain | undefined = undefined, + accountOverride extends Account | Address | undefined = undefined, >( - ...parameters: Args extends readonly [] + ...parameters: _args extends readonly [] ? [ options?: Omit< SimulateContractParameters< - TAbi, - TFunctionName, - TArgs, - TChain, - TChainOverride, - TAccountOverride + abi, + functionName, + args, + chain, + chainOverride, + accountOverride >, 'abi' | 'address' | 'args' | 'functionName' >, ] : [ - args: Args, + args: _args, options?: Omit< SimulateContractParameters< - TAbi, - TFunctionName, - TArgs, - TChain, - TChainOverride, - TAccountOverride + abi, + functionName, + args, + chain, + chainOverride, + accountOverride >, 'abi' | 'address' | 'args' | 'functionName' >, ] ) => Promise< SimulateContractReturnType< - TAbi, - TFunctionName, - TArgs, - TChain, - TAccount, - TChainOverride, - TAccountOverride + abi, + functionName, + args, + chain, + account, + chainOverride, + accountOverride > > : < - TChainOverride extends Chain | undefined = undefined, - TAccountOverride extends Account | Address | undefined = undefined, + chainOverride extends Chain | undefined = undefined, + accountOverride extends Account | Address | undefined = undefined, >( ...parameters: | [ options?: Omit< SimulateContractParameters< - TAbi, - TFunctionName, - TArgs, - TChain, - TChainOverride, - TAccountOverride + abi, + functionName, + args, + chain, + chainOverride, + accountOverride >, 'abi' | 'address' | 'args' | 'functionName' >, @@ -979,12 +977,12 @@ type GetSimulateFunction< args: readonly unknown[], options?: Omit< SimulateContractParameters< - TAbi, - TFunctionName, - TArgs, - TChain, - TChainOverride, - TAccountOverride + abi, + functionName, + args, + chain, + chainOverride, + accountOverride >, 'abi' | 'address' | 'args' | 'functionName' >, @@ -992,169 +990,173 @@ type GetSimulateFunction< ) => Promise type GetWriteFunction< - Narrowable extends boolean, - TChain extends Chain | undefined, - TAccount extends Account | undefined, - TAbi extends Abi | readonly unknown[], - TFunctionName extends ContractFunctionName, - TArgs extends ContractFunctionArgs< - TAbi, + narrowable extends boolean, + chain extends Chain | undefined, + account extends Account | undefined, + abi extends Abi | readonly unknown[], + functionName extends ContractFunctionName, + args extends ContractFunctionArgs< + abi, 'nonpayable' | 'payable', - TFunctionName - > = ContractFunctionArgs, - TAbiFunction extends AbiFunction = TAbi extends Abi - ? ExtractAbiFunction + functionName + > = ContractFunctionArgs, + abiFunction extends AbiFunction = abi extends Abi + ? ExtractAbiFunction : AbiFunction, - Args = AbiParametersToPrimitiveTypes, - // For making `options` parameter required if `TAccount` or `TChain` is undefined - IsOptionsRequired = Or<[IsUndefined, IsUndefined]>, -> = Narrowable extends true + // + _args = AbiParametersToPrimitiveTypes, + // For making `options` parameter required if `account` or `chain` is undefined + _isOptionsRequired = Or<[IsUndefined, IsUndefined]>, +> = narrowable extends true ? < - TChainOverride extends Chain | undefined, - Options extends Prettify< + chainOverride extends Chain | undefined, + options extends Prettify< UnionOmit< WriteContractParameters< - TAbi, - TFunctionName, - TArgs, - TChain, - TAccount, - TChainOverride + abi, + functionName, + args, + chain, + account, + chainOverride >, 'abi' | 'address' | 'args' | 'functionName' > >, >( - ...parameters: Args extends readonly [] - ? IsOptionsRequired extends true - ? [options: Options] - : [options?: Options] + ...parameters: _args extends readonly [] + ? _isOptionsRequired extends true + ? [options: options] + : [options?: options] : [ - args: Args, - ...parameters: IsOptionsRequired extends true - ? [options: Options] - : [options?: Options], + args: _args, + ...parameters: _isOptionsRequired extends true + ? [options: options] + : [options?: options], ] ) => Promise : < - TChainOverride extends Chain | undefined, - Options extends Prettify< + chainOverride extends Chain | undefined, + options extends Prettify< UnionOmit< WriteContractParameters< - TAbi, - TFunctionName, - TArgs, - TChain, - TAccount, - TChainOverride + abi, + functionName, + args, + chain, + account, + chainOverride >, 'abi' | 'address' | 'args' | 'functionName' > >, - Rest extends unknown[] = IsOptionsRequired extends true - ? [options: Options] - : [options?: Options], + Rest extends unknown[] = _isOptionsRequired extends true + ? [options: options] + : [options?: options], >( ...parameters: Rest | [args: readonly unknown[], ...parameters: Rest] ) => Promise type GetEventFilter< - Narrowable extends boolean, - TAbi extends Abi | readonly unknown[], - TEventName extends ContractEventName, - TAbiEvent extends AbiEvent = TAbi extends Abi - ? ExtractAbiEvent + narrowable extends boolean, + abi extends Abi | readonly unknown[], + eventName extends ContractEventName, + abiEvent extends AbiEvent = abi extends Abi + ? ExtractAbiEvent : AbiEvent, - Args = AbiEventParametersToPrimitiveTypes, - Options = Prettify< + // + _args = AbiEventParametersToPrimitiveTypes, + _options = Prettify< Omit< - CreateContractEventFilterParameters, + CreateContractEventFilterParameters, 'abi' | 'address' | 'args' | 'eventName' | 'strict' > >, - IndexedInputs = Extract, -> = Narrowable extends true + IndexedInputs = Extract, +> = narrowable extends true ? < - const TArgs extends - | MaybeExtractEventArgsFromAbi + const args extends + | MaybeExtractEventArgsFromAbi | undefined, - TStrict extends boolean | undefined = undefined, + strict extends boolean | undefined = undefined, >( ...parameters: IsNever extends true - ? [options?: Options & { strict?: TStrict }] + ? [options?: _options & { strict?: strict }] : [ - args: Args | (Args extends TArgs ? Readonly : never), - options?: Options & { strict?: TStrict }, + args: _args | (_args extends args ? Readonly : never), + options?: _options & { strict?: strict }, ] ) => Promise< - CreateContractEventFilterReturnType + CreateContractEventFilterReturnType > - : ( + : ( ...parameters: - | [options?: Options & { strict?: TStrict }] + | [options?: _options & { strict?: strict }] | [ args: readonly unknown[] | CreateContractFilterOptions, - options?: Options & { strict?: TStrict }, + options?: _options & { strict?: strict }, ] ) => Promise type GetEventsFunction< - Narrowable extends boolean, - TAbi extends Abi | readonly unknown[], - TEventName extends ContractEventName, - TAbiEvent extends AbiEvent = TAbi extends Abi - ? ExtractAbiEvent + narrowable extends boolean, + abi extends Abi | readonly unknown[], + eventName extends ContractEventName, + abiEvent extends AbiEvent = abi extends Abi + ? ExtractAbiEvent : AbiEvent, - Args = AbiEventParametersToPrimitiveTypes, - Options = Prettify< + // + _args = AbiEventParametersToPrimitiveTypes, + _options = Prettify< Omit< - GetContractEventsParameters, + GetContractEventsParameters, 'abi' | 'address' | 'args' | 'eventName' > >, - IndexedInputs = Extract, -> = Narrowable extends true + IndexedInputs = Extract, +> = narrowable extends true ? ( ...parameters: IsNever extends true - ? [options?: Options] - : [args?: Args, options?: Options] - ) => Promise> + ? [options?: _options] + : [args?: _args, options?: _options] + ) => Promise> : ( ...parameters: - | [options?: Options] + | [options?: _options] | [ args?: readonly unknown[] | WatchContractEventOptions, - options?: Options, + options?: _options, ] - ) => Promise> + ) => Promise> type GetWatchEvent< - Narrowable extends boolean, - TAbi extends Abi | readonly unknown[], - TEventName extends ContractEventName, - TAbiEvent extends AbiEvent = TAbi extends Abi - ? ExtractAbiEvent + narrowable extends boolean, + abi extends Abi | readonly unknown[], + eventName extends ContractEventName, + abiEvent extends AbiEvent = abi extends Abi + ? ExtractAbiEvent : AbiEvent, - Args = AbiEventParametersToPrimitiveTypes, - Options = Prettify< + // + _args = AbiEventParametersToPrimitiveTypes, + _options = Prettify< Omit< - WatchContractEventParameters, + WatchContractEventParameters, 'abi' | 'address' | 'args' | 'eventName' > >, - IndexedInputs = Extract, -> = Narrowable extends true + _indexedInputs = Extract, +> = narrowable extends true ? ( - ...parameters: IsNever extends true - ? [options: Options] - : [args: Args, options: Options] + ...parameters: IsNever<_indexedInputs> extends true + ? [options: _options] + : [args: _args, options: _options] ) => WatchContractEventReturnType : ( ...parameters: - | [options?: Options] + | [options?: _options] | [ args: readonly unknown[] | WatchContractEventOptions, - options?: Options, + options?: _options, ] ) => WatchContractEventReturnType diff --git a/src/actions/public/call.ts b/src/actions/public/call.ts index 905037951e..aa401c061e 100644 --- a/src/actions/public/call.ts +++ b/src/actions/public/call.ts @@ -77,8 +77,8 @@ import type { } from '../../utils/transaction/assertRequest.js' export type CallParameters< - TChain extends Chain | undefined = Chain | undefined, -> = UnionOmit, 'from'> & { + chain extends Chain | undefined = Chain | undefined, +> = UnionOmit, 'from'> & { /** Account attached to the call (msg.sender). */ account?: Account | Address | undefined /** Whether or not to enable multicall batching on this call. */ @@ -106,8 +106,8 @@ export type CallParameters< blockTag?: BlockTag | undefined } ) -type FormattedCall = - FormattedTransactionRequest +type FormattedCall = + FormattedTransactionRequest export type CallReturnType = { data: Hex | undefined } @@ -148,9 +148,9 @@ export type CallErrorType = GetCallErrorReturnType< * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', * }) */ -export async function call( - client: Client, - args: CallParameters, +export async function call( + client: Client, + args: CallParameters, ): Promise { const { account: account_ = client.account, @@ -239,7 +239,7 @@ export async function call( ...request, blockNumber, blockTag, - } as unknown as ScheduleMulticallParameters) + } as unknown as ScheduleMulticallParameters) } catch (err) { if ( !(err instanceof ClientChainNotConfiguredError) && @@ -304,8 +304,8 @@ function shouldPerformMulticall({ request }: { request: TransactionRequest }) { return true } -type ScheduleMulticallParameters = Pick< - CallParameters, +type ScheduleMulticallParameters = Pick< + CallParameters, 'blockNumber' | 'blockTag' > & { data: Hex @@ -322,9 +322,9 @@ type ScheduleMulticallErrorType = | RawContractErrorType | ErrorType -async function scheduleMulticall( +async function scheduleMulticall( client: Client, - args: ScheduleMulticallParameters, + args: ScheduleMulticallParameters, ) { const { batchSize = 1024, wait = 0 } = typeof client.batch?.multicall === 'object' ? client.batch.multicall : {} diff --git a/src/actions/public/createBlockFilter.ts b/src/actions/public/createBlockFilter.ts index 5b174bdd89..955d6da1c8 100644 --- a/src/actions/public/createBlockFilter.ts +++ b/src/actions/public/createBlockFilter.ts @@ -31,8 +31,8 @@ export type CreateBlockFilterErrorType = RequestErrorType | ErrorType * const filter = await createBlockFilter(client) * // { id: "0x345a6572337856574a76364e457a4366", type: 'block' } */ -export async function createBlockFilter( - client: Client, +export async function createBlockFilter( + client: Client, ): Promise { const getRequest = createFilterRequestScope(client, { method: 'eth_newBlockFilter', diff --git a/src/actions/public/createContractEventFilter.ts b/src/actions/public/createContractEventFilter.ts index df767bb603..3746e293a6 100644 --- a/src/actions/public/createContractEventFilter.ts +++ b/src/actions/public/createContractEventFilter.ts @@ -47,11 +47,11 @@ export type CreateContractEventFilterParameters< ? { args?: undefined } - : MaybeExtractEventArgsFromAbi extends infer TEventFilterArgs + : MaybeExtractEventArgsFromAbi extends infer eventFilterArgs ? { args?: - | TEventFilterArgs - | (args extends TEventFilterArgs ? args : never) + | eventFilterArgs + | (args extends eventFilterArgs ? args : never) | undefined } : { diff --git a/src/actions/public/createEventFilter.ts b/src/actions/public/createEventFilter.ts index 8ef24b21cf..d2fb1e44fa 100644 --- a/src/actions/public/createEventFilter.ts +++ b/src/actions/public/createEventFilter.ts @@ -25,58 +25,59 @@ import { import { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js' export type CreateEventFilterParameters< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbiEvents extends + abiEvent extends AbiEvent | undefined = undefined, + abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, - _EventName extends string | undefined = MaybeAbiEventName, - _Args extends - | MaybeExtractEventArgsFromAbi + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, + // + _eventName extends string | undefined = MaybeAbiEventName, + _args extends + | MaybeExtractEventArgsFromAbi | undefined = undefined, > = { address?: Address | Address[] | undefined - fromBlock?: TFromBlock | BlockNumber | BlockTag | undefined - toBlock?: TToBlock | BlockNumber | BlockTag | undefined + fromBlock?: fromBlock | BlockNumber | BlockTag | undefined + toBlock?: toBlock | BlockNumber | BlockTag | undefined } & (MaybeExtractEventArgsFromAbi< - TAbiEvents, - _EventName -> extends infer TEventFilterArgs + abiEvents, + _eventName +> extends infer eventFilterArgs ? | { args: - | TEventFilterArgs - | (_Args extends TEventFilterArgs ? _Args : never) - event: TAbiEvent + | eventFilterArgs + | (_args extends eventFilterArgs ? _args : never) + event: abiEvent events?: undefined /** * Whether or not the logs must match the indexed/non-indexed arguments on `event`. * @default false */ - strict?: TStrict | undefined + strict?: strict | undefined } | { args?: undefined - event?: TAbiEvent | undefined + event?: abiEvent | undefined events?: undefined /** * Whether or not the logs must match the indexed/non-indexed arguments on `event`. * @default false */ - strict?: TStrict | undefined + strict?: strict | undefined } | { args?: undefined event?: undefined - events: TAbiEvents | undefined + events: abiEvents | undefined /** * Whether or not the logs must match the indexed/non-indexed arguments on `event`. * @default false */ - strict?: TStrict | undefined + strict?: strict | undefined } | { args?: undefined @@ -92,20 +93,20 @@ export type CreateEventFilterParameters< }) export type CreateEventFilterReturnType< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbiEvents extends + abiEvent extends AbiEvent | undefined = undefined, + abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, - _EventName extends string | undefined = MaybeAbiEventName, - _Args extends - | MaybeExtractEventArgsFromAbi + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, + _eventName extends string | undefined = MaybeAbiEventName, + _args extends + | MaybeExtractEventArgsFromAbi | undefined = undefined, > = Prettify< - Filter<'event', TAbiEvents, _EventName, _Args, TStrict, TFromBlock, TToBlock> + Filter<'event', abiEvents, _eventName, _args, strict, fromBlock, toBlock> > export type CreateEventFilterErrorType = @@ -138,21 +139,21 @@ export type CreateEventFilterErrorType = * }) */ export async function createEventFilter< - TChain extends Chain | undefined, - const TAbiEvent extends AbiEvent | undefined = undefined, - const TAbiEvents extends + chain extends Chain | undefined, + const abiEvent extends AbiEvent | undefined = undefined, + const abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, - _EventName extends string | undefined = MaybeAbiEventName, - _Args extends - | MaybeExtractEventArgsFromAbi + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, + _eventName extends string | undefined = MaybeAbiEventName, + _args extends + | MaybeExtractEventArgsFromAbi | undefined = undefined, >( - client: Client, + client: Client, { address, args, @@ -162,23 +163,23 @@ export async function createEventFilter< strict, toBlock, }: CreateEventFilterParameters< - TAbiEvent, - TAbiEvents, - TStrict, - TFromBlock, - TToBlock, - _EventName, - _Args + abiEvent, + abiEvents, + strict, + fromBlock, + toBlock, + _eventName, + _args > = {} as any, ): Promise< CreateEventFilterReturnType< - TAbiEvent, - TAbiEvents, - TStrict, - TFromBlock, - TToBlock, - _EventName, - _Args + abiEvent, + abiEvents, + strict, + fromBlock, + toBlock, + _eventName, + _args > > { const events = events_ ?? (event ? [event] : undefined) @@ -225,12 +226,12 @@ export async function createEventFilter< toBlock, type: 'event', } as unknown as CreateEventFilterReturnType< - TAbiEvent, - TAbiEvents, - TStrict, - TFromBlock, - TToBlock, - _EventName, - _Args + abiEvent, + abiEvents, + strict, + fromBlock, + toBlock, + _eventName, + _args > } diff --git a/src/actions/public/createPendingTransactionFilter.ts b/src/actions/public/createPendingTransactionFilter.ts index 86369121ea..049f850748 100644 --- a/src/actions/public/createPendingTransactionFilter.ts +++ b/src/actions/public/createPendingTransactionFilter.ts @@ -34,10 +34,10 @@ export type CreatePendingTransactionFilterErrorType = * // { id: "0x345a6572337856574a76364e457a4366", type: 'transaction' } */ export async function createPendingTransactionFilter< - TTransport extends Transport, - TChain extends Chain | undefined, + transport extends Transport, + chain extends Chain | undefined, >( - client: Client, + client: Client, ): Promise { const getRequest = createFilterRequestScope(client, { method: 'eth_newPendingTransactionFilter', diff --git a/src/actions/public/estimateGas.ts b/src/actions/public/estimateGas.ts index 5fa83aeecf..767a52dd6d 100644 --- a/src/actions/public/estimateGas.ts +++ b/src/actions/public/estimateGas.ts @@ -38,8 +38,8 @@ import { } from '../wallet/prepareTransactionRequest.js' export type EstimateGasParameters< - TChain extends Chain | undefined = Chain | undefined, -> = UnionOmit, 'from'> & { + chain extends Chain | undefined = Chain | undefined, +> = UnionOmit, 'from'> & { account?: Account | Address | undefined stateOverride?: StateOverride | undefined } & ( @@ -57,9 +57,8 @@ export type EstimateGasParameters< blockTag?: BlockTag | undefined } ) -type FormattedEstimateGas< - TChain extends Chain | undefined = Chain | undefined, -> = FormattedTransactionRequest +type FormattedEstimateGas = + FormattedTransactionRequest export type EstimateGasReturnType = bigint @@ -96,11 +95,11 @@ export type EstimateGasErrorType = GetEstimateGasErrorReturnType< * }) */ export async function estimateGas< - TChain extends Chain | undefined, - TAccount extends Account | undefined = undefined, + chain extends Chain | undefined, + account extends Account | undefined = undefined, >( - client: Client, - args: EstimateGasParameters, + client: Client, + args: EstimateGasParameters, ): Promise { const account_ = args.account ?? client.account const account = account_ ? parseAccount(account_) : undefined diff --git a/src/actions/public/getBalance.ts b/src/actions/public/getBalance.ts index ea78e7002d..4659f11857 100644 --- a/src/actions/public/getBalance.ts +++ b/src/actions/public/getBalance.ts @@ -69,8 +69,8 @@ export type GetBalanceErrorType = * }) * // 10000000000000000000000n (wei) */ -export async function getBalance( - client: Client, +export async function getBalance( + client: Client, { address, blockNumber, blockTag = 'latest' }: GetBalanceParameters, ): Promise { const blockNumberHex = blockNumber ? numberToHex(blockNumber) : undefined diff --git a/src/actions/public/getBlobBaseFee.ts b/src/actions/public/getBlobBaseFee.ts index 093d5caea4..223f7c57c8 100644 --- a/src/actions/public/getBlobBaseFee.ts +++ b/src/actions/public/getBlobBaseFee.ts @@ -30,10 +30,10 @@ export type GetBlobBaseFeeErrorType = RequestErrorType | ErrorType * const blobBaseFee = await getBlobBaseFee(client) */ export async function getBlobBaseFee< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, ): Promise { const baseFee = await client.request({ method: 'eth_blobBaseFee', diff --git a/src/actions/public/getBlock.ts b/src/actions/public/getBlock.ts index 6f555248bc..6221d4f73f 100644 --- a/src/actions/public/getBlock.ts +++ b/src/actions/public/getBlock.ts @@ -22,11 +22,11 @@ import { } from '../../utils/formatters/block.js' export type GetBlockParameters< - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', > = { /** Whether or not to include transaction data in the response. */ - includeTransactions?: TIncludeTransactions | undefined + includeTransactions?: includeTransactions | undefined } & ( | { /** Hash of the block. */ @@ -47,15 +47,15 @@ export type GetBlockParameters< * The block tag. * @default 'latest' */ - blockTag?: TBlockTag | BlockTag | undefined + blockTag?: blockTag | BlockTag | undefined } ) export type GetBlockReturnType< - TChain extends Chain | undefined = undefined, - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', -> = Prettify> + chain extends Chain | undefined = undefined, + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', +> = Prettify> export type GetBlockErrorType = | BlockNotFoundErrorType @@ -88,19 +88,19 @@ export type GetBlockErrorType = * const block = await getBlock(client) */ export async function getBlock< - TChain extends Chain | undefined, - TAccount extends Account | undefined, - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', + chain extends Chain | undefined, + account extends Account | undefined, + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', >( - client: Client, + client: Client, { blockHash, blockNumber, blockTag: blockTag_, includeTransactions: includeTransactions_, - }: GetBlockParameters = {}, -): Promise> { + }: GetBlockParameters = {}, +): Promise> { const blockTag = blockTag_ ?? 'latest' const includeTransactions = includeTransactions_ ?? false diff --git a/src/actions/public/getBlockNumber.ts b/src/actions/public/getBlockNumber.ts index 50dc2cc6e1..8e8c45f53c 100644 --- a/src/actions/public/getBlockNumber.ts +++ b/src/actions/public/getBlockNumber.ts @@ -51,8 +51,8 @@ export function getBlockNumberCache(id: string) { * const blockNumber = await getBlockNumber(client) * // 69420n */ -export async function getBlockNumber( - client: Client, +export async function getBlockNumber( + client: Client, { cacheTime = client.cacheTime }: GetBlockNumberParameters = {}, ): Promise { const blockNumberHex = await withCache( diff --git a/src/actions/public/getBlockTransactionCount.ts b/src/actions/public/getBlockTransactionCount.ts index 7960643acb..79db01322d 100644 --- a/src/actions/public/getBlockTransactionCount.ts +++ b/src/actions/public/getBlockTransactionCount.ts @@ -66,10 +66,8 @@ export type GetBlockTransactionCountErrorType = * }) * const count = await getBlockTransactionCount(client) */ -export async function getBlockTransactionCount< - TChain extends Chain | undefined, ->( - client: Client, +export async function getBlockTransactionCount( + client: Client, { blockHash, blockNumber, diff --git a/src/actions/public/getChainId.ts b/src/actions/public/getChainId.ts index e97b2445d4..532d7c7b26 100644 --- a/src/actions/public/getChainId.ts +++ b/src/actions/public/getChainId.ts @@ -38,9 +38,9 @@ export type GetChainIdErrorType = * // 1 */ export async function getChainId< - TChain extends Chain | undefined, - TAccount extends Account | undefined, ->(client: Client): Promise { + chain extends Chain | undefined, + account extends Account | undefined, +>(client: Client): Promise { const chainIdHex = await client.request( { method: 'eth_chainId', diff --git a/src/actions/public/getCode.ts b/src/actions/public/getCode.ts index d367b329a6..8c85a24e82 100644 --- a/src/actions/public/getCode.ts +++ b/src/actions/public/getCode.ts @@ -55,8 +55,8 @@ export type GetCodeErrorType = * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', * }) */ -export async function getCode( - client: Client, +export async function getCode( + client: Client, { address, blockNumber, blockTag = 'latest' }: GetCodeParameters, ): Promise { const blockNumberHex = diff --git a/src/actions/public/getContractEvents.ts b/src/actions/public/getContractEvents.ts index 3e559089bf..a71ca6ce0c 100644 --- a/src/actions/public/getContractEvents.ts +++ b/src/actions/public/getContractEvents.ts @@ -116,20 +116,20 @@ export async function getContractEvents< chain extends Chain | undefined, const abi extends Abi | readonly unknown[], eventName extends ContractEventName | undefined = undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, >( client: Client, parameters: GetContractEventsParameters< abi, eventName, - TStrict, - TFromBlock, - TToBlock + strict, + fromBlock, + toBlock >, ): Promise< - GetContractEventsReturnType + GetContractEventsReturnType > { const { abi, @@ -163,8 +163,8 @@ export async function getContractEvents< } as {} as GetLogsParameters) as unknown as GetContractEventsReturnType< abi, eventName, - TStrict, - TFromBlock, - TToBlock + strict, + fromBlock, + toBlock > } diff --git a/src/actions/public/getFeeHistory.ts b/src/actions/public/getFeeHistory.ts index 42dca53ad9..8c5df23fd9 100644 --- a/src/actions/public/getFeeHistory.ts +++ b/src/actions/public/getFeeHistory.ts @@ -68,8 +68,8 @@ export type GetFeeHistoryErrorType = * rewardPercentiles: [25, 75], * }) */ -export async function getFeeHistory( - client: Client, +export async function getFeeHistory( + client: Client, { blockCount, blockNumber, diff --git a/src/actions/public/getFilterChanges.ts b/src/actions/public/getFilterChanges.ts index b64d5cdeef..e9fb6ad9d0 100644 --- a/src/actions/public/getFilterChanges.ts +++ b/src/actions/public/getFilterChanges.ts @@ -18,41 +18,33 @@ import { } from '../../utils/formatters/log.js' export type GetFilterChangesParameters< - TFilterType extends FilterType = FilterType, - TAbi extends Abi | readonly unknown[] | undefined = undefined, - TEventName extends string | undefined = undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + filterType extends FilterType = FilterType, + abi extends Abi | readonly unknown[] | undefined = undefined, + eventName extends string | undefined = undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, > = { - filter: Filter< - TFilterType, - TAbi, - TEventName, - any, - TStrict, - TFromBlock, - TToBlock - > + filter: Filter } export type GetFilterChangesReturnType< - TFilterType extends FilterType = FilterType, - TAbi extends Abi | readonly unknown[] | undefined = undefined, - TEventName extends string | undefined = undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, - _AbiEvent extends AbiEvent | undefined = TAbi extends Abi - ? TEventName extends string - ? ExtractAbiEvent + filterType extends FilterType = FilterType, + abi extends Abi | readonly unknown[] | undefined = undefined, + eventName extends string | undefined = undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, + _AbiEvent extends AbiEvent | undefined = abi extends Abi + ? eventName extends string + ? ExtractAbiEvent : undefined : undefined, _Pending extends boolean = - | (TFromBlock extends 'pending' ? true : false) - | (TToBlock extends 'pending' ? true : false), -> = TFilterType extends 'event' - ? Log[] + | (fromBlock extends 'pending' ? true : false) + | (toBlock extends 'pending' ? true : false), +> = filterType extends 'event' + ? Log[] : Hash[] export type GetFilterChangesErrorType = @@ -144,34 +136,34 @@ export type GetFilterChangesErrorType = * const hashes = await getFilterChanges(client, { filter }) */ export async function getFilterChanges< - TTransport extends Transport, - TChain extends Chain | undefined, - TFilterType extends FilterType, - const TAbi extends Abi | readonly unknown[] | undefined, - TEventName extends string | undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + transport extends Transport, + chain extends Chain | undefined, + filterType extends FilterType, + const abi extends Abi | readonly unknown[] | undefined, + eventName extends string | undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, >( - _client: Client, + _client: Client, { filter, }: GetFilterChangesParameters< - TFilterType, - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + filterType, + abi, + eventName, + strict, + fromBlock, + toBlock >, ): Promise< GetFilterChangesReturnType< - TFilterType, - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + filterType, + abi, + eventName, + strict, + fromBlock, + toBlock > > { const strict = 'strict' in filter && filter.strict @@ -183,34 +175,34 @@ export async function getFilterChanges< if (typeof logs[0] === 'string') return logs as GetFilterChangesReturnType< - TFilterType, - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + filterType, + abi, + eventName, + strict, + fromBlock, + toBlock > const formattedLogs = logs.map((log) => formatLog(log as RpcLog)) if (!('abi' in filter) || !filter.abi) return formattedLogs as GetFilterChangesReturnType< - TFilterType, - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + filterType, + abi, + eventName, + strict, + fromBlock, + toBlock > return parseEventLogs({ abi: filter.abi, logs: formattedLogs, strict, }) as unknown as GetFilterChangesReturnType< - TFilterType, - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + filterType, + abi, + eventName, + strict, + fromBlock, + toBlock > } diff --git a/src/actions/public/getFilterLogs.ts b/src/actions/public/getFilterLogs.ts index 1384d6730a..207fd8c430 100644 --- a/src/actions/public/getFilterLogs.ts +++ b/src/actions/public/getFilterLogs.ts @@ -17,29 +17,29 @@ import { } from '../../utils/formatters/log.js' export type GetFilterLogsParameters< - TAbi extends Abi | readonly unknown[] | undefined = undefined, - TEventName extends string | undefined = undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + abi extends Abi | readonly unknown[] | undefined = undefined, + eventName extends string | undefined = undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, > = { - filter: Filter<'event', TAbi, TEventName, any, TStrict, TFromBlock, TToBlock> + filter: Filter<'event', abi, eventName, any, strict, fromBlock, toBlock> } export type GetFilterLogsReturnType< - TAbi extends Abi | readonly unknown[] | undefined = undefined, - TEventName extends string | undefined = undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, - _AbiEvent extends AbiEvent | undefined = TAbi extends Abi - ? TEventName extends string - ? ExtractAbiEvent + abi extends Abi | readonly unknown[] | undefined = undefined, + eventName extends string | undefined = undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, + _AbiEvent extends AbiEvent | undefined = abi extends Abi + ? eventName extends string + ? ExtractAbiEvent : undefined : undefined, _Pending extends boolean = - | (TFromBlock extends 'pending' ? true : false) - | (TToBlock extends 'pending' ? true : false), -> = Log[] + | (fromBlock extends 'pending' ? true : false) + | (toBlock extends 'pending' ? true : false), +> = Log[] export type GetFilterLogsErrorType = | RequestErrorType @@ -75,19 +75,19 @@ export type GetFilterLogsErrorType = * const logs = await getFilterLogs(client, { filter }) */ export async function getFilterLogs< - TChain extends Chain | undefined, - const TAbi extends Abi | readonly unknown[] | undefined, - TEventName extends string | undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + chain extends Chain | undefined, + const abi extends Abi | readonly unknown[] | undefined, + eventName extends string | undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, >( - _client: Client, + _client: Client, { filter, - }: GetFilterLogsParameters, + }: GetFilterLogsParameters, ): Promise< - GetFilterLogsReturnType + GetFilterLogsReturnType > { const strict = filter.strict ?? false @@ -99,21 +99,21 @@ export async function getFilterLogs< const formattedLogs = logs.map((log) => formatLog(log)) if (!filter.abi) return formattedLogs as GetFilterLogsReturnType< - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + abi, + eventName, + strict, + fromBlock, + toBlock > return parseEventLogs({ abi: filter.abi, logs: formattedLogs, strict, }) as unknown as GetFilterLogsReturnType< - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + abi, + eventName, + strict, + fromBlock, + toBlock > } diff --git a/src/actions/public/getGasPrice.ts b/src/actions/public/getGasPrice.ts index cc93ed2b87..1320f2bad5 100644 --- a/src/actions/public/getGasPrice.ts +++ b/src/actions/public/getGasPrice.ts @@ -30,9 +30,9 @@ export type GetGasPriceErrorType = RequestErrorType | ErrorType * const gasPrice = await getGasPrice(client) */ export async function getGasPrice< - TChain extends Chain | undefined, - TAccount extends Account | undefined, ->(client: Client): Promise { + chain extends Chain | undefined, + account extends Account | undefined, +>(client: Client): Promise { const gasPrice = await client.request({ method: 'eth_gasPrice', }) diff --git a/src/actions/public/getLogs.ts b/src/actions/public/getLogs.ts index 9d1dd427d0..34291436f5 100644 --- a/src/actions/public/getLogs.ts +++ b/src/actions/public/getLogs.ts @@ -30,38 +30,39 @@ import { } from '../../utils/formatters/log.js' export type GetLogsParameters< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbiEvents extends + abiEvent extends AbiEvent | undefined = undefined, + abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, - _EventName extends string | undefined = MaybeAbiEventName, + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, + // + _eventName extends string | undefined = MaybeAbiEventName, > = { /** Address or list of addresses from which logs originated */ address?: Address | Address[] | undefined } & ( | { - event: TAbiEvent + event: abiEvent events?: undefined - args?: MaybeExtractEventArgsFromAbi | undefined + args?: MaybeExtractEventArgsFromAbi | undefined /** * Whether or not the logs must match the indexed/non-indexed arguments on `event`. * @default false */ - strict?: TStrict | undefined + strict?: strict | undefined } | { event?: undefined - events: TAbiEvents + events: abiEvents args?: undefined /** * Whether or not the logs must match the indexed/non-indexed arguments on `event`. * @default false */ - strict?: TStrict | undefined + strict?: strict | undefined } | { event?: undefined @@ -73,9 +74,9 @@ export type GetLogsParameters< ( | { /** Block number or tag after which to include logs */ - fromBlock?: TFromBlock | BlockNumber | BlockTag | undefined + fromBlock?: fromBlock | BlockNumber | BlockTag | undefined /** Block number or tag before which to include logs */ - toBlock?: TToBlock | BlockNumber | BlockTag | undefined + toBlock?: toBlock | BlockNumber | BlockTag | undefined blockHash?: undefined } | { @@ -87,19 +88,20 @@ export type GetLogsParameters< ) export type GetLogsReturnType< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbiEvents extends + abiEvent extends AbiEvent | undefined = undefined, + abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, - _EventName extends string | undefined = MaybeAbiEventName, - _Pending extends boolean = - | (TFromBlock extends 'pending' ? true : false) - | (TToBlock extends 'pending' ? true : false), -> = Log[] + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, + // + _eventName extends string | undefined = MaybeAbiEventName, + _pending extends boolean = + | (fromBlock extends 'pending' ? true : false) + | (toBlock extends 'pending' ? true : false), +> = Log[] export type GetLogsErrorType = | DecodeEventLogErrorType @@ -132,17 +134,17 @@ export type GetLogsErrorType = * const logs = await getLogs(client) */ export async function getLogs< - TChain extends Chain | undefined, - const TAbiEvent extends AbiEvent | undefined = undefined, - const TAbiEvents extends + chain extends Chain | undefined, + const abiEvent extends AbiEvent | undefined = undefined, + const abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, >( - client: Client, + client: Client, { address, blockHash, @@ -152,16 +154,8 @@ export async function getLogs< events: events_, args, strict: strict_, - }: GetLogsParameters< - TAbiEvent, - TAbiEvents, - TStrict, - TFromBlock, - TToBlock - > = {}, -): Promise< - GetLogsReturnType -> { + }: GetLogsParameters = {}, +): Promise> { const strict = strict_ ?? false const events = events_ ?? (event ? [event] : undefined) @@ -203,21 +197,21 @@ export async function getLogs< const formattedLogs = logs.map((log) => formatLog(log)) if (!events) return formattedLogs as GetLogsReturnType< - TAbiEvent, - TAbiEvents, - TStrict, - TFromBlock, - TToBlock + abiEvent, + abiEvents, + strict, + fromBlock, + toBlock > return parseEventLogs({ abi: events, logs: formattedLogs, strict, }) as unknown as GetLogsReturnType< - TAbiEvent, - TAbiEvents, - TStrict, - TFromBlock, - TToBlock + abiEvent, + abiEvents, + strict, + fromBlock, + toBlock > } diff --git a/src/actions/public/getProof.ts b/src/actions/public/getProof.ts index 96a5646868..83a3b7169e 100644 --- a/src/actions/public/getProof.ts +++ b/src/actions/public/getProof.ts @@ -70,8 +70,8 @@ export type GetProofErrorType = * storageKeys: ['0x...'], * }) */ -export async function getProof( - client: Client, +export async function getProof( + client: Client, { address, blockNumber, diff --git a/src/actions/public/getStorageAt.ts b/src/actions/public/getStorageAt.ts index d23a5b020f..b4e350c1fa 100644 --- a/src/actions/public/getStorageAt.ts +++ b/src/actions/public/getStorageAt.ts @@ -57,8 +57,8 @@ export type GetStorageAtErrorType = * slot: toHex(0), * }) */ -export async function getStorageAt( - client: Client, +export async function getStorageAt( + client: Client, { address, blockNumber, blockTag = 'latest', slot }: GetStorageAtParameters, ): Promise { const blockNumberHex = diff --git a/src/actions/public/getTransaction.ts b/src/actions/public/getTransaction.ts index cb3c9eeb34..96016d8590 100644 --- a/src/actions/public/getTransaction.ts +++ b/src/actions/public/getTransaction.ts @@ -17,7 +17,7 @@ import { formatTransaction, } from '../../utils/formatters/transaction.js' -export type GetTransactionParameters = +export type GetTransactionParameters = | { /** The block hash */ blockHash: Hash @@ -40,7 +40,7 @@ export type GetTransactionParameters = blockHash?: undefined blockNumber?: undefined /** The block tag. */ - blockTag: TBlockTag | BlockTag + blockTag: blockTag | BlockTag hash?: undefined /** The index of the transaction on the block. */ index: number @@ -55,9 +55,9 @@ export type GetTransactionParameters = } export type GetTransactionReturnType< - TChain extends Chain | undefined = undefined, - TBlockTag extends BlockTag = 'latest', -> = Prettify> + chain extends Chain | undefined = undefined, + blockTag extends BlockTag = 'latest', +> = Prettify> export type GetTransactionErrorType = | NumberToHexErrorType @@ -89,18 +89,18 @@ export type GetTransactionErrorType = * }) */ export async function getTransaction< - TChain extends Chain | undefined, - TBlockTag extends BlockTag = 'latest', + chain extends Chain | undefined, + blockTag extends BlockTag = 'latest', >( - client: Client, + client: Client, { blockHash, blockNumber, blockTag: blockTag_, hash, index, - }: GetTransactionParameters, -): Promise> { + }: GetTransactionParameters, +): Promise> { const blockTag = blockTag_ || 'latest' const blockNumberHex = diff --git a/src/actions/public/getTransactionConfirmations.ts b/src/actions/public/getTransactionConfirmations.ts index 48c96c121d..7ff7e6a7dd 100644 --- a/src/actions/public/getTransactionConfirmations.ts +++ b/src/actions/public/getTransactionConfirmations.ts @@ -16,7 +16,7 @@ import { } from './getTransaction.js' export type GetTransactionConfirmationsParameters< - TChain extends Chain | undefined = Chain, + chain extends Chain | undefined = Chain, > = | { /** The transaction hash. */ @@ -26,7 +26,7 @@ export type GetTransactionConfirmationsParameters< | { hash?: undefined /** The transaction receipt. */ - transactionReceipt: FormattedTransactionReceipt + transactionReceipt: FormattedTransactionReceipt } export type GetTransactionConfirmationsReturnType = bigint @@ -61,10 +61,10 @@ export type GetTransactionConfirmationsErrorType = * }) */ export async function getTransactionConfirmations< - TChain extends Chain | undefined, + chain extends Chain | undefined, >( - client: Client, - { hash, transactionReceipt }: GetTransactionConfirmationsParameters, + client: Client, + { hash, transactionReceipt }: GetTransactionConfirmationsParameters, ): Promise { const [blockNumber, transaction] = await Promise.all([ getAction(client, getBlockNumber, 'getBlockNumber')({}), diff --git a/src/actions/public/getTransactionCount.ts b/src/actions/public/getTransactionCount.ts index 7e62775977..68596d4996 100644 --- a/src/actions/public/getTransactionCount.ts +++ b/src/actions/public/getTransactionCount.ts @@ -63,10 +63,10 @@ export type GetTransactionCountErrorType = * }) */ export async function getTransactionCount< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, { address, blockTag = 'latest', blockNumber }: GetTransactionCountParameters, ): Promise { const count = await client.request( diff --git a/src/actions/public/getTransactionReceipt.ts b/src/actions/public/getTransactionReceipt.ts index c40f803f4e..2140f6feb6 100644 --- a/src/actions/public/getTransactionReceipt.ts +++ b/src/actions/public/getTransactionReceipt.ts @@ -19,8 +19,8 @@ export type GetTransactionReceiptParameters = { } export type GetTransactionReceiptReturnType< - TChain extends Chain | undefined = undefined, -> = FormattedTransactionReceipt + chain extends Chain | undefined = undefined, +> = FormattedTransactionReceipt export type GetTransactionReceiptErrorType = | RequestErrorType @@ -51,8 +51,8 @@ export type GetTransactionReceiptErrorType = * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', * }) */ -export async function getTransactionReceipt( - client: Client, +export async function getTransactionReceipt( + client: Client, { hash }: GetTransactionReceiptParameters, ) { const receipt = await client.request( @@ -68,5 +68,5 @@ export async function getTransactionReceipt( const format = client.chain?.formatters?.transactionReceipt?.format || formatTransactionReceipt - return format(receipt) as GetTransactionReceiptReturnType + return format(receipt) as GetTransactionReceiptReturnType } diff --git a/src/actions/public/uninstallFilter.ts b/src/actions/public/uninstallFilter.ts index 3c57d738b1..2a3e7c709a 100644 --- a/src/actions/public/uninstallFilter.ts +++ b/src/actions/public/uninstallFilter.ts @@ -37,10 +37,10 @@ export type UninstallFilterErrorType = RequestErrorType | ErrorType * // true */ export async function uninstallFilter< - TTransport extends Transport, - TChain extends Chain | undefined, + transport extends Transport, + chain extends Chain | undefined, >( - _client: Client, + _client: Client, { filter }: UninstallFilterParameters, ): Promise { return filter.request({ diff --git a/src/actions/public/verifyHash.ts b/src/actions/public/verifyHash.ts index ba4be8e00a..67b367fdd1 100644 --- a/src/actions/public/verifyHash.ts +++ b/src/actions/public/verifyHash.ts @@ -58,8 +58,8 @@ export type VerifyHashErrorType = * @param parameters - {@link VerifyHashParameters} * @returns Whether or not the signature is valid. {@link VerifyHashReturnType} */ -export async function verifyHash( - client: Client, +export async function verifyHash( + client: Client, parameters: VerifyHashParameters, ): Promise { const { address, factory, factoryData, hash, signature, ...rest } = parameters diff --git a/src/actions/public/verifyMessage.ts b/src/actions/public/verifyMessage.ts index 6fc8fc5ff8..06892ca1a7 100644 --- a/src/actions/public/verifyMessage.ts +++ b/src/actions/public/verifyMessage.ts @@ -48,8 +48,8 @@ export type VerifyMessageErrorType = * @param parameters - {@link VerifyMessageParameters} * @returns Whether or not the signature is valid. {@link VerifyMessageReturnType} */ -export async function verifyMessage( - client: Client, +export async function verifyMessage( + client: Client, { address, message, diff --git a/src/actions/public/waitForTransactionReceipt.ts b/src/actions/public/waitForTransactionReceipt.ts index e1fc50cbac..a25e4fe540 100644 --- a/src/actions/public/waitForTransactionReceipt.ts +++ b/src/actions/public/waitForTransactionReceipt.ts @@ -36,20 +36,20 @@ import { export type ReplacementReason = 'cancelled' | 'replaced' | 'repriced' export type ReplacementReturnType< - TChain extends Chain | undefined = Chain | undefined, + chain extends Chain | undefined = Chain | undefined, > = { reason: ReplacementReason replacedTransaction: Transaction transaction: Transaction - transactionReceipt: GetTransactionReceiptReturnType + transactionReceipt: GetTransactionReceiptReturnType } export type WaitForTransactionReceiptReturnType< - TChain extends Chain | undefined = Chain | undefined, -> = GetTransactionReceiptReturnType + chain extends Chain | undefined = Chain | undefined, +> = GetTransactionReceiptReturnType export type WaitForTransactionReceiptParameters< - TChain extends Chain | undefined = Chain | undefined, + chain extends Chain | undefined = Chain | undefined, > = { /** * The number of confirmations (blocks that have passed) to wait before resolving. @@ -59,7 +59,7 @@ export type WaitForTransactionReceiptParameters< /** The hash of the transaction. */ hash: Hash /** Optional callback to emit if the transaction has been replaced. */ - onReplaced?: ((response: ReplacementReturnType) => void) | undefined + onReplaced?: ((response: ReplacementReturnType) => void) | undefined /** * Polling frequency (in ms). Defaults to the client's pollingInterval config. * @default client.pollingInterval @@ -126,9 +126,9 @@ export type WaitForTransactionReceiptErrorType = * }) */ export async function waitForTransactionReceipt< - TChain extends Chain | undefined, + chain extends Chain | undefined, >( - client: Client, + client: Client, { confirmations = 1, hash, @@ -137,14 +137,14 @@ export async function waitForTransactionReceipt< retryCount = 6, retryDelay = ({ count }) => ~~(1 << count) * 200, // exponential backoff timeout, - }: WaitForTransactionReceiptParameters, -): Promise> { + }: WaitForTransactionReceiptParameters, +): Promise> { const observerId = stringify(['waitForTransactionReceipt', client.uid, hash]) let count = 0 - let transaction: GetTransactionReturnType | undefined - let replacedTransaction: GetTransactionReturnType | undefined - let receipt: GetTransactionReceiptReturnType + let transaction: GetTransactionReturnType | undefined + let replacedTransaction: GetTransactionReturnType | undefined + let receipt: GetTransactionReceiptReturnType let retrying = false return new Promise((resolve, reject) => { @@ -210,7 +210,7 @@ export async function waitForTransactionReceipt< client, getTransaction, 'getTransaction', - )({ hash })) as GetTransactionReturnType + )({ hash })) as GetTransactionReturnType if (transaction.blockNumber) blockNumber = transaction.blockNumber }, diff --git a/src/actions/public/watchBlockNumber.ts b/src/actions/public/watchBlockNumber.ts index d5d3f2110d..6d5fd3abec 100644 --- a/src/actions/public/watchBlockNumber.ts +++ b/src/actions/public/watchBlockNumber.ts @@ -21,14 +21,14 @@ export type OnBlockNumberFn = ( ) => void export type WatchBlockNumberParameters< - TTransport extends Transport = Transport, + transport extends Transport = Transport, > = { /** The callback to call when a new block number is received. */ onBlockNumber: OnBlockNumberFn /** The callback to call when an error occurred when trying to get for a new block. */ onError?: ((error: Error) => void) | undefined } & ( - | (HasTransportType extends true + | (HasTransportType extends true ? { emitMissed?: undefined emitOnBegin?: undefined @@ -78,10 +78,10 @@ export type WatchBlockNumberErrorType = PollErrorType | ErrorType * }) */ export function watchBlockNumber< - TChain extends Chain | undefined, - TTransport extends Transport, + chain extends Chain | undefined, + transport extends Transport, >( - client: Client, + client: Client, { emitOnBegin = false, emitMissed = false, @@ -89,7 +89,7 @@ export function watchBlockNumber< onError, poll: poll_, pollingInterval = client.pollingInterval, - }: WatchBlockNumberParameters, + }: WatchBlockNumberParameters, ): WatchBlockNumberReturnType { const enablePolling = (() => { if (typeof poll_ !== 'undefined') return poll_ diff --git a/src/actions/public/watchBlocks.ts b/src/actions/public/watchBlocks.ts index b0bf453743..b68bd61017 100644 --- a/src/actions/public/watchBlocks.ts +++ b/src/actions/public/watchBlocks.ts @@ -13,34 +13,32 @@ import { type StringifyErrorType, stringify } from '../../utils/stringify.js' import { type GetBlockReturnType, getBlock } from './getBlock.js' export type OnBlockParameter< - TChain extends Chain | undefined = Chain, - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', -> = GetBlockReturnType + chain extends Chain | undefined = Chain, + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', +> = GetBlockReturnType export type OnBlock< - TChain extends Chain | undefined = Chain, - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', + chain extends Chain | undefined = Chain, + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', > = ( - block: OnBlockParameter, - prevBlock: - | OnBlockParameter - | undefined, + block: OnBlockParameter, + prevBlock: OnBlockParameter | undefined, ) => void export type WatchBlocksParameters< - TTransport extends Transport = Transport, - TChain extends Chain | undefined = Chain, - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', + transport extends Transport = Transport, + chain extends Chain | undefined = Chain, + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', > = { /** The callback to call when a new block is received. */ - onBlock: OnBlock + onBlock: OnBlock /** The callback to call when an error occurred when trying to get for a new block. */ onError?: ((error: Error) => void) | undefined } & ( - | (HasTransportType extends true + | (HasTransportType extends true ? { blockTag?: undefined emitMissed?: undefined @@ -53,13 +51,13 @@ export type WatchBlocksParameters< : never) | { /** The block tag. Defaults to "latest". */ - blockTag?: TBlockTag | BlockTag | undefined + blockTag?: blockTag | BlockTag | undefined /** Whether or not to emit the missed blocks to the callback. */ emitMissed?: boolean | undefined /** Whether or not to emit the block to the callback when the subscription opens. */ emitOnBegin?: boolean | undefined /** Whether or not to include transaction data in the response. */ - includeTransactions?: TIncludeTransactions | undefined + includeTransactions?: includeTransactions | undefined poll?: true | undefined /** Polling frequency (in ms). Defaults to the client's pollingInterval config. */ pollingInterval?: number | undefined @@ -99,12 +97,12 @@ export type WatchBlocksErrorType = * }) */ export function watchBlocks< - TTransport extends Transport, - TChain extends Chain | undefined, - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', + transport extends Transport, + chain extends Chain | undefined, + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', >( - client: Client, + client: Client, { blockTag = 'latest', emitMissed = false, @@ -114,7 +112,7 @@ export function watchBlocks< includeTransactions: includeTransactions_, poll: poll_, pollingInterval = client.pollingInterval, - }: WatchBlocksParameters, + }: WatchBlocksParameters, ): WatchBlocksReturnType { const enablePolling = (() => { if (typeof poll_ !== 'undefined') return poll_ @@ -129,7 +127,7 @@ export function watchBlocks< const includeTransactions = includeTransactions_ ?? false let prevBlock: - | GetBlockReturnType + | GetBlockReturnType | undefined const pollBlocks = () => { @@ -171,7 +169,7 @@ export function watchBlocks< )({ blockNumber: i, includeTransactions, - })) as GetBlockReturnType + })) as GetBlockReturnType emit.onBlock(block as any, prevBlock as any) prevBlock = block } diff --git a/src/actions/public/watchEvent.ts b/src/actions/public/watchEvent.ts index ae9f42118f..8430eb7894 100644 --- a/src/actions/public/watchEvent.ts +++ b/src/actions/public/watchEvent.ts @@ -39,35 +39,37 @@ import { type GetLogsParameters, getLogs } from './getLogs.js' import { uninstallFilter } from './uninstallFilter.js' export type WatchEventOnLogsParameter< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbiEvents extends + abiEvent extends AbiEvent | undefined = undefined, + abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TEventName extends string | undefined = MaybeAbiEventName, -> = Log[] + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + eventName extends string | undefined = MaybeAbiEventName, +> = Log[] export type WatchEventOnLogsFn< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbiEvents extends + abiEvent extends AbiEvent | undefined = undefined, + abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - _EventName extends string | undefined = MaybeAbiEventName, + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + // + _eventName extends string | undefined = MaybeAbiEventName, > = ( - logs: WatchEventOnLogsParameter, + logs: WatchEventOnLogsParameter, ) => void export type WatchEventParameters< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbiEvents extends + abiEvent extends AbiEvent | undefined = undefined, + abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TTransport extends Transport = Transport, - _EventName extends string | undefined = MaybeAbiEventName, + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + transport extends Transport = Transport, + // + _eventName extends string | undefined = MaybeAbiEventName, > = { /** The address of the contract. */ address?: Address | Address[] | undefined @@ -76,28 +78,28 @@ export type WatchEventParameters< /** The callback to call when an error occurred when trying to get for a new block. */ onError?: ((error: Error) => void) | undefined /** The callback to call when new event logs are received. */ - onLogs: WatchEventOnLogsFn -} & GetPollOptions & + onLogs: WatchEventOnLogsFn +} & GetPollOptions & ( | { - event: TAbiEvent + event: abiEvent events?: undefined - args?: MaybeExtractEventArgsFromAbi | undefined + args?: MaybeExtractEventArgsFromAbi | undefined /** * Whether or not the logs must match the indexed/non-indexed arguments on `event`. * @default false */ - strict?: TStrict | undefined + strict?: strict | undefined } | { event?: undefined - events?: TAbiEvents | undefined + events?: abiEvents | undefined args?: undefined /** * Whether or not the logs must match the indexed/non-indexed arguments on `event`. * @default false */ - strict?: TStrict | undefined + strict?: strict | undefined } | { event?: undefined @@ -147,17 +149,17 @@ export type WatchEventErrorType = * }) */ export function watchEvent< - TChain extends Chain | undefined, - const TAbiEvent extends AbiEvent | undefined = undefined, - const TAbiEvents extends + chain extends Chain | undefined, + const abiEvent extends AbiEvent | undefined = undefined, + const abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TTransport extends Transport = Transport, - _EventName extends string | undefined = undefined, + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + transport extends Transport = Transport, + _eventName extends string | undefined = undefined, >( - client: Client, + client: Client, { address, args, @@ -170,7 +172,7 @@ export function watchEvent< poll: poll_, pollingInterval = client.pollingInterval, strict: strict_, - }: WatchEventParameters, + }: WatchEventParameters, ): WatchEventReturnType { const enablePolling = (() => { if (typeof poll_ !== 'undefined') return poll_ @@ -200,7 +202,7 @@ export function watchEvent< return observe(observerId, { onLogs, onError }, (emit) => { let previousBlockNumber: bigint if (fromBlock !== undefined) previousBlockNumber = fromBlock - 1n - let filter: Filter<'event', TAbiEvents, _EventName, any> + let filter: Filter<'event', abiEvents, _eventName, any> let initialized = false const unwatch = poll( @@ -220,8 +222,8 @@ export function watchEvent< fromBlock, } as unknown as CreateEventFilterParameters)) as unknown as Filter< 'event', - TAbiEvents, - _EventName + abiEvents, + _eventName > } catch {} initialized = true diff --git a/src/actions/public/watchPendingTransactions.ts b/src/actions/public/watchPendingTransactions.ts index c0da7cf227..85d73d117e 100644 --- a/src/actions/public/watchPendingTransactions.ts +++ b/src/actions/public/watchPendingTransactions.ts @@ -18,13 +18,13 @@ export type OnTransactionsParameter = Hash[] export type OnTransactionsFn = (transactions: OnTransactionsParameter) => void export type WatchPendingTransactionsParameters< - TTransport extends Transport = Transport, + transport extends Transport = Transport, > = { /** The callback to call when an error occurred when trying to get for a new block. */ onError?: ((error: Error) => void) | undefined /** The callback to call when new transactions are received. */ onTransactions: OnTransactionsFn -} & GetPollOptions +} & GetPollOptions export type WatchPendingTransactionsReturnType = () => void @@ -63,17 +63,17 @@ export type WatchPendingTransactionsErrorType = * }) */ export function watchPendingTransactions< - TTransport extends Transport, - TChain extends Chain | undefined, + transport extends Transport, + chain extends Chain | undefined, >( - client: Client, + client: Client, { batch = true, onError, onTransactions, poll: poll_, pollingInterval = client.pollingInterval, - }: WatchPendingTransactionsParameters, + }: WatchPendingTransactionsParameters, ) { const enablePolling = typeof poll_ !== 'undefined' ? poll_ : client.transport.type !== 'webSocket' diff --git a/src/actions/test/dropTransaction.ts b/src/actions/test/dropTransaction.ts index 7e9e92fafc..24e2fe44d3 100644 --- a/src/actions/test/dropTransaction.ts +++ b/src/actions/test/dropTransaction.ts @@ -39,10 +39,10 @@ export type DropTransactionErrorType = RequestErrorType | ErrorType * }) */ export async function dropTransaction< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { hash }: DropTransactionParameters, ) { await client.request({ diff --git a/src/actions/test/dumpState.ts b/src/actions/test/dumpState.ts index 957b4252cf..3b49fb9633 100644 --- a/src/actions/test/dumpState.ts +++ b/src/actions/test/dumpState.ts @@ -33,10 +33,10 @@ export type DumpStateErrorType = RequestErrorType | ErrorType * await dumpState(client) */ export async function dumpState< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, ): Promise { return client.request({ method: `${client.mode}_dumpState`, diff --git a/src/actions/test/getAutomine.ts b/src/actions/test/getAutomine.ts index d2c4494c0e..bc5c72de5a 100644 --- a/src/actions/test/getAutomine.ts +++ b/src/actions/test/getAutomine.ts @@ -33,10 +33,10 @@ export type GetAutomineErrorType = RequestErrorType | ErrorType * const isAutomining = await getAutomine(client) */ export async function getAutomine< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, ): Promise { if (client.mode === 'ganache') return await client.request({ diff --git a/src/actions/test/getTxpoolContent.ts b/src/actions/test/getTxpoolContent.ts index ac1d1a296e..578d782f2d 100644 --- a/src/actions/test/getTxpoolContent.ts +++ b/src/actions/test/getTxpoolContent.ts @@ -41,10 +41,10 @@ export type GetTxpoolContentErrorType = RequestErrorType | ErrorType * const content = await getTxpoolContent(client) */ export async function getTxpoolContent< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, ): Promise { return await client.request({ method: 'txpool_content', diff --git a/src/actions/test/getTxpoolStatus.ts b/src/actions/test/getTxpoolStatus.ts index c33f935e6a..a5b78470ca 100644 --- a/src/actions/test/getTxpoolStatus.ts +++ b/src/actions/test/getTxpoolStatus.ts @@ -37,10 +37,10 @@ export type GetTxpoolStatusErrorType = RequestErrorType | ErrorType * const status = await getTxpoolStatus(client) */ export async function getTxpoolStatus< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, ): Promise { const { pending, queued } = await client.request({ method: 'txpool_status', diff --git a/src/actions/test/impersonateAccount.ts b/src/actions/test/impersonateAccount.ts index 55792f48b4..e92fcdfc24 100644 --- a/src/actions/test/impersonateAccount.ts +++ b/src/actions/test/impersonateAccount.ts @@ -40,10 +40,10 @@ export type ImpersonateAccountErrorType = RequestErrorType | ErrorType * }) */ export async function impersonateAccount< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { address }: ImpersonateAccountParameters, ) { await client.request({ diff --git a/src/actions/test/increaseTime.ts b/src/actions/test/increaseTime.ts index 4bf855a698..a359fc768a 100644 --- a/src/actions/test/increaseTime.ts +++ b/src/actions/test/increaseTime.ts @@ -39,10 +39,10 @@ export type IncreaseTimeErrorType = RequestErrorType | ErrorType * }) */ export async function increaseTime< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { seconds }: IncreaseTimeParameters, ) { return await client.request({ diff --git a/src/actions/test/inspectTxpool.ts b/src/actions/test/inspectTxpool.ts index 1476aab941..067fddb468 100644 --- a/src/actions/test/inspectTxpool.ts +++ b/src/actions/test/inspectTxpool.ts @@ -38,10 +38,10 @@ export type InspectTxpoolErrorType = RequestErrorType | ErrorType * const data = await inspectTxpool(client) */ export async function inspectTxpool< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, ): Promise { return await client.request({ method: 'txpool_inspect', diff --git a/src/actions/test/loadState.ts b/src/actions/test/loadState.ts index 1507010769..17dac28965 100644 --- a/src/actions/test/loadState.ts +++ b/src/actions/test/loadState.ts @@ -34,10 +34,10 @@ export type LoadStateErrorType = RequestErrorType | ErrorType * await loadState(client, { state: '0x...' }) */ export async function loadState< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { state }: LoadStateParameters, ): Promise { await client.request({ diff --git a/src/actions/test/mine.ts b/src/actions/test/mine.ts index 97647f39a7..04f3f604ea 100644 --- a/src/actions/test/mine.ts +++ b/src/actions/test/mine.ts @@ -39,10 +39,10 @@ export type MineErrorType = RequestErrorType | ErrorType * await mine(client, { blocks: 1 }) */ export async function mine< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { blocks, interval }: MineParameters, ) { if (client.mode === 'ganache') diff --git a/src/actions/test/removeBlockTimestampInterval.ts b/src/actions/test/removeBlockTimestampInterval.ts index bd347af453..a7a7709ded 100644 --- a/src/actions/test/removeBlockTimestampInterval.ts +++ b/src/actions/test/removeBlockTimestampInterval.ts @@ -30,9 +30,9 @@ export type RemoveBlockTimestampIntervalErrorType = RequestErrorType | ErrorType * await removeBlockTimestampInterval(client) */ export async function removeBlockTimestampInterval< - TChain extends Chain | undefined, - TAccount extends Account | undefined, ->(client: TestClient) { + chain extends Chain | undefined, + account extends Account | undefined, +>(client: TestClient) { await client.request({ method: `${client.mode}_removeBlockTimestampInterval`, }) diff --git a/src/actions/test/reset.ts b/src/actions/test/reset.ts index 5c41cd414e..0354f090f1 100644 --- a/src/actions/test/reset.ts +++ b/src/actions/test/reset.ts @@ -38,10 +38,10 @@ export type ResetErrorType = RequestErrorType | ErrorType * await reset(client, { blockNumber: 69420n }) */ export async function reset< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { blockNumber, jsonRpcUrl }: ResetParameters = {}, ) { await client.request({ diff --git a/src/actions/test/revert.ts b/src/actions/test/revert.ts index 698464e38c..2ef15c91e7 100644 --- a/src/actions/test/revert.ts +++ b/src/actions/test/revert.ts @@ -37,10 +37,10 @@ export type RevertErrorType = RequestErrorType | ErrorType * await revert(client, { id: '0x…' }) */ export async function revert< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { id }: RevertParameters, ) { await client.request({ diff --git a/src/actions/test/sendUnsignedTransaction.ts b/src/actions/test/sendUnsignedTransaction.ts index 2530f18c70..851c5bdf37 100644 --- a/src/actions/test/sendUnsignedTransaction.ts +++ b/src/actions/test/sendUnsignedTransaction.ts @@ -16,8 +16,8 @@ import { } from '../../utils/formatters/transactionRequest.js' export type SendUnsignedTransactionParameters< - TChain extends Chain | undefined = Chain | undefined, -> = FormattedTransactionRequest + chain extends Chain | undefined = Chain | undefined, +> = FormattedTransactionRequest export type SendUnsignedTransactionReturnType = Hash @@ -49,11 +49,11 @@ export type SendUnsignedTransactionErrorType = RequestErrorType | ErrorType * }) */ export async function sendUnsignedTransaction< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, - args: SendUnsignedTransactionParameters, + client: TestClient, + args: SendUnsignedTransactionParameters, ): Promise { const { accessList, diff --git a/src/actions/test/setAutomine.ts b/src/actions/test/setAutomine.ts index 491d26696b..f8938eedc5 100644 --- a/src/actions/test/setAutomine.ts +++ b/src/actions/test/setAutomine.ts @@ -30,10 +30,10 @@ export type SetAutomineErrorType = RequestErrorType | ErrorType * await setAutomine(client) */ export async function setAutomine< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, enabled: boolean, ) { if (client.mode === 'ganache') { diff --git a/src/actions/test/setBalance.ts b/src/actions/test/setBalance.ts index ece163d767..0d83be3d5a 100644 --- a/src/actions/test/setBalance.ts +++ b/src/actions/test/setBalance.ts @@ -44,10 +44,10 @@ export type SetBalanceErrorType = RequestErrorType | ErrorType * }) */ export async function setBalance< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { address, value }: SetBalanceParameters, ) { if (client.mode === 'ganache') diff --git a/src/actions/test/setBlockGasLimit.ts b/src/actions/test/setBlockGasLimit.ts index b09e8ba84c..ab70d313e9 100644 --- a/src/actions/test/setBlockGasLimit.ts +++ b/src/actions/test/setBlockGasLimit.ts @@ -37,10 +37,10 @@ export type SetBlockGasLimitErrorType = RequestErrorType | ErrorType * await setBlockGasLimit(client, { gasLimit: 420_000n }) */ export async function setBlockGasLimit< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { gasLimit }: SetBlockGasLimitParameters, ) { await client.request({ diff --git a/src/actions/test/setBlockTimestampInterval.ts b/src/actions/test/setBlockTimestampInterval.ts index 2a7c55edd3..4b8192bc40 100644 --- a/src/actions/test/setBlockTimestampInterval.ts +++ b/src/actions/test/setBlockTimestampInterval.ts @@ -36,10 +36,10 @@ export type SetBlockTimestampIntervalErrorType = RequestErrorType | ErrorType * await setBlockTimestampInterval(client, { interval: 5 }) */ export async function setBlockTimestampInterval< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { interval }: SetBlockTimestampIntervalParameters, ) { const interval_ = (() => { diff --git a/src/actions/test/setCode.ts b/src/actions/test/setCode.ts index bff9a2cf6f..e215a5ebe7 100644 --- a/src/actions/test/setCode.ts +++ b/src/actions/test/setCode.ts @@ -44,10 +44,10 @@ export type SetCodeErrorType = RequestErrorType | ErrorType * }) */ export async function setCode< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { address, bytecode }: SetCodeParameters, ) { await client.request({ diff --git a/src/actions/test/setCoinbase.ts b/src/actions/test/setCoinbase.ts index c9aa541dcc..38d0b0d084 100644 --- a/src/actions/test/setCoinbase.ts +++ b/src/actions/test/setCoinbase.ts @@ -40,10 +40,10 @@ export type SetCoinbaseErrorType = RequestErrorType | ErrorType * }) */ export async function setCoinbase< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { address }: SetCoinbaseParameters, ) { await client.request({ diff --git a/src/actions/test/setIntervalMining.ts b/src/actions/test/setIntervalMining.ts index ba566224e0..e231f92695 100644 --- a/src/actions/test/setIntervalMining.ts +++ b/src/actions/test/setIntervalMining.ts @@ -36,10 +36,10 @@ export type SetIntervalMiningErrorType = RequestErrorType | ErrorType * await setIntervalMining(client, { interval: 5 }) */ export async function setIntervalMining< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { interval }: SetIntervalMiningParameters, ) { const interval_ = (() => { diff --git a/src/actions/test/setLoggingEnabled.ts b/src/actions/test/setLoggingEnabled.ts index e893db9d7b..1e772f6dba 100644 --- a/src/actions/test/setLoggingEnabled.ts +++ b/src/actions/test/setLoggingEnabled.ts @@ -30,10 +30,10 @@ export type SetLoggingEnabledErrorType = RequestErrorType | ErrorType * await setLoggingEnabled(client) */ export async function setLoggingEnabled< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, enabled: boolean, ) { await client.request({ diff --git a/src/actions/test/setMinGasPrice.ts b/src/actions/test/setMinGasPrice.ts index d3d2b9eb80..b278f85657 100644 --- a/src/actions/test/setMinGasPrice.ts +++ b/src/actions/test/setMinGasPrice.ts @@ -41,10 +41,10 @@ export type SetMinGasPriceErrorType = RequestErrorType | ErrorType * }) */ export async function setMinGasPrice< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { gasPrice }: SetMinGasPriceParameters, ) { await client.request({ diff --git a/src/actions/test/setNextBlockBaseFeePerGas.ts b/src/actions/test/setNextBlockBaseFeePerGas.ts index 168c7b4831..34df8ccaee 100644 --- a/src/actions/test/setNextBlockBaseFeePerGas.ts +++ b/src/actions/test/setNextBlockBaseFeePerGas.ts @@ -39,10 +39,10 @@ export type SetNextBlockBaseFeePerGasErrorType = RequestErrorType | ErrorType * }) */ export async function setNextBlockBaseFeePerGas< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { baseFeePerGas }: SetNextBlockBaseFeePerGasParameters, ) { await client.request({ diff --git a/src/actions/test/setNextBlockTimestamp.ts b/src/actions/test/setNextBlockTimestamp.ts index b73bdb3d82..1fcaee4328 100644 --- a/src/actions/test/setNextBlockTimestamp.ts +++ b/src/actions/test/setNextBlockTimestamp.ts @@ -37,10 +37,10 @@ export type SetNextBlockTimestampErrorType = RequestErrorType | ErrorType * await setNextBlockTimestamp(client, { timestamp: 1671744314n }) */ export async function setNextBlockTimestamp< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { timestamp }: SetNextBlockTimestampParameters, ) { await client.request({ diff --git a/src/actions/test/setNonce.ts b/src/actions/test/setNonce.ts index 6a28021d4c..6ded13af1c 100644 --- a/src/actions/test/setNonce.ts +++ b/src/actions/test/setNonce.ts @@ -44,10 +44,10 @@ export type SetNonceErrorType = RequestErrorType | ErrorType * }) */ export async function setNonce< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { address, nonce }: SetNonceParameters, ) { await client.request({ diff --git a/src/actions/test/setRpcUrl.ts b/src/actions/test/setRpcUrl.ts index e0125fe5a2..3e3b85993b 100644 --- a/src/actions/test/setRpcUrl.ts +++ b/src/actions/test/setRpcUrl.ts @@ -31,10 +31,10 @@ export type SetRpcUrlErrorType = RequestErrorType | ErrorType * await setRpcUrl(client, 'https://eth-mainnet.g.alchemy.com/v2') */ export async function setRpcUrl< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, jsonRpcUrl: string, ) { await client.request({ diff --git a/src/actions/test/setStorageAt.ts b/src/actions/test/setStorageAt.ts index 26d9d49885..2748d33f0c 100644 --- a/src/actions/test/setStorageAt.ts +++ b/src/actions/test/setStorageAt.ts @@ -48,10 +48,10 @@ export type SetStorageAtErrorType = RequestErrorType | ErrorType * }) */ export async function setStorageAt< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { address, index, value }: SetStorageAtParameters, ) { await client.request({ diff --git a/src/actions/test/snapshot.ts b/src/actions/test/snapshot.ts index 50c1c41fdd..8a0f9d7c22 100644 --- a/src/actions/test/snapshot.ts +++ b/src/actions/test/snapshot.ts @@ -30,9 +30,9 @@ export type SnapshotErrorType = RequestErrorType | ErrorType * await snapshot(client) */ export async function snapshot< - TChain extends Chain | undefined, - TAccount extends Account | undefined, ->(client: TestClient) { + chain extends Chain | undefined, + account extends Account | undefined, +>(client: TestClient) { return await client.request({ method: 'evm_snapshot', }) diff --git a/src/actions/test/stopImpersonatingAccount.ts b/src/actions/test/stopImpersonatingAccount.ts index f27bcae366..31eb435837 100644 --- a/src/actions/test/stopImpersonatingAccount.ts +++ b/src/actions/test/stopImpersonatingAccount.ts @@ -40,10 +40,10 @@ export type StopImpersonatingAccountErrorType = RequestErrorType | ErrorType * }) */ export async function stopImpersonatingAccount< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: TestClient, + client: TestClient, { address }: StopImpersonatingAccountParameters, ) { await client.request({ diff --git a/src/actions/wallet/addChain.ts b/src/actions/wallet/addChain.ts index ba5d5839b8..04c85d0fe7 100644 --- a/src/actions/wallet/addChain.ts +++ b/src/actions/wallet/addChain.ts @@ -39,9 +39,9 @@ export type AddChainErrorType = * await addChain(client, { chain: optimism }) */ export async function addChain< - TChain extends Chain | undefined, - TAccount extends Account | undefined, ->(client: Client, { chain }: AddChainParameters) { + chain extends Chain | undefined, + account extends Account | undefined, +>(client: Client, { chain }: AddChainParameters) { const { id, name, nativeCurrency, rpcUrls, blockExplorers } = chain await client.request( { diff --git a/src/actions/wallet/getAddresses.ts b/src/actions/wallet/getAddresses.ts index 618cf72abf..5b7c532f24 100644 --- a/src/actions/wallet/getAddresses.ts +++ b/src/actions/wallet/getAddresses.ts @@ -39,11 +39,9 @@ export type GetAddressesErrorType = * const accounts = await getAddresses(client) */ export async function getAddresses< - TChain extends Chain | undefined, - TAccount extends Account | undefined = undefined, ->( - client: Client, -): Promise { + chain extends Chain | undefined, + account extends Account | undefined = undefined, +>(client: Client): Promise { if (client.account?.type === 'local') return [client.account.address] const addresses = await client.request( { method: 'eth_accounts' }, diff --git a/src/actions/wallet/getPermissions.ts b/src/actions/wallet/getPermissions.ts index a81ecbff7e..a03c913d87 100644 --- a/src/actions/wallet/getPermissions.ts +++ b/src/actions/wallet/getPermissions.ts @@ -31,9 +31,9 @@ export type GetPermissionsErrorType = RequestErrorType | ErrorType * const permissions = await getPermissions(client) */ export async function getPermissions< - TChain extends Chain | undefined, - TAccount extends Account | undefined = undefined, ->(client: Client) { + chain extends Chain | undefined, + account extends Account | undefined = undefined, +>(client: Client) { const permissions = await client.request( { method: 'wallet_getPermissions' }, { dedupe: true }, diff --git a/src/actions/wallet/requestAddresses.ts b/src/actions/wallet/requestAddresses.ts index c52bcff8ea..d801784487 100644 --- a/src/actions/wallet/requestAddresses.ts +++ b/src/actions/wallet/requestAddresses.ts @@ -37,10 +37,10 @@ export type RequestAddressesErrorType = RequestErrorType | ErrorType * const accounts = await requestAddresses(client) */ export async function requestAddresses< - TChain extends Chain | undefined, - TAccount extends Account | undefined = undefined, + chain extends Chain | undefined, + account extends Account | undefined = undefined, >( - client: Client, + client: Client, ): Promise { const addresses = await client.request( { method: 'eth_requestAccounts' }, diff --git a/src/actions/wallet/requestPermissions.ts b/src/actions/wallet/requestPermissions.ts index a71515c949..a600f06e7b 100644 --- a/src/actions/wallet/requestPermissions.ts +++ b/src/actions/wallet/requestPermissions.ts @@ -42,10 +42,10 @@ export type RequestPermissionsErrorType = RequestErrorType | ErrorType * }) */ export async function requestPermissions< - TChain extends Chain | undefined, - TAccount extends Account | undefined = undefined, + chain extends Chain | undefined, + account extends Account | undefined = undefined, >( - client: Client, + client: Client, permissions: RequestPermissionsParameters, ) { return client.request( diff --git a/src/actions/wallet/sendRawTransaction.ts b/src/actions/wallet/sendRawTransaction.ts index 2cdf479036..f5a5f4c1cb 100644 --- a/src/actions/wallet/sendRawTransaction.ts +++ b/src/actions/wallet/sendRawTransaction.ts @@ -39,8 +39,8 @@ export type SendRawTransactionErrorType = RequestErrorType | ErrorType * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33' * }) */ -export async function sendRawTransaction( - client: Client, +export async function sendRawTransaction( + client: Client, { serializedTransaction }: SendRawTransactionParameters, ): Promise { return client.request( diff --git a/src/actions/wallet/signMessage.ts b/src/actions/wallet/signMessage.ts index 6820af6c4a..c126c66c01 100644 --- a/src/actions/wallet/signMessage.ts +++ b/src/actions/wallet/signMessage.ts @@ -19,8 +19,8 @@ import { } from '../../utils/encoding/toHex.js' export type SignMessageParameters< - TAccount extends Account | undefined = Account | undefined, -> = GetAccountParameter & { + account extends Account | undefined = Account | undefined, +> = GetAccountParameter & { message: SignableMessage } @@ -80,14 +80,14 @@ export type SignMessageErrorType = * }) */ export async function signMessage< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, { account: account_ = client.account, message, - }: SignMessageParameters, + }: SignMessageParameters, ): Promise { if (!account_) throw new AccountNotFoundError({ diff --git a/src/actions/wallet/switchChain.ts b/src/actions/wallet/switchChain.ts index e0d781dbb4..f4ad22e3ff 100644 --- a/src/actions/wallet/switchChain.ts +++ b/src/actions/wallet/switchChain.ts @@ -40,9 +40,9 @@ export type SwitchChainErrorType = * await switchChain(client, { id: optimism.id }) */ export async function switchChain< - TChain extends Chain | undefined, - TAccount extends Account | undefined = undefined, ->(client: Client, { id }: SwitchChainParameters) { + chain extends Chain | undefined, + account extends Account | undefined = undefined, +>(client: Client, { id }: SwitchChainParameters) { await client.request( { method: 'wallet_switchEthereumChain', diff --git a/src/actions/wallet/watchAsset.ts b/src/actions/wallet/watchAsset.ts index f7d1ddb46b..f4d86e8baa 100644 --- a/src/actions/wallet/watchAsset.ts +++ b/src/actions/wallet/watchAsset.ts @@ -39,10 +39,10 @@ export type WatchAssetErrorType = RequestErrorType | ErrorType * }) */ export async function watchAsset< - TChain extends Chain | undefined, - TAccount extends Account | undefined = undefined, + chain extends Chain | undefined, + account extends Account | undefined = undefined, >( - client: Client, + client: Client, params: WatchAssetParameters, ): Promise { const added = await client.request( diff --git a/src/celo/parsers.ts b/src/celo/parsers.ts index 561b5630b1..f0538eed98 100644 --- a/src/celo/parsers.ts +++ b/src/celo/parsers.ts @@ -28,30 +28,30 @@ import type { import { parseTransaction as parseTransaction_op } from '../op-stack/parsers.js' export type ParseTransactionReturnType< - TSerialized extends CeloTransactionSerialized = CeloTransactionSerialized, - TType extends CeloTransactionType = GetSerializedTransactionType, -> = TSerialized extends TransactionSerializedCIP42 + serialized extends CeloTransactionSerialized = CeloTransactionSerialized, + type extends CeloTransactionType = GetSerializedTransactionType, +> = serialized extends TransactionSerializedCIP42 ? TransactionSerializableCIP42 - : ParseTransactionReturnType_ + : ParseTransactionReturnType_ -export function parseTransaction( - serializedTransaction: TSerialized, -): ParseTransactionReturnType { +export function parseTransaction( + serializedTransaction: serialized, +): ParseTransactionReturnType { const serializedType = sliceHex(serializedTransaction, 0, 1) if (serializedType === '0x7c') return parseTransactionCIP42( serializedTransaction as TransactionSerializedCIP42, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType if (serializedType === '0x7b') return parseTransactionCIP64( serializedTransaction as TransactionSerializedCIP64, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType return parseTransaction_op( serializedTransaction as OpStackTransactionSerialized, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType } function parseTransactionCIP42( diff --git a/src/celo/types.ts b/src/celo/types.ts index 7202d3fa09..96af6e9a55 100644 --- a/src/celo/types.ts +++ b/src/celo/types.ts @@ -108,9 +108,9 @@ export type CeloTransactionSerializable = OneOf< > export type CeloTransactionSerialized< - TType extends CeloTransactionType = CeloTransactionType, + type extends CeloTransactionType = CeloTransactionType, > = - | TransactionSerialized + | TransactionSerialized | TransactionSerializedCIP42 | TransactionSerializedCIP64 | TransactionSerializedDeposit diff --git a/src/clients/createClient.test-d.ts b/src/clients/createClient.test-d.ts index de2164a923..5f80e80bb7 100644 --- a/src/clients/createClient.test-d.ts +++ b/src/clients/createClient.test-d.ts @@ -110,7 +110,7 @@ describe('extend', () => { })) client.extend(() => ({ - // @ts-expect-error: Type 'SendTransactionParameters' is not assignable to type 'number'. + // @ts-expect-error: Type 'SendTransactionParameters' is not assignable to type 'number'. async sendTransaction(_args: number) { return '0x' }, diff --git a/src/clients/decorators/public.ts b/src/clients/decorators/public.ts index 3a2e40b3b4..5f40cda692 100644 --- a/src/clients/decorators/public.ts +++ b/src/clients/decorators/public.ts @@ -257,9 +257,9 @@ import type { Client } from '../createClient.js' import type { Transport } from '../transports/createTransport.js' export type PublicActions< - TTransport extends Transport = Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport = Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, > = { /** * Executes a new message call immediately without submitting a transaction to the network. @@ -284,7 +284,7 @@ export type PublicActions< * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', * }) */ - call: (parameters: CallParameters) => Promise + call: (parameters: CallParameters) => Promise /** * Creates a Filter to listen for new block hashes that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges). * @@ -326,29 +326,29 @@ export type PublicActions< * }) */ createContractEventFilter: < - const TAbi extends Abi | readonly unknown[], - TEventName extends ContractEventName | undefined, - TArgs extends MaybeExtractEventArgsFromAbi | undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + const abi extends Abi | readonly unknown[], + eventName extends ContractEventName | undefined, + args extends MaybeExtractEventArgsFromAbi | undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, >( args: CreateContractEventFilterParameters< - TAbi, - TEventName, - TArgs, - TStrict, - TFromBlock, - TToBlock + abi, + eventName, + args, + strict, + fromBlock, + toBlock >, ) => Promise< CreateContractEventFilterReturnType< - TAbi, - TEventName, - TArgs, - TStrict, - TFromBlock, - TToBlock + abi, + eventName, + args, + strict, + fromBlock, + toBlock > > /** @@ -373,37 +373,37 @@ export type PublicActions< * }) */ createEventFilter: < - const TAbiEvent extends AbiEvent | undefined = undefined, - const TAbiEvents extends + const abiEvent extends AbiEvent | undefined = undefined, + const abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, - _EventName extends string | undefined = MaybeAbiEventName, + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, + _EventName extends string | undefined = MaybeAbiEventName, _Args extends - | MaybeExtractEventArgsFromAbi + | MaybeExtractEventArgsFromAbi | undefined = undefined, >( args?: | CreateEventFilterParameters< - TAbiEvent, - TAbiEvents, - TStrict, - TFromBlock, - TToBlock, + abiEvent, + abiEvents, + strict, + fromBlock, + toBlock, _EventName, _Args > | undefined, ) => Promise< CreateEventFilterReturnType< - TAbiEvent, - TAbiEvents, - TStrict, - TFromBlock, - TToBlock, + abiEvent, + abiEvents, + strict, + fromBlock, + toBlock, _EventName, _Args > @@ -455,7 +455,7 @@ export type PublicActions< * }) */ estimateContractGas: < - TChain extends Chain | undefined, + chain extends Chain | undefined, const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, args extends ContractFunctionArgs< @@ -464,7 +464,7 @@ export type PublicActions< functionName >, >( - args: EstimateContractGasParameters, + args: EstimateContractGasParameters, ) => Promise /** * Estimates the gas necessary to complete a transaction without submitting it to the network. @@ -490,7 +490,7 @@ export type PublicActions< * }) */ estimateGas: ( - args: EstimateGasParameters, + args: EstimateGasParameters, ) => Promise /** * Returns the balance of an address in wei. @@ -571,11 +571,11 @@ export type PublicActions< * const block = await client.getBlock() */ getBlock: < - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', >( - args?: GetBlockParameters | undefined, - ) => Promise> + args?: GetBlockParameters | undefined, + ) => Promise> /** * Returns the number of the most recent block seen. * @@ -941,12 +941,10 @@ export type PublicActions< * // { maxFeePerGas: ..., maxPriorityFeePerGas: ... } */ estimateFeesPerGas: < - TChainOverride extends Chain | undefined = undefined, - TType extends FeeValuesType = 'eip1559', + chainOverride extends Chain | undefined = undefined, + type extends FeeValuesType = 'eip1559', >( - args?: - | EstimateFeesPerGasParameters - | undefined, + args?: EstimateFeesPerGasParameters | undefined, ) => Promise /** * Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called. @@ -1027,29 +1025,29 @@ export type PublicActions< * const hashes = await client.getFilterChanges({ filter }) */ getFilterChanges: < - TFilterType extends FilterType, - const TAbi extends Abi | readonly unknown[] | undefined, - TEventName extends string | undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + filterType extends FilterType, + const abi extends Abi | readonly unknown[] | undefined, + eventName extends string | undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, >( args: GetFilterChangesParameters< - TFilterType, - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + filterType, + abi, + eventName, + strict, + fromBlock, + toBlock >, ) => Promise< GetFilterChangesReturnType< - TFilterType, - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock + filterType, + abi, + eventName, + strict, + fromBlock, + toBlock > > /** @@ -1079,21 +1077,15 @@ export type PublicActions< * const logs = await client.getFilterLogs({ filter }) */ getFilterLogs: < - const TAbi extends Abi | readonly unknown[] | undefined, - TEventName extends string | undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + const abi extends Abi | readonly unknown[] | undefined, + eventName extends string | undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, >( - args: GetFilterLogsParameters< - TAbi, - TEventName, - TStrict, - TFromBlock, - TToBlock - >, + args: GetFilterLogsParameters, ) => Promise< - GetFilterLogsReturnType + GetFilterLogsReturnType > /** * Returns the current price of gas (in wei). @@ -1135,20 +1127,20 @@ export type PublicActions< * const logs = await client.getLogs() */ getLogs: < - const TAbiEvent extends AbiEvent | undefined = undefined, - const TAbiEvents extends + const abiEvent extends AbiEvent | undefined = undefined, + const abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, >( args?: - | GetLogsParameters + | GetLogsParameters | undefined, ) => Promise< - GetLogsReturnType + GetLogsReturnType > /** * Returns the account and storage values of the specified account including the Merkle-proof. @@ -1196,10 +1188,10 @@ export type PublicActions< * // 10000000n */ estimateMaxPriorityFeePerGas: < - TChainOverride extends Chain | undefined = undefined, + chainOverride extends Chain | undefined = undefined, >( args?: - | EstimateMaxPriorityFeePerGasParameters + | EstimateMaxPriorityFeePerGasParameters | undefined, ) => Promise /** @@ -1250,9 +1242,9 @@ export type PublicActions< * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', * }) */ - getTransaction: ( - args: GetTransactionParameters, - ) => Promise> + getTransaction: ( + args: GetTransactionParameters, + ) => Promise> /** * Returns the number of blocks passed (confirmations) since the transaction was processed on a block. * @@ -1276,7 +1268,7 @@ export type PublicActions< * }) */ getTransactionConfirmations: ( - args: GetTransactionConfirmationsParameters, + args: GetTransactionConfirmationsParameters, ) => Promise /** * Returns the number of [Transactions](https://viem.sh/docs/glossary/terms#transaction) an Account has broadcast / sent. @@ -1326,7 +1318,7 @@ export type PublicActions< */ getTransactionReceipt: ( args: GetTransactionReceiptParameters, - ) => Promise> + ) => Promise> /** * Similar to [`readContract`](https://viem.sh/docs/contract/readContract), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall). * @@ -1409,28 +1401,28 @@ export type PublicActions< * }) */ prepareTransactionRequest: < - const TRequest extends PrepareTransactionRequestRequest< - TChain, - TChainOverride + const request extends PrepareTransactionRequestRequest< + chain, + chainOverride >, - TChainOverride extends Chain | undefined = undefined, - TAccountOverride extends Account | Address | undefined = undefined, + chainOverride extends Chain | undefined = undefined, + accountOverride extends Account | Address | undefined = undefined, >( args: PrepareTransactionRequestParameters< - TChain, - TAccount, - TChainOverride, - TAccountOverride, - TRequest + chain, + account, + chainOverride, + accountOverride, + request >, ) => Promise< PrepareTransactionRequestReturnType< Chain, - TAccount, - TChainOverride, - TAccountOverride, + account, + chainOverride, + accountOverride, // @ts-expect-error - TRequest + request > > /** @@ -1543,7 +1535,7 @@ export type PublicActions< abi, functionName, args, - TChain, + chain, chainOverride, accountOverride >, @@ -1552,8 +1544,8 @@ export type PublicActions< abi, functionName, args, - TChain, - TAccount, + chain, + account, chainOverride, accountOverride > @@ -1659,8 +1651,8 @@ export type PublicActions< * }) */ waitForTransactionReceipt: ( - args: WaitForTransactionReceiptParameters, - ) => Promise> + args: WaitForTransactionReceiptParameters, + ) => Promise> /** * Watches and returns incoming block numbers. * @@ -1713,14 +1705,14 @@ export type PublicActions< * }) */ watchBlocks: < - TIncludeTransactions extends boolean = false, - TBlockTag extends BlockTag = 'latest', + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', >( args: WatchBlocksParameters< - TTransport, - TChain, - TIncludeTransactions, - TBlockTag + transport, + chain, + includeTransactions, + blockTag >, ) => WatchBlocksReturnType /** @@ -1753,11 +1745,11 @@ export type PublicActions< * }) */ watchContractEvent: < - const TAbi extends Abi | readonly unknown[], - TEventName extends ContractEventName, - TStrict extends boolean | undefined = undefined, + const abi extends Abi | readonly unknown[], + eventName extends ContractEventName, + strict extends boolean | undefined = undefined, >( - args: WatchContractEventParameters, + args: WatchContractEventParameters, ) => WatchContractEventReturnType /** * Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms#event-log). @@ -1791,14 +1783,14 @@ export type PublicActions< * }) */ watchEvent: < - const TAbiEvent extends AbiEvent | undefined = undefined, - const TAbiEvents extends + const abiEvent extends AbiEvent | undefined = undefined, + const abiEvents extends | readonly AbiEvent[] | readonly unknown[] - | undefined = TAbiEvent extends AbiEvent ? [TAbiEvent] : undefined, - TStrict extends boolean | undefined = undefined, + | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined, + strict extends boolean | undefined = undefined, >( - args: WatchEventParameters, + args: WatchEventParameters, ) => WatchEventReturnType /** * Watches and returns pending transaction hashes. @@ -1829,17 +1821,17 @@ export type PublicActions< * }) */ watchPendingTransactions: ( - args: WatchPendingTransactionsParameters, + args: WatchPendingTransactionsParameters, ) => WatchPendingTransactionsReturnType } export function publicActions< - TTransport extends Transport = Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport = Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >( - client: Client, -): PublicActions { + client: Client, +): PublicActions { return { call: (args) => call(client, args), createBlockFilter: () => createBlockFilter(client), diff --git a/src/clients/decorators/test.ts b/src/clients/decorators/test.ts index 39b4ff8b8c..df319e43c9 100644 --- a/src/clients/decorators/test.ts +++ b/src/clients/decorators/test.ts @@ -378,8 +378,8 @@ export type TestActions = { * value: 1000000000000000000n, * }) */ - sendUnsignedTransaction: ( - args: SendUnsignedTransactionParameters, + sendUnsignedTransaction: ( + args: SendUnsignedTransactionParameters, ) => Promise /** * Enables or disables the automatic mining of new blocks with each new transaction submitted to the network. @@ -716,21 +716,21 @@ export type TestActions = { ) => Promise } -export function testActions({ +export function testActions({ mode, -}: { mode: TMode }): < - TTransport extends Transport = Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, +}: { mode: mode }): < + transport extends Transport = Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >( - client: Client, + client: Client, ) => TestActions { return < - TTransport extends Transport = Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport = Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >( - client_: Client, + client_: Client, ): TestActions => { const client = client_.extend(() => ({ mode, diff --git a/src/clients/decorators/wallet.ts b/src/clients/decorators/wallet.ts index 7e2852a23a..03f8eaa853 100644 --- a/src/clients/decorators/wallet.ts +++ b/src/clients/decorators/wallet.ts @@ -86,8 +86,8 @@ import type { Client } from '../createClient.js' import type { Transport } from '../transports/createTransport.js' export type WalletActions< - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, > = { /** * Adds an EVM chain to the wallet. @@ -136,7 +136,7 @@ export type WalletActions< const abi extends Abi | readonly unknown[], chainOverride extends Chain | undefined, >( - args: DeployContractParameters, + args: DeployContractParameters, ) => Promise /** * Returns a list of account addresses owned by the wallet or client. @@ -235,28 +235,28 @@ export type WalletActions< * }) */ prepareTransactionRequest: < - const TRequest extends PrepareTransactionRequestRequest< - TChain, - TChainOverride + const request extends PrepareTransactionRequestRequest< + chain, + chainOverride >, - TChainOverride extends Chain | undefined = undefined, - TAccountOverride extends Account | Address | undefined = undefined, + chainOverride extends Chain | undefined = undefined, + accountOverride extends Account | Address | undefined = undefined, >( args: PrepareTransactionRequestParameters< - TChain, - TAccount, - TChainOverride, - TAccountOverride, - TRequest + chain, + account, + chainOverride, + accountOverride, + request >, ) => Promise< PrepareTransactionRequestReturnType< Chain, - TAccount, - TChainOverride, - TAccountOverride, + account, + chainOverride, + accountOverride, // @ts-expect-error - TRequest + request > > /** @@ -376,10 +376,10 @@ export type WalletActions< * }) */ sendTransaction: < - const TRequest extends SendTransactionRequest, - TChainOverride extends Chain | undefined = undefined, + const request extends SendTransactionRequest, + chainOverride extends Chain | undefined = undefined, >( - args: SendTransactionParameters, + args: SendTransactionParameters, ) => Promise /** * Calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. @@ -425,7 +425,7 @@ export type WalletActions< * }) */ signMessage: ( - args: SignMessageParameters, + args: SignMessageParameters, ) => Promise /** * Signs a transaction. @@ -470,8 +470,8 @@ export type WalletActions< * }) * const signature = await client.signTransaction(request) */ - signTransaction: ( - args: SignTransactionParameters, + signTransaction: ( + args: SignTransactionParameters, ) => Promise /** * Signs typed data and calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))`. @@ -570,10 +570,10 @@ export type WalletActions< * }) */ signTypedData: < - const TTypedData extends TypedData | { [key: string]: unknown }, - TPrimaryType extends string, + const typedData extends TypedData | { [key: string]: unknown }, + primaryType extends string, >( - args: SignTypedDataParameters, + args: SignTypedDataParameters, ) => Promise /** * Switch the target chain in a wallet. @@ -676,26 +676,24 @@ export type WalletActions< 'payable' | 'nonpayable', functionName >, - TChainOverride extends Chain | undefined = undefined, + chainOverride extends Chain | undefined = undefined, >( args: WriteContractParameters< abi, functionName, args, - TChain, - TAccount, - TChainOverride + chain, + account, + chainOverride >, ) => Promise } export function walletActions< - TTransport extends Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, ->( - client: Client, -): WalletActions { + transport extends Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, +>(client: Client): WalletActions { return { addChain: (args) => addChain(client, args), deployContract: (args) => deployContract(client, args), diff --git a/src/clients/transports/createTransport.ts b/src/clients/transports/createTransport.ts index ef922ada85..0080a3df82 100644 --- a/src/clients/transports/createTransport.ts +++ b/src/clients/transports/createTransport.ts @@ -6,15 +6,15 @@ import { uid as uid_ } from '../../utils/uid.js' import type { ClientConfig } from '../createClient.js' export type TransportConfig< - TType extends string = string, - TEIP1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn, + type extends string = string, + eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn, > = { /** The name of the transport. */ name: string /** The key of the transport. */ key: string /** The JSON-RPC request function that matches the EIP-1193 request spec. */ - request: TEIP1193RequestFn + request: eip1193RequestFn /** The base delay (in ms) between retries. */ retryDelay?: number | undefined /** The max number of times to retry. */ @@ -22,24 +22,24 @@ export type TransportConfig< /** The timeout (in ms) for requests. */ timeout?: number | undefined /** The type of the transport. */ - type: TType + type: type } export type Transport< - TType extends string = string, - TRpcAttributes = Record, - TEIP1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn, -> = ({ + type extends string = string, + rpcAttributes = Record, + eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn, +> = ({ chain, }: { - chain?: TChain | undefined + chain?: chain | undefined pollingInterval?: ClientConfig['pollingInterval'] | undefined retryCount?: TransportConfig['retryCount'] | undefined timeout?: TransportConfig['timeout'] | undefined }) => { - config: TransportConfig - request: TEIP1193RequestFn - value?: TRpcAttributes | undefined + config: TransportConfig + request: eip1193RequestFn + value?: rpcAttributes | undefined } export type CreateTransportErrorType = ErrorType @@ -48,8 +48,8 @@ export type CreateTransportErrorType = ErrorType * @description Creates an transport intended to be used with a client. */ export function createTransport< - TType extends string, - TRpcAttributes extends Record, + type extends string, + rpcAttributes extends Record, >( { key, @@ -59,9 +59,9 @@ export function createTransport< retryDelay = 150, timeout, type, - }: TransportConfig, - value?: TRpcAttributes | undefined, -): ReturnType> { + }: TransportConfig, + value?: rpcAttributes | undefined, +): ReturnType> { const uid = uid_() return { config: { diff --git a/src/clients/transports/custom.ts b/src/clients/transports/custom.ts index 290312f2ed..6ff50866a7 100644 --- a/src/clients/transports/custom.ts +++ b/src/clients/transports/custom.ts @@ -30,8 +30,8 @@ export type CustomTransportErrorType = CreateTransportErrorType | ErrorType /** * @description Creates a custom transport given an EIP-1193 compliant `request` attribute. */ -export function custom( - provider: TProvider, +export function custom( + provider: provider, config: CustomTransportConfig = {}, ): CustomTransport { const { key = 'custom', name = 'Custom Provider', retryDelay } = config diff --git a/src/errors/rpc.ts b/src/errors/rpc.ts index 4ff87176ad..9ea642e5a4 100644 --- a/src/errors/rpc.ts +++ b/src/errors/rpc.ts @@ -20,8 +20,8 @@ export type RpcErrorCode = | -32006 // JSON-RPC version not supported | -32042 // Method not found -type RpcErrorOptions = { - code?: TCode | (number & {}) | undefined +type RpcErrorOptions = { + code?: code | (number & {}) | undefined docsPath?: string | undefined metaMessages?: string[] | undefined shortMessage: string @@ -33,14 +33,14 @@ type RpcErrorOptions = { * - EIP https://eips.ethereum.org/EIPS/eip-1474 */ export type RpcErrorType = RpcError & { name: 'RpcError' } -export class RpcError extends BaseError { +export class RpcError extends BaseError { override name = 'RpcError' - code: TCode | (number & {}) + code: code | (number & {}) constructor( cause: Error, - { code, docsPath, metaMessages, shortMessage }: RpcErrorOptions, + { code, docsPath, metaMessages, shortMessage }: RpcErrorOptions, ) { super(shortMessage, { cause, @@ -51,7 +51,7 @@ export class RpcError extends BaseError { this.name = cause.name this.code = ( cause instanceof RpcRequestError ? cause.code : code ?? unknownErrorCode - ) as TCode + ) as code } } diff --git a/src/op-stack/actions/estimateL1Gas.ts b/src/op-stack/actions/estimateL1Gas.ts index 7f90c0af33..879f676282 100644 --- a/src/op-stack/actions/estimateL1Gas.ts +++ b/src/op-stack/actions/estimateL1Gas.ts @@ -34,12 +34,12 @@ import { gasPriceOracleAbi } from '../abis.js' import { contracts } from '../contracts.js' export type EstimateL1GasParameters< - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, - TChainOverride extends Chain | undefined = Chain | undefined, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, + chainOverride extends Chain | undefined = Chain | undefined, > = Omit & - GetAccountParameter & - GetChainParameter & { + GetAccountParameter & + GetChainParameter & { /** Gas price oracle address. */ gasPriceOracleAddress?: Address | undefined } @@ -78,12 +78,12 @@ export type EstimateL1GasErrorType = * }) */ export async function estimateL1Gas< - TChain extends Chain | undefined, - TAccount extends Account | undefined, - TChainOverride extends Chain | undefined = undefined, + chain extends Chain | undefined, + account extends Account | undefined, + chainOverride extends Chain | undefined = undefined, >( - client: Client, - args: EstimateL1GasParameters, + client: Client, + args: EstimateL1GasParameters, ): Promise { const { chain = client.chain, diff --git a/src/op-stack/actions/estimateTotalFee.ts b/src/op-stack/actions/estimateTotalFee.ts index c83e402963..fe3c5eafbe 100644 --- a/src/op-stack/actions/estimateTotalFee.ts +++ b/src/op-stack/actions/estimateTotalFee.ts @@ -25,10 +25,10 @@ import { } from './estimateL1Fee.js' export type EstimateTotalFeeParameters< - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, - TChainOverride extends Chain | undefined = Chain | undefined, -> = EstimateL1FeeParameters + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, + chainOverride extends Chain | undefined = Chain | undefined, +> = EstimateL1FeeParameters export type EstimateTotalFeeReturnType = bigint @@ -63,12 +63,12 @@ export type EstimateTotalFeeErrorType = * }) */ export async function estimateTotalFee< - TChain extends Chain | undefined, - TAccount extends Account | undefined, - TChainOverride extends Chain | undefined = undefined, + chain extends Chain | undefined, + account extends Account | undefined, + chainOverride extends Chain | undefined = undefined, >( - client: Client, - args: EstimateTotalFeeParameters, + client: Client, + args: EstimateTotalFeeParameters, ): Promise { // Populate transaction with required fields to accurately estimate gas. const request = await prepareTransactionRequest( diff --git a/src/op-stack/actions/estimateTotalGas.ts b/src/op-stack/actions/estimateTotalGas.ts index a032b7fb58..5cbfdf9d6a 100644 --- a/src/op-stack/actions/estimateTotalGas.ts +++ b/src/op-stack/actions/estimateTotalGas.ts @@ -21,10 +21,10 @@ import { } from './estimateL1Gas.js' export type EstimateTotalGasParameters< - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, - TChainOverride extends Chain | undefined = Chain | undefined, -> = EstimateL1GasParameters + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, + chainOverride extends Chain | undefined = Chain | undefined, +> = EstimateL1GasParameters export type EstimateTotalGasReturnType = bigint @@ -58,12 +58,12 @@ export type EstimateTotalGasErrorType = * }) */ export async function estimateTotalGas< - TChain extends Chain | undefined, - TAccount extends Account | undefined, - TChainOverride extends Chain | undefined = undefined, + chain extends Chain | undefined, + account extends Account | undefined, + chainOverride extends Chain | undefined = undefined, >( - client: Client, - args: EstimateTotalGasParameters, + client: Client, + args: EstimateTotalGasParameters, ): Promise { // Populate transaction with required fields to accurately estimate gas. const request = await prepareTransactionRequest( diff --git a/src/op-stack/actions/getL1BaseFee.ts b/src/op-stack/actions/getL1BaseFee.ts index 41ba157e6d..20ec7ac98c 100644 --- a/src/op-stack/actions/getL1BaseFee.ts +++ b/src/op-stack/actions/getL1BaseFee.ts @@ -17,9 +17,9 @@ import { gasPriceOracleAbi } from '../abis.js' import { contracts } from '../contracts.js' export type GetL1BaseFeeParameters< - TChain extends Chain | undefined = Chain | undefined, - TChainOverride extends Chain | undefined = undefined, -> = GetChainParameter & { + chain extends Chain | undefined = Chain | undefined, + chainOverride extends Chain | undefined = undefined, +> = GetChainParameter & { /** Gas price oracle address. */ gasPriceOracleAddress?: Address | undefined } @@ -52,11 +52,11 @@ export type GetL1BaseFeeErrorType = * const l1BaseFee = await getL1BaseFee(client) */ export async function getL1BaseFee< - TChain extends Chain | undefined, - TChainOverride extends Chain | undefined = undefined, + chain extends Chain | undefined, + chainOverride extends Chain | undefined = undefined, >( - client: Client, - args?: GetL1BaseFeeParameters | undefined, + client: Client, + args?: GetL1BaseFeeParameters | undefined, ): Promise { const { chain = client.chain, diff --git a/src/op-stack/decorators/publicL1.ts b/src/op-stack/decorators/publicL1.ts index 72b1f03225..36155e9d74 100644 --- a/src/op-stack/decorators/publicL1.ts +++ b/src/op-stack/decorators/publicL1.ts @@ -661,12 +661,12 @@ export type PublicActionsL1< */ export function publicActionsL1() { return < - TTransport extends Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >( - client: Client, - ): PublicActionsL1 => { + client: Client, + ): PublicActionsL1 => { return { buildInitiateWithdrawal: (args) => buildInitiateWithdrawal(client, args), estimateDepositTransactionGas: (args) => diff --git a/src/op-stack/decorators/publicL2.ts b/src/op-stack/decorators/publicL2.ts index a45b35d035..43c8ecde43 100644 --- a/src/op-stack/decorators/publicL2.ts +++ b/src/op-stack/decorators/publicL2.ts @@ -489,12 +489,12 @@ export type PublicActionsL2< */ export function publicActionsL2() { return < - TTransport extends Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >( - client: Client, - ): PublicActionsL2 => { + client: Client, + ): PublicActionsL2 => { return { buildDepositTransaction: (args) => buildDepositTransaction(client, args), buildProveWithdrawal: (args) => buildProveWithdrawal(client, args), diff --git a/src/op-stack/decorators/walletL1.ts b/src/op-stack/decorators/walletL1.ts index 867c39c5ef..e5ced5ef8e 100644 --- a/src/op-stack/decorators/walletL1.ts +++ b/src/op-stack/decorators/walletL1.ts @@ -157,12 +157,12 @@ export type WalletActionsL1< */ export function walletActionsL1() { return < - TTransport extends Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >( - client: Client, - ): WalletActionsL1 => { + client: Client, + ): WalletActionsL1 => { return { depositTransaction: (args) => depositTransaction(client, args), finalizeWithdrawal: (args) => finalizeWithdrawal(client, args), diff --git a/src/op-stack/decorators/walletL2.ts b/src/op-stack/decorators/walletL2.ts index d4146e8c8a..7b78915c6e 100644 --- a/src/op-stack/decorators/walletL2.ts +++ b/src/op-stack/decorators/walletL2.ts @@ -88,12 +88,12 @@ export type WalletActionsL2< */ export function walletActionsL2() { return < - TTransport extends Transport, - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >( - client: Client, - ): WalletActionsL2 => { + client: Client, + ): WalletActionsL2 => { return { initiateWithdrawal: (args) => initiateWithdrawal(client, args), } diff --git a/src/op-stack/parsers.ts b/src/op-stack/parsers.ts index 2be11348e0..e5abe11631 100644 --- a/src/op-stack/parsers.ts +++ b/src/op-stack/parsers.ts @@ -19,29 +19,29 @@ import type { } from './types/transaction.js' export type ParseTransactionReturnType< - TSerialized extends + serialized extends OpStackTransactionSerialized = OpStackTransactionSerialized, - TType extends - OpStackTransactionType = GetSerializedTransactionType, -> = TSerialized extends TransactionSerializedDeposit + type extends + OpStackTransactionType = GetSerializedTransactionType, +> = serialized extends TransactionSerializedDeposit ? TransactionSerializableDeposit - : ParseTransactionReturnType_ + : ParseTransactionReturnType_ export type ParseTransactionErrorType = ParseTransactionErrorType_ | ErrorType export function parseTransaction< - TSerialized extends OpStackTransactionSerialized, ->(serializedTransaction: TSerialized): ParseTransactionReturnType { + serialized extends OpStackTransactionSerialized, +>(serializedTransaction: serialized): ParseTransactionReturnType { const serializedType = sliceHex(serializedTransaction, 0, 1) if (serializedType === '0x7e') return parseTransactionDeposit( serializedTransaction as TransactionSerializedDeposit, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType return parseTransaction_( serializedTransaction, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType } function parseTransactionDeposit( diff --git a/src/op-stack/types/block.ts b/src/op-stack/types/block.ts index dd8920a040..13f2694d19 100644 --- a/src/op-stack/types/block.ts +++ b/src/op-stack/types/block.ts @@ -10,13 +10,13 @@ export type OpStackBlockOverrides = { stateRoot: Hash } export type OpStackBlock< - TIncludeTransactions extends boolean = boolean, - TBlockTag extends BlockTag = BlockTag, + includeTransactions extends boolean = boolean, + blockTag extends BlockTag = BlockTag, > = Block< bigint, - TIncludeTransactions, - TBlockTag, - OpStackTransaction + includeTransactions, + blockTag, + OpStackTransaction > & OpStackBlockOverrides @@ -24,11 +24,11 @@ export type OpStackRpcBlockOverrides = { stateRoot: Hash } export type OpStackRpcBlock< - TBlockTag extends BlockTag = BlockTag, - TIncludeTransactions extends boolean = boolean, + blockTag extends BlockTag = BlockTag, + includeTransactions extends boolean = boolean, > = RpcBlock< - TBlockTag, - TIncludeTransactions, - OpStackRpcTransaction + blockTag, + includeTransactions, + OpStackRpcTransaction > & OpStackRpcBlockOverrides diff --git a/src/op-stack/types/transaction.ts b/src/op-stack/types/transaction.ts index 898333fa01..f69a8c5f64 100644 --- a/src/op-stack/types/transaction.ts +++ b/src/op-stack/types/transaction.ts @@ -17,23 +17,23 @@ import type { } from '../../types/transaction.js' import type { OneOf } from '../../types/utils.js' -type RpcTransaction = - RpcTransaction_ & { +type RpcTransaction = + RpcTransaction_ & { isSystemTx?: undefined mint?: undefined sourceHash?: undefined } -export type OpStackRpcDepositTransaction = - Omit, 'typeHex'> & +export type OpStackRpcDepositTransaction = + Omit, 'typeHex'> & FeeValuesEIP1559 & { isSystemTx?: boolean | undefined mint?: Hex | undefined sourceHash: Hex type: '0x7e' } -export type OpStackRpcTransaction = OneOf< - RpcTransaction | OpStackRpcDepositTransaction +export type OpStackRpcTransaction = OneOf< + RpcTransaction | OpStackRpcDepositTransaction > export type OpStackRpcTransactionReceiptOverrides = { @@ -45,18 +45,18 @@ export type OpStackRpcTransactionReceiptOverrides = { export type OpStackRpcTransactionReceipt = RpcTransactionReceipt & OpStackRpcTransactionReceiptOverrides -type Transaction = Transaction_< +type Transaction = Transaction_< bigint, number, - TPending + pending > & { isSystemTx?: undefined mint?: undefined sourceHash?: undefined } -export type OpStackDepositTransaction = - TransactionBase & +export type OpStackDepositTransaction = + TransactionBase & FeeValuesEIP1559 & { isSystemTx?: boolean mint?: bigint | undefined @@ -64,9 +64,9 @@ export type OpStackDepositTransaction = type: 'deposit' } -export type OpStackTransaction = - | Transaction - | OpStackDepositTransaction +export type OpStackTransaction = + | Transaction + | OpStackDepositTransaction export type OpStackTransactionReceiptOverrides = { l1GasPrice: bigint | null @@ -82,18 +82,18 @@ export type OpStackTransactionSerializable = OneOf< > export type OpStackTransactionSerialized< - TType extends OpStackTransactionType = OpStackTransactionType, -> = TType extends 'deposit' + type extends OpStackTransactionType = OpStackTransactionType, +> = type extends 'deposit' ? TransactionSerializedDeposit - : TransactionSerialized + : TransactionSerialized export type OpStackTransactionType = TransactionType | 'deposit' export type TransactionSerializableDeposit< - TQuantity = bigint, - TIndex = number, + quantity = bigint, + index = number, > = Omit< - TransactionSerializableBase, + TransactionSerializableBase, 'nonce' | 'r' | 's' | 'v' > & { from: Hex diff --git a/src/types/account.ts b/src/types/account.ts index 71a95ec5c7..0c45ea4041 100644 --- a/src/types/account.ts +++ b/src/types/account.ts @@ -9,23 +9,23 @@ export type DeriveAccount< > = accountOverride extends Account | Address ? accountOverride : account export type GetAccountParameter< - TAccount extends Account | undefined = Account | undefined, - TAccountOverride extends Account | Address | undefined = Account | Address, - TRequired extends boolean = true, -> = IsUndefined extends true - ? TRequired extends true - ? { account: TAccountOverride | Account | Address } - : { account?: TAccountOverride | Account | Address | undefined } - : { account?: TAccountOverride | Account | Address | undefined } + account extends Account | undefined = Account | undefined, + accountOverride extends Account | Address | undefined = Account | Address, + required extends boolean = true, +> = IsUndefined extends true + ? required extends true + ? { account: accountOverride | Account | Address } + : { account?: accountOverride | Account | Address | undefined } + : { account?: accountOverride | Account | Address | undefined } export type ParseAccount< - TAccountOrAddress extends Account | Address | undefined = + accountOrAddress extends Account | Address | undefined = | Account | Address | undefined, -> = TAccountOrAddress extends Address - ? Prettify> - : TAccountOrAddress +> = accountOrAddress extends Address + ? Prettify> + : accountOrAddress export type { Account } from '../accounts/types.js' export type { HDKey } from '@scure/bip32' diff --git a/src/types/block.ts b/src/types/block.ts index ef4b6dab8b..be2ad524fd 100644 --- a/src/types/block.ts +++ b/src/types/block.ts @@ -6,12 +6,12 @@ import type { Withdrawal } from './withdrawal.js' export type Block< quantity = bigint, - TIncludeTransactions extends boolean = boolean, - TBlockTag extends BlockTag = BlockTag, - TTransaction = Transaction< + includeTransactions extends boolean = boolean, + blockTag extends BlockTag = BlockTag, + transaction = Transaction< bigint, number, - TBlockTag extends 'pending' ? true : false + blockTag extends 'pending' ? true : false >, > = { /** Base fee per gas */ @@ -29,17 +29,17 @@ export type Block< /** Total used gas by all transactions in this block */ gasUsed: quantity /** Block hash or `null` if pending */ - hash: TBlockTag extends 'pending' ? null : Hash + hash: blockTag extends 'pending' ? null : Hash /** Logs bloom filter or `null` if pending */ - logsBloom: TBlockTag extends 'pending' ? null : Hex + logsBloom: blockTag extends 'pending' ? null : Hex /** Address that received this block’s mining rewards */ miner: Address /** Unique identifier for the block. */ mixHash: Hash /** Proof-of-work hash or `null` if pending */ - nonce: TBlockTag extends 'pending' ? null : Hex + nonce: blockTag extends 'pending' ? null : Hex /** Block number or `null` if pending */ - number: TBlockTag extends 'pending' ? null : quantity + number: blockTag extends 'pending' ? null : quantity /** Parent block hash */ parentHash: Hash /** Root of the this block’s receipts trie */ @@ -56,7 +56,7 @@ export type Block< /** Total difficulty of the chain until this block */ totalDifficulty: quantity | null /** List of transaction objects or hashes */ - transactions: TIncludeTransactions extends true ? TTransaction[] : Hash[] + transactions: includeTransactions extends true ? transaction[] : Hash[] /** Root of this block’s transaction trie */ transactionsRoot: Hash /** List of uncle hashes */ @@ -87,11 +87,11 @@ export type BlockTag = 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' export type Uncle< quantity = bigint, - TIncludeTransactions extends boolean = boolean, - TBlockTag extends BlockTag = BlockTag, - TTransaction = Transaction< + includeTransactions extends boolean = boolean, + blockTag extends BlockTag = BlockTag, + transaction = Transaction< bigint, number, - TBlockTag extends 'pending' ? true : false + blockTag extends 'pending' ? true : false >, -> = Block +> = Block diff --git a/src/types/contract.ts b/src/types/contract.ts index 6a1ba2774a..8502133e37 100644 --- a/src/types/contract.ts +++ b/src/types/contract.ts @@ -302,32 +302,32 @@ export type ExtractAbiItemForArgs< export type EventDefinition = `${string}(${string})` export type GetValue< - TAbi extends Abi | readonly unknown[], - TFunctionName extends string, - TValueType = TransactionRequest['value'], - TAbiFunction extends AbiFunction = TAbi extends Abi - ? ExtractAbiFunction + abi extends Abi | readonly unknown[], + functionName extends string, + valueType = TransactionRequest['value'], + abiFunction extends AbiFunction = abi extends Abi + ? ExtractAbiFunction : AbiFunction, - _Narrowable extends boolean = IsNarrowable, + _Narrowable extends boolean = IsNarrowable, > = _Narrowable extends true - ? TAbiFunction['stateMutability'] extends 'payable' - ? { value?: NoInfer | undefined } - : TAbiFunction['payable'] extends true - ? { value?: NoInfer | undefined } + ? abiFunction['stateMutability'] extends 'payable' + ? { value?: NoInfer | undefined } + : abiFunction['payable'] extends true + ? { value?: NoInfer | undefined } : { value?: undefined } - : { value?: NoInfer | undefined } + : { value?: NoInfer | undefined } ////////////////////////////////////////////////////////////////////////////////////////////////// -export type MaybeAbiEventName = - TAbiEvent extends AbiEvent ? TAbiEvent['name'] : undefined +export type MaybeAbiEventName = + abiEvent extends AbiEvent ? abiEvent['name'] : undefined export type MaybeExtractEventArgsFromAbi< - TAbi extends Abi | readonly unknown[] | undefined, - TEventName extends string | undefined, -> = TAbi extends Abi | readonly unknown[] - ? TEventName extends string - ? GetEventArgs + abi extends Abi | readonly unknown[] | undefined, + eventName extends string | undefined, +> = abi extends Abi | readonly unknown[] + ? eventName extends string + ? GetEventArgs : undefined : undefined @@ -335,19 +335,19 @@ export type MaybeExtractEventArgsFromAbi< // ABI item args export type GetEventArgs< - TAbi extends Abi | readonly unknown[], - TEventName extends string, - TConfig extends EventParameterOptions = DefaultEventParameterOptions, - TAbiEvent extends AbiEvent & { type: 'event' } = TAbi extends Abi - ? ExtractAbiEvent + abi extends Abi | readonly unknown[], + eventName extends string, + config extends EventParameterOptions = DefaultEventParameterOptions, + abiEvent extends AbiEvent & { type: 'event' } = abi extends Abi + ? ExtractAbiEvent : AbiEvent & { type: 'event' }, - TArgs = AbiEventParametersToPrimitiveTypes, + args = AbiEventParametersToPrimitiveTypes, FailedToParseArgs = - | ([TArgs] extends [never] ? true : false) - | (readonly unknown[] extends TArgs ? true : false), + | ([args] extends [never] ? true : false) + | (readonly unknown[] extends args ? true : false), > = true extends FailedToParseArgs ? readonly unknown[] | Record - : TArgs + : args ////////////////////////////////////////////////////////////////////// // ABI event types @@ -364,14 +364,15 @@ type DefaultEventParameterOptions = { } export type AbiEventParametersToPrimitiveTypes< - TAbiParameters extends readonly AbiParameter[], - Options extends EventParameterOptions = DefaultEventParameterOptions, + abiParameters extends readonly AbiParameter[], + // + _options extends EventParameterOptions = DefaultEventParameterOptions, // Remove non-indexed parameters based on `Options['IndexedOnly']` -> = TAbiParameters extends readonly [] +> = abiParameters extends readonly [] ? readonly [] : Filter< - TAbiParameters, - Options['IndexedOnly'] extends true ? { indexed: true } : object + abiParameters, + _options['IndexedOnly'] extends true ? { indexed: true } : object > extends infer Filtered extends readonly AbiParameter[] ? _HasUnnamedAbiParameter extends true ? // Has unnamed tuple parameters so return as array @@ -379,12 +380,12 @@ export type AbiEventParametersToPrimitiveTypes< ...{ [K in keyof Filtered]: AbiEventParameterToPrimitiveType< Filtered[K], - Options + _options > }, ] // Distribute over tuple to represent optional parameters - | (Options['Required'] extends true + | (_options['Required'] extends true ? never : // Distribute over tuple to represent optional parameters Filtered extends readonly [ @@ -393,7 +394,7 @@ export type AbiEventParametersToPrimitiveTypes< ] ? AbiEventParametersToPrimitiveTypes< readonly [...{ [K in keyof Head]: Omit }], - Options + _options > : never) : // All tuple parameters are named so return as object @@ -403,21 +404,23 @@ export type AbiEventParametersToPrimitiveTypes< } ? Name : never]?: - | AbiEventParameterToPrimitiveType + | AbiEventParameterToPrimitiveType | undefined } extends infer Mapped ? Prettify< MaybeRequired< Mapped, - Options['Required'] extends boolean ? Options['Required'] : false + _options['Required'] extends boolean + ? _options['Required'] + : false > > : never : never // TODO: Speed up by returning immediately as soon as named parameter is found. -type _HasUnnamedAbiParameter = - TAbiParameters extends readonly [ +type _HasUnnamedAbiParameter = + abiParameters extends readonly [ infer Head extends AbiParameter, ...infer Tail extends readonly AbiParameter[], ] @@ -432,13 +435,13 @@ type _HasUnnamedAbiParameter = * @internal */ export type LogTopicType< - TPrimitiveType = Hex, - TTopic extends LogTopic = LogTopic, -> = TTopic extends Hex - ? TPrimitiveType - : TTopic extends Hex[] - ? TPrimitiveType[] - : TTopic extends null + primitiveType = Hex, + topic extends LogTopic = LogTopic, +> = topic extends Hex + ? primitiveType + : topic extends Hex[] + ? primitiveType[] + : topic extends null ? null : never @@ -446,10 +449,11 @@ export type LogTopicType< * @internal */ export type AbiEventParameterToPrimitiveType< - TAbiParameter extends AbiParameter, - Options extends EventParameterOptions = DefaultEventParameterOptions, - _Type = AbiParameterToPrimitiveType, -> = Options['EnableUnion'] extends true ? LogTopicType<_Type> : _Type + abiParameter extends AbiParameter, + // + _options extends EventParameterOptions = DefaultEventParameterOptions, + _type = AbiParameterToPrimitiveType, +> = _options['EnableUnion'] extends true ? LogTopicType<_type> : _type type HashedEventTypes = 'bytes' | 'string' | 'tuple' | `${string}[${string}]` @@ -457,9 +461,9 @@ type HashedEventTypes = 'bytes' | 'string' | 'tuple' | `${string}[${string}]` * @internal */ export type AbiEventTopicToPrimitiveType< - TAbiParameter extends AbiParameter, - TTopic extends LogTopic, - TPrimitiveType = TAbiParameter['type'] extends HashedEventTypes - ? TTopic - : AbiParameterToPrimitiveType, -> = LogTopicType + abiParameter extends AbiParameter, + topic extends LogTopic, + primitiveType = abiParameter['type'] extends HashedEventTypes + ? topic + : AbiParameterToPrimitiveType, +> = LogTopicType diff --git a/src/types/eip1193.ts b/src/types/eip1193.ts index c4b1a68ded..05b4df108b 100644 --- a/src/types/eip1193.ts +++ b/src/types/eip1193.ts @@ -67,13 +67,13 @@ export type EIP1193EventMap = { } export type EIP1193Events = { - on( - event: TEvent, - listener: EIP1193EventMap[TEvent], + on( + event: event, + listener: EIP1193EventMap[event], ): void - removeListener( - event: TEvent, - listener: EIP1193EventMap[TEvent], + removeListener( + event: event, + listener: EIP1193EventMap[event], ): void } @@ -808,13 +808,13 @@ export type PublicRpcSchema = [ }, ] -export type TestRpcSchema = [ +export type TestRpcSchema = [ /** * @description Add information about compiled contracts * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_addcompilationresult */ { - Method: `${TMode}_addCompilationResult` + Method: `${mode}_addCompilationResult` Parameters: any[] ReturnType: any }, @@ -823,7 +823,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_droptransaction */ { - Method: `${TMode}_dropTransaction` + Method: `${mode}_dropTransaction` Parameters: [hash: Hash] ReturnType: void }, @@ -831,7 +831,7 @@ export type TestRpcSchema = [ * @description Serializes the current state (including contracts code, contract's storage, accounts properties, etc.) into a savable data blob. */ { - Method: `${TMode}_dumpState` + Method: `${mode}_dumpState` Parameters?: undefined ReturnType: Hex }, @@ -839,7 +839,7 @@ export type TestRpcSchema = [ * @description Turn on call traces for transactions that are returned to the user when they execute a transaction (instead of just txhash/receipt). */ { - Method: `${TMode}_enableTraces` + Method: `${mode}_enableTraces` Parameters?: undefined ReturnType: void }, @@ -848,7 +848,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_impersonateaccount */ { - Method: `${TMode}_impersonateAccount` + Method: `${mode}_impersonateAccount` Parameters: [address: Address] ReturnType: void }, @@ -857,7 +857,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_getautomine */ { - Method: `${TMode}_getAutomine` + Method: `${mode}_getAutomine` Parameters?: undefined ReturnType: boolean }, @@ -865,7 +865,7 @@ export type TestRpcSchema = [ * @description Adds state previously dumped with `dumpState` to the current chain. */ { - Method: `${TMode}_loadState` + Method: `${mode}_loadState` Parameters?: [Hex] | undefined ReturnType: void }, @@ -874,7 +874,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_mine */ { - Method: `${TMode}_mine` + Method: `${mode}_mine` Parameters: [ /** Number of blocks to mine. */ count: Hex, @@ -888,7 +888,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_reset */ { - Method: `${TMode}_reset` + Method: `${mode}_reset` Parameters: any[] ReturnType: void }, @@ -897,7 +897,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_setbalance */ { - Method: `${TMode}_setBalance` + Method: `${mode}_setBalance` Parameters: [ /** The address of the target account. */ address: Address, @@ -911,7 +911,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_setcode */ { - Method: `${TMode}_setCode` + Method: `${mode}_setCode` Parameters: [ /** The address of the contract. */ address: Address, @@ -925,7 +925,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_setcoinbase */ { - Method: `${TMode}_setCoinbase` + Method: `${mode}_setCoinbase` Parameters: [ /** The address to set as the coinbase address. */ address: Address, @@ -937,7 +937,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_setcoinbase */ { - Method: `${TMode}_setLoggingEnabled` + Method: `${mode}_setLoggingEnabled` Parameters: [enabled: boolean] ReturnType: void }, @@ -946,7 +946,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_setmingasprice */ { - Method: `${TMode}_setMinGasPrice` + Method: `${mode}_setMinGasPrice` Parameters: [gasPrice: Quantity] ReturnType: void }, @@ -955,7 +955,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_setnextblockbasefeepergas */ { - Method: `${TMode}_setNextBlockBaseFeePerGas` + Method: `${mode}_setNextBlockBaseFeePerGas` Parameters: [baseFeePerGas: Quantity] ReturnType: void }, @@ -964,7 +964,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_setnonce */ { - Method: `${TMode}_setNonce` + Method: `${mode}_setNonce` Parameters: [ /** The account address. */ address: Address, @@ -977,7 +977,7 @@ export type TestRpcSchema = [ * @description Sets the backend RPC URL. */ { - Method: `${TMode}_setRpcUrl` + Method: `${mode}_setRpcUrl` Parameters: [url: string] ReturnType: void }, @@ -986,7 +986,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_setstorageat */ { - Method: `${TMode}_setStorageAt` + Method: `${mode}_setStorageAt` Parameters: [ /** The account address. */ address: Address, @@ -1002,7 +1002,7 @@ export type TestRpcSchema = [ * @link https://hardhat.org/hardhat-network/docs/reference#hardhat_stopimpersonatingaccount */ { - Method: `${TMode}_stopImpersonatingAccount` + Method: `${mode}_stopImpersonatingAccount` Parameters: [ /** The address to stop impersonating. */ address: Address, @@ -1014,7 +1014,7 @@ export type TestRpcSchema = [ * @link https://github.com/trufflesuite/ganache/blob/ef1858d5d6f27e4baeb75cccd57fb3dc77a45ae8/src/chains/ethereum/ethereum/RPC-METHODS.md#evm_increasetime */ { - Method: `${TMode}_increaseTime` + Method: `${mode}_increaseTime` Parameters: [seconds: number] ReturnType: Quantity }, @@ -1064,7 +1064,7 @@ export type TestRpcSchema = [ * The timestamp of the next block will be computed as `lastBlock_timestamp` + `interval` */ { - Method: `${TMode}_setBlockTimestampInterval` + Method: `${mode}_setBlockTimestampInterval` Parameters: [seconds: number] ReturnType: void }, @@ -1072,7 +1072,7 @@ export type TestRpcSchema = [ * @description Removes `setBlockTimestampInterval` if it exists */ { - Method: `${TMode}_removeBlockTimestampInterval` + Method: `${mode}_removeBlockTimestampInterval` Parameters?: undefined ReturnType: void }, @@ -1507,18 +1507,18 @@ export type RpcSchema = readonly { export type RpcSchemaOverride = Omit export type EIP1193Parameters< - TRpcSchema extends RpcSchema | undefined = undefined, -> = TRpcSchema extends RpcSchema + rpcSchema extends RpcSchema | undefined = undefined, +> = rpcSchema extends RpcSchema ? { - [K in keyof TRpcSchema]: Prettify< + [K in keyof rpcSchema]: Prettify< { - method: TRpcSchema[K] extends TRpcSchema[number] - ? TRpcSchema[K]['Method'] + method: rpcSchema[K] extends rpcSchema[number] + ? rpcSchema[K]['Method'] : never - } & (TRpcSchema[K] extends TRpcSchema[number] - ? TRpcSchema[K]['Parameters'] extends undefined + } & (rpcSchema[K] extends rpcSchema[number] + ? rpcSchema[K]['Parameters'] extends undefined ? { params?: undefined } - : { params: TRpcSchema[K]['Parameters'] } + : { params: rpcSchema[K]['Parameters'] } : never) > }[number] @@ -1539,29 +1539,26 @@ export type EIP1193RequestOptions = { } type DerivedRpcSchema< - TRpcSchema extends RpcSchema | undefined, - TRpcSchemaOverride extends RpcSchemaOverride | undefined, -> = TRpcSchemaOverride extends RpcSchemaOverride - ? [TRpcSchemaOverride & { Method: string }] - : TRpcSchema + rpcSchema extends RpcSchema | undefined, + rpcSchemaOverride extends RpcSchemaOverride | undefined, +> = rpcSchemaOverride extends RpcSchemaOverride + ? [rpcSchemaOverride & { Method: string }] + : rpcSchema export type EIP1193RequestFn< - TRpcSchema extends RpcSchema | undefined = undefined, + rpcSchema extends RpcSchema | undefined = undefined, > = < - TRpcSchemaOverride extends RpcSchemaOverride | undefined = undefined, - TParameters extends EIP1193Parameters< - DerivedRpcSchema - > = EIP1193Parameters>, - _ReturnType = DerivedRpcSchema< - TRpcSchema, - TRpcSchemaOverride - > extends RpcSchema + rpcSchemaOverride extends RpcSchemaOverride | undefined = undefined, + _parameters extends EIP1193Parameters< + DerivedRpcSchema + > = EIP1193Parameters>, + _returnType = DerivedRpcSchema extends RpcSchema ? Extract< - DerivedRpcSchema[number], - { Method: TParameters['method'] } + DerivedRpcSchema[number], + { Method: _parameters['method'] } >['ReturnType'] : unknown, >( - args: TParameters, + args: _parameters, options?: EIP1193RequestOptions | undefined, -) => Promise<_ReturnType> +) => Promise<_returnType> diff --git a/src/types/filter.ts b/src/types/filter.ts index 7bd5a7ad01..403ced1df1 100644 --- a/src/types/filter.ts +++ b/src/types/filter.ts @@ -16,43 +16,43 @@ type FilterRpcSchema = Filter_< > export type Filter< - TFilterType extends FilterType = 'event', - TAbi extends Abi | readonly unknown[] | undefined = undefined, - TEventName extends string | undefined = undefined, - TArgs extends - | MaybeExtractEventArgsFromAbi - | undefined = MaybeExtractEventArgsFromAbi, - TStrict extends boolean | undefined = undefined, - TFromBlock extends BlockNumber | BlockTag | undefined = undefined, - TToBlock extends BlockNumber | BlockTag | undefined = undefined, + filterType extends FilterType = 'event', + abi extends Abi | readonly unknown[] | undefined = undefined, + eventName extends string | undefined = undefined, + args extends + | MaybeExtractEventArgsFromAbi + | undefined = MaybeExtractEventArgsFromAbi, + strict extends boolean | undefined = undefined, + fromBlock extends BlockNumber | BlockTag | undefined = undefined, + toBlock extends BlockNumber | BlockTag | undefined = undefined, > = { id: Hex request: EIP1193RequestFn - type: TFilterType -} & (TFilterType extends 'event' + type: filterType +} & (filterType extends 'event' ? { - fromBlock?: TFromBlock | undefined - toBlock?: TToBlock | undefined - } & (TAbi extends Abi - ? undefined extends TEventName + fromBlock?: fromBlock | undefined + toBlock?: toBlock | undefined + } & (abi extends Abi + ? undefined extends eventName ? { - abi: TAbi + abi: abi args?: undefined eventName?: undefined - strict: TStrict + strict: strict } - : TArgs extends MaybeExtractEventArgsFromAbi + : args extends MaybeExtractEventArgsFromAbi ? { - abi: TAbi - args: TArgs - eventName: TEventName - strict: TStrict + abi: abi + args: args + eventName: eventName + strict: strict } : { - abi: TAbi + abi: abi args?: undefined - eventName: TEventName - strict: TStrict + eventName: eventName + strict: strict } : { abi?: undefined diff --git a/src/types/log.ts b/src/types/log.ts index 17a336b603..eba8b6783e 100644 --- a/src/types/log.ts +++ b/src/types/log.ts @@ -13,57 +13,57 @@ import type { import type { Hash, Hex } from './misc.js' export type Log< - TQuantity = bigint, - TIndex = number, - TPending extends boolean = boolean, - TAbiEvent extends AbiEvent | undefined = undefined, - TStrict extends boolean | undefined = undefined, - TAbi extends Abi | readonly unknown[] | undefined = TAbiEvent extends AbiEvent - ? [TAbiEvent] + quantity = bigint, + index = number, + pending extends boolean = boolean, + abiEvent extends AbiEvent | undefined = undefined, + strict extends boolean | undefined = undefined, + abi extends Abi | readonly unknown[] | undefined = abiEvent extends AbiEvent + ? [abiEvent] : undefined, - TEventName extends string | undefined = TAbiEvent extends AbiEvent - ? TAbiEvent['name'] + eventName extends string | undefined = abiEvent extends AbiEvent + ? abiEvent['name'] : undefined, > = { /** The address from which this log originated */ address: Address /** Hash of block containing this log or `null` if pending */ - blockHash: TPending extends true ? null : Hash + blockHash: pending extends true ? null : Hash /** Number of block containing this log or `null` if pending */ - blockNumber: TPending extends true ? null : TQuantity + blockNumber: pending extends true ? null : quantity /** Contains the non-indexed arguments of the log */ data: Hex /** Index of this log within its block or `null` if pending */ - logIndex: TPending extends true ? null : TIndex + logIndex: pending extends true ? null : index /** Hash of the transaction that created this log or `null` if pending */ - transactionHash: TPending extends true ? null : Hash + transactionHash: pending extends true ? null : Hash /** Index of the transaction that created this log or `null` if pending */ - transactionIndex: TPending extends true ? null : TIndex + transactionIndex: pending extends true ? null : index /** `true` if this filter has been destroyed and is invalid */ removed: boolean -} & GetInferredLogValues +} & GetInferredLogValues type Topics< - THead extends AbiEvent['inputs'], - TBase = [Hex], -> = THead extends readonly [ + head extends AbiEvent['inputs'], + base = [Hex], +> = head extends readonly [ infer _Head, ...infer Tail extends AbiEvent['inputs'], ] ? _Head extends { indexed: true } ? [Hex, ...Topics] : Topics - : TBase + : base type GetTopics< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbi extends Abi | readonly unknown[] = [TAbiEvent], - TEventName extends string | undefined = TAbiEvent extends AbiEvent - ? TAbiEvent['name'] + abiEvent extends AbiEvent | undefined = undefined, + abi extends Abi | readonly unknown[] = [abiEvent], + eventName extends string | undefined = abiEvent extends AbiEvent + ? abiEvent['name'] : undefined, - _AbiEvent extends AbiEvent | undefined = TAbi extends Abi - ? TEventName extends string - ? ExtractAbiEvent + _AbiEvent extends AbiEvent | undefined = abi extends Abi + ? eventName extends string + ? ExtractAbiEvent : undefined : undefined, _Args = _AbiEvent extends AbiEvent @@ -74,58 +74,58 @@ type GetTopics< | (readonly unknown[] extends _Args ? true : false), > = true extends _FailedToParseArgs ? [Hex, ...Hex[]] | [] - : TAbiEvent extends AbiEvent - ? Topics + : abiEvent extends AbiEvent + ? Topics : _AbiEvent extends AbiEvent ? Topics<_AbiEvent['inputs']> : [Hex, ...Hex[]] | [] type GetInferredLogValues< - TAbiEvent extends AbiEvent | undefined = undefined, - TAbi extends Abi | readonly unknown[] | undefined = TAbiEvent extends AbiEvent - ? [TAbiEvent] + abiEvent extends AbiEvent | undefined = undefined, + abi extends Abi | readonly unknown[] | undefined = abiEvent extends AbiEvent + ? [abiEvent] : undefined, - TEventName extends string | undefined = TAbiEvent extends AbiEvent - ? TAbiEvent['name'] + eventName extends string | undefined = abiEvent extends AbiEvent + ? abiEvent['name'] : undefined, - TStrict extends boolean | undefined = undefined, - _EventNames extends string = TAbi extends Abi - ? Abi extends TAbi + strict extends boolean | undefined = undefined, + _EventNames extends string = abi extends Abi + ? Abi extends abi ? string - : ExtractAbiEventNames + : ExtractAbiEventNames : string, -> = TAbi extends Abi - ? TEventName extends string +> = abi extends Abi + ? eventName extends string ? { args: GetEventArgs< - TAbi, - TEventName, + abi, + eventName, { EnableUnion: false IndexedOnly: false - Required: TStrict extends boolean ? TStrict : false + Required: strict extends boolean ? strict : false } > /** The event name decoded from `topics`. */ - eventName: TEventName + eventName: eventName /** List of order-dependent topics */ - topics: GetTopics + topics: GetTopics } : { - [TName in _EventNames]: { + [name in _EventNames]: { args: GetEventArgs< - TAbi, - TName, + abi, + name, { EnableUnion: false IndexedOnly: false - Required: TStrict extends boolean ? TStrict : false + Required: strict extends boolean ? strict : false } > /** The event name decoded from `topics`. */ - eventName: TName + eventName: name /** List of order-dependent topics */ - topics: GetTopics + topics: GetTopics } }[_EventNames] : { diff --git a/src/types/proof.ts b/src/types/proof.ts index 093289fd9c..db54466f7f 100644 --- a/src/types/proof.ts +++ b/src/types/proof.ts @@ -3,18 +3,18 @@ import type { Hash } from './misc.js' type AccountProof = Hash -type StorageProof = { +type StorageProof = { key: Hash proof: Hash[] - value: TQuantity + value: quantity } -export type Proof = { +export type Proof = { address: Address - balance: TQuantity + balance: quantity codeHash: Hash - nonce: TIndex + nonce: index storageHash: Hash accountProof: AccountProof[] - storageProof: StorageProof[] + storageProof: StorageProof[] } diff --git a/src/types/rpc.ts b/src/types/rpc.ts index add792a9f2..02754ee344 100644 --- a/src/types/rpc.ts +++ b/src/types/rpc.ts @@ -30,10 +30,10 @@ export type Status = '0x0' | '0x1' export type TransactionType = '0x0' | '0x1' | '0x2' | (string & {}) export type RpcBlock< - TBlockTag extends BlockTag = BlockTag, - TIncludeTransactions extends boolean = boolean, - TTransaction = RpcTransaction, -> = Block + blockTag extends BlockTag = BlockTag, + includeTransactions extends boolean = boolean, + transaction = RpcTransaction, +> = Block export type RpcBlockNumber = BlockNumber export type RpcBlockIdentifier = BlockIdentifier export type RpcUncle = Uncle @@ -55,18 +55,18 @@ export type RpcTransactionRequest = OneOf< > // `yParity` is optional on the RPC type as some nodes do not return it // for 1559 & 2930 transactions (they should!). -export type RpcTransaction = OneOf< - | Omit, 'typeHex'> +export type RpcTransaction = OneOf< + | Omit, 'typeHex'> | PartialBy< - Omit, 'typeHex'>, + Omit, 'typeHex'>, 'yParity' > | PartialBy< - Omit, 'typeHex'>, + Omit, 'typeHex'>, 'yParity' > | PartialBy< - Omit, 'typeHex'>, + Omit, 'typeHex'>, 'yParity' > > diff --git a/src/types/transport.ts b/src/types/transport.ts index 9b4bc06ce0..b8b37e8b89 100644 --- a/src/types/transport.ts +++ b/src/types/transport.ts @@ -2,8 +2,8 @@ import type { Transport } from '../clients/transports/createTransport.js' import type { FallbackTransport } from '../clients/transports/fallback.js' import type { Some } from './utils.js' -export type GetTransportConfig = - ReturnType['config'] +export type GetTransportConfig = + ReturnType['config'] export type GetPollOptions = | (HasTransportType extends true diff --git a/src/types/utils.ts b/src/types/utils.ts index 18d3d1dc97..dff3217ca8 100644 --- a/src/types/utils.ts +++ b/src/types/utils.ts @@ -110,7 +110,7 @@ export type IsUndefined = [undefined] extends [T] ? true : false export type MaybePromise = T | Promise /** - * @description Makes attributes on the type T required if TRequired is true. + * @description Makes attributes on the type T required if required is true. * * @example * MaybeRequired<{ a: string, b?: number }, true> @@ -119,7 +119,7 @@ export type MaybePromise = T | Promise * MaybeRequired<{ a: string, b?: number }, false> * => { a: string, b?: number } */ -export type MaybeRequired = TRequired extends true +export type MaybeRequired = required extends true ? ExactRequired : T diff --git a/src/utils/abi/decodeAbiParameters.ts b/src/utils/abi/decodeAbiParameters.ts index dc33d71393..c0fd7024f9 100644 --- a/src/utils/abi/decodeAbiParameters.ts +++ b/src/utils/abi/decodeAbiParameters.ts @@ -36,9 +36,9 @@ import { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js' import { getArrayComponents } from './encodeAbiParameters.js' export type DecodeAbiParametersReturnType< - TParams extends readonly AbiParameter[] = readonly AbiParameter[], + params extends readonly AbiParameter[] = readonly AbiParameter[], > = AbiParametersToPrimitiveTypes< - TParams extends readonly AbiParameter[] ? TParams : AbiParameter[] + params extends readonly AbiParameter[] ? params : AbiParameter[] > export type DecodeAbiParametersErrorType = @@ -50,11 +50,11 @@ export type DecodeAbiParametersErrorType = | ErrorType export function decodeAbiParameters< - const TParams extends readonly AbiParameter[], + const params extends readonly AbiParameter[], >( - params: TParams, + params: params, data: ByteArray | Hex, -): DecodeAbiParametersReturnType { +): DecodeAbiParametersReturnType { const bytes = typeof data === 'string' ? hexToBytes(data) : data const cursor = createCursor(bytes) @@ -78,7 +78,7 @@ export function decodeAbiParameters< consumed += consumed_ values.push(data) } - return values as DecodeAbiParametersReturnType + return values as DecodeAbiParametersReturnType } type DecodeParameterErrorType = diff --git a/src/utils/abi/decodeErrorResult.ts b/src/utils/abi/decodeErrorResult.ts index b9694354da..87672261b0 100644 --- a/src/utils/abi/decodeErrorResult.ts +++ b/src/utils/abi/decodeErrorResult.ts @@ -62,9 +62,9 @@ export type DecodeErrorResultErrorType = | ToFunctionSelectorErrorType | ErrorType -export function decodeErrorResult( - parameters: DecodeErrorResultParameters, -): DecodeErrorResultReturnType { +export function decodeErrorResult( + parameters: DecodeErrorResultParameters, +): DecodeErrorResultReturnType { const { abi, data } = parameters as DecodeErrorResultParameters const signature = slice(data, 0, 4) @@ -86,5 +86,5 @@ export function decodeErrorResult( ? decodeAbiParameters(abiItem.inputs, slice(data, 4)) : undefined, errorName: (abiItem as { name: string }).name, - } as DecodeErrorResultReturnType + } as DecodeErrorResultReturnType } diff --git a/src/utils/abi/encodeAbiParameters.ts b/src/utils/abi/encodeAbiParameters.ts index e482214d0d..529fb3ef98 100644 --- a/src/utils/abi/encodeAbiParameters.ts +++ b/src/utils/abi/encodeAbiParameters.ts @@ -81,11 +81,11 @@ export type EncodeAbiParametersErrorType = * ``` */ export function encodeAbiParameters< - const TParams extends readonly AbiParameter[] | readonly unknown[], + const params extends readonly AbiParameter[] | readonly unknown[], >( - params: TParams, - values: TParams extends readonly AbiParameter[] - ? AbiParametersToPrimitiveTypes + params: params, + values: params extends readonly AbiParameter[] + ? AbiParametersToPrimitiveTypes : never, ): EncodeAbiParametersReturnType { if (params.length !== values.length) @@ -112,12 +112,12 @@ type Tuple = AbiParameterToPrimitiveType type PrepareParamsErrorType = PrepareParamErrorType | ErrorType -function prepareParams({ +function prepareParams({ params, values, }: { - params: TParams - values: AbiParametersToPrimitiveTypes + params: params + values: AbiParametersToPrimitiveTypes }) { const preparedParams: PreparedParam[] = [] for (let i = 0; i < params.length; i++) { @@ -138,12 +138,12 @@ type PrepareParamErrorType = | InvalidAbiEncodingTypeErrorType | ErrorType -function prepareParam({ +function prepareParam({ param, value, }: { - param: TParam - value: AbiParameterToPrimitiveType + param: param + value: AbiParameterToPrimitiveType }): PreparedParam { const arrayComponents = getArrayComponents(param.type) if (arrayComponents) { @@ -230,14 +230,14 @@ type EncodeArrayErrorType = // | PrepareParamErrorType | ErrorType -function encodeArray( - value: AbiParameterToPrimitiveType, +function encodeArray( + value: AbiParameterToPrimitiveType, { length, param, }: { length: number | null - param: TParam + param: param }, ): PreparedParam { const dynamic = length === null @@ -283,9 +283,9 @@ type EncodeBytesErrorType = | SizeErrorType | ErrorType -function encodeBytes( +function encodeBytes( value: Hex, - { param }: { param: TParam }, + { param }: { param: param }, ): PreparedParam { const [, paramSize] = param.type.split('bytes') const bytesSize = size(value) @@ -373,10 +373,10 @@ type EncodeTupleErrorType = | ErrorType function encodeTuple< - const TParam extends AbiParameter & { components: readonly AbiParameter[] }, + const param extends AbiParameter & { components: readonly AbiParameter[] }, >( - value: AbiParameterToPrimitiveType, - { param }: { param: TParam }, + value: AbiParameterToPrimitiveType, + { param }: { param: param }, ): PreparedParam { let dynamic = false const preparedParams: PreparedParam[] = [] diff --git a/src/utils/abi/encodePacked.ts b/src/utils/abi/encodePacked.ts index 394b7c8998..6f5781cf60 100644 --- a/src/utils/abi/encodePacked.ts +++ b/src/utils/abi/encodePacked.ts @@ -45,10 +45,10 @@ type PackedAbiType = | SolidityArrayWithoutTuple type EncodePackedValues< - TPackedAbiTypes extends readonly PackedAbiType[] | readonly unknown[], + packedAbiTypes extends readonly PackedAbiType[] | readonly unknown[], > = { - [K in keyof TPackedAbiTypes]: TPackedAbiTypes[K] extends AbiType - ? AbiParameterToPrimitiveType<{ type: TPackedAbiTypes[K] }> + [K in keyof packedAbiTypes]: packedAbiTypes[K] extends AbiType + ? AbiParameterToPrimitiveType<{ type: packedAbiTypes[K] }> : unknown } @@ -59,8 +59,8 @@ export type EncodePackedErrorType = | ErrorType export function encodePacked< - const TPackedAbiTypes extends readonly PackedAbiType[] | readonly unknown[], ->(types: TPackedAbiTypes, values: EncodePackedValues): Hex { + const packedAbiTypes extends readonly PackedAbiType[] | readonly unknown[], +>(types: packedAbiTypes, values: EncodePackedValues): Hex { if (types.length !== values.length) throw new AbiEncodingLengthMismatchError({ expectedLength: types.length as number, @@ -87,9 +87,9 @@ type EncodeErrorType = | UnsupportedPackedAbiType | ErrorType -function encode( - type: TPackedAbiType, - value: EncodePackedValues<[TPackedAbiType]>[0], +function encode( + type: packedAbiType, + value: EncodePackedValues<[packedAbiType]>[0], isArray = false, ): Hex { if (type === 'address') { diff --git a/src/utils/ccip.ts b/src/utils/ccip.ts index 19cdb7b839..908eb5b991 100644 --- a/src/utils/ccip.ts +++ b/src/utils/ccip.ts @@ -56,8 +56,8 @@ export const offchainLookupAbiItem = { export type OffchainLookupErrorType = OffchainLookupErrorType_ | ErrorType -export async function offchainLookup( - client: Client, +export async function offchainLookup( + client: Client, { blockNumber, blockTag, diff --git a/src/utils/data/concat.ts b/src/utils/data/concat.ts index 63589d0a05..8635774838 100644 --- a/src/utils/data/concat.ts +++ b/src/utils/data/concat.ts @@ -1,20 +1,21 @@ import type { ErrorType } from '../../errors/utils.js' import type { ByteArray, Hex } from '../../types/misc.js' -export type ConcatReturnType = - TValue extends Hex ? Hex : ByteArray +export type ConcatReturnType = value extends Hex + ? Hex + : ByteArray export type ConcatErrorType = | ConcatBytesErrorType | ConcatHexErrorType | ErrorType -export function concat( - values: readonly TValue[], -): ConcatReturnType { +export function concat( + values: readonly value[], +): ConcatReturnType { if (typeof values[0] === 'string') - return concatHex(values as readonly Hex[]) as ConcatReturnType - return concatBytes(values as readonly ByteArray[]) as ConcatReturnType + return concatHex(values as readonly Hex[]) as ConcatReturnType + return concatBytes(values as readonly ByteArray[]) as ConcatReturnType } export type ConcatBytesErrorType = ErrorType diff --git a/src/utils/data/pad.ts b/src/utils/data/pad.ts index 9cd5b1e279..1845ebb732 100644 --- a/src/utils/data/pad.ts +++ b/src/utils/data/pad.ts @@ -9,19 +9,19 @@ type PadOptions = { dir?: 'left' | 'right' | undefined size?: number | null | undefined } -export type PadReturnType = TValue extends Hex +export type PadReturnType = value extends Hex ? Hex : ByteArray export type PadErrorType = PadHexErrorType | PadBytesErrorType | ErrorType -export function pad( - hexOrBytes: TValue, +export function pad( + hexOrBytes: value, { dir, size = 32 }: PadOptions = {}, -): PadReturnType { +): PadReturnType { if (typeof hexOrBytes === 'string') - return padHex(hexOrBytes, { dir, size }) as PadReturnType - return padBytes(hexOrBytes, { dir, size }) as PadReturnType + return padHex(hexOrBytes, { dir, size }) as PadReturnType + return padBytes(hexOrBytes, { dir, size }) as PadReturnType } export type PadHexErrorType = SizeExceedsPaddingSizeErrorType | ErrorType diff --git a/src/utils/data/slice.ts b/src/utils/data/slice.ts index 08334cad87..b5a195ef1d 100644 --- a/src/utils/data/slice.ts +++ b/src/utils/data/slice.ts @@ -8,7 +8,7 @@ import type { ByteArray, Hex } from '../../types/misc.js' import { type IsHexErrorType, isHex } from './isHex.js' import { type SizeErrorType, size } from './size.js' -export type SliceReturnType = TValue extends Hex +export type SliceReturnType = value extends Hex ? Hex : ByteArray @@ -25,19 +25,19 @@ export type SliceErrorType = * @param start The start offset (in bytes). * @param end The end offset (in bytes). */ -export function slice( - value: TValue, +export function slice( + value: value, start?: number | undefined, end?: number | undefined, { strict }: { strict?: boolean | undefined } = {}, -): SliceReturnType { +): SliceReturnType { if (isHex(value, { strict: false })) return sliceHex(value as Hex, start, end, { strict, - }) as SliceReturnType + }) as SliceReturnType return sliceBytes(value as ByteArray, start, end, { strict, - }) as SliceReturnType + }) as SliceReturnType } export type AssertStartOffsetErrorType = diff --git a/src/utils/data/trim.ts b/src/utils/data/trim.ts index 3877ebf140..2bd596998a 100644 --- a/src/utils/data/trim.ts +++ b/src/utils/data/trim.ts @@ -4,16 +4,16 @@ import type { ByteArray, Hex } from '../../types/misc.js' type TrimOptions = { dir?: 'left' | 'right' | undefined } -export type TrimReturnType = TValue extends Hex +export type TrimReturnType = value extends Hex ? Hex : ByteArray export type TrimErrorType = ErrorType -export function trim( - hexOrBytes: TValue, +export function trim( + hexOrBytes: value, { dir = 'left' }: TrimOptions = {}, -): TrimReturnType { +): TrimReturnType { let data: any = typeof hexOrBytes === 'string' ? hexOrBytes.replace('0x', '') : hexOrBytes @@ -32,7 +32,7 @@ export function trim( if (data.length === 1 && dir === 'right') data = `${data}0` return `0x${ data.length % 2 === 1 ? `0${data}` : data - }` as TrimReturnType + }` as TrimReturnType } - return data as TrimReturnType + return data as TrimReturnType } diff --git a/src/utils/encoding/fromBytes.ts b/src/utils/encoding/fromBytes.ts index b5e5766c7e..97f91295f9 100644 --- a/src/utils/encoding/fromBytes.ts +++ b/src/utils/encoding/fromBytes.ts @@ -14,25 +14,25 @@ import { import { type BytesToHexErrorType, bytesToHex } from './toHex.js' export type FromBytesParameters< - TTo extends 'string' | 'hex' | 'bigint' | 'number' | 'boolean', + to extends 'string' | 'hex' | 'bigint' | 'number' | 'boolean', > = - | TTo + | to | { /** Size of the bytes. */ size?: number | undefined /** Type to convert to. */ - to: TTo + to: to } -export type FromBytesReturnType = TTo extends 'string' +export type FromBytesReturnType = to extends 'string' ? string - : TTo extends 'hex' + : to extends 'hex' ? Hex - : TTo extends 'bigint' + : to extends 'bigint' ? bigint - : TTo extends 'number' + : to extends 'number' ? number - : TTo extends 'boolean' + : to extends 'boolean' ? boolean : never @@ -68,23 +68,23 @@ export type FromBytesErrorType = * // 'Hello world' */ export function fromBytes< - TTo extends 'string' | 'hex' | 'bigint' | 'number' | 'boolean', + to extends 'string' | 'hex' | 'bigint' | 'number' | 'boolean', >( bytes: ByteArray, - toOrOpts: FromBytesParameters, -): FromBytesReturnType { + toOrOpts: FromBytesParameters, +): FromBytesReturnType { const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts const to = opts.to if (to === 'number') - return bytesToNumber(bytes, opts) as FromBytesReturnType + return bytesToNumber(bytes, opts) as FromBytesReturnType if (to === 'bigint') - return bytesToBigInt(bytes, opts) as FromBytesReturnType + return bytesToBigInt(bytes, opts) as FromBytesReturnType if (to === 'boolean') - return bytesToBool(bytes, opts) as FromBytesReturnType + return bytesToBool(bytes, opts) as FromBytesReturnType if (to === 'string') - return bytesToString(bytes, opts) as FromBytesReturnType - return bytesToHex(bytes, opts) as FromBytesReturnType + return bytesToString(bytes, opts) as FromBytesReturnType + return bytesToHex(bytes, opts) as FromBytesReturnType } export type BytesToBigIntOpts = { diff --git a/src/utils/encoding/fromHex.ts b/src/utils/encoding/fromHex.ts index 89d82db554..05b41a3328 100644 --- a/src/utils/encoding/fromHex.ts +++ b/src/utils/encoding/fromHex.ts @@ -28,25 +28,25 @@ export function assertSize( } export type FromHexParameters< - TTo extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean', + to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean', > = - | TTo + | to | { /** Size (in bytes) of the hex value. */ size?: number | undefined /** Type to convert to. */ - to: TTo + to: to } -export type FromHexReturnType = TTo extends 'string' +export type FromHexReturnType = to extends 'string' ? string - : TTo extends 'bigint' + : to extends 'bigint' ? bigint - : TTo extends 'number' + : to extends 'number' ? number - : TTo extends 'bytes' + : to extends 'bytes' ? ByteArray - : TTo extends 'boolean' + : to extends 'boolean' ? boolean : never @@ -87,16 +87,16 @@ export type FromHexErrorType = * // 'Hello world' */ export function fromHex< - TTo extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean', ->(hex: Hex, toOrOpts: FromHexParameters): FromHexReturnType { + to extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean', +>(hex: Hex, toOrOpts: FromHexParameters): FromHexReturnType { const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts const to = opts.to - if (to === 'number') return hexToNumber(hex, opts) as FromHexReturnType - if (to === 'bigint') return hexToBigInt(hex, opts) as FromHexReturnType - if (to === 'string') return hexToString(hex, opts) as FromHexReturnType - if (to === 'boolean') return hexToBool(hex, opts) as FromHexReturnType - return hexToBytes(hex, opts) as FromHexReturnType + if (to === 'number') return hexToNumber(hex, opts) as FromHexReturnType + if (to === 'bigint') return hexToBigInt(hex, opts) as FromHexReturnType + if (to === 'string') return hexToString(hex, opts) as FromHexReturnType + if (to === 'boolean') return hexToBool(hex, opts) as FromHexReturnType + return hexToBytes(hex, opts) as FromHexReturnType } export type HexToBigIntOpts = { diff --git a/src/utils/ens/avatar/parseAvatarRecord.ts b/src/utils/ens/avatar/parseAvatarRecord.ts index 34746790cf..ddb4eef398 100644 --- a/src/utils/ens/avatar/parseAvatarRecord.ts +++ b/src/utils/ens/avatar/parseAvatarRecord.ts @@ -34,8 +34,8 @@ export type ParseAvatarRecordErrorType = * @see https://docs.ens.domains/web/avatars * */ -export async function parseAvatarRecord( - client: Client, +export async function parseAvatarRecord( + client: Client, { gatewayUrls, record, @@ -58,8 +58,8 @@ type ParseNftAvatarUriErrorType = | GetMetadataAvatarUriErrorType | ErrorType -async function parseNftAvatarUri( - client: Client, +async function parseNftAvatarUri( + client: Client, { gatewayUrls, record, diff --git a/src/utils/ens/avatar/utils.ts b/src/utils/ens/avatar/utils.ts index eccb43c54f..0e458549dd 100644 --- a/src/utils/ens/avatar/utils.ts +++ b/src/utils/ens/avatar/utils.ts @@ -258,8 +258,8 @@ export type GetNftTokenUriErrorType = | EnsAvatarUnsupportedNamespaceErrorType | ErrorType -export async function getNftTokenUri( - client: Client, +export async function getNftTokenUri( + client: Client, { nft }: { nft: ParsedNft }, ) { if (nft.namespace === 'erc721') { diff --git a/src/utils/filters/createFilterRequestScope.ts b/src/utils/filters/createFilterRequestScope.ts index 90f8d552e6..b85d15b1b8 100644 --- a/src/utils/filters/createFilterRequestScope.ts +++ b/src/utils/filters/createFilterRequestScope.ts @@ -28,8 +28,8 @@ type CreateFilterRequestScopeReturnType = ( * listen for responses and scope the child transport `request` function * to the successful filter ID. */ -export function createFilterRequestScope( - client: Client, +export function createFilterRequestScope( + client: Client, { method }: CreateFilterRequestScopeParameters, ): CreateFilterRequestScopeReturnType { const requestMap: Record = {} diff --git a/src/utils/formatters/block.ts b/src/utils/formatters/block.ts index 207ca76f26..5ba46f978b 100644 --- a/src/utils/formatters/block.ts +++ b/src/utils/formatters/block.ts @@ -15,24 +15,24 @@ import { type FormattedTransaction, formatTransaction } from './transaction.js' type BlockPendingDependencies = 'hash' | 'logsBloom' | 'nonce' | 'number' export type FormattedBlock< - TChain extends Chain | undefined = undefined, - TIncludeTransactions extends boolean = boolean, - TBlockTag extends BlockTag = BlockTag, + chain extends Chain | undefined = undefined, + includeTransactions extends boolean = boolean, + blockTag extends BlockTag = BlockTag, _FormatterReturnType = ExtractChainFormatterReturnType< - TChain, + chain, 'block', - Block + Block >, _ExcludedPendingDependencies extends string = BlockPendingDependencies & - ExtractChainFormatterExclude, + ExtractChainFormatterExclude, _Formatted = Omit<_FormatterReturnType, BlockPendingDependencies> & { [_key in _ExcludedPendingDependencies]: never } & Pick< - Block, + Block, BlockPendingDependencies >, - _Transactions = TIncludeTransactions extends true - ? Prettify>[] + _Transactions = includeTransactions extends true + ? Prettify>[] : Hash[], > = Omit<_Formatted, 'transactions'> & { transactions: _Transactions diff --git a/src/utils/formatters/formatter.ts b/src/utils/formatters/formatter.ts index 3f830a6a55..736ee5e100 100644 --- a/src/utils/formatters/formatter.ts +++ b/src/utils/formatters/formatter.ts @@ -3,24 +3,24 @@ import type { Prettify } from '../../types/utils.js' export type DefineFormatterErrorType = ErrorType -export function defineFormatter( - type: TType, - format: (_: TParameters) => TReturnType, +export function defineFormatter( + type: type, + format: (_: parameters) => returnType, ) { return < - TOverrideParameters, - TOverrideReturnType, - TExclude extends (keyof TParameters | keyof TOverrideParameters)[] = [], + parametersOverride, + returnTypeOverride, + exclude extends (keyof parameters | keyof parametersOverride)[] = [], >({ exclude, format: overrides, }: { - exclude?: TExclude | undefined - format: (_: TOverrideParameters) => TOverrideReturnType + exclude?: exclude | undefined + format: (_: parametersOverride) => returnTypeOverride }) => { return { exclude, - format: (args: TOverrideParameters) => { + format: (args: parametersOverride) => { const formatted = format(args as any) if (exclude) { for (const key of exclude) { @@ -30,8 +30,8 @@ export function defineFormatter( return { ...formatted, ...overrides(args), - } as Prettify & { - [_key in TExclude[number]]: never + } as Prettify & { + [_key in exclude[number]]: never } }, type, diff --git a/src/utils/formatters/transaction.ts b/src/utils/formatters/transaction.ts index 4b07748b31..bb5311f4c2 100644 --- a/src/utils/formatters/transaction.ts +++ b/src/utils/formatters/transaction.ts @@ -18,19 +18,19 @@ type TransactionPendingDependencies = | 'transactionIndex' export type FormattedTransaction< - TChain extends Chain | undefined = undefined, - TBlockTag extends BlockTag = BlockTag, + chain extends Chain | undefined = undefined, + blockTag extends BlockTag = BlockTag, _FormatterReturnType = ExtractChainFormatterReturnType< - TChain, + chain, 'transaction', Transaction >, _ExcludedPendingDependencies extends string = TransactionPendingDependencies & - ExtractChainFormatterExclude, + ExtractChainFormatterExclude, > = UnionLooseOmit<_FormatterReturnType, TransactionPendingDependencies> & { [_K in _ExcludedPendingDependencies]: never } & Pick< - Transaction, + Transaction, TransactionPendingDependencies > diff --git a/src/utils/formatters/transactionReceipt.ts b/src/utils/formatters/transactionReceipt.ts index 6224c8c24c..1ce64b9312 100644 --- a/src/utils/formatters/transactionReceipt.ts +++ b/src/utils/formatters/transactionReceipt.ts @@ -13,9 +13,9 @@ import { formatLog } from './log.js' import { transactionType } from './transaction.js' export type FormattedTransactionReceipt< - TChain extends Chain | undefined = undefined, + chain extends Chain | undefined = undefined, > = ExtractChainFormatterReturnType< - TChain, + chain, 'transactionReceipt', TransactionReceipt > diff --git a/src/utils/formatters/transactionRequest.ts b/src/utils/formatters/transactionRequest.ts index 6816c996b6..23feb76f4e 100644 --- a/src/utils/formatters/transactionRequest.ts +++ b/src/utils/formatters/transactionRequest.ts @@ -11,9 +11,9 @@ import { bytesToHex, numberToHex } from '../encoding/toHex.js' import { type DefineFormatterErrorType, defineFormatter } from './formatter.js' export type FormattedTransactionRequest< - TChain extends Chain | undefined = Chain | undefined, + chain extends Chain | undefined = Chain | undefined, > = ExtractChainFormatterParameters< - TChain, + chain, 'transactionRequest', TransactionRequest > diff --git a/src/utils/hash/keccak256.ts b/src/utils/hash/keccak256.ts index 540b8fadf9..abdb5733b3 100644 --- a/src/utils/hash/keccak256.ts +++ b/src/utils/hash/keccak256.ts @@ -8,9 +8,9 @@ import { type ToHexErrorType, toHex } from '../encoding/toHex.js' type To = 'hex' | 'bytes' -export type Keccak256Hash = - | (TTo extends 'bytes' ? ByteArray : never) - | (TTo extends 'hex' ? Hex : never) +export type Keccak256Hash = + | (to extends 'bytes' ? ByteArray : never) + | (to extends 'hex' ? Hex : never) export type Keccak256ErrorType = | IsHexErrorType @@ -18,14 +18,14 @@ export type Keccak256ErrorType = | ToHexErrorType | ErrorType -export function keccak256( +export function keccak256( value: Hex | ByteArray, - to_?: TTo | undefined, -): Keccak256Hash { + to_?: to | undefined, +): Keccak256Hash { const to = to_ || 'hex' const bytes = keccak_256( isHex(value, { strict: false }) ? toBytes(value) : value, ) - if (to === 'bytes') return bytes as Keccak256Hash - return toHex(bytes) as Keccak256Hash + if (to === 'bytes') return bytes as Keccak256Hash + return toHex(bytes) as Keccak256Hash } diff --git a/src/utils/hash/ripemd160.ts b/src/utils/hash/ripemd160.ts index 859b5be2f4..2bd482a08b 100644 --- a/src/utils/hash/ripemd160.ts +++ b/src/utils/hash/ripemd160.ts @@ -8,9 +8,9 @@ import { type ToHexErrorType, toHex } from '../encoding/toHex.js' type To = 'hex' | 'bytes' -export type Ripemd160Hash = - | (TTo extends 'bytes' ? ByteArray : never) - | (TTo extends 'hex' ? Hex : never) +export type Ripemd160Hash = + | (to extends 'bytes' ? ByteArray : never) + | (to extends 'hex' ? Hex : never) export type Ripemd160ErrorType = | IsHexErrorType @@ -18,14 +18,14 @@ export type Ripemd160ErrorType = | ToHexErrorType | ErrorType -export function ripemd160( +export function ripemd160( value: Hex | ByteArray, - to_?: TTo | undefined, -): Ripemd160Hash { + to_?: to | undefined, +): Ripemd160Hash { const to = to_ || 'hex' const bytes = noble_ripemd160( isHex(value, { strict: false }) ? toBytes(value) : value, ) - if (to === 'bytes') return bytes as Ripemd160Hash - return toHex(bytes) as Ripemd160Hash + if (to === 'bytes') return bytes as Ripemd160Hash + return toHex(bytes) as Ripemd160Hash } diff --git a/src/utils/hash/sha256.ts b/src/utils/hash/sha256.ts index a24b08b57d..cb63873066 100644 --- a/src/utils/hash/sha256.ts +++ b/src/utils/hash/sha256.ts @@ -8,9 +8,9 @@ import { type ToHexErrorType, toHex } from '../encoding/toHex.js' type To = 'hex' | 'bytes' -export type Sha256Hash = - | (TTo extends 'bytes' ? ByteArray : never) - | (TTo extends 'hex' ? Hex : never) +export type Sha256Hash = + | (to extends 'bytes' ? ByteArray : never) + | (to extends 'hex' ? Hex : never) export type Sha256ErrorType = | IsHexErrorType @@ -18,14 +18,14 @@ export type Sha256ErrorType = | ToHexErrorType | ErrorType -export function sha256( +export function sha256( value: Hex | ByteArray, - to_?: TTo | undefined, -): Sha256Hash { + to_?: to | undefined, +): Sha256Hash { const to = to_ || 'hex' const bytes = noble_sha256( isHex(value, { strict: false }) ? toBytes(value) : value, ) - if (to === 'bytes') return bytes as Sha256Hash - return toHex(bytes) as Sha256Hash + if (to === 'bytes') return bytes as Sha256Hash + return toHex(bytes) as Sha256Hash } diff --git a/src/utils/observe.ts b/src/utils/observe.ts index 54f7cd615c..fed724e2d4 100644 --- a/src/utils/observe.ts +++ b/src/utils/observe.ts @@ -14,8 +14,8 @@ export const listenersCache = /*#__PURE__*/ new Map< /** @internal */ export const cleanupCache = /*#__PURE__*/ new Map void>() -type EmitFunction = ( - emit: TCallbacks, +type EmitFunction = ( + emit: callbacks, ) => MaybePromise void)> let callbackCount = 0 @@ -25,10 +25,10 @@ let callbackCount = 0 * is set up under the same observer id, the function will only be called once * for both instances of the observer. */ -export function observe( +export function observe( observerId: string, - callbacks: TCallbacks, - fn: EmitFunction, + callbacks: callbacks, + fn: EmitFunction, ) { const callbackId = ++callbackCount @@ -56,15 +56,15 @@ export function observe( if (listeners && listeners.length > 0) return unwatch - const emit: TCallbacks = {} as TCallbacks + const emit: callbacks = {} as callbacks for (const key in callbacks) { emit[key] = (( - ...args: Parameters> + ...args: Parameters> ) => { const listeners = getListeners() if (listeners.length === 0) return for (const listener of listeners) listener.fns[key]?.(...args) - }) as TCallbacks[Extract] + }) as callbacks[Extract] } const cleanup = fn(emit) diff --git a/src/utils/poll.ts b/src/utils/poll.ts index 47eaf86162..79bf721cf8 100644 --- a/src/utils/poll.ts +++ b/src/utils/poll.ts @@ -1,11 +1,11 @@ import type { ErrorType } from '../errors/utils.js' import { wait } from './wait.js' -type PollOptions = { +type PollOptions = { // Whether or not to emit when the polling starts. emitOnBegin?: boolean | undefined // The initial wait time (in ms) before polling. - initialWaitTime?: ((data: TData | void) => Promise) | undefined + initialWaitTime?: ((data: data | void) => Promise) | undefined // The interval (in ms). interval: number } @@ -15,16 +15,16 @@ export type PollErrorType = ErrorType /** * @description Polls a function at a specified interval. */ -export function poll( - fn: ({ unpoll }: { unpoll: () => void }) => Promise, - { emitOnBegin, initialWaitTime, interval }: PollOptions, +export function poll( + fn: ({ unpoll }: { unpoll: () => void }) => Promise, + { emitOnBegin, initialWaitTime, interval }: PollOptions, ) { let active = true const unwatch = () => (active = false) const watch = async () => { - let data: TData | void = undefined + let data: data | void = undefined if (emitOnBegin) data = await fn({ unpoll: unwatch }) const initialWait = (await initialWaitTime?.(data)) ?? interval diff --git a/src/utils/promise/createBatchScheduler.ts b/src/utils/promise/createBatchScheduler.ts index 9610c09212..3edbfd5c0a 100644 --- a/src/utils/promise/createBatchScheduler.ts +++ b/src/utils/promise/createBatchScheduler.ts @@ -1,41 +1,38 @@ import type { ErrorType } from '../../errors/utils.js' -type Resolved = [ - result: TReturnType[number], - results: TReturnType, +type Resolved = [ + result: returnType[number], + results: returnType, ] -type PendingPromise = { - resolve?: ((data: Resolved) => void) | undefined +type PendingPromise = { + resolve?: ((data: Resolved) => void) | undefined reject?: ((reason?: unknown) => void) | undefined } type SchedulerItem = { args: unknown; pendingPromise: PendingPromise } -type BatchResultsCompareFn = ( - a: TResult, - b: TResult, -) => number +type BatchResultsCompareFn = (a: result, b: result) => number type CreateBatchSchedulerArguments< - TParameters = unknown, - TReturnType extends readonly unknown[] = readonly unknown[], + parameters = unknown, + returnType extends readonly unknown[] = readonly unknown[], > = { - fn: (args: TParameters[]) => Promise + fn: (args: parameters[]) => Promise id: number | string - shouldSplitBatch?: ((args: TParameters[]) => boolean) | undefined + shouldSplitBatch?: ((args: parameters[]) => boolean) | undefined wait?: number | undefined - sort?: BatchResultsCompareFn | undefined + sort?: BatchResultsCompareFn | undefined } type CreateBatchSchedulerReturnType< - TParameters = unknown, - TReturnType extends readonly unknown[] = readonly unknown[], + parameters = unknown, + returnType extends readonly unknown[] = readonly unknown[], > = { flush: () => void - schedule: TParameters extends undefined - ? (args?: TParameters | undefined) => Promise> - : (args: TParameters) => Promise> + schedule: parameters extends undefined + ? (args?: parameters | undefined) => Promise> + : (args: parameters) => Promise> } export type CreateBatchSchedulerErrorType = ErrorType @@ -44,8 +41,8 @@ const schedulerCache = /*#__PURE__*/ new Map() /** @internal */ export function createBatchScheduler< - TParameters, - TReturnType extends readonly unknown[], + parameters, + returnType extends readonly unknown[], >({ fn, id, @@ -53,9 +50,9 @@ export function createBatchScheduler< wait = 0, sort, }: CreateBatchSchedulerArguments< - TParameters, - TReturnType ->): CreateBatchSchedulerReturnType { + parameters, + returnType +>): CreateBatchSchedulerReturnType { const exec = async () => { const scheduler = getScheduler() flush() @@ -64,7 +61,7 @@ export function createBatchScheduler< if (args.length === 0) return - fn(args as TParameters[]) + fn(args as parameters[]) .then((data) => { if (sort && Array.isArray(data)) data.sort(sort) for (let i = 0; i < scheduler.length; i++) { @@ -83,7 +80,7 @@ export function createBatchScheduler< const flush = () => schedulerCache.delete(id) const getBatchedArgs = () => - getScheduler().map(({ args }) => args) as TParameters[] + getScheduler().map(({ args }) => args) as parameters[] const getScheduler = () => schedulerCache.get(id) || [] @@ -92,9 +89,9 @@ export function createBatchScheduler< return { flush, - async schedule(args: TParameters) { - const pendingPromise: PendingPromise = {} - const promise = new Promise>((resolve, reject) => { + async schedule(args: parameters) { + const pendingPromise: PendingPromise = {} + const promise = new Promise>((resolve, reject) => { pendingPromise.resolve = resolve pendingPromise.reject = reject }) @@ -113,5 +110,5 @@ export function createBatchScheduler< setTimeout(exec, wait) return promise }, - } as unknown as CreateBatchSchedulerReturnType + } as unknown as CreateBatchSchedulerReturnType } diff --git a/src/utils/promise/withCache.ts b/src/utils/promise/withCache.ts index 1f12b1cb5d..d810f652e3 100644 --- a/src/utils/promise/withCache.ts +++ b/src/utils/promise/withCache.ts @@ -7,15 +7,15 @@ export const responseCache = /*#__PURE__*/ new Map() export type GetCacheErrorType = ErrorType -export function getCache(cacheKey: string) { - const buildCache = (cacheKey: string, cache: Map) => ({ +export function getCache(cacheKey: string) { + const buildCache = (cacheKey: string, cache: Map) => ({ clear: () => cache.delete(cacheKey), get: () => cache.get(cacheKey), - set: (data: TData) => cache.set(cacheKey, data), + set: (data: data) => cache.set(cacheKey, data), }) - const promise = buildCache>(cacheKey, promiseCache) - const response = buildCache<{ created: Date; data: TData }>( + const promise = buildCache>(cacheKey, promiseCache) + const response = buildCache<{ created: Date; data: data }>( cacheKey, responseCache, ) @@ -41,11 +41,11 @@ type WithCacheParameters = { * @description Returns the result of a given promise, and caches the result for * subsequent invocations against a provided cache key. */ -export async function withCache( - fn: () => Promise, +export async function withCache( + fn: () => Promise, { cacheKey, cacheTime = Number.POSITIVE_INFINITY }: WithCacheParameters, ) { - const cache = getCache(cacheKey) + const cache = getCache(cacheKey) // If a response exists in the cache, and it's not expired, return it // and do not invoke the promise. diff --git a/src/utils/promise/withRetry.ts b/src/utils/promise/withRetry.ts index e9fc30de68..c18ebc2948 100644 --- a/src/utils/promise/withRetry.ts +++ b/src/utils/promise/withRetry.ts @@ -23,15 +23,15 @@ export type WithRetryParameters = { export type WithRetryErrorType = ErrorType -export function withRetry( - fn: () => Promise, +export function withRetry( + fn: () => Promise, { delay: delay_ = 100, retryCount = 2, shouldRetry = () => true, }: WithRetryParameters = {}, ) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const attemptRetry = async ({ count = 0 } = {}) => { const retry = async ({ error }: { error: Error }) => { const delay = diff --git a/src/utils/promise/withTimeout.ts b/src/utils/promise/withTimeout.ts index fb79fb4b9f..6dbd7b5d0d 100644 --- a/src/utils/promise/withTimeout.ts +++ b/src/utils/promise/withTimeout.ts @@ -2,10 +2,10 @@ import type { ErrorType } from '../../errors/utils.js' export type WithTimeoutErrorType = ErrorType -export function withTimeout( +export function withTimeout( fn: ({ signal, - }: { signal: AbortController['signal'] | null }) => Promise, + }: { signal: AbortController['signal'] | null }) => Promise, { errorInstance = new Error('timed out'), timeout, @@ -18,7 +18,7 @@ export function withTimeout( // Whether or not the timeout should use an abort signal. signal?: boolean | undefined }, -): Promise { +): Promise { return new Promise((resolve, reject) => { ;(async () => { let timeoutId!: NodeJS.Timeout diff --git a/src/utils/rpc/http.ts b/src/utils/rpc/http.ts index 963ffbd846..6c1f414129 100644 --- a/src/utils/rpc/http.ts +++ b/src/utils/rpc/http.ts @@ -25,10 +25,10 @@ export type HttpRpcClientOptions = { } export type HttpRequestParameters< - TBody extends RpcRequest | RpcRequest[] = RpcRequest, + body extends RpcRequest | RpcRequest[] = RpcRequest, > = { /** The RPC request body. */ - body: TBody + body: body /** Request configuration to pass to `fetch`. */ fetchOptions?: HttpRpcClientOptions['fetchOptions'] | undefined /** A callback to handle the response. */ @@ -40,8 +40,8 @@ export type HttpRequestParameters< } export type HttpRequestReturnType< - TBody extends RpcRequest | RpcRequest[] = RpcRequest, -> = TBody extends RpcRequest[] ? RpcResponse[] : RpcResponse + body extends RpcRequest | RpcRequest[] = RpcRequest, +> = body extends RpcRequest[] ? RpcResponse[] : RpcResponse export type HttpRequestErrorType = | HttpRequestErrorType_ @@ -50,9 +50,9 @@ export type HttpRequestErrorType = | ErrorType export type HttpRpcClient = { - request( - params: HttpRequestParameters, - ): Promise> + request( + params: HttpRequestParameters, + ): Promise> } export function getHttpRpcClient( diff --git a/src/utils/signature/hashMessage.ts b/src/utils/signature/hashMessage.ts index acff88d33a..0d0a7ddf3e 100644 --- a/src/utils/signature/hashMessage.ts +++ b/src/utils/signature/hashMessage.ts @@ -5,15 +5,15 @@ import { toPrefixedMessage } from './toPrefixedMessage.js' type To = 'hex' | 'bytes' -export type HashMessage = - | (TTo extends 'bytes' ? ByteArray : never) - | (TTo extends 'hex' ? Hex : never) +export type HashMessage = + | (to extends 'bytes' ? ByteArray : never) + | (to extends 'hex' ? Hex : never) export type HashMessageErrorType = Keccak256ErrorType | ErrorType -export function hashMessage( +export function hashMessage( message: SignableMessage, - to_?: TTo | undefined, -): HashMessage { + to_?: to | undefined, +): HashMessage { return keccak256(toPrefixedMessage(message), to_) } diff --git a/src/utils/transaction/parseTransaction.ts b/src/utils/transaction/parseTransaction.ts index 2212c71b5b..605556fce6 100644 --- a/src/utils/transaction/parseTransaction.ts +++ b/src/utils/transaction/parseTransaction.ts @@ -59,14 +59,14 @@ import { } from './getSerializedTransactionType.js' export type ParseTransactionReturnType< - TSerialized extends TransactionSerializedGeneric = TransactionSerialized, - TType extends TransactionType = GetSerializedTransactionType, -> = IsNarrowable extends true + serialized extends TransactionSerializedGeneric = TransactionSerialized, + type extends TransactionType = GetSerializedTransactionType, +> = IsNarrowable extends true ? - | (TType extends 'eip1559' ? TransactionSerializableEIP1559 : never) - | (TType extends 'eip2930' ? TransactionSerializableEIP2930 : never) - | (TType extends 'eip4844' ? TransactionSerializableEIP4844 : never) - | (TType extends 'legacy' ? TransactionSerializableLegacy : never) + | (type extends 'eip1559' ? TransactionSerializableEIP1559 : never) + | (type extends 'eip2930' ? TransactionSerializableEIP2930 : never) + | (type extends 'eip4844' ? TransactionSerializableEIP4844 : never) + | (type extends 'legacy' ? TransactionSerializableLegacy : never) : TransactionSerializable export type ParseTransactionErrorType = @@ -77,28 +77,28 @@ export type ParseTransactionErrorType = | ParseTransactionLegacyErrorType export function parseTransaction< - const TSerialized extends TransactionSerializedGeneric, ->(serializedTransaction: TSerialized): ParseTransactionReturnType { + const serialized extends TransactionSerializedGeneric, +>(serializedTransaction: serialized): ParseTransactionReturnType { const type = getSerializedTransactionType(serializedTransaction) if (type === 'eip1559') return parseTransactionEIP1559( serializedTransaction as TransactionSerializedEIP1559, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType if (type === 'eip2930') return parseTransactionEIP2930( serializedTransaction as TransactionSerializedEIP2930, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType if (type === 'eip4844') return parseTransactionEIP4844( serializedTransaction as TransactionSerializedEIP4844, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType return parseTransactionLegacy( serializedTransaction, - ) as ParseTransactionReturnType + ) as ParseTransactionReturnType } type ParseTransactionEIP4844ErrorType = diff --git a/src/zksync/actions/getAllBalances.ts b/src/zksync/actions/getAllBalances.ts index 523b48dd9a..b245251272 100644 --- a/src/zksync/actions/getAllBalances.ts +++ b/src/zksync/actions/getAllBalances.ts @@ -8,17 +8,17 @@ import { hexToBigInt } from '../../utils/encoding/fromHex.js' import type { PublicZkSyncRpcSchema } from '../types/eip1193.js' export type GetAllBalancesParameters< - TAccount extends Account | undefined = Account | undefined, -> = GetAccountParameter + account extends Account | undefined = Account | undefined, +> = GetAccountParameter export type GetAllBalancesReturnType = { [key: Address]: bigint } export async function getAllBalances< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, - parameters: GetAllBalancesParameters, + client: Client, + parameters: GetAllBalancesParameters, ): Promise { const { account: account_ } = parameters const account = account_ ? parseAccount(account_) : client.account diff --git a/src/zksync/actions/getBaseTokenL1Address.ts b/src/zksync/actions/getBaseTokenL1Address.ts index d82299775b..d41b936bad 100644 --- a/src/zksync/actions/getBaseTokenL1Address.ts +++ b/src/zksync/actions/getBaseTokenL1Address.ts @@ -8,10 +8,10 @@ import type { PublicZkSyncRpcSchema } from '../types/eip1193.js' export type GetBaseTokenL1AddressReturnType = Address export async function getBaseTokenL1Address< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, ): Promise { const result = await client.request({ method: 'zks_getBaseTokenL1Address' }) return result diff --git a/src/zksync/actions/getBlockDetails.ts b/src/zksync/actions/getBlockDetails.ts index 687d5629fc..ea2a36cc0f 100644 --- a/src/zksync/actions/getBlockDetails.ts +++ b/src/zksync/actions/getBlockDetails.ts @@ -13,10 +13,10 @@ export type GetBlockDetailsParameters = ZkSyncNumberParameter export type GetBlockDetailsReturnType = ZkSyncBlockDetails export async function getBlockDetails< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, parameters: GetBlockDetailsParameters, ): Promise { const result = await client.request({ diff --git a/src/zksync/actions/getBridgehubContractAddress.ts b/src/zksync/actions/getBridgehubContractAddress.ts index 38ed2252f6..271bca2567 100644 --- a/src/zksync/actions/getBridgehubContractAddress.ts +++ b/src/zksync/actions/getBridgehubContractAddress.ts @@ -8,10 +8,10 @@ import type { PublicZkSyncRpcSchema } from '../types/eip1193.js' export type GetBridgehubContractAddressReturnType = Address export async function getBridgehubContractAddress< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, ): Promise { const result = await client.request({ method: 'zks_getBridgehubContract' }) return result diff --git a/src/zksync/actions/getDefaultBridgeAddresses.ts b/src/zksync/actions/getDefaultBridgeAddresses.ts index 3af1e05f40..b5dee41dfa 100644 --- a/src/zksync/actions/getDefaultBridgeAddresses.ts +++ b/src/zksync/actions/getDefaultBridgeAddresses.ts @@ -8,10 +8,10 @@ import type { PublicZkSyncRpcSchema } from '../types/eip1193.js' export type GetDefaultBridgeAddressesReturnType = BridgeContractAddresses export async function getDefaultBridgeAddresses< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, ): Promise { const addresses = await client.request({ method: 'zks_getBridgeContracts' }) return { diff --git a/src/zksync/actions/getL1Allowance.ts b/src/zksync/actions/getL1Allowance.ts index 10bbc2f4de..db71b52ef3 100644 --- a/src/zksync/actions/getL1Allowance.ts +++ b/src/zksync/actions/getL1Allowance.ts @@ -11,8 +11,8 @@ import type { BlockTag } from '../../types/block.js' import type { Chain } from '../../types/chain.js' export type GetL1AllowanceParameters< - TAccount extends Account | undefined = Account | undefined, -> = GetAccountParameter & { + account extends Account | undefined = Account | undefined, +> = GetAccountParameter & { bridgeAddress: Address blockTag?: BlockTag token: Address @@ -23,11 +23,11 @@ export type GetL1AllowanceReturnType = bigint export type GetL1AllowanceErrorType = AccountNotFoundError | BaseError export async function getL1Allowance< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, - parameters: GetL1AllowanceParameters, + client: Client, + parameters: GetL1AllowanceParameters, ): Promise { const { token, bridgeAddress, blockTag, account: account_ } = parameters diff --git a/src/zksync/actions/getL1Balance.ts b/src/zksync/actions/getL1Balance.ts index 748f7624ae..1f0e3f6e52 100644 --- a/src/zksync/actions/getL1Balance.ts +++ b/src/zksync/actions/getL1Balance.ts @@ -19,8 +19,8 @@ import { } from './getL1TokenBalance.js' export type GetL1BalanceParameters< - TAccount extends Account | undefined = Account | undefined, -> = GetAccountParameter & { token?: Address | undefined } & ( + account extends Account | undefined = Account | undefined, +> = GetAccountParameter & { token?: Address | undefined } & ( | { /** The balance of the account at a block number. */ blockNumber?: bigint | undefined @@ -38,13 +38,13 @@ export type GetL1BalanceReturnType = bigint export type GetL1BalanceErrorType = AccountNotFoundError | BaseError export async function getL1Balance< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, - ...[parameters = {}]: TAccount extends undefined - ? [GetL1BalanceParameters] - : [GetL1BalanceParameters] | [] + client: Client, + ...[parameters = {}]: account extends undefined + ? [GetL1BalanceParameters] + : [GetL1BalanceParameters] | [] ): Promise { const { account: account_ = client.account, @@ -63,6 +63,6 @@ export async function getL1Balance< } as GetBalanceParameters) return await getL1TokenBalance(client, { - ...(parameters as GetL1TokenBalanceParameters), + ...(parameters as GetL1TokenBalanceParameters), }) } diff --git a/src/zksync/actions/getL1BatchBlockRange.ts b/src/zksync/actions/getL1BatchBlockRange.ts index 264d1fd0c5..212e721a20 100644 --- a/src/zksync/actions/getL1BatchBlockRange.ts +++ b/src/zksync/actions/getL1BatchBlockRange.ts @@ -12,10 +12,10 @@ export type GetL1BatchBlockRangeParameters = { export type GetL1BatchBlockRangeReturnParameters = [number, number] export async function getL1BatchBlockRange< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, parameters: GetL1BatchBlockRangeParameters, ): Promise { const [number_1, number_2] = await client.request({ diff --git a/src/zksync/actions/getL1BatchDetails.ts b/src/zksync/actions/getL1BatchDetails.ts index edf187e19c..2bef886768 100644 --- a/src/zksync/actions/getL1BatchDetails.ts +++ b/src/zksync/actions/getL1BatchDetails.ts @@ -13,10 +13,10 @@ export type GetL1BatchDetailsParameters = ZkSyncNumberParameter export type GetL1BatchDetailsReturnType = ZkSyncBatchDetails export async function getL1BatchDetails< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, parameters: GetL1BatchDetailsParameters, ): Promise { const result = await client.request({ diff --git a/src/zksync/actions/getL1BatchNumber.ts b/src/zksync/actions/getL1BatchNumber.ts index a0fd98cc01..10f1b4beec 100644 --- a/src/zksync/actions/getL1BatchNumber.ts +++ b/src/zksync/actions/getL1BatchNumber.ts @@ -8,10 +8,10 @@ import type { PublicZkSyncRpcSchema } from '../types/eip1193.js' export type GetL1BatchNumberReturnType = Hex export async function getL1BatchNumber< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, ): Promise { const result = await client.request({ method: 'zks_L1BatchNumber' }) return result diff --git a/src/zksync/actions/getL1ChainId.ts b/src/zksync/actions/getL1ChainId.ts index 8b2bc91974..7e1d083aa3 100644 --- a/src/zksync/actions/getL1ChainId.ts +++ b/src/zksync/actions/getL1ChainId.ts @@ -8,10 +8,10 @@ import type { PublicZkSyncRpcSchema } from '../types/eip1193.js' export type GetL1ChainIdReturnType = Hex export async function getL1ChainId< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, ): Promise { const result = await client.request({ method: 'zks_L1ChainId' }) return result diff --git a/src/zksync/actions/getL1TokenBalance.ts b/src/zksync/actions/getL1TokenBalance.ts index becea43e56..4eb0d56e5b 100644 --- a/src/zksync/actions/getL1TokenBalance.ts +++ b/src/zksync/actions/getL1TokenBalance.ts @@ -16,8 +16,8 @@ import { import { isEth } from '../utils/isEth.js' export type GetL1TokenBalanceParameters< - TAccount extends Account | undefined = Account | undefined, -> = GetAccountParameter & { token: Address } & ( + account extends Account | undefined = Account | undefined, +> = GetAccountParameter & { token: Address } & ( | { /** The balance of the account at a block number. */ blockNumber?: bigint | undefined @@ -38,11 +38,11 @@ export type GetL1TokenBalanceErrorType = | BaseErrorType export async function getL1TokenBalance< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, - parameters: GetL1TokenBalanceParameters, + client: Client, + parameters: GetL1TokenBalanceParameters, ): Promise { const { account: account_ = client.account, diff --git a/src/zksync/actions/getLogProof.ts b/src/zksync/actions/getLogProof.ts index fcfd0de8f9..7418f20dc3 100644 --- a/src/zksync/actions/getLogProof.ts +++ b/src/zksync/actions/getLogProof.ts @@ -14,10 +14,10 @@ export type GetLogProofParameters = { export type GetLogProofReturnType = MessageProof | null export async function getLogProof< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, parameters: GetLogProofParameters, ): Promise { const result = await client.request({ diff --git a/src/zksync/actions/getMainContractAddress.ts b/src/zksync/actions/getMainContractAddress.ts index 1aabd037ce..db5d9fa58d 100644 --- a/src/zksync/actions/getMainContractAddress.ts +++ b/src/zksync/actions/getMainContractAddress.ts @@ -8,10 +8,10 @@ import type { PublicZkSyncRpcSchema } from '../types/eip1193.js' export type GetMainContractAddressReturnType = Address export async function getMainContractAddress< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, ): Promise { const address = await client.request({ method: 'zks_getMainContract' }) return address diff --git a/src/zksync/actions/getRawBlockTransactions.ts b/src/zksync/actions/getRawBlockTransactions.ts index 5d2c6130e7..cfd2c48dbc 100644 --- a/src/zksync/actions/getRawBlockTransactions.ts +++ b/src/zksync/actions/getRawBlockTransactions.ts @@ -12,10 +12,10 @@ export type GetRawBlockTransactionsParameters = ZkSyncNumberParameter export type GetRawBlockTransactionsReturnType = ZkSyncRawBlockTransactions export async function getRawBlockTransactions< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, parameters: GetRawBlockTransactionsParameters, ): Promise { const result = await client.request({ diff --git a/src/zksync/actions/getTestnetPaymasterAddress.ts b/src/zksync/actions/getTestnetPaymasterAddress.ts index 617ed416ee..9c34ddf4e3 100644 --- a/src/zksync/actions/getTestnetPaymasterAddress.ts +++ b/src/zksync/actions/getTestnetPaymasterAddress.ts @@ -8,10 +8,10 @@ import type { PublicZkSyncRpcSchema } from '../types/eip1193.js' export type GetTestnetPaymasterAddressReturnType = Address | null export async function getTestnetPaymasterAddress< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, ): Promise { const result = await client.request({ method: 'zks_getTestnetPaymaster' }) return result diff --git a/src/zksync/actions/getTransactionDetails.ts b/src/zksync/actions/getTransactionDetails.ts index b9f382c98e..541d68a23f 100644 --- a/src/zksync/actions/getTransactionDetails.ts +++ b/src/zksync/actions/getTransactionDetails.ts @@ -13,10 +13,10 @@ export type GetTransactionDetailsParameters = { export type GetTransactionDetailsReturnType = ZkSyncTransactionDetails export async function getTransactionDetails< - TChain extends Chain | undefined, - TAccount extends Account | undefined, + chain extends Chain | undefined, + account extends Account | undefined, >( - client: Client, + client: Client, parameters: GetTransactionDetailsParameters, ): Promise { const result = await client.request({ diff --git a/src/zksync/actions/signEip712Transaction.ts b/src/zksync/actions/signEip712Transaction.ts index 31ec4f85ad..0b7415948b 100644 --- a/src/zksync/actions/signEip712Transaction.ts +++ b/src/zksync/actions/signEip712Transaction.ts @@ -26,25 +26,25 @@ import { } from '../utils/assertEip712Request.js' type FormattedTransactionRequest< - TChain extends ChainEIP712 | undefined = ChainEIP712 | undefined, + chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, > = ExtractChainFormatterParameters< - TChain, + chain, 'transactionRequest', TransactionRequestEIP712 > export type SignEip712TransactionParameters< - TChain extends ChainEIP712 | undefined = ChainEIP712 | undefined, - TAccount extends Account | undefined = Account | undefined, - TChainOverride extends ChainEIP712 | undefined = ChainEIP712 | undefined, + chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, + account extends Account | undefined = Account | undefined, + chainOverride extends ChainEIP712 | undefined = ChainEIP712 | undefined, > = UnionOmit< FormattedTransactionRequest< - TChainOverride extends ChainEIP712 ? TChainOverride : TChain + chainOverride extends ChainEIP712 ? chainOverride : chain >, 'from' > & - GetAccountParameter & - GetChainParameter + GetAccountParameter & + GetChainParameter export type SignEip712TransactionReturnType = SignTransactionReturnType @@ -89,12 +89,12 @@ export type SignEip712TransactionErrorType = SignTransactionErrorType * }) */ export async function signEip712Transaction< - TChain extends ChainEIP712 | undefined, - TAccount extends Account | undefined, - TChainOverride extends ChainEIP712 | undefined, + chain extends ChainEIP712 | undefined, + account extends Account | undefined, + chainOverride extends ChainEIP712 | undefined, >( - client: Client, - args: SignEip712TransactionParameters, + client: Client, + args: SignEip712TransactionParameters, ): Promise { const { account: account_ = client.account, diff --git a/src/zksync/actions/signTransaction.ts b/src/zksync/actions/signTransaction.ts index 5cd8e076a7..8956dac13d 100644 --- a/src/zksync/actions/signTransaction.ts +++ b/src/zksync/actions/signTransaction.ts @@ -18,25 +18,25 @@ import { isEIP712Transaction } from '../utils/isEip712Transaction.js' import { signEip712Transaction } from './signEip712Transaction.js' type FormattedTransactionRequest< - TChain extends ChainEIP712 | undefined = ChainEIP712 | undefined, + chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, > = ExtractChainFormatterParameters< - TChain, + chain, 'transactionRequest', TransactionRequestEIP712 > export type SignTransactionParameters< - TChain extends ChainEIP712 | undefined = ChainEIP712 | undefined, - TAccount extends Account | undefined = Account | undefined, - TChainOverride extends ChainEIP712 | undefined = ChainEIP712 | undefined, + chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, + account extends Account | undefined = Account | undefined, + chainOverride extends ChainEIP712 | undefined = ChainEIP712 | undefined, > = UnionOmit< FormattedTransactionRequest< - TChainOverride extends ChainEIP712 ? TChainOverride : TChain + chainOverride extends ChainEIP712 ? chainOverride : chain >, 'from' > & - GetAccountParameter & - GetChainParameter + GetAccountParameter & + GetChainParameter export type SignTransactionReturnType = SignTransactionReturnType_ @@ -83,12 +83,12 @@ export type SignTransactionErrorType = SignTransactionErrorType_ * }) */ export async function signTransaction< - TChain extends ChainEIP712 | undefined, - TAccount extends Account | undefined, - TChainOverride extends ChainEIP712 | undefined, + chain extends ChainEIP712 | undefined, + account extends Account | undefined, + chainOverride extends ChainEIP712 | undefined, >( - client: Client, - args: SignTransactionParameters, + client: Client, + args: SignTransactionParameters, ): Promise { if (isEIP712Transaction(args)) return signEip712Transaction(client, args) return await signTransaction_(client, args as any) diff --git a/src/zksync/decorators/publicL1.ts b/src/zksync/decorators/publicL1.ts index 771707a7fc..cbd3e43fab 100644 --- a/src/zksync/decorators/publicL1.ts +++ b/src/zksync/decorators/publicL1.ts @@ -19,7 +19,7 @@ import { } from '../actions/getL1TokenBalance.js' export type PublicActionsL1< - TAccount extends Account | undefined = Account | undefined, + account extends Account | undefined = Account | undefined, > = { /** * Returns the amount of approved tokens for a specific L1 bridge. @@ -65,7 +65,7 @@ export type PublicActionsL1< * }) */ getL1Allowance: ( - parameters: GetL1AllowanceParameters, + parameters: GetL1AllowanceParameters, ) => Promise /** * Returns the amount of the ERC20 token the client has on specific address. @@ -109,7 +109,7 @@ export type PublicActionsL1< * }) */ getL1TokenBalance: ( - parameters: GetL1TokenBalanceParameters, + parameters: GetL1TokenBalanceParameters, ) => Promise /** * Returns the amount of the token held by the account on the L1 network. @@ -159,19 +159,19 @@ export type PublicActionsL1< * }) */ getL1Balance: ( - ...parameters: TAccount extends undefined - ? [GetL1BalanceParameters] - : [GetL1BalanceParameters] | [] + ...parameters: account extends undefined + ? [GetL1BalanceParameters] + : [GetL1BalanceParameters] | [] ) => Promise } export function publicActionsL1() { return < - TChain extends Chain | undefined = Chain | undefined, - TAccount extends Account | undefined = Account | undefined, + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, >( - client: Client, - ): PublicActionsL1 => ({ + client: Client, + ): PublicActionsL1 => ({ getL1Allowance: (args) => getL1Allowance(client, args), getL1TokenBalance: (args) => getL1TokenBalance(client, args), // @ts-expect-error diff --git a/src/zksync/decorators/publicL2.ts b/src/zksync/decorators/publicL2.ts index 9b76494daa..0d98238dcc 100644 --- a/src/zksync/decorators/publicL2.ts +++ b/src/zksync/decorators/publicL2.ts @@ -78,8 +78,8 @@ import { import type { ChainEIP712 } from '../types/chain.js' export type PublicActionsL2< - TChain extends ChainEIP712 | undefined = ChainEIP712 | undefined, - TAccount extends Account | undefined = Account | undefined, + chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, + account extends Account | undefined = Account | undefined, > = { /** * Returns the addresses of the default zkSync Era bridge contracts on both L1 and L2. @@ -347,7 +347,7 @@ export type PublicActionsL2< * const details = await client.estimateFee({transactionRequest: {...}}}); */ estimateFee: ( - args: EstimateFeeParameters, + args: EstimateFeeParameters, ) => Promise /** @@ -369,7 +369,7 @@ export type PublicActionsL2< * const details = await client.estimateGasL1ToL2({transactionRequest: {...}}}); */ estimateGasL1ToL2: ( - args: EstimateGasL1ToL2Parameters, + args: EstimateGasL1ToL2Parameters, ) => Promise /** @@ -415,12 +415,12 @@ export type PublicActionsL2< export function publicActionsL2() { return < - TTransport extends Transport = Transport, - TChain extends ChainEIP712 | undefined = ChainEIP712 | undefined, - TAccount extends Account | undefined = Account | undefined, + transport extends Transport = Transport, + chain extends ChainEIP712 | undefined = ChainEIP712 | undefined, + account extends Account | undefined = Account | undefined, >( - client: Client, - ): PublicActionsL2 => { + client: Client, + ): PublicActionsL2 => { return { estimateGasL1ToL2: (args) => estimateGasL1ToL2(client, args), getDefaultBridgeAddresses: () => getDefaultBridgeAddresses(client), diff --git a/src/zksync/types/block.ts b/src/zksync/types/block.ts index 1f8d28c116..50576a58b8 100644 --- a/src/zksync/types/block.ts +++ b/src/zksync/types/block.ts @@ -14,14 +14,14 @@ export type ZkSyncBatchDetails = Omit< } export type ZkSyncBlock< - TIncludeTransactions extends boolean = boolean, - TBlockTag extends BlockTag = BlockTag, + includeTransactions extends boolean = boolean, + blockTag extends BlockTag = BlockTag, > = Assign< Block< bigint, - TIncludeTransactions, - TBlockTag, - ZkSyncTransaction + includeTransactions, + blockTag, + ZkSyncTransaction >, { l1BatchNumber: bigint | null @@ -52,13 +52,13 @@ export type ZkSyncBlockDetails = { } export type ZkSyncRpcBlock< - TBlockTag extends BlockTag = BlockTag, - TIncludeTransactions extends boolean = boolean, + blockTag extends BlockTag = BlockTag, + includeTransactions extends boolean = boolean, > = Assign< RpcBlock< - TBlockTag, - TIncludeTransactions, - ZkSyncRpcTransaction + blockTag, + includeTransactions, + ZkSyncRpcTransaction >, { l1BatchNumber: Hex | null diff --git a/src/zksync/types/eip712.ts b/src/zksync/types/eip712.ts index 6c4dea31f9..8227ce980d 100644 --- a/src/zksync/types/eip712.ts +++ b/src/zksync/types/eip712.ts @@ -17,15 +17,15 @@ export type ZkSyncEip712Meta = { type EIP712FieldType = 'uint256' | 'bytes' | 'bytes32[]' type EIP712Field = { name: string; type: EIP712FieldType } -export type EIP712Domain = { +export type EIP712Domain = { domain: TypedDataDomain types: Record primaryType: string - message: TransactionSignable + message: transactionSignable } export type EIP712DomainFn< - TTransactionSerializable extends + transactionSerializable extends ZkSyncTransactionSerializable = ZkSyncTransactionSerializable, - TransactionSignable = {}, -> = (transaction: TTransactionSerializable) => EIP712Domain + transactionSignable = {}, +> = (transaction: transactionSerializable) => EIP712Domain diff --git a/src/zksync/types/fee.ts b/src/zksync/types/fee.ts index 54d2245032..cc283bf0a4 100644 --- a/src/zksync/types/fee.ts +++ b/src/zksync/types/fee.ts @@ -1,12 +1,12 @@ -export type ZkSyncFee = { - gasLimit: TQuantity - gasPerPubdataLimit: TQuantity - maxPriorityFeePerGas: TQuantity - maxFeePerGas: TQuantity +export type ZkSyncFee = { + gasLimit: quantity + gasPerPubdataLimit: quantity + maxPriorityFeePerGas: quantity + maxFeePerGas: quantity } -export type ZkSyncFeeValues = { - gasPrice: TQuantity - maxFeePerGas: TQuantity - maxPriorityFeePerGas: TQuantity +export type ZkSyncFeeValues = { + gasPrice: quantity + maxFeePerGas: quantity + maxPriorityFeePerGas: quantity } diff --git a/src/zksync/types/log.ts b/src/zksync/types/log.ts index 5680e63829..cf88662aa0 100644 --- a/src/zksync/types/log.ts +++ b/src/zksync/types/log.ts @@ -4,20 +4,20 @@ import type { Hex } from '../../types/misc.js' import type { RpcLog as RpcLog_ } from '../../types/rpc.js' export type ZkSyncLog< - TQuantity = bigint, - TIndex = number, - TPending extends boolean = boolean, - TAbiEvent extends AbiEvent | undefined = undefined, - TStrict extends boolean | undefined = undefined, - TAbi extends Abi | readonly unknown[] | undefined = TAbiEvent extends AbiEvent - ? [TAbiEvent] + quantity = bigint, + index = number, + pending extends boolean = boolean, + abiEvent extends AbiEvent | undefined = undefined, + strict extends boolean | undefined = undefined, + abi extends Abi | readonly unknown[] | undefined = abiEvent extends AbiEvent + ? [abiEvent] : undefined, - TEventName extends string | undefined = TAbiEvent extends AbiEvent - ? TAbiEvent['name'] + eventName extends string | undefined = abiEvent extends AbiEvent + ? abiEvent['name'] : undefined, -> = Log_ & { - l1BatchNumber: TQuantity | null - transactionLogIndex: TIndex +> = Log_ & { + l1BatchNumber: quantity | null + transactionLogIndex: index logType: Hex | null } diff --git a/src/zksync/types/transaction.ts b/src/zksync/types/transaction.ts index 90a19e5975..8c59bb1eaf 100644 --- a/src/zksync/types/transaction.ts +++ b/src/zksync/types/transaction.ts @@ -42,34 +42,34 @@ type TransactionOverrides = { l1BatchTxIndex: bigint | null } -type TransactionPriority = TransactionBase< +type TransactionPriority = TransactionBase< bigint, number, - TPending + pending > & TransactionOverrides & FeeValuesEIP1559 & { type: 'priority' } -export type ZkSyncTransactionEIP712 = - TransactionBase & +export type ZkSyncTransactionEIP712 = + TransactionBase & TransactionOverrides & FeeValuesEIP1559 & { type: 'eip712' | 'priority' } -type Transaction = Transaction_< +type Transaction = Transaction_< bigint, number, - TPending + pending > & TransactionOverrides -export type ZkSyncTransaction = - | Transaction - | TransactionPriority - | ZkSyncTransactionEIP712 +export type ZkSyncTransaction = + | Transaction + | TransactionPriority + | ZkSyncTransactionEIP712 // Transaction (RPC) @@ -78,17 +78,17 @@ type RpcTransactionOverrides = { l1BatchTxIndex: Hex | null } -type RpcTransactionLegacy = - TransactionLegacy_ & RpcTransactionOverrides +type RpcTransactionLegacy = + TransactionLegacy_ & RpcTransactionOverrides -type RpcTransactionEIP2930 = - TransactionEIP2930_ & RpcTransactionOverrides +type RpcTransactionEIP2930 = + TransactionEIP2930_ & RpcTransactionOverrides -type RpcTransactionEIP1559 = - TransactionEIP1559_ & RpcTransactionOverrides +type RpcTransactionEIP1559 = + TransactionEIP1559_ & RpcTransactionOverrides -export type ZkSyncRpcTransactionPriority = - TransactionBase & +export type ZkSyncRpcTransactionPriority = + TransactionBase & ZkSyncFeeValues & RpcTransactionOverrides & { accessList?: undefined @@ -96,8 +96,8 @@ export type ZkSyncRpcTransactionPriority = type: PriorityType } -export type ZkSyncRpcTransactionEIP712 = - TransactionBase & +export type ZkSyncRpcTransactionEIP712 = + TransactionBase & ZkSyncFeeValues & RpcTransactionOverrides & { accessList?: undefined @@ -105,23 +105,22 @@ export type ZkSyncRpcTransactionEIP712 = type: EIP712Type } -export type ZkSyncRpcTransaction = - UnionOmit< - | RpcTransactionLegacy - | RpcTransactionEIP2930 - | RpcTransactionEIP1559 - | ZkSyncRpcTransactionPriority - | ZkSyncRpcTransactionEIP712, - 'typeHex' - > +export type ZkSyncRpcTransaction = UnionOmit< + | RpcTransactionLegacy + | RpcTransactionEIP2930 + | RpcTransactionEIP1559 + | ZkSyncRpcTransactionPriority + | ZkSyncRpcTransactionEIP712, + 'typeHex' +> // Transaction Request // https://era.zksync.io/docs/reference/concepts/transactions export type TransactionRequest< - TQuantity = bigint, - TIndex = number, -> = TransactionRequest_ & { + quantity = bigint, + index = number, +> = TransactionRequest_ & { gasPerPubdata?: undefined customSignature?: undefined paymaster?: undefined @@ -130,9 +129,9 @@ export type TransactionRequest< } export type ZkSyncTransactionRequestEIP712< - TQuantity = bigint, - TIndex = number, -> = Omit, 'type'> & + quantity = bigint, + index = number, +> = Omit, 'type'> & ExactPartial & { gasPerPubdata?: bigint | undefined customSignature?: Hex | undefined @@ -143,9 +142,9 @@ export type ZkSyncTransactionRequestEIP712< | { paymaster?: undefined; paymasterInput?: undefined } ) -export type ZkSyncTransactionRequest = - | TransactionRequest - | ZkSyncTransactionRequestEIP712 +export type ZkSyncTransactionRequest = + | TransactionRequest + | ZkSyncTransactionRequestEIP712 type RpcTransactionRequest = RpcTransactionRequest_ & { eip712Meta?: undefined } @@ -186,9 +185,9 @@ export type ZkSyncTransactionReceiptOverrides = { } export type ZkSyncTransactionReceipt< - TStatus = 'success' | 'reverted', - TType = ZkSyncTransactionType, -> = Omit, 'logs'> & + status = 'success' | 'reverted', + type = ZkSyncTransactionType, +> = Omit, 'logs'> & ZkSyncTransactionReceiptOverrides // Serializers @@ -198,17 +197,17 @@ export type ZkSyncTransactionSerializable = OneOf< > export type ZkSyncTransactionSerialized< - TType extends TransactionType = 'eip712', -> = TType extends 'eip712' + type extends TransactionType = 'eip712', +> = type extends 'eip712' ? ZkSyncTransactionSerializedEIP712 - : TransactionSerialized + : TransactionSerialized export type ZkSyncTransactionSerializedEIP712 = `0x71${string}` export type ZkSyncTransactionSerializableEIP712< - TQuantity = bigint, - TIndex = number, -> = Omit, 'type'> & { + quantity = bigint, + index = number, +> = Omit, 'type'> & { from: Hex gasPerPubdata?: bigint | undefined paymaster?: Address | undefined @@ -237,18 +236,18 @@ export type ZkSyncEIP712TransactionSignable = { } export type TransactionRequestEIP712< - TQuantity = bigint, - TIndex = number, - TTransactionType = 'eip712', -> = TransactionRequestBase & - ExactPartial> & { + quantity = bigint, + index = number, + transactionType = 'eip712', +> = TransactionRequestBase & + ExactPartial> & { accessList?: undefined gasPerPubdata?: bigint | undefined factoryDeps?: Hex[] | undefined paymaster?: Address | undefined paymasterInput?: Hex | undefined customSignature?: Hex | undefined - type?: TTransactionType | undefined + type?: transactionType | undefined } type CommonDataRawBlockTransaction = { diff --git a/test/src/utils.ts b/test/src/utils.ts index 208106f739..c7a0cccac9 100644 --- a/test/src/utils.ts +++ b/test/src/utils.ts @@ -71,7 +71,7 @@ export function createHttpServer( }) } -export async function deploy( +export async function deploy( client: TestClient< TestClientMode, Transport, @@ -79,7 +79,7 @@ export async function deploy( Account | undefined, false >, - args: DeployContractParameters, + args: DeployContractParameters, ) { const hash = await deployContract(client, { account: accounts[0].address, From c10fa659aeaeadee74899d27ad92f99ef4c6cb70 Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 10 Jul 2024 11:46:40 +1000 Subject: [PATCH 30/68] fix: ts@5.3.3 --- src/errors/rpc.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/errors/rpc.ts b/src/errors/rpc.ts index 9ea642e5a4..e7f6a41021 100644 --- a/src/errors/rpc.ts +++ b/src/errors/rpc.ts @@ -33,14 +33,14 @@ type RpcErrorOptions = { * - EIP https://eips.ethereum.org/EIPS/eip-1474 */ export type RpcErrorType = RpcError & { name: 'RpcError' } -export class RpcError extends BaseError { +export class RpcError extends BaseError { override name = 'RpcError' - code: code | (number & {}) + code: code_ | (number & {}) constructor( cause: Error, - { code, docsPath, metaMessages, shortMessage }: RpcErrorOptions, + { code, docsPath, metaMessages, shortMessage }: RpcErrorOptions, ) { super(shortMessage, { cause, @@ -51,7 +51,7 @@ export class RpcError extends BaseError { this.name = cause.name this.code = ( cause instanceof RpcRequestError ? cause.code : code ?? unknownErrorCode - ) as code + ) as code_ } } From bc419b7d2b7c2f8b5ea44a3859bb59cb8b5bbf01 Mon Sep 17 00:00:00 2001 From: Ryan Miller Date: Wed, 10 Jul 2024 16:27:34 +1000 Subject: [PATCH 31/68] docs: fix `prepareTransactionRequest` usage (#2487) * chore: update prepareTransactionRequest usage docs with correct example * Update prepareTransactionRequest.md --------- Co-authored-by: jxom --- .../docs/actions/wallet/prepareTransactionRequest.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/site/pages/docs/actions/wallet/prepareTransactionRequest.md b/site/pages/docs/actions/wallet/prepareTransactionRequest.md index 92bbb1042f..bb67a54586 100644 --- a/site/pages/docs/actions/wallet/prepareTransactionRequest.md +++ b/site/pages/docs/actions/wallet/prepareTransactionRequest.md @@ -29,8 +29,8 @@ const request = await walletClient.prepareTransactionRequest({ // [!code focus:1 // @log: } -const signature = await walletClient.signTransaction(request) -const hash = await walletClient.sendRawTransaction(signature) +const serializedTransaction = await walletClient.signTransaction(request) +const hash = await walletClient.sendRawTransaction({ serializedTransaction }) ``` ```ts twoslash [config.ts] filename="config.ts" @@ -80,8 +80,8 @@ const request = await walletClient.prepareTransactionRequest({ // [!code focus:1 // @log: } -const signature = await walletClient.signTransaction(request) -const hash = await walletClient.sendRawTransaction(signature) +const serializedTransaction = await walletClient.signTransaction(request) +const hash = await walletClient.sendRawTransaction({ serializedTransaction }) ``` ```ts [config.ts (JSON-RPC Account)] From a02120e2620df3128a05f3945a02483e7ca61475 Mon Sep 17 00:00:00 2001 From: jxom Date: Fri, 12 Jul 2024 07:26:45 +1000 Subject: [PATCH 32/68] =?UTF-8?q?chore:=20`./test/contracts`=20=E2=86=92?= =?UTF-8?q?=20`./contracts`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 6 +- .../generateTypedArtifacts.ts | 4 +- {scripts => .scripts}/prepublishOnly.ts | 0 {scripts => .scripts}/tsconfig.json | 0 {scripts => .scripts}/updateVersion.ts | 0 biome.json | 1 + {test/contracts => contracts}/.gitignore | 0 contracts/foundry.toml | 6 + contracts/lib/forge-std | 1 + contracts/lib/solady | 1 + .../deployless}/DeploylessCallViaBytecode.sol | 0 .../deployless}/DeploylessCallViaFactory.sol | 0 .../DeploylessUniversalSigValidator.sol | 0 .../src/test}/ERC20InvalidTransferEvent.sol | 0 .../src/test}/EnsAvatarTokenUri.sol | 0 .../src/test}/ErrorsExample.sol | 0 .../src => contracts/src/test}/GH434.sol | 0 .../src/test}/Mock4337Account.sol | 0 .../src/test}/Mock4337AccountFactory.sol | 0 .../src/test}/OffchainLookupExample.sol | 0 .../src => contracts/src/test}/Payable.sol | 0 package.json | 10 +- pnpm-lock.yaml | 17 +- src/actions/public/call.test.ts | 2 +- .../public/estimateContractGas.test.ts | 2 +- src/actions/public/getEip712Domain.test.ts | 2 +- src/actions/public/getFilterChanges.test.ts | 5 +- src/actions/public/getFilterLogs.test.ts | 2 +- src/actions/public/getLogs.test.ts | 2 +- src/actions/public/multicall.test.ts | 2 +- src/actions/public/readContract.test.ts | 2 +- src/actions/public/simulateContract.test.ts | 2 +- src/actions/public/verifyHash.test.ts | 2 +- src/actions/public/watchContractEvent.test.ts | 2 +- src/actions/public/watchEvent.test.ts | 2 +- src/actions/wallet/writeContract.test.ts | 2 +- src/clients/decorators/public.test.ts | 2 +- src/errors/contract.test.ts | 2 +- .../solady/actions/signMessage.test.ts | 6 +- .../solady/actions/signTypedData.test.ts | 6 +- .../solady/decorators/solady.test.ts | 8 +- .../solady/utils/hashMessage.test.ts | 8 +- .../solady/utils/hashTypedData.test.ts | 8 +- src/utils/ccip.test.ts | 2 +- .../lib/forge-std/.github/workflows/ci.yml | 92 - test/contracts/lib/forge-std/.gitignore | 4 - test/contracts/lib/forge-std/.gitmodules | 3 - test/contracts/lib/forge-std/LICENSE-APACHE | 203 --- test/contracts/lib/forge-std/LICENSE-MIT | 25 - test/contracts/lib/forge-std/README.md | 250 --- test/contracts/lib/forge-std/foundry.toml | 21 - .../lib/forge-std/lib/ds-test/.gitignore | 3 - .../lib/forge-std/lib/ds-test/LICENSE | 674 ------- .../lib/forge-std/lib/ds-test/Makefile | 14 - .../lib/forge-std/lib/ds-test/default.nix | 4 - .../lib/forge-std/lib/ds-test/demo/demo.sol | 222 --- .../lib/forge-std/lib/ds-test/package.json | 15 - .../forge-std/lib/ds-test/package.json.d.ts | 15 - .../lib/forge-std/lib/ds-test/src/test.sol | 469 ----- test/contracts/lib/forge-std/package.json | 16 - .../contracts/lib/forge-std/package.json.d.ts | 16 - test/contracts/lib/forge-std/src/Base.sol | 33 - test/contracts/lib/forge-std/src/Script.sol | 26 - .../lib/forge-std/src/StdAssertions.sol | 325 ---- .../contracts/lib/forge-std/src/StdChains.sol | 233 --- .../contracts/lib/forge-std/src/StdCheats.sol | 572 ------ test/contracts/lib/forge-std/src/StdError.sol | 15 - .../lib/forge-std/src/StdInvariant.sol | 92 - test/contracts/lib/forge-std/src/StdJson.sol | 179 -- test/contracts/lib/forge-std/src/StdMath.sol | 43 - .../lib/forge-std/src/StdStorage.sol | 327 ---- test/contracts/lib/forge-std/src/StdUtils.sol | 189 -- test/contracts/lib/forge-std/src/Test.sol | 31 - test/contracts/lib/forge-std/src/Vm.sol | 405 ----- test/contracts/lib/forge-std/src/console.sol | 1533 ---------------- test/contracts/lib/forge-std/src/console2.sol | 1546 ----------------- .../lib/forge-std/src/interfaces/IERC1155.sol | 105 -- .../lib/forge-std/src/interfaces/IERC165.sol | 12 - .../lib/forge-std/src/interfaces/IERC20.sol | 43 - .../lib/forge-std/src/interfaces/IERC4626.sol | 190 -- .../lib/forge-std/src/interfaces/IERC721.sol | 164 -- .../forge-std/src/interfaces/IMulticall3.sol | 73 - .../lib/forge-std/test/StdAssertions.t.sol | 823 --------- .../lib/forge-std/test/StdChains.t.sol | 160 -- .../lib/forge-std/test/StdCheats.t.sol | 329 ---- .../lib/forge-std/test/StdError.t.sol | 118 -- .../lib/forge-std/test/StdMath.t.sol | 197 --- .../lib/forge-std/test/StdStorage.t.sol | 283 --- .../lib/forge-std/test/StdUtils.t.sol | 297 ---- .../test/compilation/CompilationScript.sol | 10 - .../compilation/CompilationScriptBase.sol | 10 - .../test/compilation/CompilationTest.sol | 10 - .../test/compilation/CompilationTestBase.sol | 10 - .../test/fixtures/broadcast.log.json | 187 -- .../test/fixtures/broadcast.log.json.d.ts | 187 -- test/contracts/lib/solady | 1 - test/foundry.toml | 6 - test/src/utils.ts | 2 +- test/tsconfig.json | 1 + test/vitest.config.ts | 1 + tsconfig.json | 3 +- 101 files changed, 67 insertions(+), 10867 deletions(-) rename {scripts => .scripts}/generateTypedArtifacts.ts (83%) rename {scripts => .scripts}/prepublishOnly.ts (100%) rename {scripts => .scripts}/tsconfig.json (100%) rename {scripts => .scripts}/updateVersion.ts (100%) rename {test/contracts => contracts}/.gitignore (100%) create mode 100644 contracts/foundry.toml create mode 160000 contracts/lib/forge-std create mode 160000 contracts/lib/solady rename {test/contracts/src => contracts/src/deployless}/DeploylessCallViaBytecode.sol (100%) rename {test/contracts/src => contracts/src/deployless}/DeploylessCallViaFactory.sol (100%) rename {test/contracts/src => contracts/src/deployless}/DeploylessUniversalSigValidator.sol (100%) rename {test/contracts/src => contracts/src/test}/ERC20InvalidTransferEvent.sol (100%) rename {test/contracts/src => contracts/src/test}/EnsAvatarTokenUri.sol (100%) rename {test/contracts/src => contracts/src/test}/ErrorsExample.sol (100%) rename {test/contracts/src => contracts/src/test}/GH434.sol (100%) rename {test/contracts/src => contracts/src/test}/Mock4337Account.sol (100%) rename {test/contracts/src => contracts/src/test}/Mock4337AccountFactory.sol (100%) rename {test/contracts/src => contracts/src/test}/OffchainLookupExample.sol (100%) rename {test/contracts/src => contracts/src/test}/Payable.sol (100%) delete mode 100644 test/contracts/lib/forge-std/.github/workflows/ci.yml delete mode 100644 test/contracts/lib/forge-std/.gitignore delete mode 100644 test/contracts/lib/forge-std/.gitmodules delete mode 100644 test/contracts/lib/forge-std/LICENSE-APACHE delete mode 100644 test/contracts/lib/forge-std/LICENSE-MIT delete mode 100644 test/contracts/lib/forge-std/README.md delete mode 100644 test/contracts/lib/forge-std/foundry.toml delete mode 100644 test/contracts/lib/forge-std/lib/ds-test/.gitignore delete mode 100644 test/contracts/lib/forge-std/lib/ds-test/LICENSE delete mode 100644 test/contracts/lib/forge-std/lib/ds-test/Makefile delete mode 100644 test/contracts/lib/forge-std/lib/ds-test/default.nix delete mode 100644 test/contracts/lib/forge-std/lib/ds-test/demo/demo.sol delete mode 100644 test/contracts/lib/forge-std/lib/ds-test/package.json delete mode 100644 test/contracts/lib/forge-std/lib/ds-test/package.json.d.ts delete mode 100644 test/contracts/lib/forge-std/lib/ds-test/src/test.sol delete mode 100644 test/contracts/lib/forge-std/package.json delete mode 100644 test/contracts/lib/forge-std/package.json.d.ts delete mode 100644 test/contracts/lib/forge-std/src/Base.sol delete mode 100644 test/contracts/lib/forge-std/src/Script.sol delete mode 100644 test/contracts/lib/forge-std/src/StdAssertions.sol delete mode 100644 test/contracts/lib/forge-std/src/StdChains.sol delete mode 100644 test/contracts/lib/forge-std/src/StdCheats.sol delete mode 100644 test/contracts/lib/forge-std/src/StdError.sol delete mode 100644 test/contracts/lib/forge-std/src/StdInvariant.sol delete mode 100644 test/contracts/lib/forge-std/src/StdJson.sol delete mode 100644 test/contracts/lib/forge-std/src/StdMath.sol delete mode 100644 test/contracts/lib/forge-std/src/StdStorage.sol delete mode 100644 test/contracts/lib/forge-std/src/StdUtils.sol delete mode 100644 test/contracts/lib/forge-std/src/Test.sol delete mode 100644 test/contracts/lib/forge-std/src/Vm.sol delete mode 100644 test/contracts/lib/forge-std/src/console.sol delete mode 100644 test/contracts/lib/forge-std/src/console2.sol delete mode 100644 test/contracts/lib/forge-std/src/interfaces/IERC1155.sol delete mode 100644 test/contracts/lib/forge-std/src/interfaces/IERC165.sol delete mode 100644 test/contracts/lib/forge-std/src/interfaces/IERC20.sol delete mode 100644 test/contracts/lib/forge-std/src/interfaces/IERC4626.sol delete mode 100644 test/contracts/lib/forge-std/src/interfaces/IERC721.sol delete mode 100644 test/contracts/lib/forge-std/src/interfaces/IMulticall3.sol delete mode 100644 test/contracts/lib/forge-std/test/StdAssertions.t.sol delete mode 100644 test/contracts/lib/forge-std/test/StdChains.t.sol delete mode 100644 test/contracts/lib/forge-std/test/StdCheats.t.sol delete mode 100644 test/contracts/lib/forge-std/test/StdError.t.sol delete mode 100644 test/contracts/lib/forge-std/test/StdMath.t.sol delete mode 100644 test/contracts/lib/forge-std/test/StdStorage.t.sol delete mode 100644 test/contracts/lib/forge-std/test/StdUtils.t.sol delete mode 100644 test/contracts/lib/forge-std/test/compilation/CompilationScript.sol delete mode 100644 test/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol delete mode 100644 test/contracts/lib/forge-std/test/compilation/CompilationTest.sol delete mode 100644 test/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol delete mode 100644 test/contracts/lib/forge-std/test/fixtures/broadcast.log.json delete mode 100644 test/contracts/lib/forge-std/test/fixtures/broadcast.log.json.d.ts delete mode 160000 test/contracts/lib/solady delete mode 100644 test/foundry.toml diff --git a/.gitmodules b/.gitmodules index bc0f30001d..c7020e5773 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "contracts/lib/forge-std"] path = contracts/lib/forge-std - url = https://github.com/foundry-rs/forge-std -[submodule "test/contracts/lib/solady"] - path = test/contracts/lib/solady + url = git@github.com:foundry-rs/forge-std.git +[submodule "contracts/lib/solady"] + path = contracts/lib/solady url = git@github.com:Vectorized/solady.git diff --git a/scripts/generateTypedArtifacts.ts b/.scripts/generateTypedArtifacts.ts similarity index 83% rename from scripts/generateTypedArtifacts.ts rename to .scripts/generateTypedArtifacts.ts index 8411eaa3a3..ad5f5bb00e 100644 --- a/scripts/generateTypedArtifacts.ts +++ b/.scripts/generateTypedArtifacts.ts @@ -1,7 +1,7 @@ import { join } from 'node:path' import { Glob } from 'bun' -const generatedPath = join(import.meta.dir, '../test/contracts/generated.ts') +const generatedPath = join(import.meta.dir, '../contracts/generated.ts') Bun.write(generatedPath, '') const generated = Bun.file(generatedPath) @@ -9,7 +9,7 @@ const writer = generated.writer() const fileNames = [] -const glob = new Glob('test/contracts/out/**/*.json') +const glob = new Glob('contracts/out/**/*.json') for await (const file of glob.scan('.')) { if (file.includes('build-info')) continue diff --git a/scripts/prepublishOnly.ts b/.scripts/prepublishOnly.ts similarity index 100% rename from scripts/prepublishOnly.ts rename to .scripts/prepublishOnly.ts diff --git a/scripts/tsconfig.json b/.scripts/tsconfig.json similarity index 100% rename from scripts/tsconfig.json rename to .scripts/tsconfig.json diff --git a/scripts/updateVersion.ts b/.scripts/updateVersion.ts similarity index 100% rename from scripts/updateVersion.ts rename to .scripts/updateVersion.ts diff --git a/biome.json b/biome.json index 2aca0c550a..d0be8bd350 100644 --- a/biome.json +++ b/biome.json @@ -12,6 +12,7 @@ "CHANGELOG.md", "bun.lockb", "cache", + "contracts", "test/contracts", "test/kzg/*.json", "test/kzg/*.txt", diff --git a/test/contracts/.gitignore b/contracts/.gitignore similarity index 100% rename from test/contracts/.gitignore rename to contracts/.gitignore diff --git a/contracts/foundry.toml b/contracts/foundry.toml new file mode 100644 index 0000000000..f54dd6209e --- /dev/null +++ b/contracts/foundry.toml @@ -0,0 +1,6 @@ +[profile.default] +remappings = [ + "solady/=lib/solady/src/", +] +src = "src" +out = "out" diff --git a/contracts/lib/forge-std b/contracts/lib/forge-std new file mode 160000 index 0000000000..07263d193d --- /dev/null +++ b/contracts/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 07263d193d621c4b2b0ce8b4d54af58f6957d97d diff --git a/contracts/lib/solady b/contracts/lib/solady new file mode 160000 index 0000000000..8200a70e8d --- /dev/null +++ b/contracts/lib/solady @@ -0,0 +1 @@ +Subproject commit 8200a70e8dc2a77ecb074fc2e99a2a0d36547522 diff --git a/test/contracts/src/DeploylessCallViaBytecode.sol b/contracts/src/deployless/DeploylessCallViaBytecode.sol similarity index 100% rename from test/contracts/src/DeploylessCallViaBytecode.sol rename to contracts/src/deployless/DeploylessCallViaBytecode.sol diff --git a/test/contracts/src/DeploylessCallViaFactory.sol b/contracts/src/deployless/DeploylessCallViaFactory.sol similarity index 100% rename from test/contracts/src/DeploylessCallViaFactory.sol rename to contracts/src/deployless/DeploylessCallViaFactory.sol diff --git a/test/contracts/src/DeploylessUniversalSigValidator.sol b/contracts/src/deployless/DeploylessUniversalSigValidator.sol similarity index 100% rename from test/contracts/src/DeploylessUniversalSigValidator.sol rename to contracts/src/deployless/DeploylessUniversalSigValidator.sol diff --git a/test/contracts/src/ERC20InvalidTransferEvent.sol b/contracts/src/test/ERC20InvalidTransferEvent.sol similarity index 100% rename from test/contracts/src/ERC20InvalidTransferEvent.sol rename to contracts/src/test/ERC20InvalidTransferEvent.sol diff --git a/test/contracts/src/EnsAvatarTokenUri.sol b/contracts/src/test/EnsAvatarTokenUri.sol similarity index 100% rename from test/contracts/src/EnsAvatarTokenUri.sol rename to contracts/src/test/EnsAvatarTokenUri.sol diff --git a/test/contracts/src/ErrorsExample.sol b/contracts/src/test/ErrorsExample.sol similarity index 100% rename from test/contracts/src/ErrorsExample.sol rename to contracts/src/test/ErrorsExample.sol diff --git a/test/contracts/src/GH434.sol b/contracts/src/test/GH434.sol similarity index 100% rename from test/contracts/src/GH434.sol rename to contracts/src/test/GH434.sol diff --git a/test/contracts/src/Mock4337Account.sol b/contracts/src/test/Mock4337Account.sol similarity index 100% rename from test/contracts/src/Mock4337Account.sol rename to contracts/src/test/Mock4337Account.sol diff --git a/test/contracts/src/Mock4337AccountFactory.sol b/contracts/src/test/Mock4337AccountFactory.sol similarity index 100% rename from test/contracts/src/Mock4337AccountFactory.sol rename to contracts/src/test/Mock4337AccountFactory.sol diff --git a/test/contracts/src/OffchainLookupExample.sol b/contracts/src/test/OffchainLookupExample.sol similarity index 100% rename from test/contracts/src/OffchainLookupExample.sol rename to contracts/src/test/OffchainLookupExample.sol diff --git a/test/contracts/src/Payable.sol b/contracts/src/test/Payable.sol similarity index 100% rename from test/contracts/src/Payable.sol rename to contracts/src/test/Payable.sol diff --git a/package.json b/package.json index b5de87979c..8edc9f78cb 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,11 @@ "build:trustedSetups:start": "mv src/node/trustedSetups.ts src/node/trustedSetups_esm.ts && mv src/node/trustedSetups_cjs.ts src/node/trustedSetups.ts", "build:trustedSetups:end": "mv src/node/trustedSetups.ts src/node/trustedSetups_cjs.ts && mv src/node/trustedSetups_esm.ts src/node/trustedSetups.ts", "build:types": "tsc --project ./tsconfig.build.json --module esnext --declarationDir ./src/_types --emitDeclarationOnly --declaration --declarationMap", - "changeset:prepublish": "pnpm version:update && bun scripts/prepublishOnly.ts && pnpm build", + "changeset:prepublish": "pnpm version:update && bun .scripts/prepublishOnly.ts && pnpm build", "changeset:publish": "pnpm changeset:prepublish && changeset publish", "changeset:version": "changeset version && pnpm install --lockfile-only && pnpm version:update && pnpm format", "clean": "rm -rf *.tsbuildinfo src/*.tsbuildinfo src/_esm src/_cjs src/_types", - "contracts:build": "forge build --config-path ./test/foundry.toml && bun ./scripts/generateTypedArtifacts.ts", + "contracts:build": "forge build --config-path ./contracts/foundry.toml && bun .scripts/generateTypedArtifacts.ts", "deps": "pnpx taze -r", "docs:dev": "pnpm --filter site dev", "docs:build": "pnpm --filter site build", @@ -25,7 +25,7 @@ "postinstall": "git submodule update --init --recursive && pnpm contracts:build", "preinstall": "pnpx only-allow pnpm", "prepare": "pnpm simple-git-hooks", - "prepublishOnly": "bun scripts/prepublishOnly.ts", + "prepublishOnly": "bun .scripts/prepublishOnly.ts", "size": "size-limit", "test": "vitest -c ./test/vitest.config.ts dev", "test:build": "publint --strict ./src && attw --pack ./src --ignore-rules false-esm", @@ -43,7 +43,7 @@ "typecheck": "tsc --noEmit", "vectors": "bun test vectors/**/*.test.ts", "vectors:generate": "bun vectors/generate.ts", - "version:update": "bun scripts/updateVersion.ts" + "version:update": "bun .scripts/updateVersion.ts" }, "devDependencies": { "@arethetypeswrong/cli": "^0.15.3", @@ -89,7 +89,7 @@ }, "workspaces": { ".": { - "project": "scripts/*.ts" + "project": ".scripts/*.ts" }, "src": { "entry": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e845485b10..c992df2da9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -575,8 +575,8 @@ packages: '@arktype/fs@0.0.20': resolution: {integrity: sha512-WnoIFrhiDKnWixd7xmcvFTlP7ZVReT7j37nTbCpieUCsVaUldb38pgQjxdvlJN40UL3kkjxyiYIRmc7BOvgy1A==} - '@arktype/schema@0.1.18': - resolution: {integrity: sha512-6xMboHvnO3NtgYNP160PmghElUDpKe/aDMqH2hRRHoMb1Nh0bPilDfr9LJnXQEwfA5hDguqRM+vifOKkROtOLA==} + '@arktype/schema@0.1.22': + resolution: {integrity: sha512-3HAf9EcIgu/H9IIOtfY2yH1exuF5b7z3GmMrPuI9xhC0OwKw5DK/57MNGSxbx9JMw51RLxL/fcEOnyNiXEDT+g==} '@arktype/util@0.0.49': resolution: {integrity: sha512-ptlPUDZ8EECx23S7OjQnMulUSt8lmhxq5pQXmiyMlVt9g9EhUOVpdFrNqSCntFURtennxwFDJaYa+7rKQrGrew==} @@ -2600,8 +2600,8 @@ packages: arity-n@1.0.4: resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} - arktype@2.0.0-dev.26: - resolution: {integrity: sha512-L7JkKHPkvEoDRKhtXyrCQcHast2oXFo7sOX1SZ3GSbIFJcEnTRRW12lFvH8M4fFR589CaOE9LleHMg9jZFR2TA==} + arktype@2.0.0-dev.29: + resolution: {integrity: sha512-SJluMYDyaGOYUntlG0rxd8ErRdTGceUb6Svsf5u1aAzSurwsh6my9ktkHA99wtJGmz/CbTv9T7OOan3cUppzUQ==} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} @@ -2743,7 +2743,6 @@ packages: bun@1.1.12: resolution: {integrity: sha512-NZzeZuZk7VwCs8VAXnXUHCPOlTS/IyHCscChtT1M1FLSwhBcVMsGVStYlXaaoqsinBKgp0CGJdhnJw2gR3NkDw==} - cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true @@ -6358,14 +6357,14 @@ snapshots: '@arktype/util': 0.0.49 '@typescript/analyze-trace': 0.10.1 '@typescript/vfs': 1.5.3(typescript@5.5.2) - arktype: 2.0.0-dev.26 + arktype: 2.0.0-dev.29 typescript: 5.5.2 transitivePeerDependencies: - supports-color '@arktype/fs@0.0.20': {} - '@arktype/schema@0.1.18': + '@arktype/schema@0.1.22': dependencies: '@arktype/util': 0.0.51 @@ -8739,9 +8738,9 @@ snapshots: arity-n@1.0.4: {} - arktype@2.0.0-dev.26: + arktype@2.0.0-dev.29: dependencies: - '@arktype/schema': 0.1.18 + '@arktype/schema': 0.1.22 '@arktype/util': 0.0.51 array-buffer-byte-length@1.0.1: diff --git a/src/actions/public/call.test.ts b/src/actions/public/call.test.ts index 49282e21da..6312e0c9df 100644 --- a/src/actions/public/call.test.ts +++ b/src/actions/public/call.test.ts @@ -4,7 +4,7 @@ import { Mock4337Account, Mock4337AccountFactory, OffchainLookupExample, -} from '~test/contracts/generated.js' +} from '~contracts/generated.js' import { baycContractConfig, usdcContractConfig, diff --git a/src/actions/public/estimateContractGas.test.ts b/src/actions/public/estimateContractGas.test.ts index 04fbf87430..5aadc553ed 100644 --- a/src/actions/public/estimateContractGas.test.ts +++ b/src/actions/public/estimateContractGas.test.ts @@ -6,7 +6,7 @@ */ import { describe, expect, test } from 'vitest' -import { ErrorsExample } from '~test/contracts/generated.js' +import { ErrorsExample } from '~contracts/generated.js' import { baycContractConfig, wagmiContractConfig } from '~test/src/abis.js' import { accounts } from '~test/src/constants.js' import { deployBAYC, deployErrorExample } from '~test/src/utils.js' diff --git a/src/actions/public/getEip712Domain.test.ts b/src/actions/public/getEip712Domain.test.ts index 1238f742d9..37bed66fb3 100644 --- a/src/actions/public/getEip712Domain.test.ts +++ b/src/actions/public/getEip712Domain.test.ts @@ -1,5 +1,5 @@ import { expect, test } from 'vitest' -import { Mock4337AccountFactory } from '../../../test/contracts/generated.js' +import { Mock4337AccountFactory } from '~contracts/generated.js' import { anvilMainnet } from '../../../test/src/anvil.js' import { accounts } from '../../../test/src/constants.js' import { deployMock4337Account } from '../../../test/src/utils.js' diff --git a/src/actions/public/getFilterChanges.test.ts b/src/actions/public/getFilterChanges.test.ts index 67b9dbbc35..ef9ff33764 100644 --- a/src/actions/public/getFilterChanges.test.ts +++ b/src/actions/public/getFilterChanges.test.ts @@ -8,8 +8,9 @@ import { test, } from 'vitest' -import { ERC20InvalidTransferEvent } from '~test/contracts/generated.js' +import { ERC20InvalidTransferEvent } from '~contracts/generated.js' import { usdcContractConfig } from '~test/src/abis.js' +import { anvilMainnet } from '~test/src/anvil.js' import { accounts, address } from '~test/src/constants.js' import { deployErc20InvalidTransferEvent } from '~test/src/utils.js' import type { Log } from '../../types/log.js' @@ -22,8 +23,6 @@ import { setBalance } from '../test/setBalance.js' import { sendTransaction } from '../wallet/sendTransaction.js' import { writeContract } from '../wallet/writeContract.js' -import { anvilMainnet } from '../../../test/src/anvil.js' - import { createBlockFilter } from './createBlockFilter.js' import { createContractEventFilter } from './createContractEventFilter.js' import { createEventFilter } from './createEventFilter.js' diff --git a/src/actions/public/getFilterLogs.test.ts b/src/actions/public/getFilterLogs.test.ts index 219cf9c0c9..5281c842f2 100644 --- a/src/actions/public/getFilterLogs.test.ts +++ b/src/actions/public/getFilterLogs.test.ts @@ -8,7 +8,7 @@ import { test, } from 'vitest' -import { ERC20InvalidTransferEvent } from '~test/contracts/generated.js' +import { ERC20InvalidTransferEvent } from '~contracts/generated.js' import { usdcContractConfig } from '~test/src/abis.js' import { accounts, address } from '~test/src/constants.js' import { deployErc20InvalidTransferEvent } from '~test/src/utils.js' diff --git a/src/actions/public/getLogs.test.ts b/src/actions/public/getLogs.test.ts index e270f6a13e..c3410c1692 100644 --- a/src/actions/public/getLogs.test.ts +++ b/src/actions/public/getLogs.test.ts @@ -7,7 +7,7 @@ import { test, } from 'vitest' -import { ERC20InvalidTransferEvent } from '~test/contracts/generated.js' +import { ERC20InvalidTransferEvent } from '~contracts/generated.js' import { usdcContractConfig } from '~test/src/abis.js' import { accounts, address } from '~test/src/constants.js' import { deployErc20InvalidTransferEvent } from '~test/src/utils.js' diff --git a/src/actions/public/multicall.test.ts b/src/actions/public/multicall.test.ts index 1476c5ce89..46185a6a0c 100644 --- a/src/actions/public/multicall.test.ts +++ b/src/actions/public/multicall.test.ts @@ -5,7 +5,7 @@ */ import { describe, expect, test, vi } from 'vitest' -import { ErrorsExample, GH434 } from '~test/contracts/generated.js' +import { ErrorsExample, GH434 } from '~contracts/generated.js' import { baycContractConfig, usdcContractConfig, diff --git a/src/actions/public/readContract.test.ts b/src/actions/public/readContract.test.ts index 19c94263a4..850beed742 100644 --- a/src/actions/public/readContract.test.ts +++ b/src/actions/public/readContract.test.ts @@ -10,7 +10,7 @@ import { ErrorsExample, Mock4337Account, Mock4337AccountFactory, -} from '~test/contracts/generated.js' +} from '~contracts/generated.js' import { baycContractConfig, wagmiContractConfig } from '~test/src/abis.js' import { accounts, address } from '~test/src/constants.js' import { deployErrorExample, deployMock4337Account } from '~test/src/utils.js' diff --git a/src/actions/public/simulateContract.test.ts b/src/actions/public/simulateContract.test.ts index 42b62bb829..d17865b725 100644 --- a/src/actions/public/simulateContract.test.ts +++ b/src/actions/public/simulateContract.test.ts @@ -9,7 +9,7 @@ */ import { describe, expect, test, vi } from 'vitest' -import { ErrorsExample } from '~test/contracts/generated.js' +import { ErrorsExample } from '~contracts/generated.js' import { baycContractConfig, wagmiContractConfig } from '~test/src/abis.js' import { accounts } from '~test/src/constants.js' import { diff --git a/src/actions/public/verifyHash.test.ts b/src/actions/public/verifyHash.test.ts index f089e472d7..cf56bd0ca9 100644 --- a/src/actions/public/verifyHash.test.ts +++ b/src/actions/public/verifyHash.test.ts @@ -4,7 +4,7 @@ import { ensPublicResolverConfig, smartAccountConfig } from '~test/src/abis.js' import { accounts, address } from '~test/src/constants.js' import { anvilMainnet } from '../../../test/src/anvil.js' -import { Mock4337AccountFactory } from '../../../test/contracts/generated.js' +import { Mock4337AccountFactory } from '~contracts/generated.js' import { deployMock4337Account } from '../../../test/src/utils.js' import { privateKeyToAccount } from '../../accounts/privateKeyToAccount.js' import { zkSync } from '../../chains/index.js' diff --git a/src/actions/public/watchContractEvent.test.ts b/src/actions/public/watchContractEvent.test.ts index 30fb2d5ba8..53e35d3897 100644 --- a/src/actions/public/watchContractEvent.test.ts +++ b/src/actions/public/watchContractEvent.test.ts @@ -1,6 +1,6 @@ import { assertType, beforeAll, describe, expect, test, vi } from 'vitest' -import { ERC20InvalidTransferEvent } from '~test/contracts/generated.js' +import { ERC20InvalidTransferEvent } from '~contracts/generated.js' import { usdcContractConfig } from '~test/src/abis.js' import { accounts, address } from '~test/src/constants.js' import { deployErc20InvalidTransferEvent } from '~test/src/utils.js' diff --git a/src/actions/public/watchEvent.test.ts b/src/actions/public/watchEvent.test.ts index 2883652d56..4837a7a837 100644 --- a/src/actions/public/watchEvent.test.ts +++ b/src/actions/public/watchEvent.test.ts @@ -1,6 +1,6 @@ import { beforeAll, describe, expect, test, vi } from 'vitest' -import { ERC20InvalidTransferEvent } from '~test/contracts/generated.js' +import { ERC20InvalidTransferEvent } from '~contracts/generated.js' import { usdcContractConfig, wagmiContractConfig } from '~test/src/abis.js' import { accounts, address } from '~test/src/constants.js' import { deployErc20InvalidTransferEvent } from '~test/src/utils.js' diff --git a/src/actions/wallet/writeContract.test.ts b/src/actions/wallet/writeContract.test.ts index 410c1ebabd..66229fac61 100644 --- a/src/actions/wallet/writeContract.test.ts +++ b/src/actions/wallet/writeContract.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test, vi } from 'vitest' -import { Payable } from '~test/contracts/generated.js' +import { Payable } from '~contracts/generated.js' import { wagmiContractConfig } from '~test/src/abis.js' import { accounts } from '~test/src/constants.js' import { deployPayable } from '~test/src/utils.js' diff --git a/src/clients/decorators/public.test.ts b/src/clients/decorators/public.test.ts index c81fb5acdb..fb8352a9d2 100644 --- a/src/clients/decorators/public.test.ts +++ b/src/clients/decorators/public.test.ts @@ -9,7 +9,7 @@ import { accounts, address, typedData } from '~test/src/constants.js' import { getBlockNumber } from '../../actions/public/getBlockNumber.js' import { parseEther } from '../../utils/unit/parseEther.js' -import { Mock4337AccountFactory } from '../../../test/contracts/generated.js' +import { Mock4337AccountFactory } from '~contracts/generated.js' import { anvilMainnet } from '../../../test/src/anvil.js' import { deployMock4337Account } from '../../../test/src/utils.js' import { privateKeyToAccount } from '../../accounts/privateKeyToAccount.js' diff --git a/src/errors/contract.test.ts b/src/errors/contract.test.ts index d3f803ac71..e1c2eaf3ba 100644 --- a/src/errors/contract.test.ts +++ b/src/errors/contract.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from 'vitest' -import { ErrorsExample } from '~test/contracts/generated.js' +import { ErrorsExample } from '~contracts/generated.js' import { baycContractConfig } from '~test/src/abis.js' import { address } from '~test/src/constants.js' import { polygon } from '../chains/index.js' diff --git a/src/experimental/solady/actions/signMessage.test.ts b/src/experimental/solady/actions/signMessage.test.ts index 14473b1fc7..9d3165f489 100644 --- a/src/experimental/solady/actions/signMessage.test.ts +++ b/src/experimental/solady/actions/signMessage.test.ts @@ -1,10 +1,10 @@ import type { Address } from 'abitype' import { beforeAll, expect, test } from 'vitest' +import { Mock4337AccountFactory } from '~contracts/generated.js' +import { anvilMainnet } from '~test/src/anvil.js' import { accounts } from '~test/src/constants.js' -import { Mock4337AccountFactory } from '../../../../test/contracts/generated.js' -import { anvilMainnet } from '../../../../test/src/anvil.js' -import { deployMock4337Account } from '../../../../test/src/utils.js' +import { deployMock4337Account } from '~test/src/utils.js' import { privateKeyToAccount } from '../../../accounts/privateKeyToAccount.js' import { mine, diff --git a/src/experimental/solady/actions/signTypedData.test.ts b/src/experimental/solady/actions/signTypedData.test.ts index 72ba8a7370..a3c3bd7a62 100644 --- a/src/experimental/solady/actions/signTypedData.test.ts +++ b/src/experimental/solady/actions/signTypedData.test.ts @@ -1,10 +1,10 @@ import type { Address } from 'abitype' import { beforeAll, describe, expect, test } from 'vitest' +import { Mock4337AccountFactory } from '~contracts/generated.js' +import { anvilMainnet } from '~test/src/anvil.js' import { accounts, typedData } from '~test/src/constants.js' -import { Mock4337AccountFactory } from '../../../../test/contracts/generated.js' -import { anvilMainnet } from '../../../../test/src/anvil.js' -import { deployMock4337Account } from '../../../../test/src/utils.js' +import { deployMock4337Account } from '~test/src/utils.js' import { privateKeyToAccount } from '../../../accounts/privateKeyToAccount.js' import { mine, diff --git a/src/experimental/solady/decorators/solady.test.ts b/src/experimental/solady/decorators/solady.test.ts index 4391241ee1..935d96dd82 100644 --- a/src/experimental/solady/decorators/solady.test.ts +++ b/src/experimental/solady/decorators/solady.test.ts @@ -1,10 +1,10 @@ import type { Address } from 'abitype' import { beforeAll, expect, test } from 'vitest' -import { Mock4337AccountFactory } from '../../../../test/contracts/generated.js' -import { anvilMainnet } from '../../../../test/src/anvil.js' -import { accounts, typedData } from '../../../../test/src/constants.js' -import { deployMock4337Account } from '../../../../test/src/utils.js' +import { Mock4337AccountFactory } from '~contracts/generated.js' +import { anvilMainnet } from '~test/src/anvil.js' +import { accounts, typedData } from '~test/src/constants.js' +import { deployMock4337Account } from '~test/src/utils.js' import { mine, simulateContract, diff --git a/src/experimental/solady/utils/hashMessage.test.ts b/src/experimental/solady/utils/hashMessage.test.ts index 1f804336ad..f290bc9b6b 100644 --- a/src/experimental/solady/utils/hashMessage.test.ts +++ b/src/experimental/solady/utils/hashMessage.test.ts @@ -1,10 +1,10 @@ import type { Address } from 'abitype' import { beforeAll, expect, test } from 'vitest' -import { Mock4337AccountFactory } from '../../../../test/contracts/generated.js' -import { anvilMainnet } from '../../../../test/src/anvil.js' -import { accounts } from '../../../../test/src/constants.js' -import { deployMock4337Account } from '../../../../test/src/utils.js' +import { Mock4337AccountFactory } from '~contracts/generated.js' +import { anvilMainnet } from '~test/src/anvil.js' +import { accounts } from '~test/src/constants.js' +import { deployMock4337Account } from '~test/src/utils.js' import { sign } from '../../../accounts/index.js' import { getEip712Domain, diff --git a/src/experimental/solady/utils/hashTypedData.test.ts b/src/experimental/solady/utils/hashTypedData.test.ts index 91d4f593d3..578ab345b5 100644 --- a/src/experimental/solady/utils/hashTypedData.test.ts +++ b/src/experimental/solady/utils/hashTypedData.test.ts @@ -1,10 +1,10 @@ import type { Address } from 'abitype' import { beforeAll, expect, test } from 'vitest' -import { Mock4337AccountFactory } from '../../../../test/contracts/generated.js' -import { anvilMainnet } from '../../../../test/src/anvil.js' -import { accounts, typedData } from '../../../../test/src/constants.js' -import { deployMock4337Account } from '../../../../test/src/utils.js' +import { Mock4337AccountFactory } from '~contracts/generated.js' +import { anvilMainnet } from '~test/src/anvil.js' +import { accounts, typedData } from '~test/src/constants.js' +import { deployMock4337Account } from '~test/src/utils.js' import { serializeSignature, sign } from '../../../accounts/index.js' import { getEip712Domain, diff --git a/src/utils/ccip.test.ts b/src/utils/ccip.test.ts index 08601e5970..32d0a520b0 100644 --- a/src/utils/ccip.test.ts +++ b/src/utils/ccip.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from 'vitest' -import { OffchainLookupExample } from '~test/contracts/generated.js' +import { OffchainLookupExample } from '~contracts/generated.js' import { createCcipServer } from '~test/src/ccip.js' import { accounts } from '~test/src/constants.js' import { diff --git a/test/contracts/lib/forge-std/.github/workflows/ci.yml b/test/contracts/lib/forge-std/.github/workflows/ci.yml deleted file mode 100644 index 96b23365ec..0000000000 --- a/test/contracts/lib/forge-std/.github/workflows/ci.yml +++ /dev/null @@ -1,92 +0,0 @@ -name: CI - -on: - workflow_dispatch: - pull_request: - push: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Install Foundry - uses: onbjerg/foundry-toolchain@v1 - with: - version: nightly - - - name: Print forge version - run: forge --version - - # Backwards compatibility checks. - - name: Check compatibility with 0.8.0 - if: always() - run: forge build --skip test --use solc:0.8.0 - - - name: Check compatibility with 0.7.6 - if: always() - run: forge build --skip test --use solc:0.7.6 - - - name: Check compatibility with 0.7.0 - if: always() - run: forge build --skip test --use solc:0.7.0 - - - name: Check compatibility with 0.6.12 - if: always() - run: forge build --skip test --use solc:0.6.12 - - - name: Check compatibility with 0.6.2 - if: always() - run: forge build --skip test --use solc:0.6.2 - - # via-ir compilation time checks. - - name: Measure compilation time of Test with 0.8.17 --via-ir - if: always() - run: forge build --skip test --contracts test/compilation/CompilationTest.sol --use solc:0.8.17 --via-ir - - - name: Measure compilation time of TestBase with 0.8.17 --via-ir - if: always() - run: forge build --skip test --contracts test/compilation/CompilationTestBase.sol --use solc:0.8.17 --via-ir - - - name: Measure compilation time of Script with 0.8.17 --via-ir - if: always() - run: forge build --skip test --contracts test/compilation/CompilationScript.sol --use solc:0.8.17 --via-ir - - - name: Measure compilation time of ScriptBase with 0.8.17 --via-ir - if: always() - run: forge build --skip test --contracts test/compilation/CompilationScriptBase.sol --use solc:0.8.17 --via-ir - - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Install Foundry - uses: onbjerg/foundry-toolchain@v1 - with: - version: nightly - - - name: Print forge version - run: forge --version - - - name: Run tests - run: forge test -vvv - - fmt: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Install Foundry - uses: onbjerg/foundry-toolchain@v1 - with: - version: nightly - - - name: Print forge version - run: forge --version - - - name: Check formatting - run: forge fmt --check diff --git a/test/contracts/lib/forge-std/.gitignore b/test/contracts/lib/forge-std/.gitignore deleted file mode 100644 index 756106d388..0000000000 --- a/test/contracts/lib/forge-std/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -cache/ -out/ -.vscode -.idea diff --git a/test/contracts/lib/forge-std/.gitmodules b/test/contracts/lib/forge-std/.gitmodules deleted file mode 100644 index e12471968b..0000000000 --- a/test/contracts/lib/forge-std/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "lib/ds-test"] - path = lib/ds-test - url = https://github.com/dapphub/ds-test diff --git a/test/contracts/lib/forge-std/LICENSE-APACHE b/test/contracts/lib/forge-std/LICENSE-APACHE deleted file mode 100644 index cf01a499fb..0000000000 --- a/test/contracts/lib/forge-std/LICENSE-APACHE +++ /dev/null @@ -1,203 +0,0 @@ -Copyright Contributors to Forge Standard Library - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/test/contracts/lib/forge-std/LICENSE-MIT b/test/contracts/lib/forge-std/LICENSE-MIT deleted file mode 100644 index 28f98304ac..0000000000 --- a/test/contracts/lib/forge-std/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright Contributors to Forge Standard Library - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER -DEALINGS IN THE SOFTWARE.R diff --git a/test/contracts/lib/forge-std/README.md b/test/contracts/lib/forge-std/README.md deleted file mode 100644 index 8494a7dd5e..0000000000 --- a/test/contracts/lib/forge-std/README.md +++ /dev/null @@ -1,250 +0,0 @@ -# Forge Standard Library • [![CI status](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml/badge.svg)](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml) - -Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes. - -**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://book.getfoundry.sh/forge/forge-std.html).** - -## Install - -```bash -forge install foundry-rs/forge-std -``` - -## Contracts -### stdError - -This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler builtin errors. - -See the contract itself for all error codes. - -#### Example usage - -```solidity - -import "forge-std/Test.sol"; - -contract TestContract is Test { - ErrorsTest test; - - function setUp() public { - test = new ErrorsTest(); - } - - function testExpectArithmetic() public { - vm.expectRevert(stdError.arithmeticError); - test.arithmeticError(10); - } -} - -contract ErrorsTest { - function arithmeticError(uint256 a) public { - uint256 a = a - 100; - } -} -``` - -### stdStorage - -This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can *always* find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`). - -This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth. - -I.e.: -```solidity -struct T { - // depth 0 - uint256 a; - // depth 1 - uint256 b; -} -``` - -#### Example usage - -```solidity -import "forge-std/Test.sol"; - -contract TestContract is Test { - using stdStorage for StdStorage; - - Storage test; - - function setUp() public { - test = new Storage(); - } - - function testFindExists() public { - // Lets say we want to find the slot for the public - // variable `exists`. We just pass in the function selector - // to the `find` command - uint256 slot = stdstore.target(address(test)).sig("exists()").find(); - assertEq(slot, 0); - } - - function testWriteExists() public { - // Lets say we want to write to the slot for the public - // variable `exists`. We just pass in the function selector - // to the `checked_write` command - stdstore.target(address(test)).sig("exists()").checked_write(100); - assertEq(test.exists(), 100); - } - - // It supports arbitrary storage layouts, like assembly based storage locations - function testFindHidden() public { - // `hidden` is a random hash of a bytes, iteration through slots would - // not find it. Our mechanism does - // Also, you can use the selector instead of a string - uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find(); - assertEq(slot, uint256(keccak256("my.random.var"))); - } - - // If targeting a mapping, you have to pass in the keys necessary to perform the find - // i.e.: - function testFindMapping() public { - uint256 slot = stdstore - .target(address(test)) - .sig(test.map_addr.selector) - .with_key(address(this)) - .find(); - // in the `Storage` constructor, we wrote that this address' value was 1 in the map - // so when we load the slot, we expect it to be 1 - assertEq(uint(vm.load(address(test), bytes32(slot))), 1); - } - - // If the target is a struct, you can specify the field depth: - function testFindStruct() public { - // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc. - uint256 slot_for_a_field = stdstore - .target(address(test)) - .sig(test.basicStruct.selector) - .depth(0) - .find(); - - uint256 slot_for_b_field = stdstore - .target(address(test)) - .sig(test.basicStruct.selector) - .depth(1) - .find(); - - assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1); - assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2); - } -} - -// A complex storage contract -contract Storage { - struct UnpackedStruct { - uint256 a; - uint256 b; - } - - constructor() { - map_addr[msg.sender] = 1; - } - - uint256 public exists = 1; - mapping(address => uint256) public map_addr; - // mapping(address => Packed) public map_packed; - mapping(address => UnpackedStruct) public map_struct; - mapping(address => mapping(address => uint256)) public deep_map; - mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; - UnpackedStruct public basicStruct = UnpackedStruct({ - a: 1, - b: 2 - }); - - function hidden() public view returns (bytes32 t) { - // an extremely hidden storage slot - bytes32 slot = keccak256("my.random.var"); - assembly { - t := sload(slot) - } - } -} -``` - -### stdCheats - -This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for address that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you. - - -#### Example usage: -```solidity - -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "forge-std/Test.sol"; - -// Inherit the stdCheats -contract StdCheatsTest is Test { - Bar test; - function setUp() public { - test = new Bar(); - } - - function testHoax() public { - // we call `hoax`, which gives the target address - // eth and then calls `prank` - hoax(address(1337)); - test.bar{value: 100}(address(1337)); - - // overloaded to allow you to specify how much eth to - // initialize the address with - hoax(address(1337), 1); - test.bar{value: 1}(address(1337)); - } - - function testStartHoax() public { - // we call `startHoax`, which gives the target address - // eth and then calls `startPrank` - // - // it is also overloaded so that you can specify an eth amount - startHoax(address(1337)); - test.bar{value: 100}(address(1337)); - test.bar{value: 100}(address(1337)); - vm.stopPrank(); - test.bar(address(this)); - } -} - -contract Bar { - function bar(address expectedSender) public payable { - require(msg.sender == expectedSender, "!prank"); - } -} -``` - -### Std Assertions - -Expand upon the assertion functions from the `DSTest` library. - -### `console.log` - -Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log). -It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces. - -```solidity -// import it indirectly via Test.sol -import "forge-std/Test.sol"; -// or directly import it -import "forge-std/console2.sol"; -... -console2.log(someValue); -``` - -If you need compatibility with Hardhat, you must use the standard `console.sol` instead. -Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces. - -```solidity -// import it indirectly via Test.sol -import "forge-std/Test.sol"; -// or directly import it -import "forge-std/console.sol"; -... -console.log(someValue); -``` - -## License - -Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license. diff --git a/test/contracts/lib/forge-std/foundry.toml b/test/contracts/lib/forge-std/foundry.toml deleted file mode 100644 index 36e4e63e80..0000000000 --- a/test/contracts/lib/forge-std/foundry.toml +++ /dev/null @@ -1,21 +0,0 @@ -[profile.default] -fs_permissions = [{ access = "read-write", path = "./"}] - -[rpc_endpoints] -# The RPC URLs are modified versions of the default for testing initialization. -mainnet = "https://mainnet.infura.io/v3/16a8be88795540b9b3903d8de0f7baa5" # Different API key. -optimism_goerli = "https://goerli.optimism.io/" # Adds a trailing slash. -arbitrum_one_goerli = "https://goerli-rollup.arbitrum.io/rpc/" # Adds a trailing slash. -needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}" - -[fmt] -# These are all the `forge fmt` defaults. -line_length = 120 -tab_width = 4 -bracket_spacing = false -int_types = 'long' -multiline_func_header = 'attributes_first' -quote_style = 'double' -number_underscore = 'preserve' -single_line_statement_blocks = 'preserve' -ignore = ["src/console.sol", "src/console2.sol"] \ No newline at end of file diff --git a/test/contracts/lib/forge-std/lib/ds-test/.gitignore b/test/contracts/lib/forge-std/lib/ds-test/.gitignore deleted file mode 100644 index 63f0b2c6ec..0000000000 --- a/test/contracts/lib/forge-std/lib/ds-test/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/.dapple -/build -/out diff --git a/test/contracts/lib/forge-std/lib/ds-test/LICENSE b/test/contracts/lib/forge-std/lib/ds-test/LICENSE deleted file mode 100644 index 94a9ed024d..0000000000 --- a/test/contracts/lib/forge-std/lib/ds-test/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/test/contracts/lib/forge-std/lib/ds-test/Makefile b/test/contracts/lib/forge-std/lib/ds-test/Makefile deleted file mode 100644 index 661dac4868..0000000000 --- a/test/contracts/lib/forge-std/lib/ds-test/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -all:; dapp build - -test: - -dapp --use solc:0.4.23 build - -dapp --use solc:0.4.26 build - -dapp --use solc:0.5.17 build - -dapp --use solc:0.6.12 build - -dapp --use solc:0.7.5 build - -demo: - DAPP_SRC=demo dapp --use solc:0.7.5 build - -hevm dapp-test --verbose 3 - -.PHONY: test demo diff --git a/test/contracts/lib/forge-std/lib/ds-test/default.nix b/test/contracts/lib/forge-std/lib/ds-test/default.nix deleted file mode 100644 index cf65419ab4..0000000000 --- a/test/contracts/lib/forge-std/lib/ds-test/default.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ solidityPackage, dappsys }: solidityPackage { - name = "ds-test"; - src = ./src; -} diff --git a/test/contracts/lib/forge-std/lib/ds-test/demo/demo.sol b/test/contracts/lib/forge-std/lib/ds-test/demo/demo.sol deleted file mode 100644 index f3bb48e701..0000000000 --- a/test/contracts/lib/forge-std/lib/ds-test/demo/demo.sol +++ /dev/null @@ -1,222 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity >=0.5.0; - -import "../src/test.sol"; - -contract DemoTest is DSTest { - function test_this() public pure { - require(true); - } - function test_logs() public { - emit log("-- log(string)"); - emit log("a string"); - - emit log("-- log_named_uint(string, uint)"); - emit log_named_uint("uint", 512); - - emit log("-- log_named_int(string, int)"); - emit log_named_int("int", -512); - - emit log("-- log_named_address(string, address)"); - emit log_named_address("address", address(this)); - - emit log("-- log_named_bytes32(string, bytes32)"); - emit log_named_bytes32("bytes32", "a string"); - - emit log("-- log_named_bytes(string, bytes)"); - emit log_named_bytes("bytes", hex"cafefe"); - - emit log("-- log_named_string(string, string)"); - emit log_named_string("string", "a string"); - - emit log("-- log_named_decimal_uint(string, uint, uint)"); - emit log_named_decimal_uint("decimal uint", 1.0e18, 18); - - emit log("-- log_named_decimal_int(string, int, uint)"); - emit log_named_decimal_int("decimal int", -1.0e18, 18); - } - event log_old_named_uint(bytes32,uint); - function test_old_logs() public { - emit log_old_named_uint("key", 500); - emit log_named_bytes32("bkey", "val"); - } - function test_trace() public view { - this.echo("string 1", "string 2"); - } - function test_multiline() public { - emit log("a multiline\\nstring"); - emit log("a multiline string"); - emit log_bytes("a string"); - emit log_bytes("a multiline\nstring"); - emit log_bytes("a multiline\\nstring"); - emit logs(hex"0000"); - emit log_named_bytes("0x0000", hex"0000"); - emit logs(hex"ff"); - } - function echo(string memory s1, string memory s2) public pure - returns (string memory, string memory) - { - return (s1, s2); - } - - function prove_this(uint x) public { - emit log_named_uint("sym x", x); - assertGt(x + 1, 0); - } - - function test_logn() public { - assembly { - log0(0x01, 0x02) - log1(0x01, 0x02, 0x03) - log2(0x01, 0x02, 0x03, 0x04) - log3(0x01, 0x02, 0x03, 0x04, 0x05) - } - } - - event MyEvent(uint, uint indexed, uint, uint indexed); - function test_events() public { - emit MyEvent(1, 2, 3, 4); - } - - function test_asserts() public { - string memory err = "this test has failed!"; - emit log("## assertTrue(bool)\n"); - assertTrue(false); - emit log("\n"); - assertTrue(false, err); - - emit log("\n## assertEq(address,address)\n"); - assertEq(address(this), msg.sender); - emit log("\n"); - assertEq(address(this), msg.sender, err); - - emit log("\n## assertEq32(bytes32,bytes32)\n"); - assertEq32("bytes 1", "bytes 2"); - emit log("\n"); - assertEq32("bytes 1", "bytes 2", err); - - emit log("\n## assertEq(bytes32,bytes32)\n"); - assertEq32("bytes 1", "bytes 2"); - emit log("\n"); - assertEq32("bytes 1", "bytes 2", err); - - emit log("\n## assertEq(uint,uint)\n"); - assertEq(uint(0), 1); - emit log("\n"); - assertEq(uint(0), 1, err); - - emit log("\n## assertEq(int,int)\n"); - assertEq(-1, -2); - emit log("\n"); - assertEq(-1, -2, err); - - emit log("\n## assertEqDecimal(int,int,uint)\n"); - assertEqDecimal(-1.0e18, -1.1e18, 18); - emit log("\n"); - assertEqDecimal(-1.0e18, -1.1e18, 18, err); - - emit log("\n## assertEqDecimal(uint,uint,uint)\n"); - assertEqDecimal(uint(1.0e18), 1.1e18, 18); - emit log("\n"); - assertEqDecimal(uint(1.0e18), 1.1e18, 18, err); - - emit log("\n## assertGt(uint,uint)\n"); - assertGt(uint(0), 0); - emit log("\n"); - assertGt(uint(0), 0, err); - - emit log("\n## assertGt(int,int)\n"); - assertGt(-1, -1); - emit log("\n"); - assertGt(-1, -1, err); - - emit log("\n## assertGtDecimal(int,int,uint)\n"); - assertGtDecimal(-2.0e18, -1.1e18, 18); - emit log("\n"); - assertGtDecimal(-2.0e18, -1.1e18, 18, err); - - emit log("\n## assertGtDecimal(uint,uint,uint)\n"); - assertGtDecimal(uint(1.0e18), 1.1e18, 18); - emit log("\n"); - assertGtDecimal(uint(1.0e18), 1.1e18, 18, err); - - emit log("\n## assertGe(uint,uint)\n"); - assertGe(uint(0), 1); - emit log("\n"); - assertGe(uint(0), 1, err); - - emit log("\n## assertGe(int,int)\n"); - assertGe(-1, 0); - emit log("\n"); - assertGe(-1, 0, err); - - emit log("\n## assertGeDecimal(int,int,uint)\n"); - assertGeDecimal(-2.0e18, -1.1e18, 18); - emit log("\n"); - assertGeDecimal(-2.0e18, -1.1e18, 18, err); - - emit log("\n## assertGeDecimal(uint,uint,uint)\n"); - assertGeDecimal(uint(1.0e18), 1.1e18, 18); - emit log("\n"); - assertGeDecimal(uint(1.0e18), 1.1e18, 18, err); - - emit log("\n## assertLt(uint,uint)\n"); - assertLt(uint(0), 0); - emit log("\n"); - assertLt(uint(0), 0, err); - - emit log("\n## assertLt(int,int)\n"); - assertLt(-1, -1); - emit log("\n"); - assertLt(-1, -1, err); - - emit log("\n## assertLtDecimal(int,int,uint)\n"); - assertLtDecimal(-1.0e18, -1.1e18, 18); - emit log("\n"); - assertLtDecimal(-1.0e18, -1.1e18, 18, err); - - emit log("\n## assertLtDecimal(uint,uint,uint)\n"); - assertLtDecimal(uint(2.0e18), 1.1e18, 18); - emit log("\n"); - assertLtDecimal(uint(2.0e18), 1.1e18, 18, err); - - emit log("\n## assertLe(uint,uint)\n"); - assertLe(uint(1), 0); - emit log("\n"); - assertLe(uint(1), 0, err); - - emit log("\n## assertLe(int,int)\n"); - assertLe(0, -1); - emit log("\n"); - assertLe(0, -1, err); - - emit log("\n## assertLeDecimal(int,int,uint)\n"); - assertLeDecimal(-1.0e18, -1.1e18, 18); - emit log("\n"); - assertLeDecimal(-1.0e18, -1.1e18, 18, err); - - emit log("\n## assertLeDecimal(uint,uint,uint)\n"); - assertLeDecimal(uint(2.0e18), 1.1e18, 18); - emit log("\n"); - assertLeDecimal(uint(2.0e18), 1.1e18, 18, err); - - emit log("\n## assertEq(string,string)\n"); - string memory s1 = "string 1"; - string memory s2 = "string 2"; - assertEq(s1, s2); - emit log("\n"); - assertEq(s1, s2, err); - - emit log("\n## assertEq0(bytes,bytes)\n"); - assertEq0(hex"abcdef01", hex"abcdef02"); - emit log("\n"); - assertEq0(hex"abcdef01", hex"abcdef02", err); - } -} - -contract DemoTestWithSetUp { - function setUp() public { - } - function test_pass() public pure { - } -} diff --git a/test/contracts/lib/forge-std/lib/ds-test/package.json b/test/contracts/lib/forge-std/lib/ds-test/package.json deleted file mode 100644 index 4802adaa32..0000000000 --- a/test/contracts/lib/forge-std/lib/ds-test/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "ds-test", - "version": "1.0.0", - "description": "Assertions, equality checks and other test helpers ", - "bugs": "https://github.com/dapphub/ds-test/issues", - "license": "GPL-3.0", - "author": "Contributors to ds-test", - "files": [ - "src/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/dapphub/ds-test.git" - } -} diff --git a/test/contracts/lib/forge-std/lib/ds-test/package.json.d.ts b/test/contracts/lib/forge-std/lib/ds-test/package.json.d.ts deleted file mode 100644 index 0f871747d2..0000000000 --- a/test/contracts/lib/forge-std/lib/ds-test/package.json.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare const abi: { - "name": "ds-test", - "version": "1.0.0", - "description": "Assertions, equality checks and other test helpers ", - "bugs": "https://github.com/dapphub/ds-test/issues", - "license": "GPL-3.0", - "author": "Contributors to ds-test", - "files": [ - "src/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/dapphub/ds-test.git" - } -}; export default abi; diff --git a/test/contracts/lib/forge-std/lib/ds-test/src/test.sol b/test/contracts/lib/forge-std/lib/ds-test/src/test.sol deleted file mode 100644 index 515a3bd012..0000000000 --- a/test/contracts/lib/forge-std/lib/ds-test/src/test.sol +++ /dev/null @@ -1,469 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity >=0.5.0; - -contract DSTest { - event log (string); - event logs (bytes); - - event log_address (address); - event log_bytes32 (bytes32); - event log_int (int); - event log_uint (uint); - event log_bytes (bytes); - event log_string (string); - - event log_named_address (string key, address val); - event log_named_bytes32 (string key, bytes32 val); - event log_named_decimal_int (string key, int val, uint decimals); - event log_named_decimal_uint (string key, uint val, uint decimals); - event log_named_int (string key, int val); - event log_named_uint (string key, uint val); - event log_named_bytes (string key, bytes val); - event log_named_string (string key, string val); - - bool public IS_TEST = true; - bool private _failed; - - address constant HEVM_ADDRESS = - address(bytes20(uint160(uint256(keccak256('hevm cheat code'))))); - - modifier mayRevert() { _; } - modifier testopts(string memory) { _; } - - function failed() public returns (bool) { - if (_failed) { - return _failed; - } else { - bool globalFailed = false; - if (hasHEVMContext()) { - (, bytes memory retdata) = HEVM_ADDRESS.call( - abi.encodePacked( - bytes4(keccak256("load(address,bytes32)")), - abi.encode(HEVM_ADDRESS, bytes32("failed")) - ) - ); - globalFailed = abi.decode(retdata, (bool)); - } - return globalFailed; - } - } - - function fail() internal { - if (hasHEVMContext()) { - (bool status, ) = HEVM_ADDRESS.call( - abi.encodePacked( - bytes4(keccak256("store(address,bytes32,bytes32)")), - abi.encode(HEVM_ADDRESS, bytes32("failed"), bytes32(uint256(0x01))) - ) - ); - status; // Silence compiler warnings - } - _failed = true; - } - - function hasHEVMContext() internal view returns (bool) { - uint256 hevmCodeSize = 0; - assembly { - hevmCodeSize := extcodesize(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D) - } - return hevmCodeSize > 0; - } - - modifier logs_gas() { - uint startGas = gasleft(); - _; - uint endGas = gasleft(); - emit log_named_uint("gas", startGas - endGas); - } - - function assertTrue(bool condition) internal { - if (!condition) { - emit log("Error: Assertion Failed"); - fail(); - } - } - - function assertTrue(bool condition, string memory err) internal { - if (!condition) { - emit log_named_string("Error", err); - assertTrue(condition); - } - } - - function assertEq(address a, address b) internal { - if (a != b) { - emit log("Error: a == b not satisfied [address]"); - emit log_named_address(" Expected", b); - emit log_named_address(" Actual", a); - fail(); - } - } - function assertEq(address a, address b, string memory err) internal { - if (a != b) { - emit log_named_string ("Error", err); - assertEq(a, b); - } - } - - function assertEq(bytes32 a, bytes32 b) internal { - if (a != b) { - emit log("Error: a == b not satisfied [bytes32]"); - emit log_named_bytes32(" Expected", b); - emit log_named_bytes32(" Actual", a); - fail(); - } - } - function assertEq(bytes32 a, bytes32 b, string memory err) internal { - if (a != b) { - emit log_named_string ("Error", err); - assertEq(a, b); - } - } - function assertEq32(bytes32 a, bytes32 b) internal { - assertEq(a, b); - } - function assertEq32(bytes32 a, bytes32 b, string memory err) internal { - assertEq(a, b, err); - } - - function assertEq(int a, int b) internal { - if (a != b) { - emit log("Error: a == b not satisfied [int]"); - emit log_named_int(" Expected", b); - emit log_named_int(" Actual", a); - fail(); - } - } - function assertEq(int a, int b, string memory err) internal { - if (a != b) { - emit log_named_string("Error", err); - assertEq(a, b); - } - } - function assertEq(uint a, uint b) internal { - if (a != b) { - emit log("Error: a == b not satisfied [uint]"); - emit log_named_uint(" Expected", b); - emit log_named_uint(" Actual", a); - fail(); - } - } - function assertEq(uint a, uint b, string memory err) internal { - if (a != b) { - emit log_named_string("Error", err); - assertEq(a, b); - } - } - function assertEqDecimal(int a, int b, uint decimals) internal { - if (a != b) { - emit log("Error: a == b not satisfied [decimal int]"); - emit log_named_decimal_int(" Expected", b, decimals); - emit log_named_decimal_int(" Actual", a, decimals); - fail(); - } - } - function assertEqDecimal(int a, int b, uint decimals, string memory err) internal { - if (a != b) { - emit log_named_string("Error", err); - assertEqDecimal(a, b, decimals); - } - } - function assertEqDecimal(uint a, uint b, uint decimals) internal { - if (a != b) { - emit log("Error: a == b not satisfied [decimal uint]"); - emit log_named_decimal_uint(" Expected", b, decimals); - emit log_named_decimal_uint(" Actual", a, decimals); - fail(); - } - } - function assertEqDecimal(uint a, uint b, uint decimals, string memory err) internal { - if (a != b) { - emit log_named_string("Error", err); - assertEqDecimal(a, b, decimals); - } - } - - function assertGt(uint a, uint b) internal { - if (a <= b) { - emit log("Error: a > b not satisfied [uint]"); - emit log_named_uint(" Value a", a); - emit log_named_uint(" Value b", b); - fail(); - } - } - function assertGt(uint a, uint b, string memory err) internal { - if (a <= b) { - emit log_named_string("Error", err); - assertGt(a, b); - } - } - function assertGt(int a, int b) internal { - if (a <= b) { - emit log("Error: a > b not satisfied [int]"); - emit log_named_int(" Value a", a); - emit log_named_int(" Value b", b); - fail(); - } - } - function assertGt(int a, int b, string memory err) internal { - if (a <= b) { - emit log_named_string("Error", err); - assertGt(a, b); - } - } - function assertGtDecimal(int a, int b, uint decimals) internal { - if (a <= b) { - emit log("Error: a > b not satisfied [decimal int]"); - emit log_named_decimal_int(" Value a", a, decimals); - emit log_named_decimal_int(" Value b", b, decimals); - fail(); - } - } - function assertGtDecimal(int a, int b, uint decimals, string memory err) internal { - if (a <= b) { - emit log_named_string("Error", err); - assertGtDecimal(a, b, decimals); - } - } - function assertGtDecimal(uint a, uint b, uint decimals) internal { - if (a <= b) { - emit log("Error: a > b not satisfied [decimal uint]"); - emit log_named_decimal_uint(" Value a", a, decimals); - emit log_named_decimal_uint(" Value b", b, decimals); - fail(); - } - } - function assertGtDecimal(uint a, uint b, uint decimals, string memory err) internal { - if (a <= b) { - emit log_named_string("Error", err); - assertGtDecimal(a, b, decimals); - } - } - - function assertGe(uint a, uint b) internal { - if (a < b) { - emit log("Error: a >= b not satisfied [uint]"); - emit log_named_uint(" Value a", a); - emit log_named_uint(" Value b", b); - fail(); - } - } - function assertGe(uint a, uint b, string memory err) internal { - if (a < b) { - emit log_named_string("Error", err); - assertGe(a, b); - } - } - function assertGe(int a, int b) internal { - if (a < b) { - emit log("Error: a >= b not satisfied [int]"); - emit log_named_int(" Value a", a); - emit log_named_int(" Value b", b); - fail(); - } - } - function assertGe(int a, int b, string memory err) internal { - if (a < b) { - emit log_named_string("Error", err); - assertGe(a, b); - } - } - function assertGeDecimal(int a, int b, uint decimals) internal { - if (a < b) { - emit log("Error: a >= b not satisfied [decimal int]"); - emit log_named_decimal_int(" Value a", a, decimals); - emit log_named_decimal_int(" Value b", b, decimals); - fail(); - } - } - function assertGeDecimal(int a, int b, uint decimals, string memory err) internal { - if (a < b) { - emit log_named_string("Error", err); - assertGeDecimal(a, b, decimals); - } - } - function assertGeDecimal(uint a, uint b, uint decimals) internal { - if (a < b) { - emit log("Error: a >= b not satisfied [decimal uint]"); - emit log_named_decimal_uint(" Value a", a, decimals); - emit log_named_decimal_uint(" Value b", b, decimals); - fail(); - } - } - function assertGeDecimal(uint a, uint b, uint decimals, string memory err) internal { - if (a < b) { - emit log_named_string("Error", err); - assertGeDecimal(a, b, decimals); - } - } - - function assertLt(uint a, uint b) internal { - if (a >= b) { - emit log("Error: a < b not satisfied [uint]"); - emit log_named_uint(" Value a", a); - emit log_named_uint(" Value b", b); - fail(); - } - } - function assertLt(uint a, uint b, string memory err) internal { - if (a >= b) { - emit log_named_string("Error", err); - assertLt(a, b); - } - } - function assertLt(int a, int b) internal { - if (a >= b) { - emit log("Error: a < b not satisfied [int]"); - emit log_named_int(" Value a", a); - emit log_named_int(" Value b", b); - fail(); - } - } - function assertLt(int a, int b, string memory err) internal { - if (a >= b) { - emit log_named_string("Error", err); - assertLt(a, b); - } - } - function assertLtDecimal(int a, int b, uint decimals) internal { - if (a >= b) { - emit log("Error: a < b not satisfied [decimal int]"); - emit log_named_decimal_int(" Value a", a, decimals); - emit log_named_decimal_int(" Value b", b, decimals); - fail(); - } - } - function assertLtDecimal(int a, int b, uint decimals, string memory err) internal { - if (a >= b) { - emit log_named_string("Error", err); - assertLtDecimal(a, b, decimals); - } - } - function assertLtDecimal(uint a, uint b, uint decimals) internal { - if (a >= b) { - emit log("Error: a < b not satisfied [decimal uint]"); - emit log_named_decimal_uint(" Value a", a, decimals); - emit log_named_decimal_uint(" Value b", b, decimals); - fail(); - } - } - function assertLtDecimal(uint a, uint b, uint decimals, string memory err) internal { - if (a >= b) { - emit log_named_string("Error", err); - assertLtDecimal(a, b, decimals); - } - } - - function assertLe(uint a, uint b) internal { - if (a > b) { - emit log("Error: a <= b not satisfied [uint]"); - emit log_named_uint(" Value a", a); - emit log_named_uint(" Value b", b); - fail(); - } - } - function assertLe(uint a, uint b, string memory err) internal { - if (a > b) { - emit log_named_string("Error", err); - assertLe(a, b); - } - } - function assertLe(int a, int b) internal { - if (a > b) { - emit log("Error: a <= b not satisfied [int]"); - emit log_named_int(" Value a", a); - emit log_named_int(" Value b", b); - fail(); - } - } - function assertLe(int a, int b, string memory err) internal { - if (a > b) { - emit log_named_string("Error", err); - assertLe(a, b); - } - } - function assertLeDecimal(int a, int b, uint decimals) internal { - if (a > b) { - emit log("Error: a <= b not satisfied [decimal int]"); - emit log_named_decimal_int(" Value a", a, decimals); - emit log_named_decimal_int(" Value b", b, decimals); - fail(); - } - } - function assertLeDecimal(int a, int b, uint decimals, string memory err) internal { - if (a > b) { - emit log_named_string("Error", err); - assertLeDecimal(a, b, decimals); - } - } - function assertLeDecimal(uint a, uint b, uint decimals) internal { - if (a > b) { - emit log("Error: a <= b not satisfied [decimal uint]"); - emit log_named_decimal_uint(" Value a", a, decimals); - emit log_named_decimal_uint(" Value b", b, decimals); - fail(); - } - } - function assertLeDecimal(uint a, uint b, uint decimals, string memory err) internal { - if (a > b) { - emit log_named_string("Error", err); - assertGeDecimal(a, b, decimals); - } - } - - function assertEq(string memory a, string memory b) internal { - if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { - emit log("Error: a == b not satisfied [string]"); - emit log_named_string(" Expected", b); - emit log_named_string(" Actual", a); - fail(); - } - } - function assertEq(string memory a, string memory b, string memory err) internal { - if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { - emit log_named_string("Error", err); - assertEq(a, b); - } - } - - function checkEq0(bytes memory a, bytes memory b) internal pure returns (bool ok) { - ok = true; - if (a.length == b.length) { - for (uint i = 0; i < a.length; i++) { - if (a[i] != b[i]) { - ok = false; - } - } - } else { - ok = false; - } - } - function assertEq0(bytes memory a, bytes memory b) internal { - if (!checkEq0(a, b)) { - emit log("Error: a == b not satisfied [bytes]"); - emit log_named_bytes(" Expected", b); - emit log_named_bytes(" Actual", a); - fail(); - } - } - function assertEq0(bytes memory a, bytes memory b, string memory err) internal { - if (!checkEq0(a, b)) { - emit log_named_string("Error", err); - assertEq0(a, b); - } - } -} diff --git a/test/contracts/lib/forge-std/package.json b/test/contracts/lib/forge-std/package.json deleted file mode 100644 index a000ac8118..0000000000 --- a/test/contracts/lib/forge-std/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "forge-std", - "version": "1.2.0", - "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", - "homepage": "https://book.getfoundry.sh/forge/forge-std", - "bugs": "https://github.com/foundry-rs/forge-std/issues", - "license": "(Apache-2.0 OR MIT)", - "author": "Contributors to Forge Standard Library", - "files": [ - "src/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/foundry-rs/forge-std.git" - } -} diff --git a/test/contracts/lib/forge-std/package.json.d.ts b/test/contracts/lib/forge-std/package.json.d.ts deleted file mode 100644 index ab78228407..0000000000 --- a/test/contracts/lib/forge-std/package.json.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -declare const abi: { - "name": "forge-std", - "version": "1.2.0", - "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", - "homepage": "https://book.getfoundry.sh/forge/forge-std", - "bugs": "https://github.com/foundry-rs/forge-std/issues", - "license": "(Apache-2.0 OR MIT)", - "author": "Contributors to Forge Standard Library", - "files": [ - "src/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/foundry-rs/forge-std.git" - } -}; export default abi; diff --git a/test/contracts/lib/forge-std/src/Base.sol b/test/contracts/lib/forge-std/src/Base.sol deleted file mode 100644 index 83c5c1cfcb..0000000000 --- a/test/contracts/lib/forge-std/src/Base.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -import {StdStorage} from "./StdStorage.sol"; -import {Vm, VmSafe} from "./Vm.sol"; - -abstract contract CommonBase { - // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D. - address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); - // console.sol and console2.sol work by executing a staticcall to this address. - address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; - // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38. - address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller")))); - // Address of the test contract, deployed by the DEFAULT_SENDER. - address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; - // Deterministic deployment address of the Multicall3 contract. - address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11; - - uint256 internal constant UINT256_MAX = - 115792089237316195423570985008687907853269984665640564039457584007913129639935; - - Vm internal constant vm = Vm(VM_ADDRESS); - StdStorage internal stdstore; -} - -abstract contract TestBase is CommonBase {} - -abstract contract ScriptBase is CommonBase { - // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. - address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; - - VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS); -} diff --git a/test/contracts/lib/forge-std/src/Script.sol b/test/contracts/lib/forge-std/src/Script.sol deleted file mode 100644 index bffccadbe4..0000000000 --- a/test/contracts/lib/forge-std/src/Script.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -// 💬 ABOUT -// Standard Library's default Script. - -// 🧩 MODULES -import {ScriptBase} from "./Base.sol"; -import {console} from "./console.sol"; -import {console2} from "./console2.sol"; -import {StdChains} from "./StdChains.sol"; -import {StdCheatsSafe} from "./StdCheats.sol"; -import {stdJson} from "./StdJson.sol"; -import {stdMath} from "./StdMath.sol"; -import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; -import {StdUtils} from "./StdUtils.sol"; -import {VmSafe} from "./Vm.sol"; - -// 📦 BOILERPLATE -import {ScriptBase} from "./Base.sol"; - -// ⭐️ SCRIPT -abstract contract Script is StdChains, StdCheatsSafe, StdUtils, ScriptBase { - // Note: IS_SCRIPT() must return true. - bool public IS_SCRIPT = true; -} diff --git a/test/contracts/lib/forge-std/src/StdAssertions.sol b/test/contracts/lib/forge-std/src/StdAssertions.sol deleted file mode 100644 index 1967fa2829..0000000000 --- a/test/contracts/lib/forge-std/src/StdAssertions.sol +++ /dev/null @@ -1,325 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -import {DSTest} from "ds-test/test.sol"; -import {stdMath} from "./StdMath.sol"; - -abstract contract StdAssertions is DSTest { - event log_array(uint256[] val); - event log_array(int256[] val); - event log_array(address[] val); - event log_named_array(string key, uint256[] val); - event log_named_array(string key, int256[] val); - event log_named_array(string key, address[] val); - - function fail(string memory err) internal virtual { - emit log_named_string("Error", err); - fail(); - } - - function assertFalse(bool data) internal virtual { - assertTrue(!data); - } - - function assertFalse(bool data, string memory err) internal virtual { - assertTrue(!data, err); - } - - function assertEq(bool a, bool b) internal virtual { - if (a != b) { - emit log("Error: a == b not satisfied [bool]"); - emit log_named_string(" Expected", b ? "true" : "false"); - emit log_named_string(" Actual", a ? "true" : "false"); - fail(); - } - } - - function assertEq(bool a, bool b, string memory err) internal virtual { - if (a != b) { - emit log_named_string("Error", err); - assertEq(a, b); - } - } - - function assertEq(bytes memory a, bytes memory b) internal virtual { - assertEq0(a, b); - } - - function assertEq(bytes memory a, bytes memory b, string memory err) internal virtual { - assertEq0(a, b, err); - } - - function assertEq(uint256[] memory a, uint256[] memory b) internal virtual { - if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { - emit log("Error: a == b not satisfied [uint[]]"); - emit log_named_array(" Expected", b); - emit log_named_array(" Actual", a); - fail(); - } - } - - function assertEq(int256[] memory a, int256[] memory b) internal virtual { - if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { - emit log("Error: a == b not satisfied [int[]]"); - emit log_named_array(" Expected", b); - emit log_named_array(" Actual", a); - fail(); - } - } - - function assertEq(address[] memory a, address[] memory b) internal virtual { - if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { - emit log("Error: a == b not satisfied [address[]]"); - emit log_named_array(" Expected", b); - emit log_named_array(" Actual", a); - fail(); - } - } - - function assertEq(uint256[] memory a, uint256[] memory b, string memory err) internal virtual { - if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { - emit log_named_string("Error", err); - assertEq(a, b); - } - } - - function assertEq(int256[] memory a, int256[] memory b, string memory err) internal virtual { - if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { - emit log_named_string("Error", err); - assertEq(a, b); - } - } - - function assertEq(address[] memory a, address[] memory b, string memory err) internal virtual { - if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { - emit log_named_string("Error", err); - assertEq(a, b); - } - } - - // Legacy helper - function assertEqUint(uint256 a, uint256 b) internal virtual { - assertEq(uint256(a), uint256(b)); - } - - function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta) internal virtual { - uint256 delta = stdMath.delta(a, b); - - if (delta > maxDelta) { - emit log("Error: a ~= b not satisfied [uint]"); - emit log_named_uint(" Expected", b); - emit log_named_uint(" Actual", a); - emit log_named_uint(" Max Delta", maxDelta); - emit log_named_uint(" Delta", delta); - fail(); - } - } - - function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err) internal virtual { - uint256 delta = stdMath.delta(a, b); - - if (delta > maxDelta) { - emit log_named_string("Error", err); - assertApproxEqAbs(a, b, maxDelta); - } - } - - function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) internal virtual { - uint256 delta = stdMath.delta(a, b); - - if (delta > maxDelta) { - emit log("Error: a ~= b not satisfied [uint]"); - emit log_named_decimal_uint(" Expected", b, decimals); - emit log_named_decimal_uint(" Actual", a, decimals); - emit log_named_decimal_uint(" Max Delta", maxDelta, decimals); - emit log_named_decimal_uint(" Delta", delta, decimals); - fail(); - } - } - - function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, string memory err) - internal - virtual - { - uint256 delta = stdMath.delta(a, b); - - if (delta > maxDelta) { - emit log_named_string("Error", err); - assertApproxEqAbsDecimal(a, b, maxDelta, decimals); - } - } - - function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta) internal virtual { - uint256 delta = stdMath.delta(a, b); - - if (delta > maxDelta) { - emit log("Error: a ~= b not satisfied [int]"); - emit log_named_int(" Expected", b); - emit log_named_int(" Actual", a); - emit log_named_uint(" Max Delta", maxDelta); - emit log_named_uint(" Delta", delta); - fail(); - } - } - - function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err) internal virtual { - uint256 delta = stdMath.delta(a, b); - - if (delta > maxDelta) { - emit log_named_string("Error", err); - assertApproxEqAbs(a, b, maxDelta); - } - } - - function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals) internal virtual { - uint256 delta = stdMath.delta(a, b); - - if (delta > maxDelta) { - emit log("Error: a ~= b not satisfied [int]"); - emit log_named_decimal_int(" Expected", b, decimals); - emit log_named_decimal_int(" Actual", a, decimals); - emit log_named_decimal_uint(" Max Delta", maxDelta, decimals); - emit log_named_decimal_uint(" Delta", delta, decimals); - fail(); - } - } - - function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, string memory err) - internal - virtual - { - uint256 delta = stdMath.delta(a, b); - - if (delta > maxDelta) { - emit log_named_string("Error", err); - assertApproxEqAbsDecimal(a, b, maxDelta, decimals); - } - } - - function assertApproxEqRel( - uint256 a, - uint256 b, - uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100% - ) internal virtual { - if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too. - - uint256 percentDelta = stdMath.percentDelta(a, b); - - if (percentDelta > maxPercentDelta) { - emit log("Error: a ~= b not satisfied [uint]"); - emit log_named_uint(" Expected", b); - emit log_named_uint(" Actual", a); - emit log_named_decimal_uint(" Max % Delta", maxPercentDelta, 18); - emit log_named_decimal_uint(" % Delta", percentDelta, 18); - fail(); - } - } - - function assertApproxEqRel( - uint256 a, - uint256 b, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - string memory err - ) internal virtual { - if (b == 0) return assertEq(a, b, err); // If the expected is 0, actual must be too. - - uint256 percentDelta = stdMath.percentDelta(a, b); - - if (percentDelta > maxPercentDelta) { - emit log_named_string("Error", err); - assertApproxEqRel(a, b, maxPercentDelta); - } - } - - function assertApproxEqRelDecimal( - uint256 a, - uint256 b, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - uint256 decimals - ) internal virtual { - if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too. - - uint256 percentDelta = stdMath.percentDelta(a, b); - - if (percentDelta > maxPercentDelta) { - emit log("Error: a ~= b not satisfied [uint]"); - emit log_named_decimal_uint(" Expected", b, decimals); - emit log_named_decimal_uint(" Actual", a, decimals); - emit log_named_decimal_uint(" Max % Delta", maxPercentDelta, 18); - emit log_named_decimal_uint(" % Delta", percentDelta, 18); - fail(); - } - } - - function assertApproxEqRelDecimal( - uint256 a, - uint256 b, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - uint256 decimals, - string memory err - ) internal virtual { - if (b == 0) return assertEq(a, b, err); // If the expected is 0, actual must be too. - - uint256 percentDelta = stdMath.percentDelta(a, b); - - if (percentDelta > maxPercentDelta) { - emit log_named_string("Error", err); - assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); - } - } - - function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta) internal virtual { - if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too. - - uint256 percentDelta = stdMath.percentDelta(a, b); - - if (percentDelta > maxPercentDelta) { - emit log("Error: a ~= b not satisfied [int]"); - emit log_named_int(" Expected", b); - emit log_named_int(" Actual", a); - emit log_named_decimal_uint(" Max % Delta", maxPercentDelta, 18); - emit log_named_decimal_uint(" % Delta", percentDelta, 18); - fail(); - } - } - - function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err) internal virtual { - if (b == 0) return assertEq(a, b, err); // If the expected is 0, actual must be too. - - uint256 percentDelta = stdMath.percentDelta(a, b); - - if (percentDelta > maxPercentDelta) { - emit log_named_string("Error", err); - assertApproxEqRel(a, b, maxPercentDelta); - } - } - - function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals) internal virtual { - if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too. - - uint256 percentDelta = stdMath.percentDelta(a, b); - - if (percentDelta > maxPercentDelta) { - emit log("Error: a ~= b not satisfied [int]"); - emit log_named_decimal_int(" Expected", b, decimals); - emit log_named_decimal_int(" Actual", a, decimals); - emit log_named_decimal_uint(" Max % Delta", maxPercentDelta, 18); - emit log_named_decimal_uint(" % Delta", percentDelta, 18); - fail(); - } - } - - function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, string memory err) - internal - virtual - { - if (b == 0) return assertEq(a, b, err); // If the expected is 0, actual must be too. - - uint256 percentDelta = stdMath.percentDelta(a, b); - - if (percentDelta > maxPercentDelta) { - emit log_named_string("Error", err); - assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); - } - } -} diff --git a/test/contracts/lib/forge-std/src/StdChains.sol b/test/contracts/lib/forge-std/src/StdChains.sol deleted file mode 100644 index b1f0e6df4c..0000000000 --- a/test/contracts/lib/forge-std/src/StdChains.sol +++ /dev/null @@ -1,233 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import {VmSafe} from "./Vm.sol"; - -/** - * StdChains provides information about EVM compatible chains that can be used in scripts/tests. - * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are - * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of - * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the - * alias used in this contract, which can be found as the first argument to the - * `setChainWithDefaultRpcUrl` call in the `initialize` function. - * - * There are two main ways to use this contract: - * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or - * `setChain(string memory chainAlias, Chain memory chain)` - * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. - * - * The first time either of those are used, chains are initialized with the default set of RPC URLs. - * This is done in `initialize`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in - * `defaultRpcUrls`. - * - * The `setChain` function is straightforward, and it simply saves off the given chain data. - * - * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say - * we want to retrieve `mainnet`'s RPC URL: - * - If you haven't set any mainnet chain info with `setChain`, you haven't specified that - * chain in `foundry.toml` and no env var is set, the default data and RPC URL will be returned. - * - If you have set a mainnet RPC URL in `foundry.toml` it will return that, if valid (e.g. if - * a URL is given or if an environment variable is given and that environment variable exists). - * Otherwise, the default data is returned. - * - If you specified data with `setChain` it will return that. - * - * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults. - */ -abstract contract StdChains { - VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - - bool private initialized; - - struct ChainData { - string name; - uint256 chainId; - string rpcUrl; - } - - struct Chain { - // The chain name. - string name; - // The chain's Chain ID. - uint256 chainId; - // The chain's alias. (i.e. what gets specified in `foundry.toml`). - string chainAlias; - // A default RPC endpoint for this chain. - // NOTE: This default RPC URL is included for convenience to facilitate quick tests and - // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy - // usage as you will be throttled and this is a disservice to others who need this endpoint. - string rpcUrl; - } - - // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data. - mapping(string => Chain) private chains; - // Maps from the chain's alias to it's default RPC URL. - mapping(string => string) private defaultRpcUrls; - // Maps from a chain ID to it's alias. - mapping(uint256 => string) private idToAlias; - - bool private fallbackToDefaultRpcUrls = true; - - // The RPC URL will be fetched from config or defaultRpcUrls if possible. - function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) { - require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string."); - - initialize(); - chain = chains[chainAlias]; - require( - chain.chainId != 0, - string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found.")) - ); - - chain = getChainWithUpdatedRpcUrl(chainAlias, chain); - } - - function getChain(uint256 chainId) internal virtual returns (Chain memory chain) { - require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0."); - initialize(); - string memory chainAlias = idToAlias[chainId]; - - chain = chains[chainAlias]; - - require( - chain.chainId != 0, - string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found.")) - ); - - chain = getChainWithUpdatedRpcUrl(chainAlias, chain); - } - - // set chain info, with priority to argument's rpcUrl field. - function setChain(string memory chainAlias, ChainData memory chain) internal virtual { - require( - bytes(chainAlias).length != 0, - "StdChains setChain(string,ChainData): Chain alias cannot be the empty string." - ); - - require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0."); - - initialize(); - string memory foundAlias = idToAlias[chain.chainId]; - - require( - bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)), - string( - abi.encodePacked( - "StdChains setChain(string,ChainData): Chain ID ", - vm.toString(chain.chainId), - " already used by \"", - foundAlias, - "\"." - ) - ) - ); - - uint256 oldChainId = chains[chainAlias].chainId; - delete idToAlias[oldChainId]; - - chains[chainAlias] = - Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl}); - idToAlias[chain.chainId] = chainAlias; - } - - // set chain info, with priority to argument's rpcUrl field. - function setChain(string memory chainAlias, Chain memory chain) internal virtual { - setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl})); - } - - function _toUpper(string memory str) private pure returns (string memory) { - bytes memory strb = bytes(str); - bytes memory copy = new bytes(strb.length); - for (uint256 i = 0; i < strb.length; i++) { - bytes1 b = strb[i]; - if (b >= 0x61 && b <= 0x7A) { - copy[i] = bytes1(uint8(b) - 32); - } else { - copy[i] = b; - } - } - return string(copy); - } - - // lookup rpcUrl, in descending order of priority: - // current -> config (foundry.toml) -> environment variable -> default - function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) private returns (Chain memory) { - if (bytes(chain.rpcUrl).length == 0) { - try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) { - chain.rpcUrl = configRpcUrl; - } catch (bytes memory err) { - string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL")); - if (fallbackToDefaultRpcUrls) { - chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]); - } else { - chain.rpcUrl = vm.envString(envName); - } - // distinguish 'not found' from 'cannot read' - bytes memory notFoundError = - abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias))); - if (keccak256(notFoundError) != keccak256(err) || bytes(chain.rpcUrl).length == 0) { - /// @solidity memory-safe-assembly - assembly { - revert(add(32, err), mload(err)) - } - } - } - } - return chain; - } - - function setFallbackToDefaultRpcUrls(bool useDefault) internal { - fallbackToDefaultRpcUrls = useDefault; - } - - function initialize() private { - if (initialized) return; - - initialized = true; - - // If adding an RPC here, make sure to test the default RPC URL in `testRpcs` - setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545")); - setChainWithDefaultRpcUrl( - "mainnet", ChainData("Mainnet", 1, "https://mainnet.infura.io/v3/f4a0bdad42674adab5fc0ac077ffab2b") - ); - setChainWithDefaultRpcUrl( - "goerli", ChainData("Goerli", 5, "https://goerli.infura.io/v3/f4a0bdad42674adab5fc0ac077ffab2b") - ); - setChainWithDefaultRpcUrl( - "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/f4a0bdad42674adab5fc0ac077ffab2b") - ); - setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io")); - setChainWithDefaultRpcUrl("optimism_goerli", ChainData("Optimism Goerli", 420, "https://goerli.optimism.io")); - setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc")); - setChainWithDefaultRpcUrl( - "arbitrum_one_goerli", ChainData("Arbitrum One Goerli", 421613, "https://goerli-rollup.arbitrum.io/rpc") - ); - setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc")); - setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com")); - setChainWithDefaultRpcUrl( - "polygon_mumbai", ChainData("Polygon Mumbai", 80001, "https://rpc-mumbai.maticvigil.com") - ); - setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc")); - setChainWithDefaultRpcUrl( - "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc") - ); - setChainWithDefaultRpcUrl( - "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org") - ); - setChainWithDefaultRpcUrl( - "bnb_smart_chain_testnet", - ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel") - ); - setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com")); - } - - // set chain info, with priority to chainAlias' rpc url in foundry.toml - function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private { - string memory rpcUrl = chain.rpcUrl; - defaultRpcUrls[chainAlias] = rpcUrl; - chain.rpcUrl = ""; - setChain(chainAlias, chain); - chain.rpcUrl = rpcUrl; // restore argument - } -} diff --git a/test/contracts/lib/forge-std/src/StdCheats.sol b/test/contracts/lib/forge-std/src/StdCheats.sol deleted file mode 100644 index 356b9ee7a2..0000000000 --- a/test/contracts/lib/forge-std/src/StdCheats.sol +++ /dev/null @@ -1,572 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import {StdStorage, stdStorage} from "./StdStorage.sol"; -import {Vm} from "./Vm.sol"; - -abstract contract StdCheatsSafe { - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - bool private gasMeteringOff; - - // Data structures to parse Transaction objects from the broadcast artifact - // that conform to EIP1559. The Raw structs is what is parsed from the JSON - // and then converted to the one that is used by the user for better UX. - - struct RawTx1559 { - string[] arguments; - address contractAddress; - string contractName; - // json value name = function - string functionSig; - bytes32 hash; - // json value name = tx - RawTx1559Detail txDetail; - // json value name = type - string opcode; - } - - struct RawTx1559Detail { - AccessList[] accessList; - bytes data; - address from; - bytes gas; - bytes nonce; - address to; - bytes txType; - bytes value; - } - - struct Tx1559 { - string[] arguments; - address contractAddress; - string contractName; - string functionSig; - bytes32 hash; - Tx1559Detail txDetail; - string opcode; - } - - struct Tx1559Detail { - AccessList[] accessList; - bytes data; - address from; - uint256 gas; - uint256 nonce; - address to; - uint256 txType; - uint256 value; - } - - // Data structures to parse Transaction objects from the broadcast artifact - // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON - // and then converted to the one that is used by the user for better UX. - - struct TxLegacy { - string[] arguments; - address contractAddress; - string contractName; - string functionSig; - string hash; - string opcode; - TxDetailLegacy transaction; - } - - struct TxDetailLegacy { - AccessList[] accessList; - uint256 chainId; - bytes data; - address from; - uint256 gas; - uint256 gasPrice; - bytes32 hash; - uint256 nonce; - bytes1 opcode; - bytes32 r; - bytes32 s; - uint256 txType; - address to; - uint8 v; - uint256 value; - } - - struct AccessList { - address accessAddress; - bytes32[] storageKeys; - } - - // Data structures to parse Receipt objects from the broadcast artifact. - // The Raw structs is what is parsed from the JSON - // and then converted to the one that is used by the user for better UX. - - struct RawReceipt { - bytes32 blockHash; - bytes blockNumber; - address contractAddress; - bytes cumulativeGasUsed; - bytes effectiveGasPrice; - address from; - bytes gasUsed; - RawReceiptLog[] logs; - bytes logsBloom; - bytes status; - address to; - bytes32 transactionHash; - bytes transactionIndex; - } - - struct Receipt { - bytes32 blockHash; - uint256 blockNumber; - address contractAddress; - uint256 cumulativeGasUsed; - uint256 effectiveGasPrice; - address from; - uint256 gasUsed; - ReceiptLog[] logs; - bytes logsBloom; - uint256 status; - address to; - bytes32 transactionHash; - uint256 transactionIndex; - } - - // Data structures to parse the entire broadcast artifact, assuming the - // transactions conform to EIP1559. - - struct EIP1559ScriptArtifact { - string[] libraries; - string path; - string[] pending; - Receipt[] receipts; - uint256 timestamp; - Tx1559[] transactions; - TxReturn[] txReturns; - } - - struct RawEIP1559ScriptArtifact { - string[] libraries; - string path; - string[] pending; - RawReceipt[] receipts; - TxReturn[] txReturns; - uint256 timestamp; - RawTx1559[] transactions; - } - - struct RawReceiptLog { - // json value = address - address logAddress; - bytes32 blockHash; - bytes blockNumber; - bytes data; - bytes logIndex; - bool removed; - bytes32[] topics; - bytes32 transactionHash; - bytes transactionIndex; - bytes transactionLogIndex; - } - - struct ReceiptLog { - // json value = address - address logAddress; - bytes32 blockHash; - uint256 blockNumber; - bytes data; - uint256 logIndex; - bytes32[] topics; - uint256 transactionIndex; - uint256 transactionLogIndex; - bool removed; - } - - struct TxReturn { - string internalType; - string value; - } - - function assumeNoPrecompiles(address addr) internal virtual { - // Assembly required since `block.chainid` was introduced in 0.8.0. - uint256 chainId; - assembly { - chainId := chainid() - } - assumeNoPrecompiles(addr, chainId); - } - - function assumeNoPrecompiles(address addr, uint256 chainId) internal pure virtual { - // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific - // address), but the same rationale for excluding them applies so we include those too. - - // These should be present on all EVM-compatible chains. - vm.assume(addr < address(0x1) || addr > address(0x9)); - - // forgefmt: disable-start - if (chainId == 10 || chainId == 420) { - // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21 - vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800)); - } else if (chainId == 42161 || chainId == 421613) { - // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains - vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068)); - } else if (chainId == 43114 || chainId == 43113) { - // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59 - vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff)); - vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF)); - vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff)); - } - // forgefmt: disable-end - } - - function readEIP1559ScriptArtifact(string memory path) - internal - view - virtual - returns (EIP1559ScriptArtifact memory) - { - string memory data = vm.readFile(path); - bytes memory parsedData = vm.parseJson(data); - RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact)); - EIP1559ScriptArtifact memory artifact; - artifact.libraries = rawArtifact.libraries; - artifact.path = rawArtifact.path; - artifact.timestamp = rawArtifact.timestamp; - artifact.pending = rawArtifact.pending; - artifact.txReturns = rawArtifact.txReturns; - artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts); - artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions); - return artifact; - } - - function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) { - Tx1559[] memory txs = new Tx1559[](rawTxs.length); - for (uint256 i; i < rawTxs.length; i++) { - txs[i] = rawToConvertedEIPTx1559(rawTxs[i]); - } - return txs; - } - - function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) { - Tx1559 memory transaction; - transaction.arguments = rawTx.arguments; - transaction.contractName = rawTx.contractName; - transaction.functionSig = rawTx.functionSig; - transaction.hash = rawTx.hash; - transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail); - transaction.opcode = rawTx.opcode; - return transaction; - } - - function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail) - internal - pure - virtual - returns (Tx1559Detail memory) - { - Tx1559Detail memory txDetail; - txDetail.data = rawDetail.data; - txDetail.from = rawDetail.from; - txDetail.to = rawDetail.to; - txDetail.nonce = _bytesToUint(rawDetail.nonce); - txDetail.txType = _bytesToUint(rawDetail.txType); - txDetail.value = _bytesToUint(rawDetail.value); - txDetail.gas = _bytesToUint(rawDetail.gas); - txDetail.accessList = rawDetail.accessList; - return txDetail; - } - - function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) { - string memory deployData = vm.readFile(path); - bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions"); - RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[])); - return rawToConvertedEIPTx1559s(rawTxs); - } - - function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) { - string memory deployData = vm.readFile(path); - string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]")); - bytes memory parsedDeployData = vm.parseJson(deployData, key); - RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559)); - return rawToConvertedEIPTx1559(rawTx); - } - - // Analogous to readTransactions, but for receipts. - function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) { - string memory deployData = vm.readFile(path); - bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts"); - RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[])); - return rawToConvertedReceipts(rawReceipts); - } - - function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) { - string memory deployData = vm.readFile(path); - string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]")); - bytes memory parsedDeployData = vm.parseJson(deployData, key); - RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt)); - return rawToConvertedReceipt(rawReceipt); - } - - function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) { - Receipt[] memory receipts = new Receipt[](rawReceipts.length); - for (uint256 i; i < rawReceipts.length; i++) { - receipts[i] = rawToConvertedReceipt(rawReceipts[i]); - } - return receipts; - } - - function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) { - Receipt memory receipt; - receipt.blockHash = rawReceipt.blockHash; - receipt.to = rawReceipt.to; - receipt.from = rawReceipt.from; - receipt.contractAddress = rawReceipt.contractAddress; - receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice); - receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed); - receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed); - receipt.status = _bytesToUint(rawReceipt.status); - receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex); - receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber); - receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs); - receipt.logsBloom = rawReceipt.logsBloom; - receipt.transactionHash = rawReceipt.transactionHash; - return receipt; - } - - function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs) - internal - pure - virtual - returns (ReceiptLog[] memory) - { - ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length); - for (uint256 i; i < rawLogs.length; i++) { - logs[i].logAddress = rawLogs[i].logAddress; - logs[i].blockHash = rawLogs[i].blockHash; - logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber); - logs[i].data = rawLogs[i].data; - logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex); - logs[i].topics = rawLogs[i].topics; - logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex); - logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex); - logs[i].removed = rawLogs[i].removed; - } - return logs; - } - - // Deploy a contract by fetching the contract bytecode from - // the artifacts directory - // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))` - function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) { - bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); - /// @solidity memory-safe-assembly - assembly { - addr := create(0, add(bytecode, 0x20), mload(bytecode)) - } - - require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed."); - } - - function deployCode(string memory what) internal virtual returns (address addr) { - bytes memory bytecode = vm.getCode(what); - /// @solidity memory-safe-assembly - assembly { - addr := create(0, add(bytecode, 0x20), mload(bytecode)) - } - - require(addr != address(0), "StdCheats deployCode(string): Deployment failed."); - } - - /// @dev deploy contract with value on construction - function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) { - bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); - /// @solidity memory-safe-assembly - assembly { - addr := create(val, add(bytecode, 0x20), mload(bytecode)) - } - - require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed."); - } - - function deployCode(string memory what, uint256 val) internal virtual returns (address addr) { - bytes memory bytecode = vm.getCode(what); - /// @solidity memory-safe-assembly - assembly { - addr := create(val, add(bytecode, 0x20), mload(bytecode)) - } - - require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed."); - } - - // creates a labeled address and the corresponding private key - function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) { - privateKey = uint256(keccak256(abi.encodePacked(name))); - addr = vm.addr(privateKey); - vm.label(addr, name); - } - - // creates a labeled address - function makeAddr(string memory name) internal virtual returns (address addr) { - (addr,) = makeAddrAndKey(name); - } - - function deriveRememberKey(string memory mnemonic, uint32 index) - internal - virtual - returns (address who, uint256 privateKey) - { - privateKey = vm.deriveKey(mnemonic, index); - who = vm.rememberKey(privateKey); - } - - function _bytesToUint(bytes memory b) private pure returns (uint256) { - require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32."); - return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); - } - - function isFork() internal view virtual returns (bool status) { - try vm.activeFork() { - status = true; - } catch (bytes memory) {} - } - - modifier skipWhenForking() { - if (!isFork()) { - _; - } - } - - modifier skipWhenNotForking() { - if (isFork()) { - _; - } - } - - modifier noGasMetering() { - vm.pauseGasMetering(); - // To prevent turning gas monitoring back on with nested functions that use this modifier, - // we check if gasMetering started in the off position. If it did, we don't want to turn - // it back on until we exit the top level function that used the modifier - // - // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well. - // funcA will have `gasStartedOff` as false, funcB will have it as true, - // so we only turn metering back on at the end of the funcA - bool gasStartedOff = gasMeteringOff; - gasMeteringOff = true; - - _; - - // if gas metering was on when this modifier was called, turn it back on at the end - if (!gasStartedOff) { - gasMeteringOff = false; - vm.resumeGasMetering(); - } - } - - // a cheat for fuzzing addresses that are payable only - // see https://github.com/foundry-rs/foundry/issues/3631 - function assumePayable(address addr) internal virtual { - (bool success,) = payable(addr).call{value: 0}(""); - vm.assume(success); - } -} - -// Wrappers around cheatcodes to avoid footguns -abstract contract StdCheats is StdCheatsSafe { - using stdStorage for StdStorage; - - StdStorage private stdstore; - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - // Skip forward or rewind time by the specified number of seconds - function skip(uint256 time) internal virtual { - vm.warp(block.timestamp + time); - } - - function rewind(uint256 time) internal virtual { - vm.warp(block.timestamp - time); - } - - // Setup a prank from an address that has some ether - function hoax(address msgSender) internal virtual { - vm.deal(msgSender, 1 << 128); - vm.prank(msgSender); - } - - function hoax(address msgSender, uint256 give) internal virtual { - vm.deal(msgSender, give); - vm.prank(msgSender); - } - - function hoax(address msgSender, address origin) internal virtual { - vm.deal(msgSender, 1 << 128); - vm.prank(msgSender, origin); - } - - function hoax(address msgSender, address origin, uint256 give) internal virtual { - vm.deal(msgSender, give); - vm.prank(msgSender, origin); - } - - // Start perpetual prank from an address that has some ether - function startHoax(address msgSender) internal virtual { - vm.deal(msgSender, 1 << 128); - vm.startPrank(msgSender); - } - - function startHoax(address msgSender, uint256 give) internal virtual { - vm.deal(msgSender, give); - vm.startPrank(msgSender); - } - - // Start perpetual prank from an address that has some ether - // tx.origin is set to the origin parameter - function startHoax(address msgSender, address origin) internal virtual { - vm.deal(msgSender, 1 << 128); - vm.startPrank(msgSender, origin); - } - - function startHoax(address msgSender, address origin, uint256 give) internal virtual { - vm.deal(msgSender, give); - vm.startPrank(msgSender, origin); - } - - function changePrank(address msgSender) internal virtual { - vm.stopPrank(); - vm.startPrank(msgSender); - } - - // The same as Vm's `deal` - // Use the alternative signature for ERC20 tokens - function deal(address to, uint256 give) internal virtual { - vm.deal(to, give); - } - - // Set the balance of an account for any ERC20 token - // Use the alternative signature to update `totalSupply` - function deal(address token, address to, uint256 give) internal virtual { - deal(token, to, give, false); - } - - function deal(address token, address to, uint256 give, bool adjust) internal virtual { - // get current balance - (, bytes memory balData) = token.call(abi.encodeWithSelector(0x70a08231, to)); - uint256 prevBal = abi.decode(balData, (uint256)); - - // update balance - stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give); - - // update total supply - if (adjust) { - (, bytes memory totSupData) = token.call(abi.encodeWithSelector(0x18160ddd)); - uint256 totSup = abi.decode(totSupData, (uint256)); - if (give < prevBal) { - totSup -= (prevBal - give); - } else { - totSup += (give - prevBal); - } - stdstore.target(token).sig(0x18160ddd).checked_write(totSup); - } - } -} diff --git a/test/contracts/lib/forge-std/src/StdError.sol b/test/contracts/lib/forge-std/src/StdError.sol deleted file mode 100644 index a302191faa..0000000000 --- a/test/contracts/lib/forge-std/src/StdError.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT -// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test -pragma solidity >=0.6.2 <0.9.0; - -library stdError { - bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01); - bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11); - bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12); - bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21); - bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22); - bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31); - bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32); - bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41); - bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51); -} diff --git a/test/contracts/lib/forge-std/src/StdInvariant.sol b/test/contracts/lib/forge-std/src/StdInvariant.sol deleted file mode 100644 index efa1129ef6..0000000000 --- a/test/contracts/lib/forge-std/src/StdInvariant.sol +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -contract StdInvariant { - struct FuzzSelector { - address addr; - bytes4[] selectors; - } - - address[] private _excludedContracts; - address[] private _excludedSenders; - address[] private _targetedContracts; - address[] private _targetedSenders; - - string[] private _excludedArtifacts; - string[] private _targetedArtifacts; - - FuzzSelector[] private _targetedArtifactSelectors; - FuzzSelector[] private _targetedSelectors; - - // Functions for users: - // These are intended to be called in tests. - - function excludeContract(address newExcludedContract_) internal { - _excludedContracts.push(newExcludedContract_); - } - - function excludeSender(address newExcludedSender_) internal { - _excludedSenders.push(newExcludedSender_); - } - - function excludeArtifact(string memory newExcludedArtifact_) internal { - _excludedArtifacts.push(newExcludedArtifact_); - } - - function targetArtifact(string memory newTargetedArtifact_) internal { - _targetedArtifacts.push(newTargetedArtifact_); - } - - function targetArtifactSelector(FuzzSelector memory newTargetedArtifactSelector_) internal { - _targetedArtifactSelectors.push(newTargetedArtifactSelector_); - } - - function targetContract(address newTargetedContract_) internal { - _targetedContracts.push(newTargetedContract_); - } - - function targetSelector(FuzzSelector memory newTargetedSelector_) internal { - _targetedSelectors.push(newTargetedSelector_); - } - - function targetSender(address newTargetedSender_) internal { - _targetedSenders.push(newTargetedSender_); - } - - // Functions for forge: - // These are called by forge to run invariant tests and don't need to be called in tests. - - function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) { - excludedArtifacts_ = _excludedArtifacts; - } - - function excludeContracts() public view returns (address[] memory excludedContracts_) { - excludedContracts_ = _excludedContracts; - } - - function excludeSenders() public view returns (address[] memory excludedSenders_) { - excludedSenders_ = _excludedSenders; - } - - function targetArtifacts() public view returns (string[] memory targetedArtifacts_) { - targetedArtifacts_ = _targetedArtifacts; - } - - function targetArtifactSelectors() public view returns (FuzzSelector[] memory targetedArtifactSelectors_) { - targetedArtifactSelectors_ = _targetedArtifactSelectors; - } - - function targetContracts() public view returns (address[] memory targetedContracts_) { - targetedContracts_ = _targetedContracts; - } - - function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) { - targetedSelectors_ = _targetedSelectors; - } - - function targetSenders() public view returns (address[] memory targetedSenders_) { - targetedSenders_ = _targetedSenders; - } -} diff --git a/test/contracts/lib/forge-std/src/StdJson.sol b/test/contracts/lib/forge-std/src/StdJson.sol deleted file mode 100644 index 014e6b15e5..0000000000 --- a/test/contracts/lib/forge-std/src/StdJson.sol +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.0 <0.9.0; - -pragma experimental ABIEncoderV2; - -import {VmSafe} from "./Vm.sol"; - -// Helpers for parsing and writing JSON files -// To parse: -// ``` -// using stdJson for string; -// string memory json = vm.readFile("some_peth"); -// json.parseUint(""); -// ``` -// To write: -// ``` -// using stdJson for string; -// string memory json = "deploymentArtifact"; -// Contract contract = new Contract(); -// json.serialize("contractAddress", address(contract)); -// json = json.serialize("deploymentTimes", uint(1)); -// // store the stringified JSON to the 'json' variable we have been using as a key -// // as we won't need it any longer -// string memory json2 = "finalArtifact"; -// string memory final = json2.serialize("depArtifact", json); -// final.write(""); -// ``` - -library stdJson { - VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) { - return vm.parseJson(json, key); - } - - function readUint(string memory json, string memory key) internal returns (uint256) { - return vm.parseJsonUint(json, key); - } - - function readUintArray(string memory json, string memory key) internal returns (uint256[] memory) { - return vm.parseJsonUintArray(json, key); - } - - function readInt(string memory json, string memory key) internal returns (int256) { - return vm.parseJsonInt(json, key); - } - - function readIntArray(string memory json, string memory key) internal returns (int256[] memory) { - return vm.parseJsonIntArray(json, key); - } - - function readBytes32(string memory json, string memory key) internal returns (bytes32) { - return vm.parseJsonBytes32(json, key); - } - - function readBytes32Array(string memory json, string memory key) internal returns (bytes32[] memory) { - return vm.parseJsonBytes32Array(json, key); - } - - function readString(string memory json, string memory key) internal returns (string memory) { - return vm.parseJsonString(json, key); - } - - function readStringArray(string memory json, string memory key) internal returns (string[] memory) { - return vm.parseJsonStringArray(json, key); - } - - function readAddress(string memory json, string memory key) internal returns (address) { - return vm.parseJsonAddress(json, key); - } - - function readAddressArray(string memory json, string memory key) internal returns (address[] memory) { - return vm.parseJsonAddressArray(json, key); - } - - function readBool(string memory json, string memory key) internal returns (bool) { - return vm.parseJsonBool(json, key); - } - - function readBoolArray(string memory json, string memory key) internal returns (bool[] memory) { - return vm.parseJsonBoolArray(json, key); - } - - function readBytes(string memory json, string memory key) internal returns (bytes memory) { - return vm.parseJsonBytes(json, key); - } - - function readBytesArray(string memory json, string memory key) internal returns (bytes[] memory) { - return vm.parseJsonBytesArray(json, key); - } - - function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { - return vm.serializeBool(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bool[] memory value) - internal - returns (string memory) - { - return vm.serializeBool(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { - return vm.serializeUint(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, uint256[] memory value) - internal - returns (string memory) - { - return vm.serializeUint(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { - return vm.serializeInt(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, int256[] memory value) - internal - returns (string memory) - { - return vm.serializeInt(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { - return vm.serializeAddress(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, address[] memory value) - internal - returns (string memory) - { - return vm.serializeAddress(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { - return vm.serializeBytes32(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes32[] memory value) - internal - returns (string memory) - { - return vm.serializeBytes32(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { - return vm.serializeBytes(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes[] memory value) - internal - returns (string memory) - { - return vm.serializeBytes(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, string memory value) - internal - returns (string memory) - { - return vm.serializeString(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, string[] memory value) - internal - returns (string memory) - { - return vm.serializeString(jsonKey, key, value); - } - - function write(string memory jsonKey, string memory path) internal { - vm.writeJson(jsonKey, path); - } - - function write(string memory jsonKey, string memory path, string memory valueKey) internal { - vm.writeJson(jsonKey, path, valueKey); - } -} diff --git a/test/contracts/lib/forge-std/src/StdMath.sol b/test/contracts/lib/forge-std/src/StdMath.sol deleted file mode 100644 index 459523bdac..0000000000 --- a/test/contracts/lib/forge-std/src/StdMath.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -library stdMath { - int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968; - - function abs(int256 a) internal pure returns (uint256) { - // Required or it will fail when `a = type(int256).min` - if (a == INT256_MIN) { - return 57896044618658097711785492504343953926634992332820282019728792003956564819968; - } - - return uint256(a > 0 ? a : -a); - } - - function delta(uint256 a, uint256 b) internal pure returns (uint256) { - return a > b ? a - b : b - a; - } - - function delta(int256 a, int256 b) internal pure returns (uint256) { - // a and b are of the same sign - // this works thanks to two's complement, the left-most bit is the sign bit - if ((a ^ b) > -1) { - return delta(abs(a), abs(b)); - } - - // a and b are of opposite signs - return abs(a) + abs(b); - } - - function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) { - uint256 absDelta = delta(a, b); - - return absDelta * 1e18 / b; - } - - function percentDelta(int256 a, int256 b) internal pure returns (uint256) { - uint256 absDelta = delta(a, b); - uint256 absB = abs(b); - - return absDelta * 1e18 / absB; - } -} diff --git a/test/contracts/lib/forge-std/src/StdStorage.sol b/test/contracts/lib/forge-std/src/StdStorage.sol deleted file mode 100644 index 73a5ceb969..0000000000 --- a/test/contracts/lib/forge-std/src/StdStorage.sol +++ /dev/null @@ -1,327 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -import {Vm} from "./Vm.sol"; - -struct StdStorage { - mapping(address => mapping(bytes4 => mapping(bytes32 => uint256))) slots; - mapping(address => mapping(bytes4 => mapping(bytes32 => bool))) finds; - bytes32[] _keys; - bytes4 _sig; - uint256 _depth; - address _target; - bytes32 _set; -} - -library stdStorageSafe { - event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot); - event WARNING_UninitedSlot(address who, uint256 slot); - - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function sigs(string memory sigStr) internal pure returns (bytes4) { - return bytes4(keccak256(bytes(sigStr))); - } - - /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against - // slot complexity: - // if flat, will be bytes32(uint256(uint)); - // if map, will be keccak256(abi.encode(key, uint(slot))); - // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))); - // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); - function find(StdStorage storage self) internal returns (uint256) { - address who = self._target; - bytes4 fsig = self._sig; - uint256 field_depth = self._depth; - bytes32[] memory ins = self._keys; - - // calldata to test against - if (self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]) { - return self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]; - } - bytes memory cald = abi.encodePacked(fsig, flatten(ins)); - vm.record(); - bytes32 fdat; - { - (, bytes memory rdat) = who.staticcall(cald); - fdat = bytesToBytes32(rdat, 32 * field_depth); - } - - (bytes32[] memory reads,) = vm.accesses(address(who)); - if (reads.length == 1) { - bytes32 curr = vm.load(who, reads[0]); - if (curr == bytes32(0)) { - emit WARNING_UninitedSlot(who, uint256(reads[0])); - } - if (fdat != curr) { - require( - false, - "stdStorage find(StdStorage): Packed slot. This would cause dangerous overwriting and currently isn't supported." - ); - } - emit SlotFound(who, fsig, keccak256(abi.encodePacked(ins, field_depth)), uint256(reads[0])); - self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = uint256(reads[0]); - self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = true; - } else if (reads.length > 1) { - for (uint256 i = 0; i < reads.length; i++) { - bytes32 prev = vm.load(who, reads[i]); - if (prev == bytes32(0)) { - emit WARNING_UninitedSlot(who, uint256(reads[i])); - } - // store - vm.store(who, reads[i], bytes32(hex"1337")); - bool success; - bytes memory rdat; - { - (success, rdat) = who.staticcall(cald); - fdat = bytesToBytes32(rdat, 32 * field_depth); - } - - if (success && fdat == bytes32(hex"1337")) { - // we found which of the slots is the actual one - emit SlotFound(who, fsig, keccak256(abi.encodePacked(ins, field_depth)), uint256(reads[i])); - self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = uint256(reads[i]); - self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = true; - vm.store(who, reads[i], prev); - break; - } - vm.store(who, reads[i], prev); - } - } else { - revert("stdStorage find(StdStorage): No storage use detected for target."); - } - - require( - self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))], - "stdStorage find(StdStorage): Slot(s) not found." - ); - - delete self._target; - delete self._sig; - delete self._keys; - delete self._depth; - - return self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]; - } - - function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { - self._target = _target; - return self; - } - - function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { - self._sig = _sig; - return self; - } - - function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { - self._sig = sigs(_sig); - return self; - } - - function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { - self._keys.push(bytes32(uint256(uint160(who)))); - return self; - } - - function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { - self._keys.push(bytes32(amt)); - return self; - } - - function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { - self._keys.push(key); - return self; - } - - function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { - self._depth = _depth; - return self; - } - - function read(StdStorage storage self) private returns (bytes memory) { - address t = self._target; - uint256 s = find(self); - return abi.encode(vm.load(t, bytes32(s))); - } - - function read_bytes32(StdStorage storage self) internal returns (bytes32) { - return abi.decode(read(self), (bytes32)); - } - - function read_bool(StdStorage storage self) internal returns (bool) { - int256 v = read_int(self); - if (v == 0) return false; - if (v == 1) return true; - revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); - } - - function read_address(StdStorage storage self) internal returns (address) { - return abi.decode(read(self), (address)); - } - - function read_uint(StdStorage storage self) internal returns (uint256) { - return abi.decode(read(self), (uint256)); - } - - function read_int(StdStorage storage self) internal returns (int256) { - return abi.decode(read(self), (int256)); - } - - function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { - bytes32 out; - - uint256 max = b.length > 32 ? 32 : b.length; - for (uint256 i = 0; i < max; i++) { - out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); - } - return out; - } - - function flatten(bytes32[] memory b) private pure returns (bytes memory) { - bytes memory result = new bytes(b.length * 32); - for (uint256 i = 0; i < b.length; i++) { - bytes32 k = b[i]; - /// @solidity memory-safe-assembly - assembly { - mstore(add(result, add(32, mul(32, i))), k) - } - } - - return result; - } -} - -library stdStorage { - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function sigs(string memory sigStr) internal pure returns (bytes4) { - return stdStorageSafe.sigs(sigStr); - } - - function find(StdStorage storage self) internal returns (uint256) { - return stdStorageSafe.find(self); - } - - function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { - return stdStorageSafe.target(self, _target); - } - - function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { - return stdStorageSafe.sig(self, _sig); - } - - function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { - return stdStorageSafe.sig(self, _sig); - } - - function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { - return stdStorageSafe.with_key(self, who); - } - - function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { - return stdStorageSafe.with_key(self, amt); - } - - function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { - return stdStorageSafe.with_key(self, key); - } - - function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { - return stdStorageSafe.depth(self, _depth); - } - - function checked_write(StdStorage storage self, address who) internal { - checked_write(self, bytes32(uint256(uint160(who)))); - } - - function checked_write(StdStorage storage self, uint256 amt) internal { - checked_write(self, bytes32(amt)); - } - - function checked_write(StdStorage storage self, bool write) internal { - bytes32 t; - /// @solidity memory-safe-assembly - assembly { - t := write - } - checked_write(self, t); - } - - function checked_write(StdStorage storage self, bytes32 set) internal { - address who = self._target; - bytes4 fsig = self._sig; - uint256 field_depth = self._depth; - bytes32[] memory ins = self._keys; - - bytes memory cald = abi.encodePacked(fsig, flatten(ins)); - if (!self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]) { - find(self); - } - bytes32 slot = bytes32(self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]); - - bytes32 fdat; - { - (, bytes memory rdat) = who.staticcall(cald); - fdat = bytesToBytes32(rdat, 32 * field_depth); - } - bytes32 curr = vm.load(who, slot); - - if (fdat != curr) { - require( - false, - "stdStorage find(StdStorage): Packed slot. This would cause dangerous overwriting and currently isn't supported." - ); - } - vm.store(who, slot, set); - delete self._target; - delete self._sig; - delete self._keys; - delete self._depth; - } - - function read_bytes32(StdStorage storage self) internal returns (bytes32) { - return stdStorageSafe.read_bytes32(self); - } - - function read_bool(StdStorage storage self) internal returns (bool) { - return stdStorageSafe.read_bool(self); - } - - function read_address(StdStorage storage self) internal returns (address) { - return stdStorageSafe.read_address(self); - } - - function read_uint(StdStorage storage self) internal returns (uint256) { - return stdStorageSafe.read_uint(self); - } - - function read_int(StdStorage storage self) internal returns (int256) { - return stdStorageSafe.read_int(self); - } - - // Private function so needs to be copied over - function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { - bytes32 out; - - uint256 max = b.length > 32 ? 32 : b.length; - for (uint256 i = 0; i < max; i++) { - out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); - } - return out; - } - - // Private function so needs to be copied over - function flatten(bytes32[] memory b) private pure returns (bytes memory) { - bytes memory result = new bytes(b.length * 32); - for (uint256 i = 0; i < b.length; i++) { - bytes32 k = b[i]; - /// @solidity memory-safe-assembly - assembly { - mstore(add(result, add(32, mul(32, i))), k) - } - } - - return result; - } -} diff --git a/test/contracts/lib/forge-std/src/StdUtils.sol b/test/contracts/lib/forge-std/src/StdUtils.sol deleted file mode 100644 index f68d11fdf9..0000000000 --- a/test/contracts/lib/forge-std/src/StdUtils.sol +++ /dev/null @@ -1,189 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import {IMulticall3} from "./interfaces/IMulticall3.sol"; -// TODO Remove import. -import {VmSafe} from "./Vm.sol"; - -abstract contract StdUtils { - /*////////////////////////////////////////////////////////////////////////// - CONSTANTS - //////////////////////////////////////////////////////////////////////////*/ - - IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); - VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; - uint256 private constant INT256_MIN_ABS = - 57896044618658097711785492504343953926634992332820282019728792003956564819968; - uint256 private constant UINT256_MAX = - 115792089237316195423570985008687907853269984665640564039457584007913129639935; - - // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. - address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; - - /*////////////////////////////////////////////////////////////////////////// - INTERNAL FUNCTIONS - //////////////////////////////////////////////////////////////////////////*/ - - function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { - require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min."); - // If x is between min and max, return x directly. This is to ensure that dictionary values - // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188 - if (x >= min && x <= max) return x; - - uint256 size = max - min + 1; - - // If the value is 0, 1, 2, 3, warp that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side. - // This helps ensure coverage of the min/max values. - if (x <= 3 && size > x) return min + x; - if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x); - - // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive. - if (x > max) { - uint256 diff = x - max; - uint256 rem = diff % size; - if (rem == 0) return max; - result = min + rem - 1; - } else if (x < min) { - uint256 diff = min - x; - uint256 rem = diff % size; - if (rem == 0) return min; - result = max - rem + 1; - } - } - - function bound(uint256 x, uint256 min, uint256 max) internal view virtual returns (uint256 result) { - result = _bound(x, min, max); - console2_log("Bound Result", result); - } - - function bound(int256 x, int256 min, int256 max) internal view virtual returns (int256 result) { - require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min."); - - // Shifting all int256 values to uint256 to use _bound function. The range of two types are: - // int256 : -(2**255) ~ (2**255 - 1) - // uint256: 0 ~ (2**256 - 1) - // So, add 2**255, INT256_MIN_ABS to the integer values. - // - // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow. - // So, use `~uint256(x) + 1` instead. - uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS); - uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS); - uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS); - - uint256 y = _bound(_x, _min, _max); - - // To move it back to int256 value, subtract INT256_MIN_ABS at here. - result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS); - console2_log("Bound result", vm.toString(result)); - } - - function bytesToUint(bytes memory b) internal pure virtual returns (uint256) { - require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32."); - return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); - } - - /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce - /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol) - function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) { - // forgefmt: disable-start - // The integer zero is treated as an empty byte string, and as a result it only has a length prefix, 0x80, computed via 0x80 + 0. - // A one byte integer uses its own value as its length prefix, there is no additional "0x80 + length" prefix that comes before it. - if (nonce == 0x00) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, bytes1(0x80)))); - if (nonce <= 0x7f) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, uint8(nonce)))); - - // Nonces greater than 1 byte all follow a consistent encoding scheme, where each value is preceded by a prefix of 0x80 + length. - if (nonce <= 2**8 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd7), bytes1(0x94), deployer, bytes1(0x81), uint8(nonce)))); - if (nonce <= 2**16 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd8), bytes1(0x94), deployer, bytes1(0x82), uint16(nonce)))); - if (nonce <= 2**24 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd9), bytes1(0x94), deployer, bytes1(0x83), uint24(nonce)))); - // forgefmt: disable-end - - // More details about RLP encoding can be found here: https://eth.wiki/fundamentals/rlp - // 0xda = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x84 ++ nonce) - // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex) - // 0x84 = 0x80 + 0x04 (0x04 = the bytes length of the nonce, 4 bytes, in hex) - // We assume nobody can have a nonce large enough to require more than 32 bytes. - return addressFromLast20Bytes( - keccak256(abi.encodePacked(bytes1(0xda), bytes1(0x94), deployer, bytes1(0x84), uint32(nonce))) - ); - } - - function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer) - internal - pure - virtual - returns (address) - { - return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, initcodeHash))); - } - - /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer - function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) { - return computeCreate2Address(salt, initCodeHash, CREATE2_FACTORY); - } - - /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments - /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode - function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) { - return hashInitCode(creationCode, ""); - } - - /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2 - /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode - /// @param args the ABI-encoded arguments to the constructor of C - function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) { - return keccak256(abi.encodePacked(creationCode, args)); - } - - // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses. - function getTokenBalances(address token, address[] memory addresses) - internal - virtual - returns (uint256[] memory balances) - { - uint256 tokenCodeSize; - assembly { - tokenCodeSize := extcodesize(token) - } - require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract."); - - // ABI encode the aggregate call to Multicall3. - uint256 length = addresses.length; - IMulticall3.Call[] memory calls = new IMulticall3.Call[](length); - for (uint256 i = 0; i < length; ++i) { - // 0x70a08231 = bytes4("balanceOf(address)")) - calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))}); - } - - // Make the aggregate call. - (, bytes[] memory returnData) = multicall.aggregate(calls); - - // ABI decode the return data and return the balances. - balances = new uint256[](length); - for (uint256 i = 0; i < length; ++i) { - balances[i] = abi.decode(returnData[i], (uint256)); - } - } - - /*////////////////////////////////////////////////////////////////////////// - PRIVATE FUNCTIONS - //////////////////////////////////////////////////////////////////////////*/ - - function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) { - return address(uint160(uint256(bytesValue))); - } - - // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. - - function console2_log(string memory p0, uint256 p1) private view { - (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string,uint256)", p0, p1)); - status; - } - - function console2_log(string memory p0, string memory p1) private view { - (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string,string)", p0, p1)); - status; - } -} diff --git a/test/contracts/lib/forge-std/src/Test.sol b/test/contracts/lib/forge-std/src/Test.sol deleted file mode 100644 index 98fa7be6d8..0000000000 --- a/test/contracts/lib/forge-std/src/Test.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -// 💬 ABOUT -// Standard Library's default Test - -// 🧩 MODULES -import {console} from "./console.sol"; -import {console2} from "./console2.sol"; -import {StdAssertions} from "./StdAssertions.sol"; -import {StdChains} from "./StdChains.sol"; -import {StdCheats} from "./StdCheats.sol"; -import {stdError} from "./StdError.sol"; -import {StdInvariant} from "./StdInvariant.sol"; -import {stdJson} from "./StdJson.sol"; -import {stdMath} from "./StdMath.sol"; -import {StdStorage, stdStorage} from "./StdStorage.sol"; -import {StdUtils} from "./StdUtils.sol"; -import {Vm} from "./Vm.sol"; - -// 📦 BOILERPLATE -import {TestBase} from "./Base.sol"; -import {DSTest} from "ds-test/test.sol"; - -// ⭐️ TEST -abstract contract Test is DSTest, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils, TestBase { -// Note: IS_TEST() must return true. -// Note: Must have failure system, https://github.com/dapphub/ds-test/blob/cd98eff28324bfac652e63a239a60632a761790b/src/test.sol#L39-L76. -} diff --git a/test/contracts/lib/forge-std/src/Vm.sol b/test/contracts/lib/forge-std/src/Vm.sol deleted file mode 100644 index 31ebd41451..0000000000 --- a/test/contracts/lib/forge-std/src/Vm.sol +++ /dev/null @@ -1,405 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -// Cheatcodes are marked as view/pure/none using the following rules: -// 0. A call's observable behaviour includes its return value, logs, reverts and state writes, -// 1. If you can influence a later call's observable behaviour, you're neither `view` nor `pure (you are modifying some state be it the EVM, interpreter, filesystem, etc), -// 2. Otherwise if you can be influenced by an earlier call, or if reading some state, you're `view`, -// 3. Otherwise you're `pure`. - -interface VmSafe { - struct Log { - bytes32[] topics; - bytes data; - address emitter; - } - - struct Rpc { - string key; - string url; - } - - struct FsMetadata { - bool isDir; - bool isSymlink; - uint256 length; - bool readOnly; - uint256 modified; - uint256 accessed; - uint256 created; - } - - // Loads a storage slot from an address - function load(address target, bytes32 slot) external view returns (bytes32 data); - // Signs data - function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); - // Gets the address for a given private key - function addr(uint256 privateKey) external pure returns (address keyAddr); - // Gets the nonce of an account - function getNonce(address account) external view returns (uint64 nonce); - // Performs a foreign function call via the terminal - function ffi(string[] calldata commandInput) external returns (bytes memory result); - // Sets environment variables - function setEnv(string calldata name, string calldata value) external; - // Reads environment variables, (name) => (value) - function envBool(string calldata name) external view returns (bool value); - function envUint(string calldata name) external view returns (uint256 value); - function envInt(string calldata name) external view returns (int256 value); - function envAddress(string calldata name) external view returns (address value); - function envBytes32(string calldata name) external view returns (bytes32 value); - function envString(string calldata name) external view returns (string memory value); - function envBytes(string calldata name) external view returns (bytes memory value); - // Reads environment variables as arrays - function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value); - function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value); - function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value); - function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value); - function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value); - function envString(string calldata name, string calldata delim) external view returns (string[] memory value); - function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value); - // Read environment variables with default value - function envOr(string calldata name, bool defaultValue) external returns (bool value); - function envOr(string calldata name, uint256 defaultValue) external returns (uint256 value); - function envOr(string calldata name, int256 defaultValue) external returns (int256 value); - function envOr(string calldata name, address defaultValue) external returns (address value); - function envOr(string calldata name, bytes32 defaultValue) external returns (bytes32 value); - function envOr(string calldata name, string calldata defaultValue) external returns (string memory value); - function envOr(string calldata name, bytes calldata defaultValue) external returns (bytes memory value); - // Read environment variables as arrays with default value - function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue) - external - returns (bool[] memory value); - function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue) - external - returns (uint256[] memory value); - function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue) - external - returns (int256[] memory value); - function envOr(string calldata name, string calldata delim, address[] calldata defaultValue) - external - returns (address[] memory value); - function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue) - external - returns (bytes32[] memory value); - function envOr(string calldata name, string calldata delim, string[] calldata defaultValue) - external - returns (string[] memory value); - function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue) - external - returns (bytes[] memory value); - // Records all storage reads and writes - function record() external; - // Gets all accessed reads and write slot from a recording session, for a given address - function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots); - // Gets the _creation_ bytecode from an artifact file. Takes in the relative path to the json file - function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode); - // Gets the _deployed_ bytecode from an artifact file. Takes in the relative path to the json file - function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode); - // Labels an address in call traces - function label(address account, string calldata newLabel) external; - // Using the address that calls the test contract, has the next call (at this call depth only) create a transaction that can later be signed and sent onchain - function broadcast() external; - // Has the next call (at this call depth only) create a transaction with the address provided as the sender that can later be signed and sent onchain - function broadcast(address signer) external; - // Has the next call (at this call depth only) create a transaction with the private key provided as the sender that can later be signed and sent onchain - function broadcast(uint256 privateKey) external; - // Using the address that calls the test contract, has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain - function startBroadcast() external; - // Has all subsequent calls (at this call depth only) create transactions with the address provided that can later be signed and sent onchain - function startBroadcast(address signer) external; - // Has all subsequent calls (at this call depth only) create transactions with the private key provided that can later be signed and sent onchain - function startBroadcast(uint256 privateKey) external; - // Stops collecting onchain transactions - function stopBroadcast() external; - // Reads the entire content of file to string - function readFile(string calldata path) external view returns (string memory data); - // Reads the entire content of file as binary. Path is relative to the project root. - function readFileBinary(string calldata path) external view returns (bytes memory data); - // Get the path of the current project root - function projectRoot() external view returns (string memory path); - // Get the metadata for a file/directory - function fsMetadata(string calldata fileOrDir) external returns (FsMetadata memory metadata); - // Reads next line of file to string - function readLine(string calldata path) external view returns (string memory line); - // Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does. - function writeFile(string calldata path, string calldata data) external; - // Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does. - // Path is relative to the project root. - function writeFileBinary(string calldata path, bytes calldata data) external; - // Writes line to file, creating a file if it does not exist. - function writeLine(string calldata path, string calldata data) external; - // Closes file for reading, resetting the offset and allowing to read it from beginning with readLine. - function closeFile(string calldata path) external; - // Removes file. This cheatcode will revert in the following situations, but is not limited to just these cases: - // - Path points to a directory. - // - The file doesn't exist. - // - The user lacks permissions to remove the file. - function removeFile(string calldata path) external; - // Convert values to a string - function toString(address value) external pure returns (string memory stringifiedValue); - function toString(bytes calldata value) external pure returns (string memory stringifiedValue); - function toString(bytes32 value) external pure returns (string memory stringifiedValue); - function toString(bool value) external pure returns (string memory stringifiedValue); - function toString(uint256 value) external pure returns (string memory stringifiedValue); - function toString(int256 value) external pure returns (string memory stringifiedValue); - // Convert values from a string - function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue); - function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue); - function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue); - function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue); - function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue); - function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue); - // Record all the transaction logs - function recordLogs() external; - // Gets all the recorded logs - function getRecordedLogs() external returns (Log[] memory logs); - // Derive a private key from a provided mnenomic string (or mnenomic file path) at the derivation path m/44'/60'/0'/0/{index} - function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey); - // Derive a private key from a provided mnenomic string (or mnenomic file path) at {derivationPath}{index} - function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index) - external - pure - returns (uint256 privateKey); - // Adds a private key to the local forge wallet and returns the address - function rememberKey(uint256 privateKey) external returns (address keyAddr); - // - // parseJson - // - // ---- - // In case the returned value is a JSON object, it's encoded as a ABI-encoded tuple. As JSON objects - // don't have the notion of ordered, but tuples do, they JSON object is encoded with it's fields ordered in - // ALPHABETICAL order. That means that in order to successfully decode the tuple, we need to define a tuple that - // encodes the fields in the same order, which is alphabetical. In the case of Solidity structs, they are encoded - // as tuples, with the attributes in the order in which they are defined. - // For example: json = { 'a': 1, 'b': 0xa4tb......3xs} - // a: uint256 - // b: address - // To decode that json, we need to define a struct or a tuple as follows: - // struct json = { uint256 a; address b; } - // If we defined a json struct with the opposite order, meaning placing the address b first, it would try to - // decode the tuple in that order, and thus fail. - // ---- - // Given a string of JSON, return it as ABI-encoded - function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData); - function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData); - - // The following parseJson cheatcodes will do type coercion, for the type that they indicate. - // For example, parseJsonUint will coerce all values to a uint256. That includes stringified numbers '12' - // and hex numbers '0xEF'. - // Type coercion works ONLY for discrete values or arrays. That means that the key must return a value or array, not - // a JSON object. - function parseJsonUint(string calldata, string calldata) external returns (uint256); - function parseJsonUintArray(string calldata, string calldata) external returns (uint256[] memory); - function parseJsonInt(string calldata, string calldata) external returns (int256); - function parseJsonIntArray(string calldata, string calldata) external returns (int256[] memory); - function parseJsonBool(string calldata, string calldata) external returns (bool); - function parseJsonBoolArray(string calldata, string calldata) external returns (bool[] memory); - function parseJsonAddress(string calldata, string calldata) external returns (address); - function parseJsonAddressArray(string calldata, string calldata) external returns (address[] memory); - function parseJsonString(string calldata, string calldata) external returns (string memory); - function parseJsonStringArray(string calldata, string calldata) external returns (string[] memory); - function parseJsonBytes(string calldata, string calldata) external returns (bytes memory); - function parseJsonBytesArray(string calldata, string calldata) external returns (bytes[] memory); - function parseJsonBytes32(string calldata, string calldata) external returns (bytes32); - function parseJsonBytes32Array(string calldata, string calldata) external returns (bytes32[] memory); - - // Serialize a key and value to a JSON object stored in-memory that can be later written to a file - // It returns the stringified version of the specific JSON file up to that moment. - function serializeBool(string calldata objectKey, string calldata valueKey, bool value) - external - returns (string memory json); - function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value) - external - returns (string memory json); - function serializeInt(string calldata objectKey, string calldata valueKey, int256 value) - external - returns (string memory json); - function serializeAddress(string calldata objectKey, string calldata valueKey, address value) - external - returns (string memory json); - function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value) - external - returns (string memory json); - function serializeString(string calldata objectKey, string calldata valueKey, string calldata value) - external - returns (string memory json); - function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value) - external - returns (string memory json); - - function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values) - external - returns (string memory json); - function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values) - external - returns (string memory json); - function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values) - external - returns (string memory json); - function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values) - external - returns (string memory json); - function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values) - external - returns (string memory json); - function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values) - external - returns (string memory json); - function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values) - external - returns (string memory json); - - // - // writeJson - // - // ---- - // Write a serialized JSON object to a file. If the file exists, it will be overwritten. - // Let's assume we want to write the following JSON to a file: - // - // { "boolean": true, "number": 342, "object": { "title": "finally json serialization" } } - // - // ``` - // string memory json1 = "some key"; - // vm.serializeBool(json1, "boolean", true); - // vm.serializeBool(json1, "number", uint256(342)); - // json2 = "some other key"; - // string memory output = vm.serializeString(json2, "title", "finally json serialization"); - // string memory finalJson = vm.serialize(json1, "object", output); - // vm.writeJson(finalJson, "./output/example.json"); - // ``` - // The critical insight is that every invocation of serialization will return the stringified version of the JSON - // up to that point. That means we can construct arbitrary JSON objects and then use the return stringified version - // to serialize them as values to another JSON object. - // - // json1 and json2 are simply keys used by the backend to keep track of the objects. So vm.serializeJson(json1,..) - // will find the object in-memory that is keyed by "some key". - function writeJson(string calldata json, string calldata path) external; - // Write a serialized JSON object to an **existing** JSON file, replacing a value with key = - // This is useful to replace a specific value of a JSON file, without having to parse the entire thing - function writeJson(string calldata json, string calldata path, string calldata valueKey) external; - // Returns the RPC url for the given alias - function rpcUrl(string calldata rpcAlias) external view returns (string memory json); - // Returns all rpc urls and their aliases `[alias, url][]` - function rpcUrls() external view returns (string[2][] memory urls); - // Returns all rpc urls and their aliases as structs. - function rpcUrlStructs() external view returns (Rpc[] memory urls); - // If the condition is false, discard this run's fuzz inputs and generate new ones. - function assume(bool condition) external pure; - // Pauses gas metering (i.e. gas usage is not counted). Noop if already paused. - function pauseGasMetering() external; - // Resumes gas metering (i.e. gas usage is counted again). Noop if already on. - function resumeGasMetering() external; -} - -interface Vm is VmSafe { - // Sets block.timestamp - function warp(uint256 newTimestamp) external; - // Sets block.height - function roll(uint256 newHeight) external; - // Sets block.basefee - function fee(uint256 newBasefee) external; - // Sets block.difficulty - function difficulty(uint256 newDifficulty) external; - // Sets block.chainid - function chainId(uint256 newChainId) external; - // Stores a value to an address' storage slot. - function store(address target, bytes32 slot, bytes32 value) external; - // Sets the nonce of an account; must be higher than the current nonce of the account - function setNonce(address account, uint64 newNonce) external; - // Sets the *next* call's msg.sender to be the input address - function prank(address msgSender) external; - // Sets all subsequent calls' msg.sender to be the input address until `stopPrank` is called - function startPrank(address msgSender) external; - // Sets the *next* call's msg.sender to be the input address, and the tx.origin to be the second input - function prank(address msgSender, address txOrigin) external; - // Sets all subsequent calls' msg.sender to be the input address until `stopPrank` is called, and the tx.origin to be the second input - function startPrank(address msgSender, address txOrigin) external; - // Resets subsequent calls' msg.sender to be `address(this)` - function stopPrank() external; - // Sets an address' balance - function deal(address account, uint256 newBalance) external; - // Sets an address' code - function etch(address target, bytes calldata newRuntimeBytecode) external; - // Expects an error on next call - function expectRevert(bytes calldata revertData) external; - function expectRevert(bytes4 revertData) external; - function expectRevert() external; - // Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData). - // Call this function, then emit an event, then call a function. Internally after the call, we check if - // logs were emitted in the expected order with the expected topics and data (as specified by the booleans) - function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; - function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) - external; - // Mocks a call to an address, returning specified data. - // Calldata can either be strict or a partial match, e.g. if you only - // pass a Solidity selector to the expected calldata, then the entire Solidity - // function will be mocked. - function mockCall(address callee, bytes calldata data, bytes calldata returnData) external; - // Mocks a call to an address with a specific msg.value, returning specified data. - // Calldata match takes precedence over msg.value in case of ambiguity. - function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external; - // Clears all mocked calls - function clearMockedCalls() external; - // Expects a call to an address with the specified calldata. - // Calldata can either be a strict or a partial match - function expectCall(address callee, bytes calldata data) external; - // Expects a call to an address with the specified msg.value and calldata - function expectCall(address callee, uint256 msgValue, bytes calldata data) external; - // Sets block.coinbase - function coinbase(address newCoinbase) external; - // Snapshot the current state of the evm. - // Returns the id of the snapshot that was created. - // To revert a snapshot use `revertTo` - function snapshot() external returns (uint256 snapshotId); - // Revert the state of the EVM to a previous snapshot - // Takes the snapshot id to revert to. - // This deletes the snapshot and all snapshots taken after the given snapshot id. - function revertTo(uint256 snapshotId) external returns (bool success); - // Creates a new fork with the given endpoint and block and returns the identifier of the fork - function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); - // Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork - function createFork(string calldata urlOrAlias) external returns (uint256 forkId); - // Creates a new fork with the given endpoint and at the block the given transaction was mined in, replays all transaction mined in the block before the transaction, - // and returns the identifier of the fork - function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); - // Creates _and_ also selects a new fork with the given endpoint and block and returns the identifier of the fork - function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); - // Creates _and_ also selects new fork with the given endpoint and at the block the given transaction was mined in, replays all transaction mined in the block before - // the transaction, returns the identifier of the fork - function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); - // Creates _and_ also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork - function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId); - // Takes a fork identifier created by `createFork` and sets the corresponding forked state as active. - function selectFork(uint256 forkId) external; - /// Returns the identifier of the currently active fork. Reverts if no fork is currently active. - function activeFork() external view returns (uint256 forkId); - // Updates the currently active fork to given block number - // This is similar to `roll` but for the currently active fork - function rollFork(uint256 blockNumber) external; - // Updates the currently active fork to given transaction - // this will `rollFork` with the number of the block the transaction was mined in and replays all transaction mined before it in the block - function rollFork(bytes32 txHash) external; - // Updates the given fork to given block number - function rollFork(uint256 forkId, uint256 blockNumber) external; - // Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block - function rollFork(uint256 forkId, bytes32 txHash) external; - // Marks that the account(s) should use persistent storage across fork swaps in a multifork setup - // Meaning, changes made to the state of this account will be kept when switching forks - function makePersistent(address account) external; - function makePersistent(address account0, address account1) external; - function makePersistent(address account0, address account1, address account2) external; - function makePersistent(address[] calldata accounts) external; - // Revokes persistent status from the address, previously added via `makePersistent` - function revokePersistent(address account) external; - function revokePersistent(address[] calldata accounts) external; - // Returns true if the account is marked as persistent - function isPersistent(address account) external view returns (bool persistent); - // In forking mode, explicitly grant the given address cheatcode access - function allowCheatcodes(address account) external; - // Fetches the given transaction from the active fork and executes it on the current state - function transact(bytes32 txHash) external; - // Fetches the given transaction from the given fork and executes it on the current state - function transact(uint256 forkId, bytes32 txHash) external; -} diff --git a/test/contracts/lib/forge-std/src/console.sol b/test/contracts/lib/forge-std/src/console.sol deleted file mode 100644 index ad57e53687..0000000000 --- a/test/contracts/lib/forge-std/src/console.sol +++ /dev/null @@ -1,1533 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.4.22 <0.9.0; - -library console { - address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); - - function _sendLogPayload(bytes memory payload) private view { - uint256 payloadLength = payload.length; - address consoleAddress = CONSOLE_ADDRESS; - /// @solidity memory-safe-assembly - assembly { - let payloadStart := add(payload, 32) - let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) - } - } - - function log() internal view { - _sendLogPayload(abi.encodeWithSignature("log()")); - } - - function logInt(int p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); - } - - function logUint(uint p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); - } - - function logString(string memory p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); - } - - function logBool(bool p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); - } - - function logAddress(address p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); - } - - function logBytes(bytes memory p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); - } - - function logBytes1(bytes1 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); - } - - function logBytes2(bytes2 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); - } - - function logBytes3(bytes3 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); - } - - function logBytes4(bytes4 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); - } - - function logBytes5(bytes5 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); - } - - function logBytes6(bytes6 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); - } - - function logBytes7(bytes7 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); - } - - function logBytes8(bytes8 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); - } - - function logBytes9(bytes9 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); - } - - function logBytes10(bytes10 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); - } - - function logBytes11(bytes11 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); - } - - function logBytes12(bytes12 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); - } - - function logBytes13(bytes13 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); - } - - function logBytes14(bytes14 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); - } - - function logBytes15(bytes15 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); - } - - function logBytes16(bytes16 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); - } - - function logBytes17(bytes17 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); - } - - function logBytes18(bytes18 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); - } - - function logBytes19(bytes19 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); - } - - function logBytes20(bytes20 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); - } - - function logBytes21(bytes21 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); - } - - function logBytes22(bytes22 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); - } - - function logBytes23(bytes23 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); - } - - function logBytes24(bytes24 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); - } - - function logBytes25(bytes25 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); - } - - function logBytes26(bytes26 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); - } - - function logBytes27(bytes27 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); - } - - function logBytes28(bytes28 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); - } - - function logBytes29(bytes29 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); - } - - function logBytes30(bytes30 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); - } - - function logBytes31(bytes31 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); - } - - function logBytes32(bytes32 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); - } - - function log(uint p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); - } - - function log(string memory p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); - } - - function log(bool p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); - } - - function log(address p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); - } - - function log(uint p0, uint p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); - } - - function log(uint p0, string memory p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); - } - - function log(uint p0, bool p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); - } - - function log(uint p0, address p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); - } - - function log(string memory p0, uint p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); - } - - function log(string memory p0, string memory p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); - } - - function log(string memory p0, bool p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); - } - - function log(string memory p0, address p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); - } - - function log(bool p0, uint p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); - } - - function log(bool p0, string memory p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); - } - - function log(bool p0, bool p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); - } - - function log(bool p0, address p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); - } - - function log(address p0, uint p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); - } - - function log(address p0, string memory p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); - } - - function log(address p0, bool p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); - } - - function log(address p0, address p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); - } - - function log(uint p0, uint p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); - } - - function log(uint p0, uint p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); - } - - function log(uint p0, uint p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); - } - - function log(uint p0, uint p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); - } - - function log(uint p0, string memory p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); - } - - function log(uint p0, string memory p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); - } - - function log(uint p0, string memory p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); - } - - function log(uint p0, string memory p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); - } - - function log(uint p0, bool p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); - } - - function log(uint p0, bool p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); - } - - function log(uint p0, bool p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); - } - - function log(uint p0, bool p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); - } - - function log(uint p0, address p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); - } - - function log(uint p0, address p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); - } - - function log(uint p0, address p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); - } - - function log(uint p0, address p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); - } - - function log(string memory p0, uint p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); - } - - function log(string memory p0, uint p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); - } - - function log(string memory p0, uint p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); - } - - function log(string memory p0, uint p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); - } - - function log(string memory p0, address p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); - } - - function log(string memory p0, address p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); - } - - function log(string memory p0, address p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); - } - - function log(string memory p0, address p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); - } - - function log(bool p0, uint p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); - } - - function log(bool p0, uint p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); - } - - function log(bool p0, uint p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); - } - - function log(bool p0, uint p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); - } - - function log(bool p0, bool p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); - } - - function log(bool p0, bool p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); - } - - function log(bool p0, bool p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); - } - - function log(bool p0, bool p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); - } - - function log(bool p0, address p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); - } - - function log(bool p0, address p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); - } - - function log(bool p0, address p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); - } - - function log(bool p0, address p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); - } - - function log(address p0, uint p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); - } - - function log(address p0, uint p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); - } - - function log(address p0, uint p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); - } - - function log(address p0, uint p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); - } - - function log(address p0, string memory p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); - } - - function log(address p0, string memory p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); - } - - function log(address p0, string memory p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); - } - - function log(address p0, string memory p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); - } - - function log(address p0, bool p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); - } - - function log(address p0, bool p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); - } - - function log(address p0, bool p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); - } - - function log(address p0, bool p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); - } - - function log(address p0, address p1, uint p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); - } - - function log(address p0, address p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); - } - - function log(address p0, address p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); - } - - function log(address p0, address p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); - } - - function log(uint p0, uint p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, uint p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); - } - -} \ No newline at end of file diff --git a/test/contracts/lib/forge-std/src/console2.sol b/test/contracts/lib/forge-std/src/console2.sol deleted file mode 100644 index 8596233d3c..0000000000 --- a/test/contracts/lib/forge-std/src/console2.sol +++ /dev/null @@ -1,1546 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.4.22 <0.9.0; - -/// @dev The original console.sol uses `int` and `uint` for computing function selectors, but it should -/// use `int256` and `uint256`. This modified version fixes that. This version is recommended -/// over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in -/// forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. -/// Reference: https://github.com/NomicFoundation/hardhat/issues/2178 -library console2 { - address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); - - function _sendLogPayload(bytes memory payload) private view { - uint256 payloadLength = payload.length; - address consoleAddress = CONSOLE_ADDRESS; - /// @solidity memory-safe-assembly - assembly { - let payloadStart := add(payload, 32) - let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) - } - } - - function log() internal view { - _sendLogPayload(abi.encodeWithSignature("log()")); - } - - function logInt(int256 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); - } - - function logUint(uint256 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); - } - - function logString(string memory p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); - } - - function logBool(bool p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); - } - - function logAddress(address p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); - } - - function logBytes(bytes memory p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); - } - - function logBytes1(bytes1 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); - } - - function logBytes2(bytes2 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); - } - - function logBytes3(bytes3 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); - } - - function logBytes4(bytes4 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); - } - - function logBytes5(bytes5 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); - } - - function logBytes6(bytes6 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); - } - - function logBytes7(bytes7 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); - } - - function logBytes8(bytes8 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); - } - - function logBytes9(bytes9 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); - } - - function logBytes10(bytes10 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); - } - - function logBytes11(bytes11 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); - } - - function logBytes12(bytes12 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); - } - - function logBytes13(bytes13 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); - } - - function logBytes14(bytes14 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); - } - - function logBytes15(bytes15 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); - } - - function logBytes16(bytes16 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); - } - - function logBytes17(bytes17 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); - } - - function logBytes18(bytes18 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); - } - - function logBytes19(bytes19 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); - } - - function logBytes20(bytes20 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); - } - - function logBytes21(bytes21 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); - } - - function logBytes22(bytes22 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); - } - - function logBytes23(bytes23 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); - } - - function logBytes24(bytes24 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); - } - - function logBytes25(bytes25 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); - } - - function logBytes26(bytes26 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); - } - - function logBytes27(bytes27 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); - } - - function logBytes28(bytes28 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); - } - - function logBytes29(bytes29 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); - } - - function logBytes30(bytes30 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); - } - - function logBytes31(bytes31 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); - } - - function logBytes32(bytes32 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); - } - - function log(uint256 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); - } - - function log(int256 p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); - } - - function log(string memory p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); - } - - function log(bool p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); - } - - function log(address p0) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); - } - - function log(uint256 p0, uint256 p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); - } - - function log(uint256 p0, string memory p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); - } - - function log(uint256 p0, bool p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); - } - - function log(uint256 p0, address p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); - } - - function log(string memory p0, uint256 p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); - } - - function log(string memory p0, int256 p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1)); - } - - function log(string memory p0, string memory p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); - } - - function log(string memory p0, bool p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); - } - - function log(string memory p0, address p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); - } - - function log(bool p0, uint256 p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); - } - - function log(bool p0, string memory p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); - } - - function log(bool p0, bool p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); - } - - function log(bool p0, address p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); - } - - function log(address p0, uint256 p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); - } - - function log(address p0, string memory p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); - } - - function log(address p0, bool p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); - } - - function log(address p0, address p1) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); - } - - function log(uint256 p0, uint256 p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); - } - - function log(uint256 p0, uint256 p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); - } - - function log(uint256 p0, uint256 p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); - } - - function log(uint256 p0, uint256 p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); - } - - function log(uint256 p0, string memory p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); - } - - function log(uint256 p0, string memory p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); - } - - function log(uint256 p0, string memory p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); - } - - function log(uint256 p0, string memory p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); - } - - function log(uint256 p0, bool p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); - } - - function log(uint256 p0, bool p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); - } - - function log(uint256 p0, bool p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); - } - - function log(uint256 p0, bool p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); - } - - function log(uint256 p0, address p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); - } - - function log(uint256 p0, address p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); - } - - function log(uint256 p0, address p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); - } - - function log(uint256 p0, address p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); - } - - function log(string memory p0, uint256 p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); - } - - function log(string memory p0, uint256 p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); - } - - function log(string memory p0, uint256 p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); - } - - function log(string memory p0, uint256 p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); - } - - function log(string memory p0, address p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); - } - - function log(string memory p0, address p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); - } - - function log(string memory p0, address p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); - } - - function log(string memory p0, address p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); - } - - function log(bool p0, uint256 p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); - } - - function log(bool p0, uint256 p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); - } - - function log(bool p0, uint256 p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); - } - - function log(bool p0, uint256 p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); - } - - function log(bool p0, bool p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); - } - - function log(bool p0, bool p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); - } - - function log(bool p0, bool p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); - } - - function log(bool p0, bool p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); - } - - function log(bool p0, address p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); - } - - function log(bool p0, address p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); - } - - function log(bool p0, address p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); - } - - function log(bool p0, address p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); - } - - function log(address p0, uint256 p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); - } - - function log(address p0, uint256 p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); - } - - function log(address p0, uint256 p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); - } - - function log(address p0, uint256 p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); - } - - function log(address p0, string memory p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); - } - - function log(address p0, string memory p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); - } - - function log(address p0, string memory p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); - } - - function log(address p0, string memory p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); - } - - function log(address p0, bool p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); - } - - function log(address p0, bool p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); - } - - function log(address p0, bool p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); - } - - function log(address p0, bool p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); - } - - function log(address p0, address p1, uint256 p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); - } - - function log(address p0, address p1, string memory p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); - } - - function log(address p0, address p1, bool p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); - } - - function log(address p0, address p1, address p2) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); - } - - function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, uint256 p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, string memory p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, bool p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); - } - - function log(uint256 p0, address p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint256 p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint256 p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint256 p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint256 p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint256 p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint256 p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint256 p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, uint256 p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, string memory p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, bool p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, address p3) internal view { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); - } - -} \ No newline at end of file diff --git a/test/contracts/lib/forge-std/src/interfaces/IERC1155.sol b/test/contracts/lib/forge-std/src/interfaces/IERC1155.sol deleted file mode 100644 index f7dd2b4106..0000000000 --- a/test/contracts/lib/forge-std/src/interfaces/IERC1155.sol +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -import "./IERC165.sol"; - -/// @title ERC-1155 Multi Token Standard -/// @dev See https://eips.ethereum.org/EIPS/eip-1155 -/// Note: The ERC-165 identifier for this interface is 0xd9b67a26. -interface IERC1155 is IERC165 { - /// @dev - /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). - /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). - /// - The `_from` argument MUST be the address of the holder whose balance is decreased. - /// - The `_to` argument MUST be the address of the recipient whose balance is increased. - /// - The `_id` argument MUST be the token type being transferred. - /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. - /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). - /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). - event TransferSingle( - address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value - ); - - /// @dev - /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). - /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). - /// - The `_from` argument MUST be the address of the holder whose balance is decreased. - /// - The `_to` argument MUST be the address of the recipient whose balance is increased. - /// - The `_ids` argument MUST be the list of tokens being transferred. - /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. - /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). - /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). - event TransferBatch( - address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values - ); - - /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled). - event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); - - /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. - /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". - event URI(string _value, uint256 indexed _id); - - /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). - /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). - /// - MUST revert if `_to` is the zero address. - /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent. - /// - MUST revert on any other error. - /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). - /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). - /// @param _from Source address - /// @param _to Target address - /// @param _id ID of the token type - /// @param _value Transfer amount - /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` - function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; - - /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). - /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). - /// - MUST revert if `_to` is the zero address. - /// - MUST revert if length of `_ids` is not the same as length of `_values`. - /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. - /// - MUST revert on any other error. - /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). - /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). - /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). - /// @param _from Source address - /// @param _to Target address - /// @param _ids IDs of each token type (order and length must match _values array) - /// @param _values Transfer amounts per token type (order and length must match _ids array) - /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` - function safeBatchTransferFrom( - address _from, - address _to, - uint256[] calldata _ids, - uint256[] calldata _values, - bytes calldata _data - ) external; - - /// @notice Get the balance of an account's tokens. - /// @param _owner The address of the token holder - /// @param _id ID of the token - /// @return The _owner's balance of the token type requested - function balanceOf(address _owner, uint256 _id) external view returns (uint256); - - /// @notice Get the balance of multiple account/token pairs - /// @param _owners The addresses of the token holders - /// @param _ids ID of the tokens - /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair) - function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) - external - view - returns (uint256[] memory); - - /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. - /// @dev MUST emit the ApprovalForAll event on success. - /// @param _operator Address to add to the set of authorized operators - /// @param _approved True if the operator is approved, false to revoke approval - function setApprovalForAll(address _operator, bool _approved) external; - - /// @notice Queries the approval status of an operator for a given owner. - /// @param _owner The owner of the tokens - /// @param _operator Address of authorized operator - /// @return True if the operator is approved, false if not - function isApprovedForAll(address _owner, address _operator) external view returns (bool); -} diff --git a/test/contracts/lib/forge-std/src/interfaces/IERC165.sol b/test/contracts/lib/forge-std/src/interfaces/IERC165.sol deleted file mode 100644 index 9af4bf800f..0000000000 --- a/test/contracts/lib/forge-std/src/interfaces/IERC165.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -interface IERC165 { - /// @notice Query if a contract implements an interface - /// @param interfaceID The interface identifier, as specified in ERC-165 - /// @dev Interface identification is specified in ERC-165. This function - /// uses less than 30,000 gas. - /// @return `true` if the contract implements `interfaceID` and - /// `interfaceID` is not 0xffffffff, `false` otherwise - function supportsInterface(bytes4 interfaceID) external view returns (bool); -} diff --git a/test/contracts/lib/forge-std/src/interfaces/IERC20.sol b/test/contracts/lib/forge-std/src/interfaces/IERC20.sol deleted file mode 100644 index ba40806c3b..0000000000 --- a/test/contracts/lib/forge-std/src/interfaces/IERC20.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -/// @dev Interface of the ERC20 standard as defined in the EIP. -/// @dev This includes the optional name, symbol, and decimals metadata. -interface IERC20 { - /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). - event Transfer(address indexed from, address indexed to, uint256 value); - - /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` - /// is the new allowance. - event Approval(address indexed owner, address indexed spender, uint256 value); - - /// @notice Returns the amount of tokens in existence. - function totalSupply() external view returns (uint256); - - /// @notice Returns the amount of tokens owned by `account`. - function balanceOf(address account) external view returns (uint256); - - /// @notice Moves `amount` tokens from the caller's account to `to`. - function transfer(address to, uint256 amount) external returns (bool); - - /// @notice Returns the remaining number of tokens that `spender` is allowed - /// to spend on behalf of `owner` - function allowance(address owner, address spender) external view returns (uint256); - - /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. - /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - function approve(address spender, uint256 amount) external returns (bool); - - /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. - /// `amount` is then deducted from the caller's allowance. - function transferFrom(address from, address to, uint256 amount) external returns (bool); - - /// @notice Returns the name of the token. - function name() external view returns (string memory); - - /// @notice Returns the symbol of the token. - function symbol() external view returns (string memory); - - /// @notice Returns the decimals places of the token. - function decimals() external view returns (uint8); -} diff --git a/test/contracts/lib/forge-std/src/interfaces/IERC4626.sol b/test/contracts/lib/forge-std/src/interfaces/IERC4626.sol deleted file mode 100644 index bfe3a1155e..0000000000 --- a/test/contracts/lib/forge-std/src/interfaces/IERC4626.sol +++ /dev/null @@ -1,190 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -import "./IERC20.sol"; - -/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in -/// https://eips.ethereum.org/EIPS/eip-4626 -interface IERC4626 is IERC20 { - event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); - - event Withdraw( - address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares - ); - - /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. - /// @dev - /// - MUST be an ERC-20 token contract. - /// - MUST NOT revert. - function asset() external view returns (address assetTokenAddress); - - /// @notice Returns the total amount of the underlying asset that is “managed” by Vault. - /// @dev - /// - SHOULD include any compounding that occurs from yield. - /// - MUST be inclusive of any fees that are charged against assets in the Vault. - /// - MUST NOT revert. - function totalAssets() external view returns (uint256 totalManagedAssets); - - /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal - /// scenario where all the conditions are met. - /// @dev - /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. - /// - MUST NOT show any variations depending on the caller. - /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. - /// - MUST NOT revert. - /// - /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the - /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and - /// from. - function convertToShares(uint256 assets) external view returns (uint256 shares); - - /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal - /// scenario where all the conditions are met. - /// @dev - /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. - /// - MUST NOT show any variations depending on the caller. - /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. - /// - MUST NOT revert. - /// - /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the - /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and - /// from. - function convertToAssets(uint256 shares) external view returns (uint256 assets); - - /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, - /// through a deposit call. - /// @dev - /// - MUST return a limited value if receiver is subject to some deposit limit. - /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. - /// - MUST NOT revert. - function maxDeposit(address receiver) external view returns (uint256 maxAssets); - - /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given - /// current on-chain conditions. - /// @dev - /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit - /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called - /// in the same transaction. - /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the - /// deposit would be accepted, regardless if the user has enough tokens approved, etc. - /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. - /// - MUST NOT revert. - /// - /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in - /// share price or some other type of condition, meaning the depositor will lose assets by depositing. - function previewDeposit(uint256 assets) external view returns (uint256 shares); - - /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. - /// @dev - /// - MUST emit the Deposit event. - /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - /// deposit execution, and are accounted for during deposit. - /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not - /// approving enough underlying tokens to the Vault contract, etc). - /// - /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. - function deposit(uint256 assets, address receiver) external returns (uint256 shares); - - /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. - /// @dev - /// - MUST return a limited value if receiver is subject to some mint limit. - /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. - /// - MUST NOT revert. - function maxMint(address receiver) external view returns (uint256 maxShares); - - /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given - /// current on-chain conditions. - /// @dev - /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call - /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the - /// same transaction. - /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint - /// would be accepted, regardless if the user has enough tokens approved, etc. - /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. - /// - MUST NOT revert. - /// - /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in - /// share price or some other type of condition, meaning the depositor will lose assets by minting. - function previewMint(uint256 shares) external view returns (uint256 assets); - - /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. - /// @dev - /// - MUST emit the Deposit event. - /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint - /// execution, and are accounted for during mint. - /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not - /// approving enough underlying tokens to the Vault contract, etc). - /// - /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. - function mint(uint256 shares, address receiver) external returns (uint256 assets); - - /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the - /// Vault, through a withdraw call. - /// @dev - /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. - /// - MUST NOT revert. - function maxWithdraw(address owner) external view returns (uint256 maxAssets); - - /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, - /// given current on-chain conditions. - /// @dev - /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw - /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if - /// called - /// in the same transaction. - /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though - /// the withdrawal would be accepted, regardless if the user has enough shares, etc. - /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. - /// - MUST NOT revert. - /// - /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in - /// share price or some other type of condition, meaning the depositor will lose assets by depositing. - function previewWithdraw(uint256 assets) external view returns (uint256 shares); - - /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver. - /// @dev - /// - MUST emit the Withdraw event. - /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - /// withdraw execution, and are accounted for during withdraw. - /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner - /// not having enough shares, etc). - /// - /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. - /// Those methods should be performed separately. - function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); - - /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, - /// through a redeem call. - /// @dev - /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. - /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. - /// - MUST NOT revert. - function maxRedeem(address owner) external view returns (uint256 maxShares); - - /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, - /// given current on-chain conditions. - /// @dev - /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call - /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the - /// same transaction. - /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the - /// redemption would be accepted, regardless if the user has enough shares, etc. - /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. - /// - MUST NOT revert. - /// - /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in - /// share price or some other type of condition, meaning the depositor will lose assets by redeeming. - function previewRedeem(uint256 shares) external view returns (uint256 assets); - - /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver. - /// @dev - /// - MUST emit the Withdraw event. - /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - /// redeem execution, and are accounted for during redeem. - /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner - /// not having enough shares, etc). - /// - /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. - /// Those methods should be performed separately. - function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); -} diff --git a/test/contracts/lib/forge-std/src/interfaces/IERC721.sol b/test/contracts/lib/forge-std/src/interfaces/IERC721.sol deleted file mode 100644 index 0a16f45cc5..0000000000 --- a/test/contracts/lib/forge-std/src/interfaces/IERC721.sol +++ /dev/null @@ -1,164 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -import "./IERC165.sol"; - -/// @title ERC-721 Non-Fungible Token Standard -/// @dev See https://eips.ethereum.org/EIPS/eip-721 -/// Note: the ERC-165 identifier for this interface is 0x80ac58cd. -interface IERC721 is IERC165 { - /// @dev This emits when ownership of any NFT changes by any mechanism. - /// This event emits when NFTs are created (`from` == 0) and destroyed - /// (`to` == 0). Exception: during contract creation, any number of NFTs - /// may be created and assigned without emitting Transfer. At the time of - /// any transfer, the approved address for that NFT (if any) is reset to none. - event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); - - /// @dev This emits when the approved address for an NFT is changed or - /// reaffirmed. The zero address indicates there is no approved address. - /// When a Transfer event emits, this also indicates that the approved - /// address for that NFT (if any) is reset to none. - event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); - - /// @dev This emits when an operator is enabled or disabled for an owner. - /// The operator can manage all NFTs of the owner. - event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); - - /// @notice Count all NFTs assigned to an owner - /// @dev NFTs assigned to the zero address are considered invalid, and this - /// function throws for queries about the zero address. - /// @param _owner An address for whom to query the balance - /// @return The number of NFTs owned by `_owner`, possibly zero - function balanceOf(address _owner) external view returns (uint256); - - /// @notice Find the owner of an NFT - /// @dev NFTs assigned to zero address are considered invalid, and queries - /// about them do throw. - /// @param _tokenId The identifier for an NFT - /// @return The address of the owner of the NFT - function ownerOf(uint256 _tokenId) external view returns (address); - - /// @notice Transfers the ownership of an NFT from one address to another address - /// @dev Throws unless `msg.sender` is the current owner, an authorized - /// operator, or the approved address for this NFT. Throws if `_from` is - /// not the current owner. Throws if `_to` is the zero address. Throws if - /// `_tokenId` is not a valid NFT. When transfer is complete, this function - /// checks if `_to` is a smart contract (code size > 0). If so, it calls - /// `onERC721Received` on `_to` and throws if the return value is not - /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. - /// @param _from The current owner of the NFT - /// @param _to The new owner - /// @param _tokenId The NFT to transfer - /// @param data Additional data with no specified format, sent in call to `_to` - function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; - - /// @notice Transfers the ownership of an NFT from one address to another address - /// @dev This works identically to the other function with an extra data parameter, - /// except this function just sets data to "". - /// @param _from The current owner of the NFT - /// @param _to The new owner - /// @param _tokenId The NFT to transfer - function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; - - /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE - /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE - /// THEY MAY BE PERMANENTLY LOST - /// @dev Throws unless `msg.sender` is the current owner, an authorized - /// operator, or the approved address for this NFT. Throws if `_from` is - /// not the current owner. Throws if `_to` is the zero address. Throws if - /// `_tokenId` is not a valid NFT. - /// @param _from The current owner of the NFT - /// @param _to The new owner - /// @param _tokenId The NFT to transfer - function transferFrom(address _from, address _to, uint256 _tokenId) external payable; - - /// @notice Change or reaffirm the approved address for an NFT - /// @dev The zero address indicates there is no approved address. - /// Throws unless `msg.sender` is the current NFT owner, or an authorized - /// operator of the current owner. - /// @param _approved The new approved NFT controller - /// @param _tokenId The NFT to approve - function approve(address _approved, uint256 _tokenId) external payable; - - /// @notice Enable or disable approval for a third party ("operator") to manage - /// all of `msg.sender`'s assets - /// @dev Emits the ApprovalForAll event. The contract MUST allow - /// multiple operators per owner. - /// @param _operator Address to add to the set of authorized operators - /// @param _approved True if the operator is approved, false to revoke approval - function setApprovalForAll(address _operator, bool _approved) external; - - /// @notice Get the approved address for a single NFT - /// @dev Throws if `_tokenId` is not a valid NFT. - /// @param _tokenId The NFT to find the approved address for - /// @return The approved address for this NFT, or the zero address if there is none - function getApproved(uint256 _tokenId) external view returns (address); - - /// @notice Query if an address is an authorized operator for another address - /// @param _owner The address that owns the NFTs - /// @param _operator The address that acts on behalf of the owner - /// @return True if `_operator` is an approved operator for `_owner`, false otherwise - function isApprovedForAll(address _owner, address _operator) external view returns (bool); -} - -/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. -interface IERC721TokenReceiver { - /// @notice Handle the receipt of an NFT - /// @dev The ERC721 smart contract calls this function on the recipient - /// after a `transfer`. This function MAY throw to revert and reject the - /// transfer. Return of other than the magic value MUST result in the - /// transaction being reverted. - /// Note: the contract address is always the message sender. - /// @param _operator The address which called `safeTransferFrom` function - /// @param _from The address which previously owned the token - /// @param _tokenId The NFT identifier which is being transferred - /// @param _data Additional data with no specified format - /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` - /// unless throwing - function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) - external - returns (bytes4); -} - -/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension -/// @dev See https://eips.ethereum.org/EIPS/eip-721 -/// Note: the ERC-165 identifier for this interface is 0x5b5e139f. -interface IERC721Metadata is IERC721 { - /// @notice A descriptive name for a collection of NFTs in this contract - function name() external view returns (string memory _name); - - /// @notice An abbreviated name for NFTs in this contract - function symbol() external view returns (string memory _symbol); - - /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. - /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC - /// 3986. The URI may point to a JSON file that conforms to the "ERC721 - /// Metadata JSON Schema". - function tokenURI(uint256 _tokenId) external view returns (string memory); -} - -/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension -/// @dev See https://eips.ethereum.org/EIPS/eip-721 -/// Note: the ERC-165 identifier for this interface is 0x780e9d63. -interface IERC721Enumerable is IERC721 { - /// @notice Count NFTs tracked by this contract - /// @return A count of valid NFTs tracked by this contract, where each one of - /// them has an assigned and queryable owner not equal to the zero address - function totalSupply() external view returns (uint256); - - /// @notice Enumerate valid NFTs - /// @dev Throws if `_index` >= `totalSupply()`. - /// @param _index A counter less than `totalSupply()` - /// @return The token identifier for the `_index`th NFT, - /// (sort order not specified) - function tokenByIndex(uint256 _index) external view returns (uint256); - - /// @notice Enumerate NFTs assigned to an owner - /// @dev Throws if `_index` >= `balanceOf(_owner)` or if - /// `_owner` is the zero address, representing invalid NFTs. - /// @param _owner An address where we are interested in NFTs owned by them - /// @param _index A counter less than `balanceOf(_owner)` - /// @return The token identifier for the `_index`th NFT assigned to `_owner`, - /// (sort order not specified) - function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); -} diff --git a/test/contracts/lib/forge-std/src/interfaces/IMulticall3.sol b/test/contracts/lib/forge-std/src/interfaces/IMulticall3.sol deleted file mode 100644 index 0d031b71dc..0000000000 --- a/test/contracts/lib/forge-std/src/interfaces/IMulticall3.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -interface IMulticall3 { - struct Call { - address target; - bytes callData; - } - - struct Call3 { - address target; - bool allowFailure; - bytes callData; - } - - struct Call3Value { - address target; - bool allowFailure; - uint256 value; - bytes callData; - } - - struct Result { - bool success; - bytes returnData; - } - - function aggregate(Call[] calldata calls) - external - payable - returns (uint256 blockNumber, bytes[] memory returnData); - - function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); - - function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData); - - function blockAndAggregate(Call[] calldata calls) - external - payable - returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); - - function getBasefee() external view returns (uint256 basefee); - - function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash); - - function getBlockNumber() external view returns (uint256 blockNumber); - - function getChainId() external view returns (uint256 chainid); - - function getCurrentBlockCoinbase() external view returns (address coinbase); - - function getCurrentBlockDifficulty() external view returns (uint256 difficulty); - - function getCurrentBlockGasLimit() external view returns (uint256 gaslimit); - - function getCurrentBlockTimestamp() external view returns (uint256 timestamp); - - function getEthBalance(address addr) external view returns (uint256 balance); - - function getLastBlockHash() external view returns (bytes32 blockHash); - - function tryAggregate(bool requireSuccess, Call[] calldata calls) - external - payable - returns (Result[] memory returnData); - - function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) - external - payable - returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); -} diff --git a/test/contracts/lib/forge-std/test/StdAssertions.t.sol b/test/contracts/lib/forge-std/test/StdAssertions.t.sol deleted file mode 100644 index 6222654a0f..0000000000 --- a/test/contracts/lib/forge-std/test/StdAssertions.t.sol +++ /dev/null @@ -1,823 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/Test.sol"; - -contract StdAssertionsTest is Test { - string constant CUSTOM_ERROR = "guh!"; - - bool constant EXPECT_PASS = false; - bool constant EXPECT_FAIL = true; - - TestTest t = new TestTest(); - - /*////////////////////////////////////////////////////////////////////////// - FAIL(STRING) - //////////////////////////////////////////////////////////////////////////*/ - - function testShouldFail() external { - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._fail(CUSTOM_ERROR); - } - - /*////////////////////////////////////////////////////////////////////////// - ASSERT_FALSE - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertFalse_Pass() external { - t._assertFalse(false, EXPECT_PASS); - } - - function testAssertFalse_Fail() external { - vm.expectEmit(false, false, false, true); - emit log("Error: Assertion Failed"); - t._assertFalse(true, EXPECT_FAIL); - } - - function testAssertFalse_Err_Pass() external { - t._assertFalse(false, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertFalse_Err_Fail() external { - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertFalse(true, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - ASSERT_EQ(BOOL) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertEq_Bool_Pass(bool a) external { - t._assertEq(a, a, EXPECT_PASS); - } - - function testAssertEq_Bool_Fail(bool a, bool b) external { - vm.assume(a != b); - - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [bool]"); - t._assertEq(a, b, EXPECT_FAIL); - } - - function testAssertEq_BoolErr_Pass(bool a) external { - t._assertEq(a, a, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertEq_BoolErr_Fail(bool a, bool b) external { - vm.assume(a != b); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - ASSERT_EQ(BYTES) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertEq_Bytes_Pass(bytes calldata a) external { - t._assertEq(a, a, EXPECT_PASS); - } - - function testAssertEq_Bytes_Fail(bytes calldata a, bytes calldata b) external { - vm.assume(keccak256(a) != keccak256(b)); - - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [bytes]"); - t._assertEq(a, b, EXPECT_FAIL); - } - - function testAssertEq_BytesErr_Pass(bytes calldata a) external { - t._assertEq(a, a, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertEq_BytesErr_Fail(bytes calldata a, bytes calldata b) external { - vm.assume(keccak256(a) != keccak256(b)); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - ASSERT_EQ(ARRAY) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertEq_UintArr_Pass(uint256 e0, uint256 e1, uint256 e2) public { - uint256[] memory a = new uint256[](3); - a[0] = e0; - a[1] = e1; - a[2] = e2; - uint256[] memory b = new uint256[](3); - b[0] = e0; - b[1] = e1; - b[2] = e2; - - t._assertEq(a, b, EXPECT_PASS); - } - - function testAssertEq_IntArr_Pass(int256 e0, int256 e1, int256 e2) public { - int256[] memory a = new int256[](3); - a[0] = e0; - a[1] = e1; - a[2] = e2; - int256[] memory b = new int256[](3); - b[0] = e0; - b[1] = e1; - b[2] = e2; - - t._assertEq(a, b, EXPECT_PASS); - } - - function testAssertEq_AddressArr_Pass(address e0, address e1, address e2) public { - address[] memory a = new address[](3); - a[0] = e0; - a[1] = e1; - a[2] = e2; - address[] memory b = new address[](3); - b[0] = e0; - b[1] = e1; - b[2] = e2; - - t._assertEq(a, b, EXPECT_PASS); - } - - function testAssertEq_UintArr_FailEl(uint256 e1) public { - vm.assume(e1 != 0); - uint256[] memory a = new uint256[](3); - uint256[] memory b = new uint256[](3); - b[1] = e1; - - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [uint[]]"); - t._assertEq(a, b, EXPECT_FAIL); - } - - function testAssertEq_IntArr_FailEl(int256 e1) public { - vm.assume(e1 != 0); - int256[] memory a = new int256[](3); - int256[] memory b = new int256[](3); - b[1] = e1; - - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [int[]]"); - t._assertEq(a, b, EXPECT_FAIL); - } - - function testAssertEq_AddressArr_FailEl(address e1) public { - vm.assume(e1 != address(0)); - address[] memory a = new address[](3); - address[] memory b = new address[](3); - b[1] = e1; - - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [address[]]"); - t._assertEq(a, b, EXPECT_FAIL); - } - - function testAssertEq_UintArrErr_FailEl(uint256 e1) public { - vm.assume(e1 != 0); - uint256[] memory a = new uint256[](3); - uint256[] memory b = new uint256[](3); - b[1] = e1; - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [uint[]]"); - t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); - } - - function testAssertEq_IntArrErr_FailEl(int256 e1) public { - vm.assume(e1 != 0); - int256[] memory a = new int256[](3); - int256[] memory b = new int256[](3); - b[1] = e1; - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [int[]]"); - t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); - } - - function testAssertEq_AddressArrErr_FailEl(address e1) public { - vm.assume(e1 != address(0)); - address[] memory a = new address[](3); - address[] memory b = new address[](3); - b[1] = e1; - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [address[]]"); - t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); - } - - function testAssertEq_UintArr_FailLen(uint256 lenA, uint256 lenB) public { - vm.assume(lenA != lenB); - vm.assume(lenA <= 10000); - vm.assume(lenB <= 10000); - uint256[] memory a = new uint256[](lenA); - uint256[] memory b = new uint256[](lenB); - - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [uint[]]"); - t._assertEq(a, b, EXPECT_FAIL); - } - - function testAssertEq_IntArr_FailLen(uint256 lenA, uint256 lenB) public { - vm.assume(lenA != lenB); - vm.assume(lenA <= 10000); - vm.assume(lenB <= 10000); - int256[] memory a = new int256[](lenA); - int256[] memory b = new int256[](lenB); - - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [int[]]"); - t._assertEq(a, b, EXPECT_FAIL); - } - - function testAssertEq_AddressArr_FailLen(uint256 lenA, uint256 lenB) public { - vm.assume(lenA != lenB); - vm.assume(lenA <= 10000); - vm.assume(lenB <= 10000); - address[] memory a = new address[](lenA); - address[] memory b = new address[](lenB); - - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [address[]]"); - t._assertEq(a, b, EXPECT_FAIL); - } - - function testAssertEq_UintArrErr_FailLen(uint256 lenA, uint256 lenB) public { - vm.assume(lenA != lenB); - vm.assume(lenA <= 10000); - vm.assume(lenB <= 10000); - uint256[] memory a = new uint256[](lenA); - uint256[] memory b = new uint256[](lenB); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [uint[]]"); - t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); - } - - function testAssertEq_IntArrErr_FailLen(uint256 lenA, uint256 lenB) public { - vm.assume(lenA != lenB); - vm.assume(lenA <= 10000); - vm.assume(lenB <= 10000); - int256[] memory a = new int256[](lenA); - int256[] memory b = new int256[](lenB); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [int[]]"); - t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); - } - - function testAssertEq_AddressArrErr_FailLen(uint256 lenA, uint256 lenB) public { - vm.assume(lenA != lenB); - vm.assume(lenA <= 10000); - vm.assume(lenB <= 10000); - address[] memory a = new address[](lenA); - address[] memory b = new address[](lenB); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - vm.expectEmit(false, false, false, true); - emit log("Error: a == b not satisfied [address[]]"); - t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - ASSERT_EQ(UINT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertEqUint() public { - assertEqUint(uint8(1), uint128(1)); - assertEqUint(uint64(2), uint64(2)); - } - - function testFailAssertEqUint() public { - assertEqUint(uint64(1), uint96(2)); - assertEqUint(uint160(3), uint160(4)); - } - - /*////////////////////////////////////////////////////////////////////////// - APPROX_EQ_ABS(UINT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertApproxEqAbs_Uint_Pass(uint256 a, uint256 b, uint256 maxDelta) external { - vm.assume(stdMath.delta(a, b) <= maxDelta); - - t._assertApproxEqAbs(a, b, maxDelta, EXPECT_PASS); - } - - function testAssertApproxEqAbs_Uint_Fail(uint256 a, uint256 b, uint256 maxDelta) external { - vm.assume(stdMath.delta(a, b) > maxDelta); - - vm.expectEmit(false, false, false, true); - emit log("Error: a ~= b not satisfied [uint]"); - t._assertApproxEqAbs(a, b, maxDelta, EXPECT_FAIL); - } - - function testAssertApproxEqAbs_UintErr_Pass(uint256 a, uint256 b, uint256 maxDelta) external { - vm.assume(stdMath.delta(a, b) <= maxDelta); - - t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertApproxEqAbs_UintErr_Fail(uint256 a, uint256 b, uint256 maxDelta) external { - vm.assume(stdMath.delta(a, b) > maxDelta); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - APPROX_EQ_ABS_DECIMAL(UINT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertApproxEqAbsDecimal_Uint_Pass(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) - external - { - vm.assume(stdMath.delta(a, b) <= maxDelta); - - t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_PASS); - } - - function testAssertApproxEqAbsDecimal_Uint_Fail(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) - external - { - vm.assume(stdMath.delta(a, b) > maxDelta); - - vm.expectEmit(false, false, false, true); - emit log("Error: a ~= b not satisfied [uint]"); - t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_FAIL); - } - - function testAssertApproxEqAbsDecimal_UintErr_Pass(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) - external - { - vm.assume(stdMath.delta(a, b) <= maxDelta); - - t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertApproxEqAbsDecimal_UintErr_Fail(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) - external - { - vm.assume(stdMath.delta(a, b) > maxDelta); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - APPROX_EQ_ABS(INT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertApproxEqAbs_Int_Pass(int256 a, int256 b, uint256 maxDelta) external { - vm.assume(stdMath.delta(a, b) <= maxDelta); - - t._assertApproxEqAbs(a, b, maxDelta, EXPECT_PASS); - } - - function testAssertApproxEqAbs_Int_Fail(int256 a, int256 b, uint256 maxDelta) external { - vm.assume(stdMath.delta(a, b) > maxDelta); - - vm.expectEmit(false, false, false, true); - emit log("Error: a ~= b not satisfied [int]"); - t._assertApproxEqAbs(a, b, maxDelta, EXPECT_FAIL); - } - - function testAssertApproxEqAbs_IntErr_Pass(int256 a, int256 b, uint256 maxDelta) external { - vm.assume(stdMath.delta(a, b) <= maxDelta); - - t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertApproxEqAbs_IntErr_Fail(int256 a, int256 b, uint256 maxDelta) external { - vm.assume(stdMath.delta(a, b) > maxDelta); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - APPROX_EQ_ABS_DECIMAL(INT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertApproxEqAbsDecimal_Int_Pass(int256 a, int256 b, uint256 maxDelta, uint256 decimals) external { - vm.assume(stdMath.delta(a, b) <= maxDelta); - - t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_PASS); - } - - function testAssertApproxEqAbsDecimal_Int_Fail(int256 a, int256 b, uint256 maxDelta, uint256 decimals) external { - vm.assume(stdMath.delta(a, b) > maxDelta); - - vm.expectEmit(false, false, false, true); - emit log("Error: a ~= b not satisfied [int]"); - t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_FAIL); - } - - function testAssertApproxEqAbsDecimal_IntErr_Pass(int256 a, int256 b, uint256 maxDelta, uint256 decimals) - external - { - vm.assume(stdMath.delta(a, b) <= maxDelta); - - t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertApproxEqAbsDecimal_IntErr_Fail(int256 a, int256 b, uint256 maxDelta, uint256 decimals) - external - { - vm.assume(stdMath.delta(a, b) > maxDelta); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - APPROX_EQ_REL(UINT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertApproxEqRel_Uint_Pass(uint256 a, uint256 b, uint256 maxPercentDelta) external { - vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); - vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); - - t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_PASS); - } - - function testAssertApproxEqRel_Uint_Fail(uint256 a, uint256 b, uint256 maxPercentDelta) external { - vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); - vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); - - vm.expectEmit(false, false, false, true); - emit log("Error: a ~= b not satisfied [uint]"); - t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_FAIL); - } - - function testAssertApproxEqRel_UintErr_Pass(uint256 a, uint256 b, uint256 maxPercentDelta) external { - vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); - vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); - - t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertApproxEqRel_UintErr_Fail(uint256 a, uint256 b, uint256 maxPercentDelta) external { - vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); - vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - APPROX_EQ_REL_DECIMAL(UINT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertApproxEqRelDecimal_Uint_Pass(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) - external - { - vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); - vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); - - t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_PASS); - } - - function testAssertApproxEqRelDecimal_Uint_Fail(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) - external - { - vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); - vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); - - vm.expectEmit(false, false, false, true); - emit log("Error: a ~= b not satisfied [uint]"); - t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_FAIL); - } - - function testAssertApproxEqRelDecimal_UintErr_Pass(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) - external - { - vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); - vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); - - t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertApproxEqRelDecimal_UintErr_Fail(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) - external - { - vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); - vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - APPROX_EQ_REL(INT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertApproxEqRel_Int_Pass(int128 a, int128 b, uint128 maxPercentDelta) external { - vm.assume(b != 0); - vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); - - t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_PASS); - } - - function testAssertApproxEqRel_Int_Fail(int128 a, int128 b, uint128 maxPercentDelta) external { - vm.assume(b != 0); - vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); - - vm.expectEmit(false, false, false, true); - emit log("Error: a ~= b not satisfied [int]"); - t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_FAIL); - } - - function testAssertApproxEqRel_IntErr_Pass(int128 a, int128 b, uint128 maxPercentDelta) external { - vm.assume(b != 0); - vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); - - t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertApproxEqRel_IntErr_Fail(int128 a, int128 b, uint128 maxPercentDelta) external { - vm.assume(b != 0); - vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_FAIL); - } - - /*////////////////////////////////////////////////////////////////////////// - APPROX_EQ_REL_DECIMAL(INT) - //////////////////////////////////////////////////////////////////////////*/ - - function testAssertApproxEqRelDecimal_Int_Pass(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) - external - { - vm.assume(b != 0); - vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); - - t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_PASS); - } - - function testAssertApproxEqRelDecimal_Int_Fail(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) - external - { - vm.assume(b != 0); - vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); - - vm.expectEmit(false, false, false, true); - emit log("Error: a ~= b not satisfied [int]"); - t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_FAIL); - } - - function testAssertApproxEqRelDecimal_IntErr_Pass(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) - external - { - vm.assume(b != 0); - vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); - - t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); - } - - function testAssertApproxEqRelDecimal_IntErr_Fail(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) - external - { - vm.assume(b != 0); - vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); - - vm.expectEmit(false, false, false, true); - emit log_named_string("Error", CUSTOM_ERROR); - t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); - } -} - -contract TestTest is Test { - modifier expectFailure(bool expectFail) { - bool preState = vm.load(HEVM_ADDRESS, bytes32("failed")) != bytes32(0x00); - _; - bool postState = vm.load(HEVM_ADDRESS, bytes32("failed")) != bytes32(0x00); - - if (preState == true) { - return; - } - - if (expectFail) { - require(postState == true, "expected failure not triggered"); - - // unwind the expected failure - vm.store(HEVM_ADDRESS, bytes32("failed"), bytes32(uint256(0x00))); - } else { - require(postState == false, "unexpected failure was triggered"); - } - } - - function _fail(string memory err) external expectFailure(true) { - fail(err); - } - - function _assertFalse(bool data, bool expectFail) external expectFailure(expectFail) { - assertFalse(data); - } - - function _assertFalse(bool data, string memory err, bool expectFail) external expectFailure(expectFail) { - assertFalse(data, err); - } - - function _assertEq(bool a, bool b, bool expectFail) external expectFailure(expectFail) { - assertEq(a, b); - } - - function _assertEq(bool a, bool b, string memory err, bool expectFail) external expectFailure(expectFail) { - assertEq(a, b, err); - } - - function _assertEq(bytes memory a, bytes memory b, bool expectFail) external expectFailure(expectFail) { - assertEq(a, b); - } - - function _assertEq(bytes memory a, bytes memory b, string memory err, bool expectFail) - external - expectFailure(expectFail) - { - assertEq(a, b, err); - } - - function _assertEq(uint256[] memory a, uint256[] memory b, bool expectFail) external expectFailure(expectFail) { - assertEq(a, b); - } - - function _assertEq(int256[] memory a, int256[] memory b, bool expectFail) external expectFailure(expectFail) { - assertEq(a, b); - } - - function _assertEq(address[] memory a, address[] memory b, bool expectFail) external expectFailure(expectFail) { - assertEq(a, b); - } - - function _assertEq(uint256[] memory a, uint256[] memory b, string memory err, bool expectFail) - external - expectFailure(expectFail) - { - assertEq(a, b, err); - } - - function _assertEq(int256[] memory a, int256[] memory b, string memory err, bool expectFail) - external - expectFailure(expectFail) - { - assertEq(a, b, err); - } - - function _assertEq(address[] memory a, address[] memory b, string memory err, bool expectFail) - external - expectFailure(expectFail) - { - assertEq(a, b, err); - } - - function _assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqAbs(a, b, maxDelta); - } - - function _assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqAbs(a, b, maxDelta, err); - } - - function _assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqAbsDecimal(a, b, maxDelta, decimals); - } - - function _assertApproxEqAbsDecimal( - uint256 a, - uint256 b, - uint256 maxDelta, - uint256 decimals, - string memory err, - bool expectFail - ) external expectFailure(expectFail) { - assertApproxEqAbsDecimal(a, b, maxDelta, decimals, err); - } - - function _assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqAbs(a, b, maxDelta); - } - - function _assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqAbs(a, b, maxDelta, err); - } - - function _assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqAbsDecimal(a, b, maxDelta, decimals); - } - - function _assertApproxEqAbsDecimal( - int256 a, - int256 b, - uint256 maxDelta, - uint256 decimals, - string memory err, - bool expectFail - ) external expectFailure(expectFail) { - assertApproxEqAbsDecimal(a, b, maxDelta, decimals, err); - } - - function _assertApproxEqRel(uint256 a, uint256 b, uint256 maxPercentDelta, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqRel(a, b, maxPercentDelta); - } - - function _assertApproxEqRel(uint256 a, uint256 b, uint256 maxPercentDelta, string memory err, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqRel(a, b, maxPercentDelta, err); - } - - function _assertApproxEqRelDecimal(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); - } - - function _assertApproxEqRelDecimal( - uint256 a, - uint256 b, - uint256 maxPercentDelta, - uint256 decimals, - string memory err, - bool expectFail - ) external expectFailure(expectFail) { - assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, err); - } - - function _assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqRel(a, b, maxPercentDelta); - } - - function _assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqRel(a, b, maxPercentDelta, err); - } - - function _assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, bool expectFail) - external - expectFailure(expectFail) - { - assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); - } - - function _assertApproxEqRelDecimal( - int256 a, - int256 b, - uint256 maxPercentDelta, - uint256 decimals, - string memory err, - bool expectFail - ) external expectFailure(expectFail) { - assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, err); - } -} diff --git a/test/contracts/lib/forge-std/test/StdChains.t.sol b/test/contracts/lib/forge-std/test/StdChains.t.sol deleted file mode 100644 index c2b215d9dd..0000000000 --- a/test/contracts/lib/forge-std/test/StdChains.t.sol +++ /dev/null @@ -1,160 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/Test.sol"; - -contract StdChainsTest is Test { - function testChainRpcInitialization() public { - // RPCs specified in `foundry.toml` should be updated. - assertEq(getChain(1).rpcUrl, "https://mainnet.infura.io/v3/16a8be88795540b9b3903d8de0f7baa5"); - assertEq(getChain("optimism_goerli").rpcUrl, "https://goerli.optimism.io/"); - assertEq(getChain("arbitrum_one_goerli").rpcUrl, "https://goerli-rollup.arbitrum.io/rpc/"); - - // Environment variables should be the next fallback - assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc"); - vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride"); - assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride"); - vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc"); - - // Cannot override RPCs defined in `foundry.toml` - vm.setEnv("MAINNET_RPC_URL", "myoverride2"); - assertEq(getChain("mainnet").rpcUrl, "https://mainnet.infura.io/v3/16a8be88795540b9b3903d8de0f7baa5"); - - // Other RPCs should remain unchanged. - assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545"); - assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/f4a0bdad42674adab5fc0ac077ffab2b"); - } - - function testRpc(string memory rpcAlias) internal { - string memory rpcUrl = getChain(rpcAlias).rpcUrl; - vm.createSelectFork(rpcUrl); - } - - // Ensure we can connect to the default RPC URL for each chain. - function testRpcs() public { - testRpc("mainnet"); - testRpc("goerli"); - testRpc("sepolia"); - testRpc("optimism"); - testRpc("optimism_goerli"); - testRpc("arbitrum_one"); - testRpc("arbitrum_one_goerli"); - testRpc("arbitrum_nova"); - testRpc("polygon"); - testRpc("polygon_mumbai"); - testRpc("avalanche"); - testRpc("avalanche_fuji"); - testRpc("bnb_smart_chain"); - testRpc("bnb_smart_chain_testnet"); - testRpc("gnosis_chain"); - } - - function testChainNoDefault() public { - vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found."); - getChain("does_not_exist"); - } - - function testSetChainFirstFails() public { - vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\"."); - setChain("anvil2", ChainData("Anvil", 31337, "URL")); - } - - function testChainBubbleUp() public { - setChain("needs_undefined_env_var", ChainData("", 123456789, "")); - vm.expectRevert( - "Failed to resolve env var `UNDEFINED_RPC_URL_PLACEHOLDER` in `${UNDEFINED_RPC_URL_PLACEHOLDER}`: environment variable not found" - ); - getChain("needs_undefined_env_var"); - } - - function testCannotSetChain_ChainIdExists() public { - setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); - - vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".'); - - setChain("another_custom_chain", ChainData("", 123456789, "")); - } - - function testSetChain() public { - setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); - Chain memory customChain = getChain("custom_chain"); - assertEq(customChain.name, "Custom Chain"); - assertEq(customChain.chainId, 123456789); - assertEq(customChain.chainAlias, "custom_chain"); - assertEq(customChain.rpcUrl, "https://custom.chain/"); - Chain memory chainById = getChain(123456789); - assertEq(chainById.name, customChain.name); - assertEq(chainById.chainId, customChain.chainId); - assertEq(chainById.chainAlias, customChain.chainAlias); - assertEq(chainById.rpcUrl, customChain.rpcUrl); - customChain.name = "Another Custom Chain"; - customChain.chainId = 987654321; - setChain("another_custom_chain", customChain); - Chain memory anotherCustomChain = getChain("another_custom_chain"); - assertEq(anotherCustomChain.name, "Another Custom Chain"); - assertEq(anotherCustomChain.chainId, 987654321); - assertEq(anotherCustomChain.chainAlias, "another_custom_chain"); - assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/"); - // Verify the first chain data was not overwritten - chainById = getChain(123456789); - assertEq(chainById.name, "Custom Chain"); - assertEq(chainById.chainId, 123456789); - } - - function testSetNoEmptyAlias() public { - vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string."); - setChain("", ChainData("", 123456789, "")); - } - - function testSetNoChainId0() public { - vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0."); - setChain("alias", ChainData("", 0, "")); - } - - function testGetNoChainId0() public { - vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0."); - getChain(0); - } - - function testGetNoEmptyAlias() public { - vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string."); - getChain(""); - } - - function testChainIdNotFound() public { - vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found."); - getChain("no_such_alias"); - } - - function testChainAliasNotFound() public { - vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found."); - getChain(321); - } - - function testSetChain_ExistingOne() public { - setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); - assertEq(getChain(123456789).chainId, 123456789); - - setChain("custom_chain", ChainData("Modified Chain", 999999999, "https://modified.chain/")); - vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found."); - getChain(123456789); - - Chain memory modifiedChain = getChain(999999999); - assertEq(modifiedChain.name, "Modified Chain"); - assertEq(modifiedChain.chainId, 999999999); - assertEq(modifiedChain.rpcUrl, "https://modified.chain/"); - } - - function testDontUseDefaultRpcUrl() public { - // Should error if default RPCs flag is set to false. - setFallbackToDefaultRpcUrls(false); - vm.expectRevert( - "Failed to get environment variable `ANVIL_RPC_URL` as type `string`: environment variable not found" - ); - getChain(31337); - vm.expectRevert( - "Failed to get environment variable `SEPOLIA_RPC_URL` as type `string`: environment variable not found" - ); - getChain("sepolia"); - } -} diff --git a/test/contracts/lib/forge-std/test/StdCheats.t.sol b/test/contracts/lib/forge-std/test/StdCheats.t.sol deleted file mode 100644 index 82bfb23c06..0000000000 --- a/test/contracts/lib/forge-std/test/StdCheats.t.sol +++ /dev/null @@ -1,329 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/StdCheats.sol"; -import "../src/Test.sol"; -import "../src/StdJson.sol"; - -contract StdCheatsTest is Test { - Bar test; - - using stdJson for string; - - function setUp() public { - test = new Bar(); - } - - function testSkip() public { - vm.warp(100); - skip(25); - assertEq(block.timestamp, 125); - } - - function testRewind() public { - vm.warp(100); - rewind(25); - assertEq(block.timestamp, 75); - } - - function testHoax() public { - hoax(address(1337)); - test.bar{value: 100}(address(1337)); - } - - function testHoaxOrigin() public { - hoax(address(1337), address(1337)); - test.origin{value: 100}(address(1337)); - } - - function testHoaxDifferentAddresses() public { - hoax(address(1337), address(7331)); - test.origin{value: 100}(address(1337), address(7331)); - } - - function testStartHoax() public { - startHoax(address(1337)); - test.bar{value: 100}(address(1337)); - test.bar{value: 100}(address(1337)); - vm.stopPrank(); - test.bar(address(this)); - } - - function testStartHoaxOrigin() public { - startHoax(address(1337), address(1337)); - test.origin{value: 100}(address(1337)); - test.origin{value: 100}(address(1337)); - vm.stopPrank(); - test.bar(address(this)); - } - - function testChangePrank() public { - vm.startPrank(address(1337)); - test.bar(address(1337)); - changePrank(address(0xdead)); - test.bar(address(0xdead)); - changePrank(address(1337)); - test.bar(address(1337)); - vm.stopPrank(); - } - - function testMakeAddrEquivalence() public { - (address addr,) = makeAddrAndKey("1337"); - assertEq(makeAddr("1337"), addr); - } - - function testMakeAddrSigning() public { - (address addr, uint256 key) = makeAddrAndKey("1337"); - bytes32 hash = keccak256("some_message"); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash); - assertEq(ecrecover(hash, v, r, s), addr); - } - - function testDeal() public { - deal(address(this), 1 ether); - assertEq(address(this).balance, 1 ether); - } - - function testDealToken() public { - Bar barToken = new Bar(); - address bar = address(barToken); - deal(bar, address(this), 10000e18); - assertEq(barToken.balanceOf(address(this)), 10000e18); - } - - function testDealTokenAdjustTS() public { - Bar barToken = new Bar(); - address bar = address(barToken); - deal(bar, address(this), 10000e18, true); - assertEq(barToken.balanceOf(address(this)), 10000e18); - assertEq(barToken.totalSupply(), 20000e18); - deal(bar, address(this), 0, true); - assertEq(barToken.balanceOf(address(this)), 0); - assertEq(barToken.totalSupply(), 10000e18); - } - - function testDeployCode() public { - address deployed = deployCode("StdCheats.t.sol:Bar", bytes("")); - assertEq(string(getCode(deployed)), string(getCode(address(test)))); - } - - function testDeployCodeNoArgs() public { - address deployed = deployCode("StdCheats.t.sol:Bar"); - assertEq(string(getCode(deployed)), string(getCode(address(test)))); - } - - function testDeployCodeVal() public { - address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether); - assertEq(string(getCode(deployed)), string(getCode(address(test)))); - assertEq(deployed.balance, 1 ether); - } - - function testDeployCodeValNoArgs() public { - address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether); - assertEq(string(getCode(deployed)), string(getCode(address(test)))); - assertEq(deployed.balance, 1 ether); - } - - // We need this so we can call "this.deployCode" rather than "deployCode" directly - function deployCodeHelper(string memory what) external { - deployCode(what); - } - - function testDeployCodeFail() public { - vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed.")); - this.deployCodeHelper("StdCheats.t.sol:RevertingContract"); - } - - function getCode(address who) internal view returns (bytes memory o_code) { - /// @solidity memory-safe-assembly - assembly { - // retrieve the size of the code, this needs assembly - let size := extcodesize(who) - // allocate output byte array - this could also be done without assembly - // by using o_code = new bytes(size) - o_code := mload(0x40) - // new "memory end" including padding - mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) - // store length in memory - mstore(o_code, size) - // actually retrieve the code, this needs assembly - extcodecopy(who, add(o_code, 0x20), 0, size) - } - } - - function testDeriveRememberKey() public { - string memory mnemonic = "test test test test test test test test test test test junk"; - - (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0); - assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); - assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); - } - - function testBytesToUint() public { - assertEq(3, bytesToUint_test(hex"03")); - assertEq(2, bytesToUint_test(hex"02")); - assertEq(255, bytesToUint_test(hex"ff")); - assertEq(29625, bytesToUint_test(hex"73b9")); - } - - function testParseJsonTxDetail() public { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - string memory json = vm.readFile(path); - bytes memory transactionDetails = json.parseRaw(".transactions[0].tx"); - RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail)); - Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail); - assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); - assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512); - assertEq( - txDetail.data, - hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004" - ); - assertEq(txDetail.nonce, 3); - assertEq(txDetail.txType, 2); - assertEq(txDetail.gas, 29625); - assertEq(txDetail.value, 0); - } - - function testReadEIP1559Transaction() public view { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - uint256 index = 0; - Tx1559 memory transaction = readTx1559(path, index); - transaction; - } - - function testReadEIP1559Transactions() public view { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - Tx1559[] memory transactions = readTx1559s(path); - transactions; - } - - function testReadReceipt() public { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - uint256 index = 5; - Receipt memory receipt = readReceipt(path, index); - assertEq( - receipt.logsBloom, - hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100" - ); - } - - function testReadReceipts() public view { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - Receipt[] memory receipts = readReceipts(path); - receipts; - } - - function testGasMeteringModifier() public { - uint256 gas_start_normal = gasleft(); - addInLoop(); - uint256 gas_used_normal = gas_start_normal - gasleft(); - - uint256 gas_start_single = gasleft(); - addInLoopNoGas(); - uint256 gas_used_single = gas_start_single - gasleft(); - - uint256 gas_start_double = gasleft(); - addInLoopNoGasNoGas(); - uint256 gas_used_double = gas_start_double - gasleft(); - - emit log_named_uint("Normal gas", gas_used_normal); - emit log_named_uint("Single modifier gas", gas_used_single); - emit log_named_uint("Double modifier gas", gas_used_double); - assertTrue(gas_used_double + gas_used_single < gas_used_normal); - } - - function addInLoop() internal pure returns (uint256) { - uint256 b; - for (uint256 i; i < 10000; i++) { - b += i; - } - return b; - } - - function addInLoopNoGas() internal noGasMetering returns (uint256) { - return addInLoop(); - } - - function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) { - return addInLoopNoGas(); - } - - function bytesToUint_test(bytes memory b) private pure returns (uint256) { - uint256 number; - for (uint256 i = 0; i < b.length; i++) { - number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1)))); - } - return number; - } - - function testAssumeNoPrecompiles(address addr) external { - assumeNoPrecompiles(addr, getChain("optimism_goerli").chainId); - assertTrue( - addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000)) - || addr > address(0x4200000000000000000000000000000000000800) - ); - } - - function testAssumePayable() external { - // all should revert since these addresses are not payable - - // VM address - vm.expectRevert(); - assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); - - // Console address - vm.expectRevert(); - assumePayable(0x000000000000000000636F6e736F6c652e6c6f67); - - // Create2Deployer - vm.expectRevert(); - assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); - } - - function testAssumePayable(address addr) external { - assumePayable(addr); - assertTrue( - addr != 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D && addr != 0x000000000000000000636F6e736F6c652e6c6f67 - && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C - ); - } -} - -contract Bar { - constructor() payable { - /// `DEAL` STDCHEAT - totalSupply = 10000e18; - balanceOf[address(this)] = totalSupply; - } - - /// `HOAX` STDCHEATS - function bar(address expectedSender) public payable { - require(msg.sender == expectedSender, "!prank"); - } - - function origin(address expectedSender) public payable { - require(msg.sender == expectedSender, "!prank"); - require(tx.origin == expectedSender, "!prank"); - } - - function origin(address expectedSender, address expectedOrigin) public payable { - require(msg.sender == expectedSender, "!prank"); - require(tx.origin == expectedOrigin, "!prank"); - } - - /// `DEAL` STDCHEAT - mapping(address => uint256) public balanceOf; - uint256 public totalSupply; -} - -contract RevertingContract { - constructor() { - revert(); - } -} diff --git a/test/contracts/lib/forge-std/test/StdError.t.sol b/test/contracts/lib/forge-std/test/StdError.t.sol deleted file mode 100644 index ccd3eface3..0000000000 --- a/test/contracts/lib/forge-std/test/StdError.t.sol +++ /dev/null @@ -1,118 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0 <0.9.0; - -import "../src/StdError.sol"; -import "../src/Test.sol"; - -contract StdErrorsTest is Test { - ErrorsTest test; - - function setUp() public { - test = new ErrorsTest(); - } - - function testExpectAssertion() public { - vm.expectRevert(stdError.assertionError); - test.assertionError(); - } - - function testExpectArithmetic() public { - vm.expectRevert(stdError.arithmeticError); - test.arithmeticError(10); - } - - function testExpectDiv() public { - vm.expectRevert(stdError.divisionError); - test.divError(0); - } - - function testExpectMod() public { - vm.expectRevert(stdError.divisionError); - test.modError(0); - } - - function testExpectEnum() public { - vm.expectRevert(stdError.enumConversionError); - test.enumConversion(1); - } - - function testExpectEncodeStg() public { - vm.expectRevert(stdError.encodeStorageError); - test.encodeStgError(); - } - - function testExpectPop() public { - vm.expectRevert(stdError.popError); - test.pop(); - } - - function testExpectOOB() public { - vm.expectRevert(stdError.indexOOBError); - test.indexOOBError(1); - } - - function testExpectMem() public { - vm.expectRevert(stdError.memOverflowError); - test.mem(); - } - - function testExpectIntern() public { - vm.expectRevert(stdError.zeroVarError); - test.intern(); - } -} - -contract ErrorsTest { - enum T {T1} - - uint256[] public someArr; - bytes someBytes; - - function assertionError() public pure { - assert(false); - } - - function arithmeticError(uint256 a) public pure { - a -= 100; - } - - function divError(uint256 a) public pure { - 100 / a; - } - - function modError(uint256 a) public pure { - 100 % a; - } - - function enumConversion(uint256 a) public pure { - T(a); - } - - function encodeStgError() public { - /// @solidity memory-safe-assembly - assembly { - sstore(someBytes.slot, 1) - } - keccak256(someBytes); - } - - function pop() public { - someArr.pop(); - } - - function indexOOBError(uint256 a) public pure { - uint256[] memory t = new uint256[](0); - t[a]; - } - - function mem() public pure { - uint256 l = 2 ** 256 / 32; - new uint256[](l); - } - - function intern() public returns (uint256) { - function(uint256) internal returns (uint256) x; - x(2); - return 7; - } -} diff --git a/test/contracts/lib/forge-std/test/StdMath.t.sol b/test/contracts/lib/forge-std/test/StdMath.t.sol deleted file mode 100644 index 95037ea5d4..0000000000 --- a/test/contracts/lib/forge-std/test/StdMath.t.sol +++ /dev/null @@ -1,197 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0 <0.9.0; - -import "../src/StdMath.sol"; -import "../src/Test.sol"; - -contract StdMathTest is Test { - function testGetAbs() external { - assertEq(stdMath.abs(-50), 50); - assertEq(stdMath.abs(50), 50); - assertEq(stdMath.abs(-1337), 1337); - assertEq(stdMath.abs(0), 0); - - assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1); - assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1)); - } - - function testGetAbs_Fuzz(int256 a) external { - uint256 manualAbs = getAbs(a); - - uint256 abs = stdMath.abs(a); - - assertEq(abs, manualAbs); - } - - function testGetDelta_Uint() external { - assertEq(stdMath.delta(uint256(0), uint256(0)), 0); - assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337); - assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max); - assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max); - assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max); - - assertEq(stdMath.delta(0, uint256(0)), 0); - assertEq(stdMath.delta(1337, uint256(0)), 1337); - assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max); - assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max); - assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max); - - assertEq(stdMath.delta(1337, uint256(1337)), 0); - assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0); - assertEq(stdMath.delta(5000, uint256(1250)), 3750); - } - - function testGetDelta_Uint_Fuzz(uint256 a, uint256 b) external { - uint256 manualDelta; - if (a > b) { - manualDelta = a - b; - } else { - manualDelta = b - a; - } - - uint256 delta = stdMath.delta(a, b); - - assertEq(delta, manualDelta); - } - - function testGetDelta_Int() external { - assertEq(stdMath.delta(int256(0), int256(0)), 0); - assertEq(stdMath.delta(int256(0), int256(1337)), 1337); - assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1); - assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1); - assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1); - - assertEq(stdMath.delta(0, int256(0)), 0); - assertEq(stdMath.delta(1337, int256(0)), 1337); - assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1); - assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1); - assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1); - - assertEq(stdMath.delta(-0, int256(0)), 0); - assertEq(stdMath.delta(-1337, int256(0)), 1337); - assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1); - assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1); - assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1); - - assertEq(stdMath.delta(int256(0), -0), 0); - assertEq(stdMath.delta(int256(0), -1337), 1337); - assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1); - assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1); - assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1); - - assertEq(stdMath.delta(1337, int256(1337)), 0); - assertEq(stdMath.delta(type(int256).max, type(int256).max), 0); - assertEq(stdMath.delta(type(int256).min, type(int256).min), 0); - assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max); - assertEq(stdMath.delta(5000, int256(1250)), 3750); - } - - function testGetDelta_Int_Fuzz(int256 a, int256 b) external { - uint256 absA = getAbs(a); - uint256 absB = getAbs(b); - uint256 absDelta = absA > absB ? absA - absB : absB - absA; - - uint256 manualDelta; - if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { - manualDelta = absDelta; - } - // (a < 0 && b >= 0) || (a >= 0 && b < 0) - else { - manualDelta = absA + absB; - } - - uint256 delta = stdMath.delta(a, b); - - assertEq(delta, manualDelta); - } - - function testGetPercentDelta_Uint() external { - assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18); - assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18); - assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18); - assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18); - - assertEq(stdMath.percentDelta(1337, uint256(1337)), 0); - assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0); - assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18); - assertEq(stdMath.percentDelta(2500, uint256(2500)), 0); - assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18); - assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18); - - vm.expectRevert(stdError.divisionError); - stdMath.percentDelta(uint256(1), 0); - } - - function testGetPercentDelta_Uint_Fuzz(uint192 a, uint192 b) external { - vm.assume(b != 0); - uint256 manualDelta; - if (a > b) { - manualDelta = a - b; - } else { - manualDelta = b - a; - } - - uint256 manualPercentDelta = manualDelta * 1e18 / b; - uint256 percentDelta = stdMath.percentDelta(a, b); - - assertEq(percentDelta, manualPercentDelta); - } - - function testGetPercentDelta_Int() external { - assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18); - assertEq(stdMath.percentDelta(int256(0), -1337), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18); - - assertEq(stdMath.percentDelta(1337, int256(1337)), 0); - assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0); - assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0); - - assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down - assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down - assertEq(stdMath.percentDelta(0, int256(2500)), 1e18); - assertEq(stdMath.percentDelta(2500, int256(2500)), 0); - assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18); - assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18); - - vm.expectRevert(stdError.divisionError); - stdMath.percentDelta(int256(1), 0); - } - - function testGetPercentDelta_Int_Fuzz(int192 a, int192 b) external { - vm.assume(b != 0); - uint256 absA = getAbs(a); - uint256 absB = getAbs(b); - uint256 absDelta = absA > absB ? absA - absB : absB - absA; - - uint256 manualDelta; - if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { - manualDelta = absDelta; - } - // (a < 0 && b >= 0) || (a >= 0 && b < 0) - else { - manualDelta = absA + absB; - } - - uint256 manualPercentDelta = manualDelta * 1e18 / absB; - uint256 percentDelta = stdMath.percentDelta(a, b); - - assertEq(percentDelta, manualPercentDelta); - } - - /*////////////////////////////////////////////////////////////////////////// - HELPERS - //////////////////////////////////////////////////////////////////////////*/ - - function getAbs(int256 a) private pure returns (uint256) { - if (a < 0) { - return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a); - } - - return uint256(a); - } -} diff --git a/test/contracts/lib/forge-std/test/StdStorage.t.sol b/test/contracts/lib/forge-std/test/StdStorage.t.sol deleted file mode 100644 index d4c563a04b..0000000000 --- a/test/contracts/lib/forge-std/test/StdStorage.t.sol +++ /dev/null @@ -1,283 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/StdStorage.sol"; -import "../src/Test.sol"; - -contract StdStorageTest is Test { - using stdStorage for StdStorage; - - StorageTest internal test; - - function setUp() public { - test = new StorageTest(); - } - - function testStorageHidden() public { - assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find()); - } - - function testStorageObvious() public { - assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find()); - } - - function testStorageCheckedWriteHidden() public { - stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100); - assertEq(uint256(test.hidden()), 100); - } - - function testStorageCheckedWriteObvious() public { - stdstore.target(address(test)).sig(test.exists.selector).checked_write(100); - assertEq(test.exists(), 100); - } - - function testStorageMapStructA() public { - uint256 slot = - stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find(); - assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot); - } - - function testStorageMapStructB() public { - uint256 slot = - stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find(); - assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot); - } - - function testStorageDeepMap() public { - uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key( - address(this) - ).find(); - assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot); - } - - function testStorageCheckedWriteDeepMap() public { - stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this)) - .checked_write(100); - assertEq(100, test.deep_map(address(this), address(this))); - } - - function testStorageDeepMapStructA() public { - uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) - .with_key(address(this)).depth(0).find(); - assertEq( - bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0), - bytes32(slot) - ); - } - - function testStorageDeepMapStructB() public { - uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) - .with_key(address(this)).depth(1).find(); - assertEq( - bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1), - bytes32(slot) - ); - } - - function testStorageCheckedWriteDeepMapStructA() public { - stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( - address(this) - ).depth(0).checked_write(100); - (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); - assertEq(100, a); - assertEq(0, b); - } - - function testStorageCheckedWriteDeepMapStructB() public { - stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( - address(this) - ).depth(1).checked_write(100); - (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); - assertEq(0, a); - assertEq(100, b); - } - - function testStorageCheckedWriteMapStructA() public { - stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100); - (uint256 a, uint256 b) = test.map_struct(address(this)); - assertEq(a, 100); - assertEq(b, 0); - } - - function testStorageCheckedWriteMapStructB() public { - stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100); - (uint256 a, uint256 b) = test.map_struct(address(this)); - assertEq(a, 0); - assertEq(b, 100); - } - - function testStorageStructA() public { - uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find(); - assertEq(uint256(7), slot); - } - - function testStorageStructB() public { - uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find(); - assertEq(uint256(7) + 1, slot); - } - - function testStorageCheckedWriteStructA() public { - stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100); - (uint256 a, uint256 b) = test.basic(); - assertEq(a, 100); - assertEq(b, 1337); - } - - function testStorageCheckedWriteStructB() public { - stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100); - (uint256 a, uint256 b) = test.basic(); - assertEq(a, 1337); - assertEq(b, 100); - } - - function testStorageMapAddrFound() public { - uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find(); - assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot); - } - - function testStorageMapUintFound() public { - uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find(); - assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot); - } - - function testStorageCheckedWriteMapUint() public { - stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100); - assertEq(100, test.map_uint(100)); - } - - function testStorageCheckedWriteMapAddr() public { - stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100); - assertEq(100, test.map_addr(address(this))); - } - - function testStorageCheckedWriteMapBool() public { - stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true); - assertTrue(test.map_bool(address(this))); - } - - function testFailStorageCheckedWriteMapPacked() public { - // expect PackedSlot error but not external call so cant expectRevert - stdstore.target(address(test)).sig(test.read_struct_lower.selector).with_key(address(uint160(1337))) - .checked_write(100); - } - - function testStorageCheckedWriteMapPackedSuccess() public { - uint256 full = test.map_packed(address(1337)); - // keep upper 128, set lower 128 to 1337 - full = (full & (uint256((1 << 128) - 1) << 128)) | 1337; - stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write( - full - ); - assertEq(1337, test.read_struct_lower(address(1337))); - } - - function testFailStorageConst() public { - // vm.expectRevert(abi.encodeWithSignature("NotStorage(bytes4)", bytes4(keccak256("const()")))); - stdstore.target(address(test)).sig("const()").find(); - } - - function testFailStorageNativePack() public { - stdstore.target(address(test)).sig(test.tA.selector).find(); - stdstore.target(address(test)).sig(test.tB.selector).find(); - - // these both would fail - stdstore.target(address(test)).sig(test.tC.selector).find(); - stdstore.target(address(test)).sig(test.tD.selector).find(); - } - - function testStorageReadBytes32() public { - bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32(); - assertEq(val, hex"1337"); - } - - function testStorageReadBool_False() public { - bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool(); - assertEq(val, false); - } - - function testStorageReadBool_True() public { - bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool(); - assertEq(val, true); - } - - function testStorageReadBool_Revert() public { - vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); - this.readNonBoolValue(); - } - - function readNonBoolValue() public { - stdstore.target(address(test)).sig(test.tE.selector).read_bool(); - } - - function testStorageReadAddress() public { - address val = stdstore.target(address(test)).sig(test.tF.selector).read_address(); - assertEq(val, address(1337)); - } - - function testStorageReadUint() public { - uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint(); - assertEq(val, 1); - } - - function testStorageReadInt() public { - int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int(); - assertEq(val, type(int256).min); - } -} - -contract StorageTest { - uint256 public exists = 1; - mapping(address => uint256) public map_addr; - mapping(uint256 => uint256) public map_uint; - mapping(address => uint256) public map_packed; - mapping(address => UnpackedStruct) public map_struct; - mapping(address => mapping(address => uint256)) public deep_map; - mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; - UnpackedStruct public basic; - - uint248 public tA; - bool public tB; - - bool public tC = false; - uint248 public tD = 1; - - struct UnpackedStruct { - uint256 a; - uint256 b; - } - - mapping(address => bool) public map_bool; - - bytes32 public tE = hex"1337"; - address public tF = address(1337); - int256 public tG = type(int256).min; - bool public tH = true; - - constructor() { - basic = UnpackedStruct({a: 1337, b: 1337}); - - uint256 two = (1 << 128) | 1; - map_packed[msg.sender] = two; - map_packed[address(uint160(1337))] = 1 << 128; - } - - function read_struct_upper(address who) public view returns (uint256) { - return map_packed[who] >> 128; - } - - function read_struct_lower(address who) public view returns (uint256) { - return map_packed[who] & ((1 << 128) - 1); - } - - function hidden() public view returns (bytes32 t) { - bytes32 slot = keccak256("my.random.var"); - /// @solidity memory-safe-assembly - assembly { - t := sload(slot) - } - } - - function const() public pure returns (bytes32 t) { - t = bytes32(hex"1337"); - } -} diff --git a/test/contracts/lib/forge-std/test/StdUtils.t.sol b/test/contracts/lib/forge-std/test/StdUtils.t.sol deleted file mode 100644 index a085b19e65..0000000000 --- a/test/contracts/lib/forge-std/test/StdUtils.t.sol +++ /dev/null @@ -1,297 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/Test.sol"; - -contract StdUtilsMock is StdUtils { - // We deploy a mock version so we can properly test expected reverts. - function getTokenBalances_(address token, address[] memory addresses) - external - returns (uint256[] memory balances) - { - return getTokenBalances(token, addresses); - } -} - -contract StdUtilsTest is Test { - /*////////////////////////////////////////////////////////////////////////// - BOUND UINT - //////////////////////////////////////////////////////////////////////////*/ - - function testBound() public { - assertEq(bound(uint256(5), 0, 4), 0); - assertEq(bound(uint256(0), 69, 69), 69); - assertEq(bound(uint256(0), 68, 69), 68); - assertEq(bound(uint256(10), 150, 190), 174); - assertEq(bound(uint256(300), 2800, 3200), 3107); - assertEq(bound(uint256(9999), 1337, 6666), 4669); - } - - function testBound_WithinRange() public { - assertEq(bound(uint256(51), 50, 150), 51); - assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150)); - assertEq(bound(uint256(149), 50, 150), 149); - assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150)); - } - - function testBound_EdgeCoverage() public { - assertEq(bound(uint256(0), 50, 150), 50); - assertEq(bound(uint256(1), 50, 150), 51); - assertEq(bound(uint256(2), 50, 150), 52); - assertEq(bound(uint256(3), 50, 150), 53); - assertEq(bound(type(uint256).max, 50, 150), 150); - assertEq(bound(type(uint256).max - 1, 50, 150), 149); - assertEq(bound(type(uint256).max - 2, 50, 150), 148); - assertEq(bound(type(uint256).max - 3, 50, 150), 147); - } - - function testBound_DistributionIsEven(uint256 min, uint256 size) public { - size = size % 100 + 1; - min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size); - uint256 max = min + size - 1; - uint256 result; - - for (uint256 i = 1; i <= size * 4; ++i) { - // x > max - result = bound(max + i, min, max); - assertEq(result, min + (i - 1) % size); - // x < min - result = bound(min - i, min, max); - assertEq(result, max - (i - 1) % size); - } - } - - function testBound(uint256 num, uint256 min, uint256 max) public { - if (min > max) (min, max) = (max, min); - - uint256 result = bound(num, min, max); - - assertGe(result, min); - assertLe(result, max); - assertEq(result, bound(result, min, max)); - if (num >= min && num <= max) assertEq(result, num); - } - - function testBoundUint256Max() public { - assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1); - assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max); - } - - function testCannotBoundMaxLessThanMin() public { - vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); - bound(uint256(5), 100, 10); - } - - function testCannotBoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public { - vm.assume(min > max); - vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); - bound(num, min, max); - } - - /*////////////////////////////////////////////////////////////////////////// - BOUND INT - //////////////////////////////////////////////////////////////////////////*/ - - function testBoundInt() public { - assertEq(bound(-3, 0, 4), 2); - assertEq(bound(0, -69, -69), -69); - assertEq(bound(0, -69, -68), -68); - assertEq(bound(-10, 150, 190), 154); - assertEq(bound(-300, 2800, 3200), 2908); - assertEq(bound(9999, -1337, 6666), 1995); - } - - function testBoundInt_WithinRange() public { - assertEq(bound(51, -50, 150), 51); - assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150)); - assertEq(bound(149, -50, 150), 149); - assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150)); - } - - function testBoundInt_EdgeCoverage() public { - assertEq(bound(type(int256).min, -50, 150), -50); - assertEq(bound(type(int256).min + 1, -50, 150), -49); - assertEq(bound(type(int256).min + 2, -50, 150), -48); - assertEq(bound(type(int256).min + 3, -50, 150), -47); - assertEq(bound(type(int256).min, 10, 150), 10); - assertEq(bound(type(int256).min + 1, 10, 150), 11); - assertEq(bound(type(int256).min + 2, 10, 150), 12); - assertEq(bound(type(int256).min + 3, 10, 150), 13); - - assertEq(bound(type(int256).max, -50, 150), 150); - assertEq(bound(type(int256).max - 1, -50, 150), 149); - assertEq(bound(type(int256).max - 2, -50, 150), 148); - assertEq(bound(type(int256).max - 3, -50, 150), 147); - assertEq(bound(type(int256).max, -50, -10), -10); - assertEq(bound(type(int256).max - 1, -50, -10), -11); - assertEq(bound(type(int256).max - 2, -50, -10), -12); - assertEq(bound(type(int256).max - 3, -50, -10), -13); - } - - function testBoundInt_DistributionIsEven(int256 min, uint256 size) public { - size = size % 100 + 1; - min = bound(min, -int256(size / 2), int256(size - size / 2)); - int256 max = min + int256(size) - 1; - int256 result; - - for (uint256 i = 1; i <= size * 4; ++i) { - // x > max - result = bound(max + int256(i), min, max); - assertEq(result, min + int256((i - 1) % size)); - // x < min - result = bound(min - int256(i), min, max); - assertEq(result, max - int256((i - 1) % size)); - } - } - - function testBoundInt(int256 num, int256 min, int256 max) public { - if (min > max) (min, max) = (max, min); - - int256 result = bound(num, min, max); - - assertGe(result, min); - assertLe(result, max); - assertEq(result, bound(result, min, max)); - if (num >= min && num <= max) assertEq(result, num); - } - - function testBoundIntInt256Max() public { - assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1); - assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max); - } - - function testBoundIntInt256Min() public { - assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min); - assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1); - } - - function testCannotBoundIntMaxLessThanMin() public { - vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); - bound(-5, 100, 10); - } - - function testCannotBoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public { - vm.assume(min > max); - vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); - bound(num, min, max); - } - - /*////////////////////////////////////////////////////////////////////////// - BYTES TO UINT - //////////////////////////////////////////////////////////////////////////*/ - - function testBytesToUint() external { - bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; - bytes memory two = hex"02"; - bytes memory millionEther = hex"d3c21bcecceda1000000"; - - assertEq(bytesToUint(maxUint), type(uint256).max); - assertEq(bytesToUint(two), 2); - assertEq(bytesToUint(millionEther), 1_000_000 ether); - } - - function testCannotConvertGT32Bytes() external { - bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; - vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32."); - bytesToUint(thirty3Bytes); - } - - /*////////////////////////////////////////////////////////////////////////// - COMPUTE CREATE ADDRESS - //////////////////////////////////////////////////////////////////////////*/ - - function testComputeCreateAddress() external { - address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; - uint256 nonce = 14; - address createAddress = computeCreateAddress(deployer, nonce); - assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45); - } - - /*////////////////////////////////////////////////////////////////////////// - COMPUTE CREATE2 ADDRESS - //////////////////////////////////////////////////////////////////////////*/ - - function testComputeCreate2Address() external { - bytes32 salt = bytes32(uint256(31415)); - bytes32 initcodeHash = keccak256(abi.encode(0x6080)); - address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; - address create2Address = computeCreate2Address(salt, initcodeHash, deployer); - assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3); - } - - function testComputeCreate2AddressWithDefaultDeployer() external { - bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0; - bytes32 initcodeHash = hashInitCode(hex"6080", ""); - assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0); - address create2Address = computeCreate2Address(salt, initcodeHash); - assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6); - } -} - -contract StdUtilsForkTest is Test { - /*////////////////////////////////////////////////////////////////////////// - GET TOKEN BALANCES - //////////////////////////////////////////////////////////////////////////*/ - - address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; - address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170; - address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA; - address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385; - - address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17; - address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52; - - function setUp() public { - // All tests of the `getTokenBalances` method are fork tests using live contracts. - vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); - } - - function testCannotGetTokenBalances_NonTokenContract() external { - // We deploy a mock version so we can properly test the revert. - StdUtilsMock stdUtils = new StdUtilsMock(); - - // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function, - // so the `balanceOf` call should revert. - address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f); - address[] memory addresses = new address[](1); - addresses[0] = USDC_HOLDER_0; - - vm.expectRevert("Multicall3: call failed"); - stdUtils.getTokenBalances_(token, addresses); - } - - function testCannotGetTokenBalances_EOA() external { - address eoa = vm.addr({privateKey: 1}); - address[] memory addresses = new address[](1); - addresses[0] = USDC_HOLDER_0; - vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract."); - getTokenBalances(eoa, addresses); - } - - function testGetTokenBalances_Empty() external { - address[] memory addresses = new address[](0); - uint256[] memory balances = getTokenBalances(USDC, addresses); - assertEq(balances.length, 0); - } - - function testGetTokenBalances_USDC() external { - address[] memory addresses = new address[](2); - addresses[0] = USDC_HOLDER_0; - addresses[1] = USDC_HOLDER_1; - uint256[] memory balances = getTokenBalances(USDC, addresses); - assertEq(balances[0], 159_000_000_000_000); - assertEq(balances[1], 131_350_000_000_000); - } - - function testGetTokenBalances_SHIB() external { - address[] memory addresses = new address[](3); - addresses[0] = SHIB_HOLDER_0; - addresses[1] = SHIB_HOLDER_1; - addresses[2] = SHIB_HOLDER_2; - uint256[] memory balances = getTokenBalances(SHIB, addresses); - assertEq(balances[0], 3_323_256_285_484.42e18); - assertEq(balances[1], 1_271_702_771_149.99999928e18); - assertEq(balances[2], 606_357_106_247e18); - } -} diff --git a/test/contracts/lib/forge-std/test/compilation/CompilationScript.sol b/test/contracts/lib/forge-std/test/compilation/CompilationScript.sol deleted file mode 100644 index e205cfff3c..0000000000 --- a/test/contracts/lib/forge-std/test/compilation/CompilationScript.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import "../../src/Script.sol"; - -// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing -// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 -contract CompilationScript is Script {} diff --git a/test/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol b/test/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol deleted file mode 100644 index ce8e0e9545..0000000000 --- a/test/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import "../../src/Script.sol"; - -// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing -// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 -contract CompilationScriptBase is ScriptBase {} diff --git a/test/contracts/lib/forge-std/test/compilation/CompilationTest.sol b/test/contracts/lib/forge-std/test/compilation/CompilationTest.sol deleted file mode 100644 index 9beeafeb7d..0000000000 --- a/test/contracts/lib/forge-std/test/compilation/CompilationTest.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import "../../src/Test.sol"; - -// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing -// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 -contract CompilationTest is Test {} diff --git a/test/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol b/test/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol deleted file mode 100644 index e993535bc0..0000000000 --- a/test/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import "../../src/Test.sol"; - -// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing -// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 -contract CompilationTestBase is TestBase {} diff --git a/test/contracts/lib/forge-std/test/fixtures/broadcast.log.json b/test/contracts/lib/forge-std/test/fixtures/broadcast.log.json deleted file mode 100644 index 0a0200bca9..0000000000 --- a/test/contracts/lib/forge-std/test/fixtures/broadcast.log.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "transactions": [ - { - "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "function": "multiple_arguments(uint256,address,uint256[]):(uint256)", - "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "gas": "0x73b9", - "value": "0x0", - "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004", - "nonce": "0x3", - "accessList": [] - } - }, - { - "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "function": "inc():(uint256)", - "arguments": [], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "gas": "0xdcb2", - "value": "0x0", - "data": "0x371303c0", - "nonce": "0x4", - "accessList": [] - } - }, - { - "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "function": "t(uint256):(uint256)", - "arguments": ["1"], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "gas": "0x8599", - "value": "0x0", - "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x5", - "accessList": [] - } - } - ], - "receipts": [ - { - "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181", - "transactionIndex": "0x0", - "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af", - "blockNumber": "0x1", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": null, - "cumulativeGasUsed": "0x13f3a", - "gasUsed": "0x13f3a", - "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3", - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782", - "transactionIndex": "0x0", - "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148", - "blockNumber": "0x2", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": null, - "cumulativeGasUsed": "0x45d80", - "gasUsed": "0x45d80", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d", - "transactionIndex": "0x0", - "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58", - "blockNumber": "0x3", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "cumulativeGasUsed": "0x45feb", - "gasUsed": "0x45feb", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", - "transactionIndex": "0x0", - "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629", - "blockNumber": "0x4", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "cumulativeGasUsed": "0x5905", - "gasUsed": "0x5905", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", - "transactionIndex": "0x0", - "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11", - "blockNumber": "0x5", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "cumulativeGasUsed": "0xa9c4", - "gasUsed": "0xa9c4", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "transactionIndex": "0x0", - "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", - "blockNumber": "0x6", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "cumulativeGasUsed": "0x66c5", - "gasUsed": "0x66c5", - "contractAddress": null, - "logs": [ - { - "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "topics": [ - "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b" - ], - "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000", - "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", - "blockNumber": "0x6", - "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "transactionIndex": "0x1", - "logIndex": "0x0", - "transactionLogIndex": "0x0", - "removed": false - } - ], - "status": "0x1", - "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16", - "transactionIndex": "0x0", - "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c", - "blockNumber": "0x7", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x0000000000000000000000000000000000001337", - "cumulativeGasUsed": "0x5208", - "gasUsed": "0x5208", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - } - ], - "libraries": [ - "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3" - ], - "pending": [], - "path": "broadcast/Broadcast.t.sol/31337/run-latest.json", - "returns": {}, - "timestamp": 1655140035 -} diff --git a/test/contracts/lib/forge-std/test/fixtures/broadcast.log.json.d.ts b/test/contracts/lib/forge-std/test/fixtures/broadcast.log.json.d.ts deleted file mode 100644 index fb9d8afb7c..0000000000 --- a/test/contracts/lib/forge-std/test/fixtures/broadcast.log.json.d.ts +++ /dev/null @@ -1,187 +0,0 @@ -declare const abi: { - "transactions": [ - { - "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "function": "multiple_arguments(uint256,address,uint256[]):(uint256)", - "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "gas": "0x73b9", - "value": "0x0", - "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004", - "nonce": "0x3", - "accessList": [] - } - }, - { - "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "function": "inc():(uint256)", - "arguments": [], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "gas": "0xdcb2", - "value": "0x0", - "data": "0x371303c0", - "nonce": "0x4", - "accessList": [] - } - }, - { - "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "function": "t(uint256):(uint256)", - "arguments": ["1"], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "gas": "0x8599", - "value": "0x0", - "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x5", - "accessList": [] - } - } - ], - "receipts": [ - { - "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181", - "transactionIndex": "0x0", - "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af", - "blockNumber": "0x1", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": null, - "cumulativeGasUsed": "0x13f3a", - "gasUsed": "0x13f3a", - "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3", - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782", - "transactionIndex": "0x0", - "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148", - "blockNumber": "0x2", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": null, - "cumulativeGasUsed": "0x45d80", - "gasUsed": "0x45d80", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d", - "transactionIndex": "0x0", - "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58", - "blockNumber": "0x3", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "cumulativeGasUsed": "0x45feb", - "gasUsed": "0x45feb", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", - "transactionIndex": "0x0", - "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629", - "blockNumber": "0x4", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "cumulativeGasUsed": "0x5905", - "gasUsed": "0x5905", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", - "transactionIndex": "0x0", - "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11", - "blockNumber": "0x5", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "cumulativeGasUsed": "0xa9c4", - "gasUsed": "0xa9c4", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "transactionIndex": "0x0", - "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", - "blockNumber": "0x6", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "cumulativeGasUsed": "0x66c5", - "gasUsed": "0x66c5", - "contractAddress": null, - "logs": [ - { - "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "topics": [ - "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b" - ], - "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000", - "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", - "blockNumber": "0x6", - "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "transactionIndex": "0x1", - "logIndex": "0x0", - "transactionLogIndex": "0x0", - "removed": false - } - ], - "status": "0x1", - "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16", - "transactionIndex": "0x0", - "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c", - "blockNumber": "0x7", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x0000000000000000000000000000000000001337", - "cumulativeGasUsed": "0x5208", - "gasUsed": "0x5208", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - } - ], - "libraries": [ - "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3" - ], - "pending": [], - "path": "broadcast/Broadcast.t.sol/31337/run-latest.json", - "returns": {}, - "timestamp": 1655140035 -}; export default abi; diff --git a/test/contracts/lib/solady b/test/contracts/lib/solady deleted file mode 160000 index 678c916355..0000000000 --- a/test/contracts/lib/solady +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 678c9163550810b08f0ffb09624c9f7532392303 diff --git a/test/foundry.toml b/test/foundry.toml deleted file mode 100644 index 02e98a9f55..0000000000 --- a/test/foundry.toml +++ /dev/null @@ -1,6 +0,0 @@ -[profile.default] -remappings = [ - "solady/=contracts/lib/solady/src/", -] -src = "contracts/src" -out = "contracts/out" diff --git a/test/src/utils.ts b/test/src/utils.ts index c7a0cccac9..e8209b28e6 100644 --- a/test/src/utils.ts +++ b/test/src/utils.ts @@ -32,7 +32,7 @@ import { Mock4337AccountFactory, OffchainLookupExample, Payable, -} from '../contracts/generated.js' +} from '../../contracts/generated.js' import { baycContractConfig, ensRegistryConfig, diff --git a/test/tsconfig.json b/test/tsconfig.json index 39f3fcbace..4f3076c60a 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,4 +1,5 @@ { + "extends": "../tsconfig.json", "compilerOptions": { "module": "nodenext", "moduleResolution": "nodenext", diff --git a/test/vitest.config.ts b/test/vitest.config.ts index 26947a6e16..6583f5ba94 100644 --- a/test/vitest.config.ts +++ b/test/vitest.config.ts @@ -4,6 +4,7 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { alias: { + '~contracts': join(__dirname, '../contracts'), '~viem': join(__dirname, '../src'), '~test': join(__dirname, '.'), }, diff --git a/tsconfig.json b/tsconfig.json index 4415359c0e..036717ccfa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,10 +3,11 @@ "extends": "./tsconfig.base.json", "include": ["src", "test/src"], "exclude": [], - "references": [{ "path": "./scripts/tsconfig.json" }], + "references": [{ "path": "./.scripts/tsconfig.json" }], "compilerOptions": { "baseUrl": ".", "paths": { + "~contracts/*": ["./contracts/*"], "~viem/*": ["./src/*"], "~test/*": ["./test/*"] } From a3f622477acb40bb0958e3802834403d4aa65d74 Mon Sep 17 00:00:00 2001 From: jxom Date: Fri, 12 Jul 2024 07:55:01 +1000 Subject: [PATCH 33/68] chore: update snapshots --- src/actions/public/getTransactionReceipt.test.ts | 11 +++++++++++ src/zksync/formatters.test.ts | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/actions/public/getTransactionReceipt.test.ts b/src/actions/public/getTransactionReceipt.test.ts index e26e6f5e3f..261580a2d7 100644 --- a/src/actions/public/getTransactionReceipt.test.ts +++ b/src/actions/public/getTransactionReceipt.test.ts @@ -166,6 +166,7 @@ test('chain w/ custom block type', async () => { "address": "0x000000000000000000000000000000000000800a", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x00000000000000000000000000000000000000000000000000017b3627a0a300", "l1BatchNumber": 273767n, "logIndex": 0, @@ -184,6 +185,7 @@ test('chain w/ custom block type', async () => { "address": "0x000000000000000000000000000000000000800a", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x00000000000000000000000000000000000000000000000000013949fc5ebec8", "l1BatchNumber": 273767n, "logIndex": 1, @@ -202,6 +204,7 @@ test('chain w/ custom block type', async () => { "address": "0x54de43b6ba21a5553697a2b78338e046dd7e0278", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", "l1BatchNumber": 273767n, "logIndex": 2, @@ -220,6 +223,7 @@ test('chain w/ custom block type', async () => { "address": "0x000000000000000000000000000000000000800a", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x0000000000000000000000000000000000000000000000000001228d38402ec8", "l1BatchNumber": 273767n, "logIndex": 3, @@ -238,6 +242,7 @@ test('chain w/ custom block type', async () => { "address": "0x000000000000000000000000000000000000800a", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x0000000000000000000000000000000000000000000000000001228d38402ec8", "l1BatchNumber": 273767n, "logIndex": 4, @@ -256,6 +261,7 @@ test('chain w/ custom block type', async () => { "address": "0x9923573104957bf457a3c4df0e21c8b389dd43df", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x0000000000000000000000000000000000000000000000000000e523da9a7ec8", "l1BatchNumber": 273767n, "logIndex": 5, @@ -272,6 +278,7 @@ test('chain w/ custom block type', async () => { "address": "0x042b8289c97896529ec2fe49ba1a8b9c956a86cc", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200010000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000", "l1BatchNumber": 273767n, "logIndex": 6, @@ -288,6 +295,7 @@ test('chain w/ custom block type', async () => { "address": "0xcb7ad38d45ab5bcf5880b0fa851263c29582c18a", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x000000000000000000000000000000000000000000000000000000000000009e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001400000000000000000000000054de43b6ba21a5553697a2b78338e046dd7e027800000000000000000000000000000000000000000000000000003d695da5b000", "l1BatchNumber": 273767n, "logIndex": 7, @@ -304,6 +312,7 @@ test('chain w/ custom block type', async () => { "address": "0x042b8289c97896529ec2fe49ba1a8b9c956a86cc", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000d400000000000022d300a554de43b6ba21a5553697a2b78338e046dd7e0278009e921b486cc33580af7d8208df1619383470d5dcbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000014e665ced18b0998ede7236da308e311e9261dc984000000000000000000000000000000000000000000000000", "l1BatchNumber": 273767n, "logIndex": 8, @@ -320,6 +329,7 @@ test('chain w/ custom block type', async () => { "address": "0x54de43b6ba21a5553697a2b78338e046dd7e0278", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000014e665ced18b0998ede7236da308e311e9261dc984000000000000000000000000", "l1BatchNumber": 273767n, "logIndex": 9, @@ -338,6 +348,7 @@ test('chain w/ custom block type', async () => { "address": "0x000000000000000000000000000000000000800a", "blockHash": "0xc621ee95e2d4ab65ecf499805dba770b20297c64029816b18c618fc49fe3d748", "blockNumber": 16628100n, + "blockTimestamp": "0x652ec6f8", "data": "0x000000000000000000000000000000000000000000000000000115d39774af00", "l1BatchNumber": 273767n, "logIndex": 10, diff --git a/src/zksync/formatters.test.ts b/src/zksync/formatters.test.ts index 7fd46bdedd..7675693589 100644 --- a/src/zksync/formatters.test.ts +++ b/src/zksync/formatters.test.ts @@ -1215,6 +1215,7 @@ describe('transaction receipt', () => { "address": "0x11f943b2c77b743ab90f4a0ae7d5a4e7fca3e102", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x", "l1BatchNumber": 1n, "logIndex": 14, @@ -1232,6 +1233,7 @@ describe('transaction receipt', () => { "address": "0x9c931462ac1bf8b47a727aaad7776405ac894482", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "l1BatchNumber": 1n, "logIndex": 15, @@ -1248,6 +1250,7 @@ describe('transaction receipt', () => { "address": "0x0000000000000000000000000000000000008006", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x", "l1BatchNumber": 1n, "logIndex": 16, @@ -1267,6 +1270,7 @@ describe('transaction receipt', () => { "address": "0x1eb710030273e529a6ad7e1e14d4e601765ba3c6", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x", "l1BatchNumber": 1n, "logIndex": 17, @@ -1285,6 +1289,7 @@ describe('transaction receipt', () => { "address": "0x0000000000000000000000000000000000008006", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x", "l1BatchNumber": 1n, "logIndex": 18, @@ -1304,6 +1309,7 @@ describe('transaction receipt', () => { "address": "0x1eb710030273e529a6ad7e1e14d4e601765ba3c6", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x", "l1BatchNumber": 1n, "logIndex": 19, @@ -1322,6 +1328,7 @@ describe('transaction receipt', () => { "address": "0x11f943b2c77b743ab90f4a0ae7d5a4e7fca3e102", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "l1BatchNumber": 1n, "logIndex": 20, @@ -1338,6 +1345,7 @@ describe('transaction receipt', () => { "address": "0x11f943b2c77b743ab90f4a0ae7d5a4e7fca3e102", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029df43f75149d0552475a6f9b2ac96e28796ed0b", "l1BatchNumber": 1n, "logIndex": 21, @@ -1354,6 +1362,7 @@ describe('transaction receipt', () => { "address": "0x0000000000000000000000000000000000008006", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x", "l1BatchNumber": 1n, "logIndex": 22, @@ -1373,6 +1382,7 @@ describe('transaction receipt', () => { "address": "0x000000000000000000000000000000000000800a", "blockHash": "0x51f81bcdfc324a0dff2b5bec9d92e21cbebc4d5e29d3a3d30de3e03fbeab8d7f", "blockNumber": 1n, + "blockTimestamp": "0x63eb991e", "data": "0x0000000000000000000000000000000000000000000000000000000000000000", "l1BatchNumber": 1n, "logIndex": 23, From ef3601d1db04e41c993943c0cfc72d3a64bbb6db Mon Sep 17 00:00:00 2001 From: Billal Fauzan <71764176+billalxcode@users.noreply.github.com> Date: Sat, 13 Jul 2024 15:27:59 +0700 Subject: [PATCH 34/68] feat(chains): add DreyerX Testnet (#2493) * feat(dreyerx): add dreyerx testnet * feat(dreyerx): add dreyerx mainnet to defined chain * feat(dreyerx): add changeset * Update dreyerxTestnet.ts --------- Co-authored-by: jxom --- .changeset/nervous-dots-hug.md | 5 +++++ src/chains/definitions/dreyerxTestnet.ts | 23 +++++++++++++++++++++++ src/chains/index.ts | 1 + 3 files changed, 29 insertions(+) create mode 100644 .changeset/nervous-dots-hug.md create mode 100644 src/chains/definitions/dreyerxTestnet.ts diff --git a/.changeset/nervous-dots-hug.md b/.changeset/nervous-dots-hug.md new file mode 100644 index 0000000000..ba0d5a1e7a --- /dev/null +++ b/.changeset/nervous-dots-hug.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added DreyerX Testnet chain diff --git a/src/chains/definitions/dreyerxTestnet.ts b/src/chains/definitions/dreyerxTestnet.ts new file mode 100644 index 0000000000..237ded3172 --- /dev/null +++ b/src/chains/definitions/dreyerxTestnet.ts @@ -0,0 +1,23 @@ +import { defineChain } from '../utils.js' + +export const dreyerxTestnet = /*#__PURE__*/ defineChain({ + id: 23452, + name: 'DreyerX Testnet', + nativeCurrency: { + name: 'DreyerX', + symbol: 'DRX', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['http://testnet-rpc.dreyerx.com'], + }, + }, + blockExplorers: { + default: { + name: 'DreyerX Testnet Scan', + url: 'https://testnet-scan.dreyerx.com', + }, + }, + testnet: true, +}) diff --git a/src/chains/index.ts b/src/chains/index.ts index c4b7545da6..cbef9b44c8 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -73,6 +73,7 @@ export { dfk } from './definitions/dfk.js' export { dodochainTestnet } from './definitions/dodochainTestnet.js' export { dogechain } from './definitions/dogechain.js' export { dreyerxMainnet } from './definitions/dreyerxMainnet.js' +export { dreyerxTestnet } from './definitions/dreyerxTestnet.js' export { edgeless } from './definitions/edgeless.js' export { edgelessTestnet } from './definitions/edgelessTestnet.js' export { edgeware } from './definitions/edgeware.js' From 8555fd09bba6de0523e712271cde3ba175581982 Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 14 Jul 2024 19:42:52 +1000 Subject: [PATCH 35/68] ci: size --- .github/workflows/verify.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 2dd59f2fee..10c0f6ba6c 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -55,6 +55,9 @@ jobs: - name: Check for unused files, dependencies, and exports run: pnpm knip --production + + - name: Check size + run: pnpm size types: name: Types From 69f8a3dba66be3bf7c0dea20493510fe0c73c5ea Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 14 Jul 2024 19:52:02 +1000 Subject: [PATCH 36/68] chore: modify size-limit config --- package.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 8edc9f78cb..61e8da5eca 100644 --- a/package.json +++ b/package.json @@ -106,86 +106,86 @@ }, "size-limit": [ { - "name": "viem (esm)", + "name": "import * from 'viem' (esm)", "path": "./src/_esm/index.js", - "limit": "60.5 kB", + "limit": "61 kB", "import": "*" }, { - "name": "viem (cjs)", + "name": "const viem = require('viem') (cjs)", "path": "./src/_cjs/index.js", "limit": "78 kB" }, { - "name": "viem (minimal surface - tree-shaking)", + "name": "import { createClient, http } from 'viem'", "path": "./src/_esm/index.js", "limit": "6.3 kB", "import": "{ createClient, http }" }, { - "name": "viem/accounts", + "name": "import * from 'viem/accounts'", "path": "./src/_esm/accounts/index.js", "limit": "92 kB", "import": "*" }, { - "name": "viem/accounts (tree-shaking)", + "name": "import { privateKeyToAccount } from 'viem/accounts'", "path": "./src/_esm/accounts/index.js", "limit": "20 kB", "import": "{ privateKeyToAccount }" }, { - "name": "viem/actions", - "path": "./src/_esm/ens/index.js", + "name": "import * from 'viem/actions'", + "path": "./src/_esm/actions/index.js", "limit": "46.5 kB", "import": "*" }, { - "name": "viem/actions (tree-shaking)", + "name": "import { getBlockNumber } from 'viem/actions'", "path": "./src/_esm/actions/index.js", "limit": "1 kB", "import": "{ getBlockNumber }" }, { - "name": "viem/chains", + "name": "import * from 'viem/chains'", "path": "./src/_esm/chains/index.js", - "limit": "30 kB", + "limit": "31 kB", "import": "*" }, { - "name": "viem/chains (tree-shaking)", + "name": "import { mainnet } from 'viem/chains'", "path": "./src/_esm/chains/index.js", "limit": "500 B", "import": "{ mainnet }" }, { - "name": "viem/chains/utils", + "name": "import * from 'viem/chains/utils'", "path": "./src/_esm/chains/utils.js", "limit": "8 kB", "import": "*" }, { - "name": "viem/ens", + "name": "import * from 'viem/ens'", "path": "./src/_esm/ens/index.js", "limit": "46.5 kB", "import": "*" }, { - "name": "viem/ens (tree-shaking)", + "name": "import { getEnsAvatar } from 'viem/ens'", "path": "./src/_esm/ens/index.js", "limit": "22.6 kB", "import": "{ getEnsAvatar }" }, { - "name": "viem/siwe", + "name": "import * from 'viem/siwe'", "path": "./src/_esm/siwe/index.js", - "limit": "30.7 kB", + "limit": "32 kB", "import": "*" }, { - "name": "viem/siwe (tree-shaking)", + "name": "import { verifySiweMessage } from 'viem/siwe'", "path": "./src/_esm/siwe/index.js", - "limit": "29.6 kB", + "limit": "30 kB", "import": "{ verifySiweMessage }" } ] From 027c8fe8998c48c170f310a9f292afe0cbfa6c38 Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 14 Jul 2024 20:10:43 +1000 Subject: [PATCH 37/68] ci: fix foundry version --- .github/actions/install-dependencies/action.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index cd46d15200..9ca0b87624 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -6,7 +6,8 @@ runs: steps: - name: Set up foundry uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly-72e44fb87c38b2acfa2b0b136fc1bc833f71e674 - name: Set up pnpm uses: wevm/actions/.github/actions/pnpm@main - From f43388495e6f87147108ea101b6083213c5699c0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 05:40:15 +1000 Subject: [PATCH 38/68] chore: version package (#2495) Co-authored-by: github-actions[bot] --- .changeset/nervous-dots-hug.md | 5 ----- pnpm-lock.yaml | 41 +++++++++++++++++----------------- src/CHANGELOG.md | 6 +++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 6 files changed, 30 insertions(+), 28 deletions(-) delete mode 100644 .changeset/nervous-dots-hug.md diff --git a/.changeset/nervous-dots-hug.md b/.changeset/nervous-dots-hug.md deleted file mode 100644 index ba0d5a1e7a..0000000000 --- a/.changeset/nervous-dots-hug.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added DreyerX Testnet chain diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c992df2da9..cd555ce411 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.2(typescript@5.4.2)(zod@3.22.4) + version: 2.17.3(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -2743,6 +2743,7 @@ packages: bun@1.1.12: resolution: {integrity: sha512-NZzeZuZk7VwCs8VAXnXUHCPOlTS/IyHCscChtT1M1FLSwhBcVMsGVStYlXaaoqsinBKgp0CGJdhnJw2gR3NkDw==} + cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true @@ -6006,8 +6007,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.17.2: - resolution: {integrity: sha512-76BMUK5nenFX8klvQrS4srHN1aa+j1/Z8PajQFCOZHy1UjfCtsFs7W1VSw58uB530COxswbtnEv2NvNVVxKrag==} + viem@2.17.3: + resolution: {integrity: sha512-FY/1uBQWfko4Esy8mU1RamvL64TLy91LZwFyQJ20E6AI3vTTEOctWfSn0pkMKa3okq4Gxs5dJE7q1hmWOQ7xcw==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -12711,7 +12712,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.17.2(typescript@5.4.2)(zod@3.22.4): + viem@2.17.3(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index f3e9de605e..173959e2b7 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,11 @@ # viem +## 2.17.4 + +### Patch Changes + +- [#2493](https://github.com/wevm/viem/pull/2493) [`ef3601d`](https://github.com/wevm/viem/commit/ef3601d1db04e41c993943c0cfc72d3a64bbb6db) Thanks [@billalxcode](https://github.com/billalxcode)! - Added DreyerX Testnet chain + ## 2.17.3 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index 6f4070650a..f99e14364b 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.3' +export const version = '2.17.4' diff --git a/src/jsr.json b/src/jsr.json index f415814fc0..04b9feb13f 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.3", + "version": "2.17.4", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index 316b33ddcc..080f88e43b 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.3", + "version": "2.17.4", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From f6d60054bdcf8ada44c8af46b66eda50b05dd08b Mon Sep 17 00:00:00 2001 From: Luca Donno <30298476+lucadonnoh@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:54:46 +0200 Subject: [PATCH 39/68] feat(chains): add Mode Testnet contracts (#2500) * feat(chains): Add Mode Testnet contracts * Update modeTestnet.ts * Create old-pans-tickle.md --------- Co-authored-by: jxom --- .changeset/old-pans-tickle.md | 5 +++++ src/chains/definitions/modeTestnet.ts | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 .changeset/old-pans-tickle.md diff --git a/.changeset/old-pans-tickle.md b/.changeset/old-pans-tickle.md new file mode 100644 index 0000000000..c1691fa1b5 --- /dev/null +++ b/.changeset/old-pans-tickle.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added OP Stack contract addresses for Mode Testnet chain. diff --git a/src/chains/definitions/modeTestnet.ts b/src/chains/definitions/modeTestnet.ts index f13765cf83..e2e21394e8 100644 --- a/src/chains/definitions/modeTestnet.ts +++ b/src/chains/definitions/modeTestnet.ts @@ -1,8 +1,10 @@ +import { chainConfig } from '../../op-stack/chainConfig.js' import { defineChain } from '../../utils/chain/defineChain.js' const sourceId = 11_155_111 // sepolia export const modeTestnet = /*#__PURE__*/ defineChain({ + ...chainConfig, id: 919, name: 'Mode Testnet', nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 }, @@ -19,6 +21,25 @@ export const modeTestnet = /*#__PURE__*/ defineChain({ }, }, contracts: { + ...chainConfig.contracts, + l2OutputOracle: { + [sourceId]: { + address: '0x2634BD65ba27AB63811c74A63118ACb312701Bfa', + blockCreated: 3778393 + } + }, + portal: { + [sourceId]: { + address: '0x320e1580effF37E008F1C92700d1eBa47c1B23fD', + blockCreated: 3778395 + } + }, + l1StandardBridge: { + [sourceId]: { + address: '0xbC5C679879B2965296756CD959C3C739769995E2', + blockCreated: 3778392 + } + }, multicall3: { address: '0xBAba8373113Fb7a68f195deF18732e01aF8eDfCF', blockCreated: 3019007, From 8d27baf268d086fda0f05120290bcbfd80ec38d8 Mon Sep 17 00:00:00 2001 From: jxom Date: Wed, 17 Jul 2024 20:55:33 +0000 Subject: [PATCH 40/68] chore: format --- src/chains/definitions/modeTestnet.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/chains/definitions/modeTestnet.ts b/src/chains/definitions/modeTestnet.ts index e2e21394e8..ccd3e49d39 100644 --- a/src/chains/definitions/modeTestnet.ts +++ b/src/chains/definitions/modeTestnet.ts @@ -25,20 +25,20 @@ export const modeTestnet = /*#__PURE__*/ defineChain({ l2OutputOracle: { [sourceId]: { address: '0x2634BD65ba27AB63811c74A63118ACb312701Bfa', - blockCreated: 3778393 - } + blockCreated: 3778393, + }, }, portal: { [sourceId]: { address: '0x320e1580effF37E008F1C92700d1eBa47c1B23fD', - blockCreated: 3778395 - } + blockCreated: 3778395, + }, }, l1StandardBridge: { [sourceId]: { address: '0xbC5C679879B2965296756CD959C3C739769995E2', - blockCreated: 3778392 - } + blockCreated: 3778392, + }, }, multicall3: { address: '0xBAba8373113Fb7a68f195deF18732e01aF8eDfCF', From 3dbd44cb46d65bee10d2e3fb01b7f7d3e19a1fb2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 07:10:40 +1000 Subject: [PATCH 41/68] chore: version package (#2502) Co-authored-by: github-actions[bot] --- .changeset/old-pans-tickle.md | 5 --- pnpm-lock.yaml | 76 +++++++++++++++++------------------ src/CHANGELOG.md | 6 +++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 6 files changed, 47 insertions(+), 46 deletions(-) delete mode 100644 .changeset/old-pans-tickle.md diff --git a/.changeset/old-pans-tickle.md b/.changeset/old-pans-tickle.md deleted file mode 100644 index c1691fa1b5..0000000000 --- a/.changeset/old-pans-tickle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added OP Stack contract addresses for Mode Testnet chain. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd555ce411..281d281bd4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.3(typescript@5.4.2)(zod@3.22.4) + version: 2.17.4(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -566,6 +566,12 @@ packages: resolution: {integrity: sha512-FYp6GBAgsNz81BkfItRz8RLZO03w5+BaeiPma1uCfmxTnxbtuMrI/dbzGiOk8VghO108uFI0oJo0OkewdSHw7g==} engines: {node: '>=18'} + '@ark/schema@0.2.0': + resolution: {integrity: sha512-IkNWCSHdjaoemMXpps4uFHEAQzwJPbTAS8K2vcQpk90sa+eNBuPSVyB/81/Qyl1VYW0iX3ceGC5NL/OznQv1jg==} + + '@ark/util@0.1.0': + resolution: {integrity: sha512-qCLYICQoCy3kEKDVwirQp8qvxhY7NJd8BhhoHaj1l3wCFAk9NUbcDsxAkPStZEMdPI/d7NcbGJe8SWZuRG2twQ==} + '@arktype/attest@0.8.0': resolution: {integrity: sha512-wxQ8PdXSrlQyHzlQeXiMMARumAS4whpuvvqV+DWWDECAhrsyhV0yixAavapz1X7qu8253cCiF6h/dabpGYAtpw==} hasBin: true @@ -575,15 +581,9 @@ packages: '@arktype/fs@0.0.20': resolution: {integrity: sha512-WnoIFrhiDKnWixd7xmcvFTlP7ZVReT7j37nTbCpieUCsVaUldb38pgQjxdvlJN40UL3kkjxyiYIRmc7BOvgy1A==} - '@arktype/schema@0.1.22': - resolution: {integrity: sha512-3HAf9EcIgu/H9IIOtfY2yH1exuF5b7z3GmMrPuI9xhC0OwKw5DK/57MNGSxbx9JMw51RLxL/fcEOnyNiXEDT+g==} - '@arktype/util@0.0.49': resolution: {integrity: sha512-ptlPUDZ8EECx23S7OjQnMulUSt8lmhxq5pQXmiyMlVt9g9EhUOVpdFrNqSCntFURtennxwFDJaYa+7rKQrGrew==} - '@arktype/util@0.0.51': - resolution: {integrity: sha512-lukmZcbSVI27ZJ4uJA7ztCKM5OligUfdTrr0E6k+F0tzz9iSEcplS0KZbVD2WfrLL3HXNKBE6g/w3nhYMAMoqw==} - '@babel/code-frame@7.24.6': resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} @@ -2600,8 +2600,8 @@ packages: arity-n@1.0.4: resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} - arktype@2.0.0-dev.29: - resolution: {integrity: sha512-SJluMYDyaGOYUntlG0rxd8ErRdTGceUb6Svsf5u1aAzSurwsh6my9ktkHA99wtJGmz/CbTv9T7OOan3cUppzUQ==} + arktype@2.0.0-beta.0: + resolution: {integrity: sha512-fE3ssMiXjr/bLqFPzlDhRlXngdyHQreu7p7i8+dtcY1CA+f8WrVUcue6JxywhnqEJXPG4HOcIwQcC+q4VfeUMQ==} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} @@ -6007,8 +6007,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.17.3: - resolution: {integrity: sha512-FY/1uBQWfko4Esy8mU1RamvL64TLy91LZwFyQJ20E6AI3vTTEOctWfSn0pkMKa3okq4Gxs5dJE7q1hmWOQ7xcw==} + viem@2.17.4: + resolution: {integrity: sha512-6gmBB85I7z1qt/+yPPS+i4L2jNPJqCs+SEb+26WnKVYez13svSzjYMsU9OYYlPFpQmpGSy9dV2bKW6VX68FTgg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -6352,27 +6352,27 @@ snapshots: typescript: 5.3.3 validate-npm-package-name: 5.0.1 + '@ark/schema@0.2.0': + dependencies: + '@ark/util': 0.1.0 + + '@ark/util@0.1.0': {} + '@arktype/attest@0.8.0(typescript@5.5.2)': dependencies: '@arktype/fs': 0.0.20 '@arktype/util': 0.0.49 '@typescript/analyze-trace': 0.10.1 '@typescript/vfs': 1.5.3(typescript@5.5.2) - arktype: 2.0.0-dev.29 + arktype: 2.0.0-beta.0 typescript: 5.5.2 transitivePeerDependencies: - supports-color '@arktype/fs@0.0.20': {} - '@arktype/schema@0.1.22': - dependencies: - '@arktype/util': 0.0.51 - '@arktype/util@0.0.49': {} - '@arktype/util@0.0.51': {} - '@babel/code-frame@7.24.6': dependencies: '@babel/highlight': 7.24.6 @@ -8739,10 +8739,10 @@ snapshots: arity-n@1.0.4: {} - arktype@2.0.0-dev.29: + arktype@2.0.0-beta.0: dependencies: - '@arktype/schema': 0.1.22 - '@arktype/util': 0.0.51 + '@ark/schema': 0.2.0 + '@ark/util': 0.1.0 array-buffer-byte-length@1.0.1: dependencies: @@ -12712,7 +12712,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.17.3(typescript@5.4.2)(zod@3.22.4): + viem@2.17.4(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 173959e2b7..f7572340cd 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,11 @@ # viem +## 2.17.5 + +### Patch Changes + +- [#2500](https://github.com/wevm/viem/pull/2500) [`f6d60054`](https://github.com/wevm/viem/commit/f6d60054bdcf8ada44c8af46b66eda50b05dd08b) Thanks [@lucadonnoh](https://github.com/lucadonnoh)! - Added OP Stack contract addresses for Mode Testnet chain. + ## 2.17.4 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index f99e14364b..ffda9869dc 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.4' +export const version = '2.17.5' diff --git a/src/jsr.json b/src/jsr.json index 04b9feb13f..db58062124 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.4", + "version": "2.17.5", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index 080f88e43b..d51e176090 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.4", + "version": "2.17.5", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 759e34dde23ca50275d9e4df38805e8f0b285753 Mon Sep 17 00:00:00 2001 From: jxom Date: Thu, 18 Jul 2024 17:40:24 +1000 Subject: [PATCH 42/68] fix: enforce `r` + `s` hex values to be padded to 32 bytes --- .changeset/mighty-clouds-remember.md | 5 +++++ src/accounts/utils/sign.ts | 6 +++--- src/utils/transaction/serializeTransaction.ts | 7 +++++-- 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 .changeset/mighty-clouds-remember.md diff --git a/.changeset/mighty-clouds-remember.md b/.changeset/mighty-clouds-remember.md new file mode 100644 index 0000000000..24af86d12c --- /dev/null +++ b/.changeset/mighty-clouds-remember.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Enforced `r` and `s` hex values on `Signature` to be always padded to 32 bytes. diff --git a/src/accounts/utils/sign.ts b/src/accounts/utils/sign.ts index d5d26a5582..a4a6bba9fd 100644 --- a/src/accounts/utils/sign.ts +++ b/src/accounts/utils/sign.ts @@ -4,7 +4,7 @@ import { secp256k1 } from '@noble/curves/secp256k1' import type { ErrorType } from '../../errors/utils.js' import type { Hex, Signature } from '../../types/misc.js' -import { type ToHexErrorType, toHex } from '../../utils/encoding/toHex.js' +import { type ToHexErrorType, numberToHex } from '../../utils/encoding/toHex.js' export type SignParameters = { hash: Hex @@ -29,8 +29,8 @@ export async function sign({ }: SignParameters): Promise { const { r, s, recovery } = secp256k1.sign(hash.slice(2), privateKey.slice(2)) return { - r: toHex(r), - s: toHex(s), + r: numberToHex(r, { size: 32 }), + s: numberToHex(s, { size: 32 }), v: recovery ? 28n : 27n, yParity: recovery, } diff --git a/src/utils/transaction/serializeTransaction.ts b/src/utils/transaction/serializeTransaction.ts index 3c54515697..5fcbedd425 100644 --- a/src/utils/transaction/serializeTransaction.ts +++ b/src/utils/transaction/serializeTransaction.ts @@ -350,11 +350,14 @@ function serializeTransactionLegacy( return v })() + const r = trim(signature.r) + const s = trim(signature.s) + serializedTransaction = [ ...serializedTransaction, toHex(v), - signature.r, - signature.s, + r === '0x00' ? '0x' : r, + s === '0x00' ? '0x' : s, ] } else if (chainId > 0) { serializedTransaction = [ From 8a2a98de76dace97bb46a232b898e2229bdadbf9 Mon Sep 17 00:00:00 2001 From: Jay Date: Thu, 18 Jul 2024 18:10:40 +0800 Subject: [PATCH 43/68] chore: update explorer of Darwinia (#2504) --- src/chains/definitions/darwinia.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chains/definitions/darwinia.ts b/src/chains/definitions/darwinia.ts index 532cac7e3c..fb17a8bb98 100644 --- a/src/chains/definitions/darwinia.ts +++ b/src/chains/definitions/darwinia.ts @@ -15,7 +15,7 @@ export const darwinia = /*#__PURE__*/ defineChain({ }, }, blockExplorers: { - default: { name: 'Explorer', url: 'https://darwinia.subscan.io' }, + default: { name: 'Explorer', url: 'https://explorer.darwinia.network' }, }, contracts: { multicall3: { From aa42f47fe8b5ce19858e5855ecdceae7000dbb92 Mon Sep 17 00:00:00 2001 From: jxom Date: Thu, 18 Jul 2024 20:11:28 +1000 Subject: [PATCH 44/68] chore: changeset --- .changeset/eighty-socks-jump.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/eighty-socks-jump.md diff --git a/.changeset/eighty-socks-jump.md b/.changeset/eighty-socks-jump.md new file mode 100644 index 0000000000..d5e766f9c3 --- /dev/null +++ b/.changeset/eighty-socks-jump.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Updated Darwinia chain explorer URL. From 9ea8cd9aca29edee6737069a6a80159f75caa4c5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 05:36:45 +1000 Subject: [PATCH 45/68] Version Packages (#2503) Co-authored-by: github-actions[bot] --- .changeset/eighty-socks-jump.md | 5 ---- .changeset/mighty-clouds-remember.md | 5 ---- pnpm-lock.yaml | 41 ++++++++++++++-------------- src/CHANGELOG.md | 8 ++++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 7 files changed, 32 insertions(+), 33 deletions(-) delete mode 100644 .changeset/eighty-socks-jump.md delete mode 100644 .changeset/mighty-clouds-remember.md diff --git a/.changeset/eighty-socks-jump.md b/.changeset/eighty-socks-jump.md deleted file mode 100644 index d5e766f9c3..0000000000 --- a/.changeset/eighty-socks-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Updated Darwinia chain explorer URL. diff --git a/.changeset/mighty-clouds-remember.md b/.changeset/mighty-clouds-remember.md deleted file mode 100644 index 24af86d12c..0000000000 --- a/.changeset/mighty-clouds-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Enforced `r` and `s` hex values on `Signature` to be always padded to 32 bytes. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 281d281bd4..3f4b749a18 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.4(typescript@5.4.2)(zod@3.22.4) + version: 2.17.5(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -2419,6 +2419,7 @@ packages: '@walletconnect/sign-client@2.10.0': resolution: {integrity: sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw==} + deprecated: Reliability and performance greatly improved - please see https://github.com/WalletConnect/walletconnect-monorepo/releases '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} @@ -6007,8 +6008,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.17.4: - resolution: {integrity: sha512-6gmBB85I7z1qt/+yPPS+i4L2jNPJqCs+SEb+26WnKVYez13svSzjYMsU9OYYlPFpQmpGSy9dV2bKW6VX68FTgg==} + viem@2.17.5: + resolution: {integrity: sha512-m0QIKQF1uqTFWAYNeAdhNUBFMaIs0Mwhu2VmZuXmBMkzJ0IL0ViblLH13JRwbDnOaY82KYzNhCARmfnLBWVdkA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -12712,7 +12713,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.17.4(typescript@5.4.2)(zod@3.22.4): + viem@2.17.5(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index f7572340cd..5e507efede 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,13 @@ # viem +## 2.17.6 + +### Patch Changes + +- [`aa42f47`](https://github.com/wevm/viem/commit/aa42f47fe8b5ce19858e5855ecdceae7000dbb92) Thanks [@jxom](https://github.com/jxom)! - Updated Darwinia chain explorer URL. + +- [`759e34d`](https://github.com/wevm/viem/commit/759e34dde23ca50275d9e4df38805e8f0b285753) Thanks [@jxom](https://github.com/jxom)! - Enforced `r` and `s` hex values on `Signature` to be always padded to 32 bytes. + ## 2.17.5 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index ffda9869dc..9383b0523a 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.5' +export const version = '2.17.6' diff --git a/src/jsr.json b/src/jsr.json index db58062124..b9ce1e77da 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.5", + "version": "2.17.6", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index d51e176090..fe3d8dab88 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.5", + "version": "2.17.6", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 7d3d505221d4bb2ccc002be1cddc9e2011e33c01 Mon Sep 17 00:00:00 2001 From: jxom Date: Fri, 19 Jul 2024 06:10:22 +1000 Subject: [PATCH 46/68] feat: allow Content-Type override --- .changeset/clean-lions-press.md | 5 +++++ src/utils/rpc/http.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/clean-lions-press.md diff --git a/.changeset/clean-lions-press.md b/.changeset/clean-lions-press.md new file mode 100644 index 0000000000..3aaa732caf --- /dev/null +++ b/.changeset/clean-lions-press.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Allow override of `Content-Type` header on `http` transport. diff --git a/src/utils/rpc/http.ts b/src/utils/rpc/http.ts index 6c1f414129..14a15e4657 100644 --- a/src/utils/rpc/http.ts +++ b/src/utils/rpc/http.ts @@ -94,8 +94,8 @@ export function getHttpRpcClient( ...body, }), headers: { - ...headers, 'Content-Type': 'application/json', + ...headers, }, method: method || 'POST', signal: signal_ || (timeout > 0 ? signal : null), From 168ff2da6d0d5410a0815d19231b2bc1ada5391c Mon Sep 17 00:00:00 2001 From: jxom Date: Fri, 19 Jul 2024 06:16:08 +1000 Subject: [PATCH 47/68] chore: bump size --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 61e8da5eca..994fb80801 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ { "name": "import { createClient, http } from 'viem'", "path": "./src/_esm/index.js", - "limit": "6.3 kB", + "limit": "6.4 kB", "import": "{ createClient, http }" }, { From 36ce1a1321f990e7b1d995079bb187fafe87e866 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 06:29:49 +1000 Subject: [PATCH 48/68] chore: version package (#2506) Co-authored-by: github-actions[bot] --- .changeset/clean-lions-press.md | 5 ----- src/CHANGELOG.md | 6 ++++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) delete mode 100644 .changeset/clean-lions-press.md diff --git a/.changeset/clean-lions-press.md b/.changeset/clean-lions-press.md deleted file mode 100644 index 3aaa732caf..0000000000 --- a/.changeset/clean-lions-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Allow override of `Content-Type` header on `http` transport. diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 5e507efede..d5aec8170b 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,11 @@ # viem +## 2.17.7 + +### Patch Changes + +- [`7d3d505`](https://github.com/wevm/viem/commit/7d3d505221d4bb2ccc002be1cddc9e2011e33c01) Thanks [@jxom](https://github.com/jxom)! - Allow override of `Content-Type` header on `http` transport. + ## 2.17.6 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index 9383b0523a..48bc5774d8 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.6' +export const version = '2.17.7' diff --git a/src/jsr.json b/src/jsr.json index b9ce1e77da..0f7440d9f4 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.6", + "version": "2.17.7", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index fe3d8dab88..3a33af9e36 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.6", + "version": "2.17.7", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 54cfde73a7522333fd9445b6c73b0ba84eaa0543 Mon Sep 17 00:00:00 2001 From: TurbanCoder <51452848+Harman-singh-waraich@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:13:10 +0530 Subject: [PATCH 49/68] fix(docs): fix expirationTime pointing to localhost (#2508) fix: update expirationTime pointing to localhost `expirationTime` under verifySiweMessage => time, pointing to localhost --- site/pages/docs/siwe/actions/verifySiweMessage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/pages/docs/siwe/actions/verifySiweMessage.md b/site/pages/docs/siwe/actions/verifySiweMessage.md index 2bbdb5ce58..a916697389 100644 --- a/site/pages/docs/siwe/actions/verifySiweMessage.md +++ b/site/pages/docs/siwe/actions/verifySiweMessage.md @@ -229,7 +229,7 @@ const valid = await publicClient.verifySiweMessage({ - **Type:** `Date` - **Default:** `new Date()` -Current time to check optional [`expirationTime`](http://localhost:5173/docs/siwe/utilities/createSiweMessage#expirationtime-optional) and [`notBefore`](/docs/siwe/utilities/createSiweMessage#notbefore-optional) message fields. +Current time to check optional [`expirationTime`](/docs/siwe/utilities/createSiweMessage#expirationtime-optional) and [`notBefore`](/docs/siwe/utilities/createSiweMessage#notbefore-optional) message fields. ```ts twoslash // [!include ~/snippets/publicClient.ts] From 690cb9a78a801edf7ea3ab1d8cf1a0cd794fc32a Mon Sep 17 00:00:00 2001 From: jxom Date: Sat, 20 Jul 2024 21:25:42 +1000 Subject: [PATCH 50/68] chore: export types for inference --- .changeset/gorgeous-zebras-sin.md | 5 +++++ src/chains/index.ts | 7 +++++++ src/index.ts | 1 + 3 files changed, 13 insertions(+) create mode 100644 .changeset/gorgeous-zebras-sin.md diff --git a/.changeset/gorgeous-zebras-sin.md b/.changeset/gorgeous-zebras-sin.md new file mode 100644 index 0000000000..66b8b65c4a --- /dev/null +++ b/.changeset/gorgeous-zebras-sin.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Exported types required for inference. diff --git a/src/chains/index.ts b/src/chains/index.ts index cbef9b44c8..b27f55b4d3 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -321,6 +321,13 @@ export type { Prettify, UnionLooseOmit, } from '../types/utils.js' +export type { + SerializeTransactionCIP64ReturnType, + assertTransactionCIP42 as assertTransactionCIP42Celo, + assertTransactionCIP64 as assertTransactionCIP64Celo, + serializeTransaction as serializeTransactionCelo, + serializers as serializersCelo, +} from '../celo/serializers.js' export type { CeloBlock, CeloRpcBlock, diff --git a/src/index.ts b/src/index.ts index 91dbed5b11..cadf7aa851 100644 --- a/src/index.ts +++ b/src/index.ts @@ -961,6 +961,7 @@ export type { TransactionSerializedLegacy, TransactionType, TransactionRequestEIP4844, + TransactionRequestGeneric, } from './types/transaction.js' export type { ExactPartial, From 1a36baa42d6d97bf2d71c1afd2e5b64aca7d6d01 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 20 Jul 2024 21:27:14 +1000 Subject: [PATCH 51/68] chore: version package (#2509) Co-authored-by: github-actions[bot] --- .changeset/gorgeous-zebras-sin.md | 5 ---- pnpm-lock.yaml | 40 +++++++++++++++---------------- src/CHANGELOG.md | 6 +++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 6 files changed, 29 insertions(+), 28 deletions(-) delete mode 100644 .changeset/gorgeous-zebras-sin.md diff --git a/.changeset/gorgeous-zebras-sin.md b/.changeset/gorgeous-zebras-sin.md deleted file mode 100644 index 66b8b65c4a..0000000000 --- a/.changeset/gorgeous-zebras-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Exported types required for inference. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f4b749a18..67ae661df3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.5(typescript@5.4.2)(zod@3.22.4) + version: 2.17.7(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -6008,8 +6008,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.17.5: - resolution: {integrity: sha512-m0QIKQF1uqTFWAYNeAdhNUBFMaIs0Mwhu2VmZuXmBMkzJ0IL0ViblLH13JRwbDnOaY82KYzNhCARmfnLBWVdkA==} + viem@2.17.7: + resolution: {integrity: sha512-RFaugldAVJYBV+qh7bAgvnbjS6VxSZ0M+xtdw5OuM2Kq9inEuWoxKWOs1/Iej7g8y9kwaZ4PUA1QedxeKNNe0A==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -12713,7 +12713,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.17.5(typescript@5.4.2)(zod@3.22.4): + viem@2.17.7(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index d5aec8170b..2e1b907d3c 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,11 @@ # viem +## 2.17.8 + +### Patch Changes + +- [`690cb9a7`](https://github.com/wevm/viem/commit/690cb9a78a801edf7ea3ab1d8cf1a0cd794fc32a) Thanks [@jxom](https://github.com/jxom)! - Exported types required for inference. + ## 2.17.7 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index 48bc5774d8..8f2f922923 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.7' +export const version = '2.17.8' diff --git a/src/jsr.json b/src/jsr.json index 0f7440d9f4..a929db2a05 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.7", + "version": "2.17.8", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index 3a33af9e36..636bec2acb 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.7", + "version": "2.17.8", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 2c05e4da77bc9891c101c6e6381289c781744ece Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 21 Jul 2024 18:16:42 +1000 Subject: [PATCH 52/68] chore: tweak multicall test --- src/actions/public/multicall.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/actions/public/multicall.test.ts b/src/actions/public/multicall.test.ts index 46185a6a0c..dde5bd8897 100644 --- a/src/actions/public/multicall.test.ts +++ b/src/actions/public/multicall.test.ts @@ -585,7 +585,6 @@ describe('errors', async () => { expect( await multicall(client, { - blockNumber: anvilMainnet.forkBlockNumber, contracts: [ { ...usdcContractConfig, @@ -954,7 +953,6 @@ describe('errors', async () => { await expect(() => multicall(client, { allowFailure: false, - blockNumber: anvilMainnet.forkBlockNumber, contracts: [ { ...usdcContractConfig, @@ -1188,7 +1186,6 @@ describe('GitHub repros', () => { expect( await multicall(client, { allowFailure: false, - blockNumber: anvilMainnet.forkBlockNumber, contracts: [ { abi: GH434.abi, From e949862e0f5e0534f67907ab8676f219a4d7f9ad Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 21 Jul 2024 18:22:09 +1000 Subject: [PATCH 53/68] chore: up foundry --- .github/actions/install-dependencies/action.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index 9ca0b87624..38070f3164 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -6,8 +6,6 @@ runs: steps: - name: Set up foundry uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly-72e44fb87c38b2acfa2b0b136fc1bc833f71e674 - name: Set up pnpm uses: wevm/actions/.github/actions/pnpm@main From 3edd8bd656a952cb415f3c4dac6022b1594a88ab Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 21 Jul 2024 18:38:59 +1000 Subject: [PATCH 54/68] chore: tweak estimateGas blobs test --- src/actions/public/estimateGas.test.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/actions/public/estimateGas.test.ts b/src/actions/public/estimateGas.test.ts index 544e5ab6d2..a95cfcf524 100644 --- a/src/actions/public/estimateGas.test.ts +++ b/src/actions/public/estimateGas.test.ts @@ -127,18 +127,6 @@ test('args: gas', async () => { ).toMatchInlineSnapshot('21000n') }) -test('args: blobs', async () => { - expect( - await estimateGas(client, { - account: accounts[0].address, - blobs: toBlobs({ data: '0x1234' }), - kzg, - to: accounts[1].address, - maxFeePerBlobGas: parseGwei('20'), - }), - ).toMatchInlineSnapshot('53001n') -}) - test('args: override', async () => { const transferData = '0xa9059cbb00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000000000000000000000000000000de0b6b3a7640000' @@ -176,6 +164,18 @@ describe('local account', () => { ).toMatchInlineSnapshot('21000n') }) + test('args: blobs', async () => { + expect( + await estimateGas(client, { + account: privateKeyToAccount(accounts[0].privateKey), + blobs: toBlobs({ data: '0x1234' }), + kzg, + to: accounts[1].address, + maxFeePerBlobGas: parseGwei('20'), + }), + ).toMatchInlineSnapshot('53001n') + }) + test('args: data', async () => { expect( await estimateGas(client, { From 28fb012e2cd409e838fd9a81a6709659f82891b6 Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 21 Jul 2024 19:30:25 +1000 Subject: [PATCH 55/68] chore: tweak eip712domain tests --- src/actions/public/call.test.ts | 13 +-- src/actions/public/getEip712Domain.test.ts | 92 +++++++++++++--------- src/actions/public/readContract.test.ts | 21 ++++- src/clients/decorators/public.test.ts | 20 +++-- 4 files changed, 86 insertions(+), 60 deletions(-) diff --git a/src/actions/public/call.test.ts b/src/actions/public/call.test.ts index 6312e0c9df..ffd4e6f293 100644 --- a/src/actions/public/call.test.ts +++ b/src/actions/public/call.test.ts @@ -113,16 +113,9 @@ describe('ccip', () => { data: calldata, to: contractAddress!, }), - ).rejects.toMatchInlineSnapshot(` - [CallExecutionError: Execution reverted with reason: custom error 556f1830:000000000000000000000000fb6dab62…00000000000000000000000000000000 (576 bytes). - - Raw Call Arguments: - to: 0xfb6dab6200b8958c2655c3747708f82243d3f32e - data: 0xbf40fac1000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000096a786f6d2e7669656d0000000000000000000000000000000000000000000000 - - Details: execution reverted: custom error 556f1830:000000000000000000000000fb6dab62…00000000000000000000000000000000 (576 bytes) - Version: viem@x.y.z] - `) + ).rejects.toThrowError( + 'Execution reverted with reason: custom error 556f1830', + ) await server.close() }) diff --git a/src/actions/public/getEip712Domain.test.ts b/src/actions/public/getEip712Domain.test.ts index 37bed66fb3..924dd2acdc 100644 --- a/src/actions/public/getEip712Domain.test.ts +++ b/src/actions/public/getEip712Domain.test.ts @@ -25,23 +25,30 @@ test('default', async () => { await writeContract(client, request) await mine(client, { blocks: 1 }) - expect( - await getEip712Domain(client, { - address, - }), - ).toMatchInlineSnapshot(` - { - "domain": { - "chainId": 1, - "name": "Mock4337Account", - "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "verifyingContract": "0xE911628bF8428C23f179a07b081325cAe376DE1f", - "version": "1", - }, - "extensions": [], - "fields": "0x0f", - } - `) + const { domain, ...rest } = await getEip712Domain(client, { + address, + }) + const { verifyingContract, ...restDomain } = domain + expect(verifyingContract).toBeDefined() + expect(rest).toMatchInlineSnapshot(` + { + "extensions": [], + "fields": "0x0f", + } + `) + expect(restDomain).toMatchInlineSnapshot(` + { + "domain": { + "chainId": 1, + "name": "Mock4337Account", + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "verifyingContract": "0xE911628bF8428C23f179a07b081325cAe376DE1f", + "version": "1", + }, + "extensions": [], + "fields": "0x0f", + } + `) }) test('counterfactual call', async () => { @@ -55,29 +62,36 @@ test('counterfactual call', async () => { args: [pad('0x0')], }) - expect( - await getEip712Domain(client, { - address, - factory: factoryAddress, - factoryData: encodeFunctionData({ - abi: Mock4337AccountFactory.abi, - functionName: 'createAccount', - args: [accounts[0].address, pad('0x0')], - }), + const { domain, ...rest } = await getEip712Domain(client, { + address, + factory: factoryAddress, + factoryData: encodeFunctionData({ + abi: Mock4337AccountFactory.abi, + functionName: 'createAccount', + args: [accounts[0].address, pad('0x0')], }), - ).toMatchInlineSnapshot(` - { - "domain": { - "chainId": 1, - "name": "Mock4337Account", - "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "verifyingContract": "0xB8e1B1e362872b237526e74B227077B0aeE8e223", - "version": "1", - }, - "extensions": [], - "fields": "0x0f", - } - `) + }) + const { verifyingContract, ...restDomain } = domain + expect(verifyingContract).toBeDefined() + expect(rest).toMatchInlineSnapshot(` + { + "extensions": [], + "fields": "0x0f", + } + `) + expect(restDomain).toMatchInlineSnapshot(` + { + "domain": { + "chainId": 1, + "name": "Mock4337Account", + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "verifyingContract": "0xE911628bF8428C23f179a07b081325cAe376DE1f", + "version": "1", + }, + "extensions": [], + "fields": "0x0f", + } + `) }) test('error: non-existent', async () => { diff --git a/src/actions/public/readContract.test.ts b/src/actions/public/readContract.test.ts index 850beed742..a46c558d41 100644 --- a/src/actions/public/readContract.test.ts +++ b/src/actions/public/readContract.test.ts @@ -212,20 +212,35 @@ describe('deployless read (factory)', () => { args: [accounts[0].address, pad('0x0')], }) - const result = await readContract(client, { + const [ + fields, + name, + version, + chainId, + verifyingContract, + salt, + extensions, + ] = await readContract(client, { address, abi: Mock4337Account.abi, functionName: 'eip712Domain', factory, factoryData, }) - expect(result).toMatchInlineSnapshot(` + expect(verifyingContract).toBeDefined() + expect([ + fields, + name, + version, + chainId, + salt, + extensions, + ]).toMatchInlineSnapshot(` [ "0x0f", "Mock4337Account", "1", 1n, - "0xE911628bF8428C23f179a07b081325cAe376DE1f", "0x0000000000000000000000000000000000000000000000000000000000000000", [], ] diff --git a/src/clients/decorators/public.test.ts b/src/clients/decorators/public.test.ts index fb8352a9d2..6eab8bb6f2 100644 --- a/src/clients/decorators/public.test.ts +++ b/src/clients/decorators/public.test.ts @@ -197,19 +197,23 @@ describe('smoke test', () => { await writeContract(client, request) await mine(client, { blocks: 1 }) - expect(await client.getEip712Domain({ address })).toMatchInlineSnapshot(` + const { domain, ...rest } = await client.getEip712Domain({ address }) + const { verifyingContract, ...restDomain } = domain + expect(verifyingContract).toBeDefined() + expect(rest).toMatchInlineSnapshot(` { - "domain": { - "chainId": 1, - "name": "Mock4337Account", - "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "verifyingContract": "0xE911628bF8428C23f179a07b081325cAe376DE1f", - "version": "1", - }, "extensions": [], "fields": "0x0f", } `) + expect(restDomain).toMatchInlineSnapshot(` + { + "chainId": 1, + "name": "Mock4337Account", + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "version": "1", + } + `) }) test( From 0ddb001e4267f3c14660c59d3e362eec6506dd3e Mon Sep 17 00:00:00 2001 From: jxom Date: Sun, 21 Jul 2024 19:52:13 +1000 Subject: [PATCH 56/68] chore: up snapshots --- src/actions/public/call.test.ts | 27 +++++++++---- src/actions/public/getEip712Domain.test.ts | 38 +++++++------------ .../eip5792/actions/writeContracts.test.ts | 12 +++--- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/actions/public/call.test.ts b/src/actions/public/call.test.ts index ffd4e6f293..dbd77f6dd5 100644 --- a/src/actions/public/call.test.ts +++ b/src/actions/public/call.test.ts @@ -1057,24 +1057,35 @@ describe('deployless call (factory)', () => { factoryData, to: address, }) - expect(result).toMatchInlineSnapshot(` - { - "data": "0x0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b8e1b1e362872b237526e74b227077b0aee8e22300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000f4d6f636b343333374163636f756e740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - } - `) - const decoded = decodeFunctionResult({ + const [ + fields, + name, + version, + chainId, + verifyingContract, + salt, + extensions, + ] = decodeFunctionResult({ abi: Mock4337Account.abi, data: result.data!, functionName: 'eip712Domain', }) - expect(decoded).toMatchInlineSnapshot(` + + expect(verifyingContract).toBeDefined() + expect([ + fields, + name, + version, + chainId, + salt, + extensions, + ]).toMatchInlineSnapshot(` [ "0x0f", "Mock4337Account", "1", 1n, - "0xB8e1B1e362872b237526e74B227077B0aeE8e223", "0x0000000000000000000000000000000000000000000000000000000000000000", [], ] diff --git a/src/actions/public/getEip712Domain.test.ts b/src/actions/public/getEip712Domain.test.ts index 924dd2acdc..15a274ecdf 100644 --- a/src/actions/public/getEip712Domain.test.ts +++ b/src/actions/public/getEip712Domain.test.ts @@ -37,18 +37,13 @@ test('default', async () => { } `) expect(restDomain).toMatchInlineSnapshot(` - { - "domain": { - "chainId": 1, - "name": "Mock4337Account", - "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "verifyingContract": "0xE911628bF8428C23f179a07b081325cAe376DE1f", - "version": "1", - }, - "extensions": [], - "fields": "0x0f", - } - `) + { + "chainId": 1, + "name": "Mock4337Account", + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "version": "1", + } + `) }) test('counterfactual call', async () => { @@ -80,18 +75,13 @@ test('counterfactual call', async () => { } `) expect(restDomain).toMatchInlineSnapshot(` - { - "domain": { - "chainId": 1, - "name": "Mock4337Account", - "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "verifyingContract": "0xE911628bF8428C23f179a07b081325cAe376DE1f", - "version": "1", - }, - "extensions": [], - "fields": "0x0f", - } - `) + { + "chainId": 1, + "name": "Mock4337Account", + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "version": "1", + } + `) }) test('error: non-existent', async () => { diff --git a/src/experimental/eip5792/actions/writeContracts.test.ts b/src/experimental/eip5792/actions/writeContracts.test.ts index 787b168e41..90b9acffcd 100644 --- a/src/experimental/eip5792/actions/writeContracts.test.ts +++ b/src/experimental/eip5792/actions/writeContracts.test.ts @@ -198,12 +198,12 @@ test('default', async () => { "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x0000000000000000000000000000000000000000000000000000000000000221", ], - "transactionHash": "0x82a761a2a38f2ff85cf8153f9c11a21995499010ba5376f8fe44fee59a80e61d", + "transactionHash": "0x4c39dd461d9ad53eb3955e20480ec42392998247e868e09fe07858d2f819114a", "transactionIndex": "0x0", }, ], "status": "success", - "transactionHash": "0x82a761a2a38f2ff85cf8153f9c11a21995499010ba5376f8fe44fee59a80e61d", + "transactionHash": "0x4c39dd461d9ad53eb3955e20480ec42392998247e868e09fe07858d2f819114a", }, { "blockHash": undefined, @@ -224,12 +224,12 @@ test('default', async () => { "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x0000000000000000000000000000000000000000000000000000000000000222", ], - "transactionHash": "0x2858f710639cd4f15fc827597fb6d8ac272b23de31f498bfa56c3e5d43cb8a91", + "transactionHash": "0x2d7626de9490a86fb47e5c0d695f209fabb2d8622c93d26c3cda5f88c51ddbaa", "transactionIndex": "0x1", }, ], "status": "success", - "transactionHash": "0x2858f710639cd4f15fc827597fb6d8ac272b23de31f498bfa56c3e5d43cb8a91", + "transactionHash": "0x2d7626de9490a86fb47e5c0d695f209fabb2d8622c93d26c3cda5f88c51ddbaa", }, { "blockHash": undefined, @@ -250,12 +250,12 @@ test('default', async () => { "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x0000000000000000000000000000000000000000000000000000000000000223", ], - "transactionHash": "0x4fe8ecaac2a2d41e33235a8673e629c67b0e5a18c129df8ef782fa7476753d1a", + "transactionHash": "0x8fc061d08b93512dd4e7cdd64f69142f357010d574152baf47513338675c3237", "transactionIndex": "0x2", }, ], "status": "success", - "transactionHash": "0x4fe8ecaac2a2d41e33235a8673e629c67b0e5a18c129df8ef782fa7476753d1a", + "transactionHash": "0x8fc061d08b93512dd4e7cdd64f69142f357010d574152baf47513338675c3237", }, ] `) From b71e656e08dadc44e2c1eccb5f505f70ce4d3aaf Mon Sep 17 00:00:00 2001 From: jxom Date: Mon, 22 Jul 2024 12:17:36 +1000 Subject: [PATCH 57/68] chore: export types --- .changeset/eleven-carpets-pretend.md | 5 +++++ src/chains/index.ts | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 .changeset/eleven-carpets-pretend.md diff --git a/.changeset/eleven-carpets-pretend.md b/.changeset/eleven-carpets-pretend.md new file mode 100644 index 0000000000..66b8b65c4a --- /dev/null +++ b/.changeset/eleven-carpets-pretend.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Exported types required for inference. diff --git a/src/chains/index.ts b/src/chains/index.ts index b27f55b4d3..4e6eb2a312 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -393,6 +393,7 @@ export type { } from '../zksync/types/log.js' export type { TransactionRequestEIP712, + TransactionRequest as ZkSyncTransactionRequest_internal, ZkSyncEIP712TransactionSignable, ZkSyncRpcTransaction, ZkSyncRpcTransactionEIP712, @@ -411,4 +412,7 @@ export type { ZkSyncTransactionSerialized, ZkSyncTransactionSerializedEIP712, ZkSyncTransactionType, + ZkSyncRawBlockTransactions, + ZkSyncRpcTransactionReceipt, + ZkSyncTransactionDetails, } from '../zksync/types/transaction.js' From 6e8621a7a62ad3ba633f353aadef72b384363bb8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 12:42:27 +1000 Subject: [PATCH 58/68] chore: version package (#2511) Co-authored-by: github-actions[bot] --- .changeset/eleven-carpets-pretend.md | 5 ---- pnpm-lock.yaml | 40 ++++++++++++++-------------- src/CHANGELOG.md | 6 +++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 6 files changed, 29 insertions(+), 28 deletions(-) delete mode 100644 .changeset/eleven-carpets-pretend.md diff --git a/.changeset/eleven-carpets-pretend.md b/.changeset/eleven-carpets-pretend.md deleted file mode 100644 index 66b8b65c4a..0000000000 --- a/.changeset/eleven-carpets-pretend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Exported types required for inference. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67ae661df3..4573dd5af7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.7(typescript@5.4.2)(zod@3.22.4) + version: 2.17.8(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -6008,8 +6008,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.17.7: - resolution: {integrity: sha512-RFaugldAVJYBV+qh7bAgvnbjS6VxSZ0M+xtdw5OuM2Kq9inEuWoxKWOs1/Iej7g8y9kwaZ4PUA1QedxeKNNe0A==} + viem@2.17.8: + resolution: {integrity: sha512-AnLX26/8UAVguXvTc+o5jvehAUfoujomH+WLPNCo0Y0ukb9Z4qWpunkHvPyazeExP2V7EevVJB79mstZh0fLsQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -12713,7 +12713,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.17.7(typescript@5.4.2)(zod@3.22.4): + viem@2.17.8(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 2e1b907d3c..d4d1cfc617 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,11 @@ # viem +## 2.17.9 + +### Patch Changes + +- [`b71e656e`](https://github.com/wevm/viem/commit/b71e656e08dadc44e2c1eccb5f505f70ce4d3aaf) Thanks [@jxom](https://github.com/jxom)! - Exported types required for inference. + ## 2.17.8 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index 8f2f922923..459379c257 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.8' +export const version = '2.17.9' diff --git a/src/jsr.json b/src/jsr.json index a929db2a05..90b3bf8a89 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.8", + "version": "2.17.9", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index 636bec2acb..dd4ecc7db1 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.8", + "version": "2.17.9", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 752680e14df5ef6b4afcff5c2b9a2ecd1491f1a7 Mon Sep 17 00:00:00 2001 From: jxom Date: Mon, 22 Jul 2024 17:41:30 +1000 Subject: [PATCH 59/68] chore: update nonceManager tests --- .../eip5792/actions/getCallsStatus.test.ts | 32 +--- src/utils/nonceManager.test.ts | 156 ++++++++++-------- src/utils/nonceManager.ts | 3 +- 3 files changed, 90 insertions(+), 101 deletions(-) diff --git a/src/experimental/eip5792/actions/getCallsStatus.test.ts b/src/experimental/eip5792/actions/getCallsStatus.test.ts index c81b0f88ea..c684a75495 100644 --- a/src/experimental/eip5792/actions/getCallsStatus.test.ts +++ b/src/experimental/eip5792/actions/getCallsStatus.test.ts @@ -122,35 +122,5 @@ test('default', async () => { const { status, receipts } = await getCallsStatus(client, { id }) expect(status).toMatchInlineSnapshot(`"CONFIRMED"`) - expect(receipts![0].blockHash).toBeDefined() - expect( - receipts?.map((x) => ({ ...x, blockHash: undefined })), - ).toMatchInlineSnapshot(` - [ - { - "blockHash": undefined, - "blockNumber": 19868021n, - "gasUsed": 21000n, - "logs": [], - "status": "success", - "transactionHash": "0x7818e87e5d2bc021d109f81e0b40e06f5dcc845399cd77f4cf67cbcaafdae5f3", - }, - { - "blockHash": undefined, - "blockNumber": 19868021n, - "gasUsed": 21000n, - "logs": [], - "status": "success", - "transactionHash": "0xb4ac29a9fdd3baff0fe572a24d506d795bf96248c672eeb47c738fa23133121d", - }, - { - "blockHash": undefined, - "blockNumber": 19868021n, - "gasUsed": 21064n, - "logs": [], - "status": "success", - "transactionHash": "0x81449b64d551257c061b74357d033c4d892e18af1e247e951dea2c797476c460", - }, - ] - `) + expect(receipts!.length).toBe(3) }) diff --git a/src/utils/nonceManager.test.ts b/src/utils/nonceManager.test.ts index 0b7a77d889..ca659f778e 100644 --- a/src/utils/nonceManager.test.ts +++ b/src/utils/nonceManager.test.ts @@ -1,46 +1,64 @@ -import { expect, test } from 'vitest' +import { beforeAll, expect, test } from 'vitest' import { anvilMainnet, anvilOptimism } from '../../test/src/anvil.js' -import { accounts } from '../../test/src/constants.js' +import { generatePrivateKey } from '../accounts/generatePrivateKey.js' import { privateKeyToAccount } from '../accounts/privateKeyToAccount.js' import { dropTransaction, getTransaction, sendTransaction, + setBalance, } from '../actions/index.js' import { createNonceManager, jsonRpc, nonceManager } from './nonceManager.js' +import { parseEther } from './unit/parseEther.js' -const mainnetClient = anvilMainnet.getClient({ account: true }) -const optimismClient = anvilOptimism.getClient({ account: true }) +const privateKey = generatePrivateKey() +const account = privateKeyToAccount(privateKey) + +const mainnetClient = anvilMainnet.getClient({ account }) +const optimismClient = anvilOptimism.getClient({ account }) const mainnetArgs = { - address: accounts[0].address, + address: account.address, chainId: mainnetClient.chain.id, client: mainnetClient, } as const const optimismArgs = { - address: accounts[0].address, + address: account.address, chainId: optimismClient.chain.id, client: optimismClient, } as const +beforeAll(async () => { + await anvilMainnet.restart() + await anvilOptimism.restart() + await setBalance(mainnetClient, { + address: account.address, + value: parseEther('100'), + }) + await setBalance(optimismClient, { + address: account.address, + value: parseEther('100'), + }) +}) + test('get next', async () => { const nonceManager = createNonceManager({ source: jsonRpc(), }) - expect(await nonceManager.get(mainnetArgs)).toBe(663) + expect(await nonceManager.get(mainnetArgs)).toBe(0) await sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, value: 0n, }) - expect(await nonceManager.get(mainnetArgs)).toBe(664) + expect(await nonceManager.get(mainnetArgs)).toBe(1) - expect(await nonceManager.get(optimismArgs)).toBe(66) + expect(await nonceManager.get(optimismArgs)).toBe(0) await sendTransaction(optimismClient, { - to: accounts[0].address, + to: account.address, value: 0n, }) - expect(await nonceManager.get(optimismArgs)).toBe(67) + expect(await nonceManager.get(optimismArgs)).toBe(1) }) test('consume (sequence)', async () => { @@ -49,31 +67,31 @@ test('consume (sequence)', async () => { }) const nonce_1 = await nonceManager.consume(mainnetArgs) - expect(nonce_1).toBe(664) + expect(nonce_1).toBe(1) const promise_1 = sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, nonce: nonce_1, value: 0n, }) - expect(await nonceManager.get(mainnetArgs)).toBe(665) + expect(await nonceManager.get(mainnetArgs)).toBe(2) const nonce_2 = await nonceManager.consume(mainnetArgs) - expect(nonce_2).toBe(665) + expect(nonce_2).toBe(2) const promise_2 = sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, nonce: nonce_2, value: 0n, }) - expect(await nonceManager.get(mainnetArgs)).toBe(666) + expect(await nonceManager.get(mainnetArgs)).toBe(3) const nonce_3 = await nonceManager.consume(mainnetArgs) - expect(nonce_3).toBe(666) + expect(nonce_3).toBe(3) const promise_3 = sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, nonce: nonce_3, value: 0n, }) - expect(await nonceManager.get(mainnetArgs)).toBe(667) + expect(await nonceManager.get(mainnetArgs)).toBe(4) const [hash_1, hash_2, hash_3] = await Promise.all([ promise_1, @@ -83,27 +101,27 @@ test('consume (sequence)', async () => { expect( (await getTransaction(mainnetClient, { hash: hash_1 })).nonce, - ).toMatchObject(664) + ).toMatchObject(1) expect( (await getTransaction(mainnetClient, { hash: hash_2 })).nonce, - ).toMatchObject(665) + ).toMatchObject(2) expect( (await getTransaction(mainnetClient, { hash: hash_3 })).nonce, - ).toMatchObject(666) - expect(await nonceManager.get(mainnetArgs)).toBe(667) + ).toMatchObject(3) + expect(await nonceManager.get(mainnetArgs)).toBe(4) const nonce_4 = await nonceManager.consume(mainnetArgs) - expect(nonce_4).toBe(667) + expect(nonce_4).toBe(4) const hash_4 = await sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, nonce: nonce_4, value: 0n, }) expect( (await getTransaction(mainnetClient, { hash: hash_4 })).nonce, - ).toMatchObject(667) + ).toMatchObject(4) - expect(await nonceManager.get(mainnetArgs)).toBe(668) + expect(await nonceManager.get(mainnetArgs)).toBe(5) }) test('consume (parallel)', async () => { @@ -121,27 +139,27 @@ test('consume (parallel)', async () => { nonceManager.get(mainnetArgs), ]) - expect(n_1).toBe(668) - expect(nonce_1).toBe(668) - expect(n_2).toBe(669) - expect(nonce_2).toBe(669) - expect(n_3).toBe(670) - expect(nonce_3).toBe(670) - expect(n_4).toBe(671) + expect(n_1).toBe(5) + expect(nonce_1).toBe(5) + expect(n_2).toBe(6) + expect(nonce_2).toBe(6) + expect(n_3).toBe(7) + expect(nonce_3).toBe(7) + expect(n_4).toBe(8) const [hash_1, hash_2, hash_3] = await Promise.all([ sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, nonce: nonce_1, value: 0n, }), sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, nonce: nonce_2, value: 0n, }), sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, nonce: nonce_3, value: 0n, }), @@ -149,32 +167,32 @@ test('consume (parallel)', async () => { expect( (await getTransaction(mainnetClient, { hash: hash_1 })).nonce, - ).toMatchObject(668) + ).toMatchObject(5) expect( (await getTransaction(mainnetClient, { hash: hash_2 })).nonce, - ).toMatchObject(669) + ).toMatchObject(6) expect( (await getTransaction(mainnetClient, { hash: hash_3 })).nonce, - ).toMatchObject(670) - expect(await nonceManager.get(mainnetArgs)).toBe(671) + ).toMatchObject(7) + expect(await nonceManager.get(mainnetArgs)).toBe(8) const nonce_4 = await nonceManager.consume(mainnetArgs) - expect(nonce_4).toBe(671) + expect(nonce_4).toBe(8) const hash_4 = await sendTransaction(mainnetClient, { - to: accounts[0].address, + to: account.address, nonce: nonce_4, value: 0n, }) expect( (await getTransaction(mainnetClient, { hash: hash_4 })).nonce, - ).toMatchObject(671) - expect(await nonceManager.get(mainnetArgs)).toBe(672) + ).toMatchObject(8) + expect(await nonceManager.get(mainnetArgs)).toBe(9) }) test('nonceManager export', async () => { - expect(await nonceManager.get(mainnetArgs)).toBe(672) - expect(await nonceManager.consume(mainnetArgs)).toBe(672) - expect(await nonceManager.get(mainnetArgs)).toBe(673) + expect(await nonceManager.get(mainnetArgs)).toBe(9) + expect(await nonceManager.consume(mainnetArgs)).toBe(9) + expect(await nonceManager.get(mainnetArgs)).toBe(10) const nonces = await Promise.all([ nonceManager.consume(mainnetArgs), @@ -186,12 +204,12 @@ test('nonceManager export', async () => { ]) expect(nonces).toMatchInlineSnapshot(` [ - 673, - 674, - 674, - 675, - 675, - 676, + 10, + 11, + 11, + 12, + 12, + 13, ] `) }) @@ -202,41 +220,41 @@ test('dropped tx', async () => { }) const args = { - address: accounts[1].address, + address: account.address, chainId: mainnetClient.chain.id, client: mainnetClient, } const nonce_1 = await nonceManager.consume(args) - expect(nonce_1).toBe(112) + expect(nonce_1).toBe(9) const hash_1 = await sendTransaction(mainnetClient, { - account: privateKeyToAccount(accounts[1].privateKey), - to: accounts[0].address, + account, + to: account.address, nonce: nonce_1, value: 0n, }) - expect(await nonceManager.get(args)).toBe(113) + expect(await nonceManager.get(args)).toBe(10) const nonce_2 = await nonceManager.consume(args) - expect(nonce_2).toBe(113) + expect(nonce_2).toBe(10) const hash_2 = await sendTransaction(mainnetClient, { - account: privateKeyToAccount(accounts[1].privateKey), - to: accounts[0].address, + account, + to: account.address, nonce: nonce_2, value: 0n, }) - expect(await nonceManager.get(args)).toBe(114) + expect(await nonceManager.get(args)).toBe(11) await dropTransaction(mainnetClient, { hash: hash_1 }) await dropTransaction(mainnetClient, { hash: hash_2 }) const nonce_3 = await nonceManager.consume(args) - expect(nonce_3).toBe(112) + expect(nonce_3).toBe(9) await sendTransaction(mainnetClient, { - account: privateKeyToAccount(accounts[1].privateKey), - to: accounts[0].address, + account, + to: account.address, nonce: nonce_3, value: 0n, }) - expect(await nonceManager.get(args)).toBe(113) + expect(await nonceManager.get(args)).toBe(10) }) diff --git a/src/utils/nonceManager.ts b/src/utils/nonceManager.ts index 4dc2664eab..1364156102 100644 --- a/src/utils/nonceManager.ts +++ b/src/utils/nonceManager.ts @@ -78,7 +78,8 @@ export function createNonceManager( try { const nonce = await source.get({ address, chainId, client }) const previousNonce = nonceMap.get(key) ?? 0 - if (nonce <= previousNonce) return previousNonce + 1 + if (previousNonce > 0 && nonce <= previousNonce) + return previousNonce + 1 nonceMap.delete(key) return nonce } finally { From 3354c46174cdb7e86036bf28b696a0ce6cf982d5 Mon Sep 17 00:00:00 2001 From: Mohit Date: Mon, 22 Jul 2024 16:41:50 +0530 Subject: [PATCH 60/68] docs: add missing `http` import in the config file example (#2517) The `http` was used in the config file example, but the import is missing, which might confuse beginners. --- site/pages/docs/contract/writeContract.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/site/pages/docs/contract/writeContract.md b/site/pages/docs/contract/writeContract.md index 40aa5daa19..bb06fca05b 100644 --- a/site/pages/docs/contract/writeContract.md +++ b/site/pages/docs/contract/writeContract.md @@ -52,7 +52,7 @@ export const wagmiAbi = [ ``` ```ts [config.ts] -import { createWalletClient, custom } from 'viem' +import { createWalletClient, custom, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' @@ -113,7 +113,7 @@ export const wagmiAbi = [ ``` ```ts [config.ts] -import { createWalletClient, custom } from 'viem' +import { createWalletClient, custom, http} from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' @@ -168,7 +168,7 @@ export const wagmiAbi = [ ``` ```ts [config.ts] -import { createWalletClient, custom } from 'viem' +import { createWalletClient, custom, http } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { mainnet } from 'viem/chains' From 3af06fe23dda1f44d43b3d3cec5d985894c2840a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ho=C3=A0ng=20T=C3=A2n?= <77823591+hoangtan282@users.noreply.github.com> Date: Tue, 23 Jul 2024 02:46:46 +0700 Subject: [PATCH 61/68] feat: add Funki Mainnet (#2513) --- .changeset/lemon-shrimps-switch.md | 5 ++++ src/chains/definitions/funkiMainnet.ts | 38 ++++++++++++++++++++++++++ src/chains/index.ts | 1 + 3 files changed, 44 insertions(+) create mode 100644 .changeset/lemon-shrimps-switch.md create mode 100644 src/chains/definitions/funkiMainnet.ts diff --git a/.changeset/lemon-shrimps-switch.md b/.changeset/lemon-shrimps-switch.md new file mode 100644 index 0000000000..082a8493a3 --- /dev/null +++ b/.changeset/lemon-shrimps-switch.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Add Funki Mainnet diff --git a/src/chains/definitions/funkiMainnet.ts b/src/chains/definitions/funkiMainnet.ts new file mode 100644 index 0000000000..0bb080aafc --- /dev/null +++ b/src/chains/definitions/funkiMainnet.ts @@ -0,0 +1,38 @@ +import { chainConfig } from '../../op-stack/chainConfig.js' +import { defineChain } from '../../utils/chain/defineChain.js' + +const sourceId = 1 // mainnet + +export const funkiMainnet = /*#__PURE__*/ defineChain({ + ...chainConfig, + id: 33979, + network: 'funkiMainnet', + name: 'Funki', + nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 }, + rpcUrls: { + default: { + http: ['https://rpc-mainnet.funkichain.com'], + }, + }, + blockExplorers: { + default: { + name: 'Funki Mainnet Explorer', + url: 'https://funkiscan.io', + }, + }, + contracts: { + ...chainConfig.contracts, + l2OutputOracleProxy: { + [sourceId]: { + address: '0x1A9aE6486caEc0504657351ac473B3dF8A1367cb', + }, + }, + l1StandardBridge: { + [sourceId]: { + address: '0x64F1e21412f61e9Ceda3b65FcFC5A4739c7eBBeE', + blockCreated: 20325722, + }, + }, + }, + sourceId, +}) \ No newline at end of file diff --git a/src/chains/index.ts b/src/chains/index.ts index 4e6eb2a312..f7b35b0a08 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -103,6 +103,7 @@ export { flowTestnet } from './definitions/flowTestnet.js' export { foundry } from './definitions/foundry.js' export { fraxtal } from './definitions/fraxtal.js' export { fraxtalTestnet } from './definitions/fraxtalTestnet.js' +export { funkiMainnet } from './definitions/funkiMainnet.js' export { funkiSepolia } from './definitions/funkiSepolia.js' export { fuse } from './definitions/fuse.js' export { fuseSparknet } from './definitions/fuseSparknet.js' From 42c197776b300c5c44f09e86157fa344ddc2659f Mon Sep 17 00:00:00 2001 From: jxom Date: Mon, 22 Jul 2024 19:47:36 +0000 Subject: [PATCH 62/68] chore: format --- src/chains/definitions/funkiMainnet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chains/definitions/funkiMainnet.ts b/src/chains/definitions/funkiMainnet.ts index 0bb080aafc..a94101e162 100644 --- a/src/chains/definitions/funkiMainnet.ts +++ b/src/chains/definitions/funkiMainnet.ts @@ -35,4 +35,4 @@ export const funkiMainnet = /*#__PURE__*/ defineChain({ }, }, sourceId, -}) \ No newline at end of file +}) From c3fac1be047cac22b3e0e1bd154038754b2b583e Mon Sep 17 00:00:00 2001 From: jxom Date: Tue, 23 Jul 2024 05:47:34 +1000 Subject: [PATCH 63/68] chore: tweak funkiMainnet --- .changeset/lemon-shrimps-switch.md | 2 +- src/chains/definitions/funkiMainnet.ts | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/.changeset/lemon-shrimps-switch.md b/.changeset/lemon-shrimps-switch.md index 082a8493a3..239f6ffa7d 100644 --- a/.changeset/lemon-shrimps-switch.md +++ b/.changeset/lemon-shrimps-switch.md @@ -2,4 +2,4 @@ "viem": patch --- -Add Funki Mainnet +Added Funki Mainnet. diff --git a/src/chains/definitions/funkiMainnet.ts b/src/chains/definitions/funkiMainnet.ts index a94101e162..f8e93c1407 100644 --- a/src/chains/definitions/funkiMainnet.ts +++ b/src/chains/definitions/funkiMainnet.ts @@ -6,7 +6,6 @@ const sourceId = 1 // mainnet export const funkiMainnet = /*#__PURE__*/ defineChain({ ...chainConfig, id: 33979, - network: 'funkiMainnet', name: 'Funki', nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 }, rpcUrls: { @@ -22,17 +21,6 @@ export const funkiMainnet = /*#__PURE__*/ defineChain({ }, contracts: { ...chainConfig.contracts, - l2OutputOracleProxy: { - [sourceId]: { - address: '0x1A9aE6486caEc0504657351ac473B3dF8A1367cb', - }, - }, - l1StandardBridge: { - [sourceId]: { - address: '0x64F1e21412f61e9Ceda3b65FcFC5A4739c7eBBeE', - blockCreated: 20325722, - }, - }, }, sourceId, }) From b7e4fa518b1798741cf029f34ed3154695ab3a16 Mon Sep 17 00:00:00 2001 From: Batek Date: Mon, 22 Jul 2024 21:51:26 +0200 Subject: [PATCH 64/68] feat: add root and root poricini (#2515) * added root and root poricini to chain definitions and export them * upd: added changelist * Update root.ts * Update rootPorcini.ts * Update sour-mayflies-rush.md --------- Co-authored-by: jxom --- .changeset/sour-mayflies-rush.md | 5 +++++ src/chains/definitions/root.ts | 29 ++++++++++++++++++++++++++ src/chains/definitions/rootPorcini.ts | 30 +++++++++++++++++++++++++++ src/chains/index.ts | 2 ++ 4 files changed, 66 insertions(+) create mode 100644 .changeset/sour-mayflies-rush.md create mode 100644 src/chains/definitions/root.ts create mode 100644 src/chains/definitions/rootPorcini.ts diff --git a/.changeset/sour-mayflies-rush.md b/.changeset/sour-mayflies-rush.md new file mode 100644 index 0000000000..8d8f901d19 --- /dev/null +++ b/.changeset/sour-mayflies-rush.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added Root Network chain. diff --git a/src/chains/definitions/root.ts b/src/chains/definitions/root.ts new file mode 100644 index 0000000000..ef6e41aa1e --- /dev/null +++ b/src/chains/definitions/root.ts @@ -0,0 +1,29 @@ +import { defineChain } from '../../utils/chain/defineChain.js' + +export const root = /*#__PURE__*/ defineChain({ + id: 7668, + name: 'The Root Network', + nativeCurrency: { + decimals: 18, + name: 'XRP', + symbol: 'XRP', + }, + rpcUrls: { + default: { + http: ['https://root.rootnet.live/archive'], + webSocket: ['wss://root.rootnet.live/archive/ws'], + }, + }, + blockExplorers: { + default: { + name: 'Rootscan', + url: 'https://rootscan.io', + }, + }, + contracts: { + multicall3: { + address: '0xc9C2E2429AeC354916c476B30d729deDdC94988d', + blockCreated: 9218338, + }, + }, +}) diff --git a/src/chains/definitions/rootPorcini.ts b/src/chains/definitions/rootPorcini.ts new file mode 100644 index 0000000000..578812b03d --- /dev/null +++ b/src/chains/definitions/rootPorcini.ts @@ -0,0 +1,30 @@ +import { defineChain } from '../../utils/chain/defineChain.js' + +export const rootPorcini = /*#__PURE__*/ defineChain({ + id: 7672, + name: 'The Root Network - Porcini', + nativeCurrency: { + decimals: 18, + name: 'XRP', + symbol: 'XRP', + }, + rpcUrls: { + default: { + http: ['https://porcini.rootnet.app/archive'], + webSocket: ['wss://porcini.rootnet.app/archive/ws'], + }, + }, + blockExplorers: { + default: { + name: 'Rootscan', + url: 'https://porcini.rootscan.io', + }, + }, + contracts: { + multicall3: { + address: '0xc9C2E2429AeC354916c476B30d729deDdC94988d', + blockCreated: 10555692, + }, + }, + testnet: true, +}) diff --git a/src/chains/index.ts b/src/chains/index.ts index f7b35b0a08..c46721bb1a 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -221,6 +221,8 @@ export { reyaNetwork } from './definitions/reyaNetwork.js' export { rollux } from './definitions/rollux.js' export { rolluxTestnet } from './definitions/rolluxTestnet.js' export { ronin } from './definitions/ronin.js' +export { root } from './definitions/root.js' +export { rootPorcini } from './definitions/rootPorcini.js' export { rootstock } from './definitions/rootstock.js' export { rootstockTestnet } from './definitions/rootstockTestnet.js' export { rss3 } from './definitions/rss3.js' From 7e17bb1b7413cb9d9f406c6d274511a6c8b7eef4 Mon Sep 17 00:00:00 2001 From: jxom Date: Tue, 23 Jul 2024 06:12:17 +1000 Subject: [PATCH 65/68] chore: up solady test --- .../solady/decorators/solady.test.ts | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/experimental/solady/decorators/solady.test.ts b/src/experimental/solady/decorators/solady.test.ts index 935d96dd82..aabeb312de 100644 --- a/src/experimental/solady/decorators/solady.test.ts +++ b/src/experimental/solady/decorators/solady.test.ts @@ -4,10 +4,12 @@ import { beforeAll, expect, test } from 'vitest' import { Mock4337AccountFactory } from '~contracts/generated.js' import { anvilMainnet } from '~test/src/anvil.js' import { accounts, typedData } from '~test/src/constants.js' -import { deployMock4337Account } from '~test/src/utils.js' +import { deployMock4337Account } from '../../../../test/src/utils.js' import { mine, simulateContract, + verifyMessage, + verifyTypedData, writeContract, } from '../../../actions/index.js' import { pad } from '../../../utils/index.js' @@ -40,14 +42,18 @@ test('default', () => { }) test('signMessage', async () => { - const result = await client.signMessage({ + const signature = await client.signMessage({ account: accounts[0].address, message: 'Hello, world!', verifier, }) - expect(result).toMatchInlineSnapshot( - `"0x70f581c85c8d5f84d7e5ae496afda8789b87c42293f881c6f382dcba35b5b57f59e181f93b98d51e4454aa8a4f43113f957f68cdf66eac7e06f5eeef224a85601b"`, - ) + expect( + await verifyMessage(client!, { + address: verifier, + message: 'Hello, world!', + signature, + }), + ).toBeTruthy() const clientWithAccount = anvilMainnet .getClient({ account: true }) @@ -55,9 +61,13 @@ test('signMessage', async () => { const result_2 = await clientWithAccount.signMessage({ message: 'Hello, world!', }) - expect(result_2).toMatchInlineSnapshot( - `"0x70f581c85c8d5f84d7e5ae496afda8789b87c42293f881c6f382dcba35b5b57f59e181f93b98d51e4454aa8a4f43113f957f68cdf66eac7e06f5eeef224a85601b"`, - ) + expect( + await verifyMessage(client!, { + address: verifier, + message: 'Hello, world!', + signature: result_2, + }), + ).toBeTruthy() }) test('signTypedData', async () => { @@ -67,9 +77,14 @@ test('signTypedData', async () => { primaryType: 'Mail', verifier, }) - expect(result).toMatchInlineSnapshot( - `"0x6a3011fea94a44f91941b76abc4490ef6b27343cdb7588361af17efa0bbfc7b03f4e21b59a588f8d169fbd838003a1065162a623faca2b3ab4683c4750e883001b1788ede5301fb0c4b95dda42eabe811ba83dc3cde96087b00c9b72a4d26a379ac2972c4c4323c6d7ee73e319350f290c6549b6eb516b5e5354128413342332154d61696c2875696e743235362074696d657374616d702c506572736f6e2066726f6d2c506572736f6e20746f2c737472696e6720636f6e74656e74732c62797465732068617368294e616d6528737472696e672066697273742c737472696e67206c61737429506572736f6e284e616d65206e616d652c616464726573732077616c6c65742c737472696e675b335d206661766f72697465436f6c6f72732c75696e7432353620666f6f2c75696e7438206167652c626f6f6c206973436f6f6c2900c1"`, - ) + expect( + await verifyTypedData(client, { + ...typedData.complex, + address: verifier, + signature: result, + primaryType: 'Mail', + }), + ).toBeTruthy() const clientWithAccount = anvilMainnet .getClient({ account: true }) @@ -78,7 +93,12 @@ test('signTypedData', async () => { ...typedData.complex, primaryType: 'Mail', }) - expect(result_2).toMatchInlineSnapshot( - `"0x6a3011fea94a44f91941b76abc4490ef6b27343cdb7588361af17efa0bbfc7b03f4e21b59a588f8d169fbd838003a1065162a623faca2b3ab4683c4750e883001b1788ede5301fb0c4b95dda42eabe811ba83dc3cde96087b00c9b72a4d26a379ac2972c4c4323c6d7ee73e319350f290c6549b6eb516b5e5354128413342332154d61696c2875696e743235362074696d657374616d702c506572736f6e2066726f6d2c506572736f6e20746f2c737472696e6720636f6e74656e74732c62797465732068617368294e616d6528737472696e672066697273742c737472696e67206c61737429506572736f6e284e616d65206e616d652c616464726573732077616c6c65742c737472696e675b335d206661766f72697465436f6c6f72732c75696e7432353620666f6f2c75696e7438206167652c626f6f6c206973436f6f6c2900c1"`, - ) + expect( + await verifyTypedData(client, { + ...typedData.complex, + address: verifier, + signature: result_2, + primaryType: 'Mail', + }), + ).toBeTruthy() }) From 01cdac14d508fbae50a31492e244b7adbe858bab Mon Sep 17 00:00:00 2001 From: "Ian L." <143178815+cbfyi@users.noreply.github.com> Date: Mon, 22 Jul 2024 21:14:54 +0100 Subject: [PATCH 66/68] feat: add dispute game factory address for Base Sepolia (#2519) * Added dispute game factory address for Base Sepolia To support Fault Proofs w/ Base Sepolia. * Create nervous-buttons-relax.md --------- Co-authored-by: jxom --- .changeset/nervous-buttons-relax.md | 5 +++++ src/chains/definitions/baseSepolia.ts | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/nervous-buttons-relax.md diff --git a/.changeset/nervous-buttons-relax.md b/.changeset/nervous-buttons-relax.md new file mode 100644 index 0000000000..695dfddb59 --- /dev/null +++ b/.changeset/nervous-buttons-relax.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Added dispute game factory address for Base Sepolia. diff --git a/src/chains/definitions/baseSepolia.ts b/src/chains/definitions/baseSepolia.ts index 96f628caf5..849c811f13 100644 --- a/src/chains/definitions/baseSepolia.ts +++ b/src/chains/definitions/baseSepolia.ts @@ -23,6 +23,11 @@ export const baseSepolia = /*#__PURE__*/ defineChain({ }, contracts: { ...chainConfig.contracts, + disputeGameFactory: { + [sourceId]: { + address: '0xd6E6dBf4F7EA0ac412fD8b65ED297e64BB7a06E1', + }, + }, l2OutputOracle: { [sourceId]: { address: '0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254', From 892d62fd17d14e60cfcb36caa671516caee990c4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 07:00:22 +1000 Subject: [PATCH 67/68] chore: version package (#2520) Co-authored-by: github-actions[bot] --- .changeset/lemon-shrimps-switch.md | 5 ---- .changeset/nervous-buttons-relax.md | 5 ---- .changeset/sour-mayflies-rush.md | 5 ---- pnpm-lock.yaml | 40 ++++++++++++++--------------- src/CHANGELOG.md | 10 ++++++++ src/errors/version.ts | 2 +- src/jsr.json | 2 +- src/package.json | 2 +- 8 files changed, 33 insertions(+), 38 deletions(-) delete mode 100644 .changeset/lemon-shrimps-switch.md delete mode 100644 .changeset/nervous-buttons-relax.md delete mode 100644 .changeset/sour-mayflies-rush.md diff --git a/.changeset/lemon-shrimps-switch.md b/.changeset/lemon-shrimps-switch.md deleted file mode 100644 index 239f6ffa7d..0000000000 --- a/.changeset/lemon-shrimps-switch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added Funki Mainnet. diff --git a/.changeset/nervous-buttons-relax.md b/.changeset/nervous-buttons-relax.md deleted file mode 100644 index 695dfddb59..0000000000 --- a/.changeset/nervous-buttons-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added dispute game factory address for Base Sepolia. diff --git a/.changeset/sour-mayflies-rush.md b/.changeset/sour-mayflies-rush.md deleted file mode 100644 index 8d8f901d19..0000000000 --- a/.changeset/sour-mayflies-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"viem": patch ---- - -Added Root Network chain. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4573dd5af7..65e5eed0bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -166,7 +166,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -179,7 +179,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -192,7 +192,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -211,7 +211,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -239,7 +239,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -261,7 +261,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -274,7 +274,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -293,7 +293,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -315,7 +315,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -328,7 +328,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -341,7 +341,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -354,7 +354,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -401,7 +401,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -423,7 +423,7 @@ importers: dependencies: viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: typescript: specifier: ^5.0.3 @@ -442,7 +442,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -476,7 +476,7 @@ importers: version: 18.2.0(react@18.2.0) viem: specifier: latest - version: 2.17.8(typescript@5.4.2)(zod@3.22.4) + version: 2.17.9(typescript@5.4.2)(zod@3.22.4) devDependencies: '@types/react': specifier: ^18.0.27 @@ -6008,8 +6008,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.17.8: - resolution: {integrity: sha512-AnLX26/8UAVguXvTc+o5jvehAUfoujomH+WLPNCo0Y0ukb9Z4qWpunkHvPyazeExP2V7EevVJB79mstZh0fLsQ==} + viem@2.17.9: + resolution: {integrity: sha512-b55e91Kh3vMfZy4kuIx3zzgYEG0ToYiNEJz/KCj2QGcsWtvfWXs/fVcbMMW7wIlbA+yqTEBDTSdBQkigfavF6w==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -12713,7 +12713,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.17.8(typescript@5.4.2)(zod@3.22.4): + viem@2.17.9(typescript@5.4.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index d4d1cfc617..66cffbccbf 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,5 +1,15 @@ # viem +## 2.17.10 + +### Patch Changes + +- [#2513](https://github.com/wevm/viem/pull/2513) [`3af06fe`](https://github.com/wevm/viem/commit/3af06fe23dda1f44d43b3d3cec5d985894c2840a) Thanks [@hoangtan282](https://github.com/hoangtan282)! - Added Funki Mainnet. + +- [#2519](https://github.com/wevm/viem/pull/2519) [`01cdac1`](https://github.com/wevm/viem/commit/01cdac14d508fbae50a31492e244b7adbe858bab) Thanks [@cbfyi](https://github.com/cbfyi)! - Added dispute game factory address for Base Sepolia. + +- [#2515](https://github.com/wevm/viem/pull/2515) [`b7e4fa5`](https://github.com/wevm/viem/commit/b7e4fa518b1798741cf029f34ed3154695ab3a16) Thanks [@JoeyKhd](https://github.com/JoeyKhd)! - Added Root Network chain. + ## 2.17.9 ### Patch Changes diff --git a/src/errors/version.ts b/src/errors/version.ts index 459379c257..b1bb1ee1c5 100644 --- a/src/errors/version.ts +++ b/src/errors/version.ts @@ -1 +1 @@ -export const version = '2.17.9' +export const version = '2.17.10' diff --git a/src/jsr.json b/src/jsr.json index 90b3bf8a89..1f847a4c2d 100644 --- a/src/jsr.json +++ b/src/jsr.json @@ -1,6 +1,6 @@ { "name": "@wevm/viem", - "version": "2.17.9", + "version": "2.17.10", "exports": { ".": "./index.ts", "./accounts": "./accounts/index.ts", diff --git a/src/package.json b/src/package.json index dd4ecc7db1..d79474db60 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "viem", "description": "TypeScript Interface for Ethereum", - "version": "2.17.9", + "version": "2.17.10", "type": "module", "main": "./_cjs/index.js", "module": "./_esm/index.js", From 8e3c9ec058885ac94f5b3a3d8f38eee201130ab5 Mon Sep 17 00:00:00 2001 From: jxom Date: Tue, 23 Jul 2024 07:49:26 +1000 Subject: [PATCH 68/68] chore: bump size --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 994fb80801..0da5c05f88 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ { "name": "import { verifySiweMessage } from 'viem/siwe'", "path": "./src/_esm/siwe/index.js", - "limit": "30 kB", + "limit": "31 kB", "import": "{ verifySiweMessage }" } ]