diff --git a/README.md b/README.md index acb374f..e61a5eb 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ The following is a list of contracts that are deployed by this script. | SequenceMarketV2 | 0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712 | | SequenceMarketV1 | 0xB537a160472183f2150d42EB1c3DD6684A55f74c | | BatchPayableHelper | 0x6166c1952c54dEd6b070B4616797E61b6c48A117 | +| TrailsMulticall3Router | 0xfa407ac8d5f9991d5e8fd896b0a65acba617717c | | ERC20ItemsFactory | 0x1063cBEe6b3Cd69B49f1B922A0D402f484b39855 | | ERC721ItemsFactory | 0xC6064FfBaDB0687Da29721C8EC02ACa71e735a3e | | ERC1155ItemsFactory | 0x7364fDEFe24385B2b3869504383c94cF083AcbD6 | diff --git a/scripts/deploy-contracts.ts b/scripts/deploy-contracts.ts index 01c90fb..a9703f6 100644 --- a/scripts/deploy-contracts.ts +++ b/scripts/deploy-contracts.ts @@ -27,6 +27,8 @@ import { ERC1155OperatorEnforcedFactory } from './factories/token_library/immuta import { ERC721OperatorEnforcedFactory } from './factories/token_library/immutable/ERC721OperatorEnforcedFactory' import { PaymentCombiner } from './factories/token_library/PaymentCombiner' import { PaymentsFactory } from './factories/token_library/PaymentsFactory' +import { TrailsMulticall3Router } from './factories/trails/TrailsMulticall3Router' +import { TrailsWaletContextTxs } from './factories/trails/Walletv3' import { FactoryV1, GuestModuleV1, @@ -375,6 +377,30 @@ export const deployContracts = async (config: Config): Promise => const batchPayableHelper = await singletonDeployer.deploy('BatchPayableHelper', BatchPayableHelper, 0, txParams) prompt.succeed('Deployed Market contracts\n') + // Trails + + prompt.start('Deploying Trails contracts\n') + const trailsMulticall3Router = await singletonDeployer.deploy('TrailsMulticall3Router', TrailsMulticall3Router, 0, txParams) + for (const trailsWalletContextTx of TrailsWaletContextTxs) { + let code = await signer.provider.getCode(trailsWalletContextTx.checkAddr) + if (code === '0x') { + const tx = await signer.sendTransaction({ + to: trailsWalletContextTx.to, + data: trailsWalletContextTx.data, + ...txParams + }) + await tx.wait() + code = await signer.provider.getCode(trailsWalletContextTx.checkAddr) + if (code === '0x') { + throw new Error(`Trails ${trailsWalletContextTx.checkAddr} not deployed with tx ${tx.hash}`) + } + prompt.log(`Trails ${trailsWalletContextTx.checkAddr} deployed with tx ${tx.hash}\n`) + } else { + prompt.log(`Trails ${trailsWalletContextTx.checkAddr} already deployed\n`) + } + } + prompt.succeed('Deployed Trails contracts\n') + // Contracts library prompt.start('Deploying Library contracts\n') @@ -494,6 +520,7 @@ export const deployContracts = async (config: Config): Promise => SequenceMarketV2: marketV2Address, SequenceMarketV1: marketV1.address, BatchPayableHelper: batchPayableHelper.address, + TrailsMulticall3Router: trailsMulticall3Router.address, ERC20ItemsFactory: erc20ItemsFactory.address, ERC721ItemsFactory: erc721ItemsFactory.address, ERC1155ItemsFactory: erc1155ItemsFactory.address, diff --git a/scripts/factories/trails/TrailsMulticall3Router.ts b/scripts/factories/trails/TrailsMulticall3Router.ts new file mode 100644 index 0000000..43c8573 --- /dev/null +++ b/scripts/factories/trails/TrailsMulticall3Router.ts @@ -0,0 +1,83 @@ +import { ContractFactory, type ethers } from 'ethers' +import type { VerificationRequest } from 'scripts/types' + +// https://github.com/0xsequence/trails-contracts/blob/f65d27efee0f766c68ee664453523e913addb6bf/broadcast/TrailsMulticall3Router.s.sol/8453/run-1752834875.json + +export class TrailsMulticall3Router extends ContractFactory { + constructor(signer?: ethers.Signer) { + super( + [], + '60a060405234603257600e6040565b60146036565b6106f761005b823960805181818161024c015261065f01526106f790f35b603c565b60405190565b5f80fd5b73ca11bde05977b3631167028862be2a173976ca1160805256fe60806040526004361015610015575b366102dc57005b61001f5f3561003e565b806309c5eabe14610039576394b41e520361000e576102a7565b61020b565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b909182601f830112156100985781359167ffffffffffffffff831161009357602001926001830284011161008e57565b61005a565b610056565b610052565b906020828203126100ce575f82013567ffffffffffffffff81116100c9576100c5920161005e565b9091565b61004e565b61004a565b5190565b60209181520190565b60200190565b151590565b6100f4906100e6565b9052565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61013961014260209361014793610130816100f8565b938480936100fc565b95869101610105565b610110565b0190565b61017691602060408201926101665f8201515f8501906100eb565b015190602081840391015261011a565b90565b906101839161014b565b90565b60200190565b906101a0610199836100d3565b80926100d7565b90816101b1602083028401946100e0565b925f915b8383106101c457505050505090565b909192939460206101e66101e083856001950387528951610179565b97610186565b93019301919392906101b5565b6102089160208201915f81840391015261018c565b90565b61023361022261021c36600461009d565b9061064d565b61022a610044565b918291826101f3565b0390f35b5f80fd5b5f91031261024557565b61004a565b7f000000000000000000000000000000000000000000000000000000000000000090565b60018060a01b031690565b6102829061026e565b90565b61028e90610279565b9052565b91906102a5905f60208501940190610285565b565b346102d7576102b736600461023b565b6102d36102c261024a565b6102ca610044565b91829182610292565b0390f35b610237565b5f80fd5b606090565b905090565b90825f939282370152565b9091826103058161030c936102e5565b80936102ea565b0190565b909161031b926102f5565b90565b634e487b7160e01b5f52604160045260245ffd5b9061033c90610110565b810190811067ffffffffffffffff82111761035657604052565b61031e565b9061036e610367610044565b9283610332565b565b67ffffffffffffffff811161038e5761038a602091610110565b0190565b61031e565b906103a56103a083610370565b61035b565b918252565b606090565b3d5f146103ca576103bf3d610393565b903d5f602084013e5b565b6103d26103aa565b906103c8565b60209181520190565b60207f6c65640000000000000000000000000000000000000000000000000000000000917f547261696c734d756c746963616c6c33526f757465723a2063616c6c206661695f8201520152565b61043b60236040926103d8565b610444816103e1565b0190565b61045d9060208101905f81830391015261042e565b90565b1561046757565b61046f610044565b62461bcd60e51b81528061048560048201610448565b0390fd5b67ffffffffffffffff81116104a15760208091020190565b61031e565b5f80fd5b5f80fd5b6104b7816100e6565b036104be57565b5f80fd5b905051906104cf826104ae565b565b5f80fd5b909291926104ea6104e582610370565b61035b565b938185526020850190828401116105065761050492610105565b565b6104d1565b9080601f8301121561052957816020610526935191016104d5565b90565b610052565b91909160408184031261058057610545604061035b565b92610552815f84016104c2565b5f850152602082015167ffffffffffffffff811161057b57610574920161050b565b6020830152565b6104aa565b6104a6565b92919061059961059482610489565b61035b565b93818552602080860192028101918383116105f05781905b8382106105bf575050505050565b815167ffffffffffffffff81116105eb576020916105e0878493870161052e565b8152019101906105b1565b610052565b61005a565b9080601f830112156106135781602061061093519101610585565b90565b610052565b90602082820312610648575f82015167ffffffffffffffff81116106435761064092016105f5565b90565b61004e565b61004a565b5f80916106be9361065c6102e0565b507f00000000000000000000000000000000000000000000000000000000000000009161069361068a610044565b92839283610310565b03915af46106a86106a26103af565b91610460565b60206106b3826100f8565b818301019101610618565b9056fea2646970667358221220c745fcc8228be456513438936d544aa0e26a493039a0820c210f2d0debf2cb2964736f6c634300081e0033', + signer + ) + } +} + +export const TRAILSMULTICALL3ROUTER_VERIFICATION: Omit = { + contractToVerify: 'src/TrailsMulticall3Router.sol:TrailsMulticall3Router', + version: 'v0.8.30+commit.73712a01', + licenceType: 'Apache-2.0', + compilerInput: { + language: 'Solidity', + sources: { + 'src/TrailsMulticall3Router.sol': { + content: + '// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IMulticall3} from "forge-std/interfaces/IMulticall3.sol";\n\n/**\n * @title TrailsMulticall3Router\n * @author Shun Kakinoki\n * @notice A wrapper to execute multiple calls via DELEGATECALL to preserve the original msg.sender.\n * @dev This contract mimics the Multicall3 interface but executes sub-calls via DELEGATECALL\n * to ensure that for the sub-calls, msg.sender is the original caller of this contract.\n * This is useful for smart contract wallets (intent addresses) that need to control msg.sender.\n */\ncontract TrailsMulticall3Router {\n // -------------------------------------------------------------------------\n // Immutable Variables\n // -------------------------------------------------------------------------\n\n address public immutable multicall3 = 0xcA11bde05977b3631167028862bE2a173976CA11;\n\n // -------------------------------------------------------------------------\n // Functions\n // -------------------------------------------------------------------------\n\n /**\n * @notice Aggregates multiple calls in a single transaction.\n * @dev See the contract-level documentation for the logic on how the call is performed.\n * @param data The data to execute.\n * @return returnResults The result of the execution. (Expects the underlying data returned to be an array of IMulticall3.Result)\n */\n function execute(bytes calldata data)\n public\n payable\n returns (IMulticall3.Result[] memory returnResults)\n {\n (bool success, bytes memory returnData) = multicall3.delegatecall(data);\n require(success, "TrailsMulticall3Router: call failed");\n return abi.decode(returnData, (IMulticall3.Result[]));\n }\n\n // -------------------------------------------------------------------------\n // Receive ETH\n // -------------------------------------------------------------------------\n\n /// @notice Receive ETH\n receive() external payable {}\n}\n' + }, + 'lib/forge-std/src/interfaces/IMulticall3.sol': { + content: + '// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\ninterface IMulticall3 {\n struct Call {\n address target;\n bytes callData;\n }\n\n struct Call3 {\n address target;\n bool allowFailure;\n bytes callData;\n }\n\n struct Call3Value {\n address target;\n bool allowFailure;\n uint256 value;\n bytes callData;\n }\n\n struct Result {\n bool success;\n bytes returnData;\n }\n\n function aggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes[] memory returnData);\n\n function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);\n\n function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);\n\n function blockAndAggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n\n function getBasefee() external view returns (uint256 basefee);\n\n function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);\n\n function getBlockNumber() external view returns (uint256 blockNumber);\n\n function getChainId() external view returns (uint256 chainid);\n\n function getCurrentBlockCoinbase() external view returns (address coinbase);\n\n function getCurrentBlockDifficulty() external view returns (uint256 difficulty);\n\n function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);\n\n function getCurrentBlockTimestamp() external view returns (uint256 timestamp);\n\n function getEthBalance(address addr) external view returns (uint256 balance);\n\n function getLastBlockHash() external view returns (bytes32 blockHash);\n\n function tryAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (Result[] memory returnData);\n\n function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n}\n' + } + }, + settings: { + remappings: [ + '@/=src/', + 'test/=test/', + '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/', + 'forge-std/=lib/forge-std/src/', + 'lifi-contracts/=lib/contracts/src/', + 'erc2470-libs/=lib/erc2470-libs/', + 'wallet-contracts-v3/=lib/wallet-contracts-v3/src/', + '@eth-optimism/=lib/contracts/node_modules/@hop-protocol/sdk/node_modules/@eth-optimism/', + '@memview-sol/=lib/evm-cctp-contracts/lib/memview-sol/', + '@uniswap/=lib/contracts/node_modules/@uniswap/', + 'Permit2/=lib/contracts/lib/Permit2/', + 'celer-network/=lib/contracts/lib/sgn-v2-contracts/', + 'centre-tokens.git/=lib/evm-cctp-contracts/lib/centre-tokens.git/', + 'contracts/=lib/contracts/src/', + 'create3-factory/=lib/contracts/lib/create3-factory/', + 'ds-test/=lib/evm-cctp-contracts/lib/ds-test/src/', + 'erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/', + 'eth-gas-reporter/=lib/contracts/node_modules/eth-gas-reporter/', + 'evm-cctp-contracts/=lib/evm-cctp-contracts/', + 'forge-gas-snapshot/=lib/contracts/lib/Permit2/lib/forge-gas-snapshot/src/', + 'halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/', + 'lifi/=lib/contracts/src/', + 'memview-sol/=lib/evm-cctp-contracts/lib/memview-sol/contracts/', + 'openzeppelin-contracts/=lib/openzeppelin-contracts/', + 'openzeppelin/=lib/contracts/lib/openzeppelin-contracts/contracts/', + 'permit2/=lib/contracts/lib/Permit2/src/', + 'sgn-v2-contracts/=lib/contracts/lib/sgn-v2-contracts/contracts/', + 'solady/=lib/contracts/lib/solady/src/', + 'solmate/=lib/contracts/lib/solmate/src/' + ], + optimizer: { + enabled: false, + runs: 200 + }, + metadata: { + useLiteralContent: false, + bytecodeHash: 'ipfs', + appendCBOR: true + }, + outputSelection: { + '*': { + '*': ['evm.bytecode', 'evm.deployedBytecode', 'devdoc', 'userdoc', 'metadata', 'abi'] + } + }, + evmVersion: 'cancun', + viaIR: true, + libraries: {} + } + } +} diff --git a/scripts/factories/trails/Walletv3.ts b/scripts/factories/trails/Walletv3.ts new file mode 100644 index 0000000..816d95e --- /dev/null +++ b/scripts/factories/trails/Walletv3.ts @@ -0,0 +1,22 @@ +// This is the Trails context using an early build of Wallet V3 +// This file will be replaced with the v3 deployment once that is ready and the context has been updated in our implementation. + +const TrailsWalletContextTxTo = '0xce0042B868300000d44A59004Da54A005ffdcf9f' +const TrailsWalletContextTxDatas = [ + { + checkAddr: '0xBd0F8abD58B4449B39C57Ac9D5C67433239aC447', + data: '0x4af63f020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003766080604052348015600e575f5ffd5b5061035a8061001c5f395ff3fe60806040526004361061001d575f3560e01c806332c02a1414610021575b5f5ffd5b61003b600480360381019061003691906101ba565b610051565b6040516100489190610207565b60405180910390f35b5f5f6040518060600160405280602c81526020016102f9602c91398473ffffffffffffffffffffffffffffffffffffffff1660405160200161009492919061029b565b60405160208183030381529060405290508281516020830134f591505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036101225783836040517f8caac8050000000000000000000000000000000000000000000000000000000081526004016101199291906102d1565b60405180910390fd5b5092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101568261012d565b9050919050565b6101668161014c565b8114610170575f5ffd5b50565b5f813590506101818161015d565b92915050565b5f819050919050565b61019981610187565b81146101a3575f5ffd5b50565b5f813590506101b481610190565b92915050565b5f5f604083850312156101d0576101cf610129565b5b5f6101dd85828601610173565b92505060206101ee858286016101a6565b9150509250929050565b6102018161014c565b82525050565b5f60208201905061021a5f8301846101f8565b92915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61024c82610220565b610256818561022a565b9350610266818560208601610234565b80840191505092915050565b5f819050919050565b5f819050919050565b61029561029082610272565b61027b565b82525050565b5f6102a68285610242565b91506102b28284610284565b6020820191508190509392505050565b6102cb81610187565b82525050565b5f6040820190506102e45f8301856101f8565b6102f160208301846102c2565b939250505056fe603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3a264697066735822122009e132ab9d1c11bdbac018e6131534eb4d4460c20d453928a5a0b89cf4ecf4fc64736f6c634300081c003300000000000000000000' + }, + { + checkAddr: '0x53bA242E7C2501839DF2972c75075dc693176Cd0', + data: '0x4af63f0200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abb760e060405234801561000f575f5ffd5b5060405161ab9738038061ab9783398181016040528101906100319190610196565b8060405161003e9061012b565b604051809103905ff080158015610057573d5f5f3e3d5ffd5b505f6040518060600160405280602c815260200161ab6b602c91393073ffffffffffffffffffffffffffffffffffffffff1660405160200161009a92919061023c565b60405160208183030381529060405280519060200120905080608081815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505050505050610263565b615398806157d383390190565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101658261013c565b9050919050565b6101758161015b565b811461017f575f5ffd5b50565b5f815190506101908161016c565b92915050565b5f602082840312156101ab576101aa610138565b5b5f6101b884828501610182565b91505092915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6101ed826101c1565b6101f781856101cb565b93506102078185602086016101d5565b80840191505092915050565b5f819050919050565b5f819050919050565b61023661023182610213565b61021c565b82525050565b5f61024782856101e3565b91506102538284610225565b6020820191508190509392505050565b60805160a05160c0516155316102a25f395f8181610bfe0152611a0401525f81816109f401526131d301525f818161095401526131f501526155315ff3fe60806040526004361061012d575f3560e01c80636ea44577116100aa578063aaf10f421161006e578063aaf10f42146104b5578063ad55366b146104df578063b93ea7ad14610520578063bc197c811461053c578063f23a6e6114610578578063f727ef1c146105b457610134565b80636ea44577146103ce5780638943ec02146103ea5780638c3f55631461041257806392dcb3fc1461044e5780639f69ef541461048b57610134565b80631f6a1eb9116100f15780631f6a1eb91461031a578063257671f51461033657806329561426146103605780632dd31000146103885780634fcf3eca146103b257610134565b8063025b22bc1461020e57806313792a4a1461022a578063150b7a02146102665780631626ba7e146102a25780631a9b2337146102de57610134565b3661013457005b60045f3690501061020c575f6101555f369061015091906135ab565b6105dc565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461020a575f5f8273ffffffffffffffffffffffffffffffffffffffff165f366040516101b3929190613645565b5f60405180830381855af49150503d805f81146101eb576040519150601f19603f3d011682016040523d82523d5f602084013e6101f0565b606091505b50915091508161020257805160208201fd5b805160208201f35b505b005b610228600480360381019061022391906136c8565b610631565b005b348015610235575f5ffd5b50610250600480360381019061024b9190613cf3565b6106ad565b60405161025d9190613d7b565b60405180910390f35b348015610271575f5ffd5b5061028c60048036038101906102879190613d94565b61085c565b6040516102999190613e27565b60405180910390f35b3480156102ad575f5ffd5b506102c860048036038101906102c39190613e40565b610870565b6040516102d59190613e27565b60405180910390f35b3480156102e9575f5ffd5b5061030460048036038101906102ff9190613ec7565b6108b2565b6040516103119190613f01565b60405180910390f35b610334600480360381019061032f9190613f1a565b6108c3565b005b348015610341575f5ffd5b5061034a610952565b6040516103579190613d7b565b60405180910390f35b34801561036b575f5ffd5b5061038660048036038101906103819190613f98565b610976565b005b348015610393575f5ffd5b5061039c6109f2565b6040516103a99190613f01565b60405180910390f35b6103cc60048036038101906103c79190613ec7565b610a16565b005b6103e860048036038101906103e39190613fc3565b610b0b565b005b3480156103f5575f5ffd5b50610410600480360381019061040b919061400e565b610baa565b005b34801561041d575f5ffd5b506104386004803603810190610433919061407f565b610bb0565b60405161044591906140b9565b60405180910390f35b348015610459575f5ffd5b50610474600480360381019061046f9190613f98565b610be8565b6040516104829291906140d2565b60405180910390f35b348015610496575f5ffd5b5061049f610bfc565b6040516104ac9190613f01565b60405180910390f35b3480156104c0575f5ffd5b506104c9610c20565b6040516104d69190613f01565b60405180910390f35b3480156104ea575f5ffd5b5061050560048036038101906105009190613cf3565b610c2e565b60405161051796959493929190614108565b60405180910390f35b61053a60048036038101906105359190614167565b610c6c565b005b348015610547575f5ffd5b50610562600480360381019061055d91906141fa565b610d62565b60405161056f9190613e27565b60405180910390f35b348015610583575f5ffd5b5061059e600480360381019061059991906142d1565b610d79565b6040516105ab9190613e27565b60405180910390f35b3480156105bf575f5ffd5b506105da60048036038101906105d591906143a8565b610d8e565b005b5f6106287fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610e57565b5f1c9050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a157336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016106989190613f01565b60405180910390fd5b6106aa81610e8f565b50565b5f5f6001856101000151516106c29190614425565b67ffffffffffffffff8111156106db576106da613707565b5b6040519080825280602002602001820160405280156107095781602001602082028036833780820191505090505b5090505f5f90505b8561010001515181101561079957856101000151818151811061073757610736614458565b5b602002602001015182828151811061075257610751614458565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610711565b50338186610100015151815181106107b4576107b3614458565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808561010001819052505f610804868686610ed2565b5090508061084d578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161084493929190614838565b60405180910390fd5b60015f1b925050509392505050565b5f63150b7a0260e01b905095945050505050565b5f5f61087b856110c2565b90505f610889828686610ed2565b5090508061089e575f60e01b925050506108ab565b6320c13b0b60e01b925050505b9392505050565b5f6108bc826105dc565b9050919050565b5f5a90505f6108d286866110eb565b90506108e68160600151826080015161158d565b5f5f6108f3838787610ed2565b915091508161093d578286866040517fa2b6d61b00000000000000000000000000000000000000000000000000000000815260040161093493929190614838565b60405180910390fd5b610948848285611631565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109e657336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016109dd9190613f01565b60405180910390fd5b6109ef81611961565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8657336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610a7d9190613f01565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610aa6826105dc565b73ffffffffffffffffffffffffffffffffffffffff1603610afe57806040517f1c3812cc000000000000000000000000000000000000000000000000000000008152600401610af59190613e27565b60405180910390fd5b610b08815f611a2b565b50565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7b57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610b729190613f01565b60405180910390fd5b5f5a90505f610b8a84846110eb565b90505f610b9682611acc565b9050610ba3838284611631565b5050505050565b50505050565b5f610bdf7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b610e57565b5f1c9050919050565b5f5f610bf383611b1c565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f610c29611b6d565b905090565b5f5f5f5f5f5f610c418989895f5f611b75565b809550819650829750839950849a505050505050610c5e83611eb2565b935093975093979195509350565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cdc57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610cd39190613f01565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610cfc836105dc565b73ffffffffffffffffffffffffffffffffffffffff1614610d5457816040517f5b4d6d6a000000000000000000000000000000000000000000000000000000008152600401610d4b9190613e27565b60405180910390fd5b610d5e8282611a2b565b5050565b5f63bc197c8160e01b905098975050505050505050565b5f63f23a6e6160e01b90509695505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dfe57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610df59190613f01565b60405180910390fd5b610e178383836bffffffffffffffffffffffff16611ec3565b7febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b1838383604051610e4a9392919061487e565b60405180910390a1505050565b5f5f8383604051602001610e6c9291906148b3565b604051602081830303815290604052805190602001209050805491505092915050565b610e9881611f21565b7f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca0381604051610ec79190613f01565b60405180910390a150565b5f5f5f84845f818110610ee857610ee7614458565b5b9050013560f81c60f81b9050608060f81b608060f81b82167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361104157610f3086611acc565b91505f5f610f3d84611b1c565b91509150428111610f875783816040517ff95b6ab7000000000000000000000000000000000000000000000000000000008152600401610f7e9291906148da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610fef57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611035578333836040517f8945c31300000000000000000000000000000000000000000000000000000000815260040161102c93929190614901565b60405180910390fd5b600194505050506110ba565b5f5f5f6110518989895f5f611b75565b905080985081945082955083965050505050828210156110aa5782826040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004016110a1929190614936565b60405180910390fd5b6110b381611eb2565b9550505050505b935093915050565b6110ca6134b6565b6003815f019060ff16908160ff1681525050818160e0018181525050919050565b6110f36134b6565b5f815f019060ff16908160ff16815250505f5f6111108585611f27565b915060ff169150600180831603611130575f83606001818152505061116c565b611145818686611f3d9290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f8111156111a95761119b82828888611f6e9190939291909392919063ffffffff16565b856080018194508281525050505b5f6010808516036111bd5760019050611215565b6020808516036111f0576111dc838888611f9b9290919263ffffffff16565b8161ffff1691508094508192505050611214565b611205838888611fba9290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561122f5761122e613707565b5b60405190808252806020026020018201604052801561126857816020015b611255613501565b81526020019060019003908161124d5790505b5085604001819052505f5f90505b81811015611582575f611294858a8a611fba9290919263ffffffff16565b8096508192505050600180821660ff16036113035730876040015183815181106112c1576112c0614458565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061136f565b611318858a8a611fd59290919263ffffffff16565b8860400151848151811061132f5761132e614458565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff16036113bd57611391858a8a6120069290919263ffffffff16565b886040015184815181106113a8576113a7614458565b5b60200260200101516020018197508281525050505b600480821660ff1603611485575f6113e0868b8b61201c9290919263ffffffff16565b8162ffffff16915080975081925050508989879083896114009190614425565b9261140d93929190614965565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508860400151848151811061146657611465614458565b5b60200260200101516040018190525080866114819190614425565b9550505b600880821660ff16036114d3576114a7858a8a6120069290919263ffffffff16565b886040015184815181106114be576114bd614458565b5b60200260200101516060018197508281525050505b601080821660ff1614876040015183815181106114f3576114f2614458565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061152957611528614458565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff168760400151838151811061156457611563614458565b5b602002602001015160c0018181525050508080600101915050611276565b505050505092915050565b5f61159783610bb0565b90508181146115e1578282826040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004016115d89392919061499f565b60405180910390fd5b5f6001830190506115f2848261203c565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f8818482604051611623929190614936565b60405180910390a150505050565b5f5f90505f82604001515190505f5f90505b81811015611959575f8460400151828151811061166357611662614458565b5b602002602001015190508060a00151801561167c575083155b156116c0577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b86836040516116b29291906148da565b60405180910390a15061194c565b5f93505f816060015190505f81141580156116da5750805a105b156117205785835a6040517f21395274000000000000000000000000000000000000000000000000000000008152600401611717939291906149d4565b60405180910390fd5b5f8260800151156117d5576117ce835f01515f841461173f5783611741565b5a5b634c4e814c60e01b8b8d898b8e606001518b6040015160405160240161176c96959493929190614a48565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612071565b90506117fd565b6117fa835f015184602001515f85146117ee57846117f0565b5a5b8660400151612086565b90505b8061190f575f60ff168360c001510361185e57600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d888561183f61209d565b60405161184e93929190614aae565b60405180910390a150505061194c565b600160ff168360c00151036118b557868461187761209d565b6040517f7f6b0bb10000000000000000000000000000000000000000000000000000000081526004016118ac93929190614aea565b60405180910390fd5b600260ff168360c001510361190e577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b88856118ef61209d565b6040516118fe93929190614aae565b60405180910390a1505050611959565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a88856040516119409291906148da565b60405180910390a15050505b8080600101915050611643565b505050505050565b5f5f1b810361199c576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119c87fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b826120bb565b7f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa816040516119f79190613d7b565b60405180910390a1611a287f0000000000000000000000000000000000000000000000000000000000000000610e8f565b50565b611a8f7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff165f1b6120c2565b7f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed18282604051611ac0929190614b2d565b60405180910390a15050565b5f5f611adc8360200151306120f7565b90505f611ae88461219b565b90508181604051602001611afd929190614bc8565b6040516020818303038152906040528051906020012092505050919050565b5f5f5f611b4b7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b85610e57565b5f1c9050606081901c816bffffffffffffffffffffffff169250925050915091565b5f3054905090565b5f5f5f5f5f5f5f611b868b8b611f27565b915060ff169150611b95613552565b6040808416148015611bd257505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611d0e57611bec828d8d611fd59290919263ffffffff16565b809350819a50505089611d0d575f611c0f838e8e61201c9290919263ffffffff16565b8162ffffff16915080945081925050505f8d8d85908487611c309190614425565b92611c3d93929190614965565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090508a73ffffffffffffffffffffffffffffffffffffffff1663ccce3bc830836040518363ffffffff1660e01b8152600401611cbc929190614bfe565b6040805180830381865afa158015611cd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cfa9190614ca1565b92508184611d089190614425565b935050505b5b600180841603611d4757611d358d8a838f8f87908092611d3093929190614965565b6123cf565b97509750975097509750505050611ea5565b6002808416148d60200190151590811515815250505f6002601c8516901c9050611d8383828f8f611f6e9190939291909392919063ffffffff16565b8094508197505050505f6001600560208616901c611da19190614425565b9050611dbf83828f8f611f6e9190939291909392919063ffffffff16565b809450819a50505050611dd18d611acc565b9350611def8d858e8e86908092611dea93929190614965565b612631565b8097508198505050611e0386895f1b6131a5565b9550611e1186865f1b6131a5565b9550611e35868a73ffffffffffffffffffffffffffffffffffffffff165f1b6131a5565b95505f5f1b815f015114158015611e4f575085815f015114155b8015611e5f575080602001518511155b15611ea157806040517fccbb534f000000000000000000000000000000000000000000000000000000008152600401611e989190614cf9565b60405180910390fd5b5050505b9550955095509550959050565b5f611ebc826131b9565b9050919050565b611f1c7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b846bffffffffffffffffffffffff841660608673ffffffffffffffffffffffffffffffffffffffff16901b175f1b6120c2565b505050565b80305550565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b61206d7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b835f1b6120c2565b5050565b5f5f5f8351602085018787f490509392505050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b8082555050565b5f83836040516020016120d69291906148b3565b60405160208183030381529060405280519060200120905081815550505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856121665746612168565b5f5b8560405160200161217d959493929190614d12565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016121b39190614def565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff160361224b575f6121e9846040015161325c565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a281856060015186608001518560405160200161222c959493929190614e05565b60405160208183030381529060405280519060200120925050506123ca565b600160ff16835f015160ff16036122ba577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a00151805190602001208260405160200161229c93929190614e56565b604051602081830303815290604052805190602001209150506123ca565b600260ff16835f015160ff1603612322577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c001518260405160200161230493929190614e56565b604051602081830303815290604052805190602001209150506123ca565b600360ff16835f015160ff160361238a577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e001518260405160200161236c93929190614e56565b604051602081830303815290604052805190602001209150506123ca565b825f01516040517f048183200000000000000000000000000000000000000000000000000000000081526004016123c19190614e9a565b60405180910390fd5b919050565b5f5f5f5f5f6123dc6134b6565b6002815f019060ff16908160ff16815250505f5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b898990508210156125c6575f5f612436848d8d61201c9290919263ffffffff16565b8162ffffff169150809550819250505083816124529190614425565b9150505f8b8b90508214612466575f612468565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036124c8576124af8f8d8d879086926124a793929190614965565b600185611b75565b809a50819b50829c50839d50849e5050505050506124f8565b6124e6858d8d879086926124de93929190614965565b600185611b75565b50809a50819b50829c50839d50505050505b89891015612553578b8b8590849261251293929190614965565b8b8b6040517fb006aba000000000000000000000000000000000000000000000000000000000815260040161254a9493929190614eb3565b60405180910390fd5b819350878d5f01510361256c575f5f1b8d5f0181815250505b8287106125b25786836040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004016125a9929190614936565b60405180910390fd5b878560c00181815250508692505050612414565b5f5f1b8b5f0151141580156125df57508a602001518511155b15612621578a6040517fccbb534f0000000000000000000000000000000000000000000000000000000081526004016126189190614cf9565b60405180910390fd5b5050509550955095509550959050565b5f5f5f5b8484905081101561319b575f612656828787611fba9290919263ffffffff16565b8160ff16915080935081925050505f600460f08316901c90505f81036127ae575f600f831690505f8160ff16036126a55761269c848989611fba9290919263ffffffff16565b80955081925050505b5f5f6126bc868b8b6132d69290919263ffffffff16565b80975081935050506126d9868b8b6132d69290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f8388866040515f815260200160405260405161273f9493929190614ef1565b6020604051602081039080840390855afa15801561275f573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612781828960ff166132ec565b90505f5f1b8c03612792578061279d565b61279c8c826131a5565b5b9b5050505050505050505050612635565b60018103612839575f600f831690505f8160ff16036127e5576127dc848989611fba9290919263ffffffff16565b80955081925050505b5f6127fb858a8a611fd59290919263ffffffff16565b80965081925050505f612811828460ff166132ec565b90505f5f1b8703612822578061282d565b61282c87826131a5565b5b96505050505050612635565b60028103612a38575f6003831690505f8160ff160361287057612867848989611fba9290919263ffffffff16565b80955081925050505b5f612886858a8a611fd59290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f6128bc87838d8d611f6e9190939291909392919063ffffffff16565b80985081925050505f81880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261292093929190614965565b6040518463ffffffff1660e01b815260040161293e93929190614f34565b602060405180830381865afa158015612959573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297d9190614f78565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146129f4578c848d8d8b9085926129b593929190614965565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016129eb9493929190614fa3565b60405180910390fd5b8097508460ff168a0199505f612a0d858760ff166132ec565b90505f5f1b8a03612a1e5780612a29565b612a288a826131a5565b5b99505050505050505050612635565b60038103612a82575f612a568489896132d69290919263ffffffff16565b80955081925050505f5f1b8503612a6d5780612a78565b612a7785826131a5565b5b9450505050612635565b60048103612b01575f600f831660ff1690505f612ab185838b8b611f6e9190939291909392919063ffffffff16565b80965081925050505f81860190505f5f612add8e8e8e8e8c908892612ad893929190614965565b612631565b91509150829750818a019950612af389826131a5565b985050505050505050612635565b60068103612c11575f6002600c841660ff16901c60ff1690505f8103612b4557612b36848989611fba9290919263ffffffff16565b8160ff16915080955081925050505b5f6003841660ff1690505f8103612b7b57612b6b858a8a611f9b9290919263ffffffff16565b8161ffff16915080965081925050505b5f612b91868b8b61201c9290919263ffffffff16565b8162ffffff16915080975081925050505f81870190505f5f612bc58f8f8f8f8d908892612bc093929190614965565b612631565b91509150829850848210612bd957858b019a505b5f612be582878961331e565b90505f5f1b8b03612bf65780612c01565b612c008b826131a5565b5b9a50505050505050505050612635565b60058103612c93575f612c2f8489896132d69290919263ffffffff16565b8095508192505050888103612c62577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b5f612c6c82613353565b90505f5f1b8603612c7d5780612c88565b612c8786826131a5565b5b955050505050612635565b60078103612df9575f600f831690505f8160ff1603612cca57612cc1848989611fba9290919263ffffffff16565b80955081925050505b5f5f612ce1868b8b6132d69290919263ffffffff16565b8097508193505050612cfe868b8b6132d69290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f604051602001612d55919061502b565b604051602081830303815290604052805190602001208388866040515f8152602001604052604051612d8a9493929190614ef1565b6020604051602081039080840390855afa158015612daa573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612dcc828960ff166132ec565b90505f5f1b8c03612ddd5780612de8565b612de78c826131a5565b5b9b5050505050505050505050612635565b60088103612e92575f612e178489896132d69290919263ffffffff16565b80955081925050505f612e335f8c61338290919063ffffffff16565b9050808203612e60577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b5f612e6a836133d3565b90505f5f1b8703612e7b5780612e86565b612e8587826131a5565b5b96505050505050612635565b60098103612ff8575f6003831690505f8160ff1603612ec957612ec0848989611fba9290919263ffffffff16565b80955081925050505b5f612edf858a8a611fd59290919263ffffffff16565b80965081925050505f5f6002600c871660ff16901c60ff169050612f1587828d8d611f6e9190939291909392919063ffffffff16565b8098508193505050505f81870190505f8373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612f5493929190614965565b6040518463ffffffff1660e01b8152600401612f7293929190615050565b602060405180830381865afa158015612f8d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fb19190615087565b90508197508460ff168a0199505f612fcd858760ff1684613402565b90505f5f1b8a03612fde5780612fe9565b612fe88a826131a5565b5b99505050505050505050612635565b600a810361315e575f6003831690505f8160ff160361302f57613026848989611fba9290919263ffffffff16565b80955081925050505b5f613045858a8a611fd59290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f61307b87838d8d611f6e9190939291909392919063ffffffff16565b80985081925050505f81880190505f8473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d9087926130b993929190614965565b6040518463ffffffff1660e01b81526004016130d793929190614f34565b602060405180830381865afa1580156130f2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131169190615087565b90508198508560ff168b019a505f613132868860ff1684613402565b90505f5f1b8b03613143578061314e565b61314d8b826131a5565b5b9a50505050505050505050612635565b806040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260040161319291906140b9565b60405180910390fd5b5094509492505050565b5f825f528160205260405f20905092915050565b5f3073ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000060405160200161322693929190615141565b604051602081830303815290604052805190602001205f1c73ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f60605f5f90505b83518110156132c5575f61329185838151811061328457613283614458565b5b6020026020010151613437565b905082816040516020016132a69291906151b8565b6040516020818303038152906040529250508080600101915050613264565b508080519060200120915050919050565b5f5f848301359150602083019050935093915050565b5f8282604051602001613300929190615249565b60405160208183030381529060405280519060200120905092915050565b5f838383604051602001613334939291906152c9565b6040516020818303038152906040528051906020012090509392505050565b5f81604051602001613365919061535a565b604051602081830303815290604052805190602001209050919050565b5f5f6133928460200151846120f7565b90505f61339e8561219b565b905081816040516020016133b3929190614bc8565b604051602081830303815290604052805190602001209250505092915050565b5f816040516020016133e591906153c9565b604051602081830303815290604052805190602001209050919050565b5f83838360405160200161341893929190615438565b6040516020818303038152906040528051906020012090509392505050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161349998979695949392919061547f565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b60405180604001604052805f81526020015f81525090565b5f82905092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f82821b905092915050565b5f6135b6838361356a565b826135c18135613574565b92506004821015613601576135fc7fffffffff000000000000000000000000000000000000000000000000000000008360040360080261359f565b831692505b505092915050565b5f81905092915050565b828183375f83830152505050565b5f61362c8385613609565b9350613639838584613613565b82840190509392505050565b5f613651828486613621565b91508190509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6136978261366e565b9050919050565b6136a78161368d565b81146136b1575f5ffd5b50565b5f813590506136c28161369e565b92915050565b5f602082840312156136dd576136dc613666565b5b5f6136ea848285016136b4565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61373d826136f7565b810181811067ffffffffffffffff8211171561375c5761375b613707565b5b80604052505050565b5f61376e61365d565b905061377a8282613734565b919050565b5f5ffd5b5f60ff82169050919050565b61379881613783565b81146137a2575f5ffd5b50565b5f813590506137b38161378f565b92915050565b5f8115159050919050565b6137cd816137b9565b81146137d7575f5ffd5b50565b5f813590506137e8816137c4565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561380c5761380b613707565b5b602082029050602081019050919050565b5f5ffd5b5f819050919050565b61383381613821565b811461383d575f5ffd5b50565b5f8135905061384e8161382a565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561387257613871613707565b5b61387b826136f7565b9050602081019050919050565b5f61389a61389584613858565b613765565b9050828152602081018484840111156138b6576138b5613854565b5b6138c1848285613613565b509392505050565b5f82601f8301126138dd576138dc6137ee565b5b81356138ed848260208601613888565b91505092915050565b5f60e0828403121561390b5761390a6136f3565b5b61391560e0613765565b90505f613924848285016136b4565b5f83015250602061393784828501613840565b602083015250604082013567ffffffffffffffff81111561395b5761395a61377f565b5b613967848285016138c9565b604083015250606061397b84828501613840565b606083015250608061398f848285016137da565b60808301525060a06139a3848285016137da565b60a08301525060c06139b784828501613840565b60c08301525092915050565b5f6139d56139d0846137f2565b613765565b905080838252602082019050602084028301858111156139f8576139f761381d565b5b835b81811015613a3f57803567ffffffffffffffff811115613a1d57613a1c6137ee565b5b808601613a2a89826138f6565b855260208501945050506020810190506139fa565b5050509392505050565b5f82601f830112613a5d57613a5c6137ee565b5b8135613a6d8482602086016139c3565b91505092915050565b5f819050919050565b613a8881613a76565b8114613a92575f5ffd5b50565b5f81359050613aa381613a7f565b92915050565b5f67ffffffffffffffff821115613ac357613ac2613707565b5b602082029050602081019050919050565b5f613ae6613ae184613aa9565b613765565b90508083825260208201905060208402830185811115613b0957613b0861381d565b5b835b81811015613b325780613b1e88826136b4565b845260208401935050602081019050613b0b565b5050509392505050565b5f82601f830112613b5057613b4f6137ee565b5b8135613b60848260208601613ad4565b91505092915050565b5f6101208284031215613b7f57613b7e6136f3565b5b613b8a610120613765565b90505f613b99848285016137a5565b5f830152506020613bac848285016137da565b602083015250604082013567ffffffffffffffff811115613bd057613bcf61377f565b5b613bdc84828501613a49565b6040830152506060613bf084828501613840565b6060830152506080613c0484828501613840565b60808301525060a082013567ffffffffffffffff811115613c2857613c2761377f565b5b613c34848285016138c9565b60a08301525060c0613c4884828501613a95565b60c08301525060e0613c5c84828501613a95565b60e08301525061010082013567ffffffffffffffff811115613c8157613c8061377f565b5b613c8d84828501613b3c565b6101008301525092915050565b5f5ffd5b5f5f83601f840112613cb357613cb26137ee565b5b8235905067ffffffffffffffff811115613cd057613ccf613c9a565b5b602083019150836001820283011115613cec57613ceb61381d565b5b9250929050565b5f5f5f60408486031215613d0a57613d09613666565b5b5f84013567ffffffffffffffff811115613d2757613d2661366a565b5b613d3386828701613b69565b935050602084013567ffffffffffffffff811115613d5457613d5361366a565b5b613d6086828701613c9e565b92509250509250925092565b613d7581613a76565b82525050565b5f602082019050613d8e5f830184613d6c565b92915050565b5f5f5f5f5f60808688031215613dad57613dac613666565b5b5f613dba888289016136b4565b9550506020613dcb888289016136b4565b9450506040613ddc88828901613840565b935050606086013567ffffffffffffffff811115613dfd57613dfc61366a565b5b613e0988828901613c9e565b92509250509295509295909350565b613e2181613574565b82525050565b5f602082019050613e3a5f830184613e18565b92915050565b5f5f5f60408486031215613e5757613e56613666565b5b5f613e6486828701613a95565b935050602084013567ffffffffffffffff811115613e8557613e8461366a565b5b613e9186828701613c9e565b92509250509250925092565b613ea681613574565b8114613eb0575f5ffd5b50565b5f81359050613ec181613e9d565b92915050565b5f60208284031215613edc57613edb613666565b5b5f613ee984828501613eb3565b91505092915050565b613efb8161368d565b82525050565b5f602082019050613f145f830184613ef2565b92915050565b5f5f5f5f60408587031215613f3257613f31613666565b5b5f85013567ffffffffffffffff811115613f4f57613f4e61366a565b5b613f5b87828801613c9e565b9450945050602085013567ffffffffffffffff811115613f7e57613f7d61366a565b5b613f8a87828801613c9e565b925092505092959194509250565b5f60208284031215613fad57613fac613666565b5b5f613fba84828501613a95565b91505092915050565b5f5f60208385031215613fd957613fd8613666565b5b5f83013567ffffffffffffffff811115613ff657613ff561366a565b5b61400285828601613c9e565b92509250509250929050565b5f5f5f5f6060858703121561402657614025613666565b5b5f614033878288016136b4565b945050602061404487828801613840565b935050604085013567ffffffffffffffff8111156140655761406461366a565b5b61407187828801613c9e565b925092505092959194509250565b5f6020828403121561409457614093613666565b5b5f6140a184828501613840565b91505092915050565b6140b381613821565b82525050565b5f6020820190506140cc5f8301846140aa565b92915050565b5f6040820190506140e55f830185613ef2565b6140f260208301846140aa565b9392505050565b614102816137b9565b82525050565b5f60c08201905061411b5f8301896140aa565b61412860208301886140aa565b61413560408301876140f9565b6141426060830186613d6c565b61414f60808301856140aa565b61415c60a0830184613d6c565b979650505050505050565b5f5f6040838503121561417d5761417c613666565b5b5f61418a85828601613eb3565b925050602061419b858286016136b4565b9150509250929050565b5f5f83601f8401126141ba576141b96137ee565b5b8235905067ffffffffffffffff8111156141d7576141d6613c9a565b5b6020830191508360208202830111156141f3576141f261381d565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b03121561421657614215613666565b5b5f6142238b828c016136b4565b98505060206142348b828c016136b4565b975050604089013567ffffffffffffffff8111156142555761425461366a565b5b6142618b828c016141a5565b9650965050606089013567ffffffffffffffff8111156142845761428361366a565b5b6142908b828c016141a5565b9450945050608089013567ffffffffffffffff8111156142b3576142b261366a565b5b6142bf8b828c01613c9e565b92509250509295985092959890939650565b5f5f5f5f5f5f60a087890312156142eb576142ea613666565b5b5f6142f889828a016136b4565b965050602061430989828a016136b4565b955050604061431a89828a01613840565b945050606061432b89828a01613840565b935050608087013567ffffffffffffffff81111561434c5761434b61366a565b5b61435889828a01613c9e565b92509250509295509295509295565b5f6bffffffffffffffffffffffff82169050919050565b61438781614367565b8114614391575f5ffd5b50565b5f813590506143a28161437e565b92915050565b5f5f5f606084860312156143bf576143be613666565b5b5f6143cc86828701613a95565b93505060206143dd868287016136b4565b92505060406143ee86828701614394565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61442f82613821565b915061443a83613821565b9250828201905080821115614452576144516143f8565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61448e81613783565b82525050565b61449d816137b9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6144d58161368d565b82525050565b6144e481613821565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61451c826144ea565b61452681856144f4565b9350614536818560208601614504565b61453f816136f7565b840191505092915050565b5f60e083015f83015161455f5f8601826144cc565b50602083015161457260208601826144db565b506040830151848203604086015261458a8282614512565b915050606083015161459f60608601826144db565b5060808301516145b26080860182614494565b5060a08301516145c560a0860182614494565b5060c08301516145d860c08601826144db565b508091505092915050565b5f6145ee838361454a565b905092915050565b5f602082019050919050565b5f61460c826144a3565b61461681856144ad565b935083602082028501614628856144bd565b805f5b85811015614663578484038952815161464485826145e3565b945061464f836145f6565b925060208a0199505060018101905061462b565b50829750879550505050505092915050565b61467e81613a76565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6146b883836144cc565b60208301905092915050565b5f602082019050919050565b5f6146da82614684565b6146e4818561468e565b93506146ef8361469e565b805f5b8381101561471f57815161470688826146ad565b9750614711836146c4565b9250506001810190506146f2565b5085935050505092915050565b5f61012083015f8301516147425f860182614485565b5060208301516147556020860182614494565b506040830151848203604086015261476d8282614602565b915050606083015161478260608601826144db565b50608083015161479560808601826144db565b5060a083015184820360a08601526147ad8282614512565b91505060c08301516147c260c0860182614675565b5060e08301516147d560e0860182614675565b506101008301518482036101008601526147ef82826146d0565b9150508091505092915050565b5f82825260208201905092915050565b5f61481783856147fc565b9350614824838584613613565b61482d836136f7565b840190509392505050565b5f6040820190508181035f830152614850818661472c565b9050818103602083015261486581848661480c565b9050949350505050565b61487881614367565b82525050565b5f6060820190506148915f830186613d6c565b61489e6020830185613ef2565b6148ab604083018461486f565b949350505050565b5f6040820190506148c65f830185613d6c565b6148d36020830184613d6c565b9392505050565b5f6040820190506148ed5f830185613d6c565b6148fa60208301846140aa565b9392505050565b5f6060820190506149145f830186613d6c565b6149216020830185613ef2565b61492e6040830184613ef2565b949350505050565b5f6040820190506149495f8301856140aa565b61495660208301846140aa565b9392505050565b5f5ffd5b5f5ffd5b5f5f858511156149785761497761495d565b5b8386111561498957614988614961565b5b6001850283019150848603905094509492505050565b5f6060820190506149b25f8301866140aa565b6149bf60208301856140aa565b6149cc60408301846140aa565b949350505050565b5f6060820190508181035f8301526149ec818661472c565b90506149fb60208301856140aa565b614a0860408301846140aa565b949350505050565b5f614a1a826144ea565b614a2481856147fc565b9350614a34818560208601614504565b614a3d816136f7565b840191505092915050565b5f60c082019050614a5b5f830189613d6c565b614a6860208301886140aa565b614a7560408301876140aa565b614a8260608301866140aa565b614a8f60808301856140aa565b81810360a0830152614aa18184614a10565b9050979650505050505050565b5f606082019050614ac15f830186613d6c565b614ace60208301856140aa565b8181036040830152614ae08184614a10565b9050949350505050565b5f6060820190508181035f830152614b02818661472c565b9050614b1160208301856140aa565b8181036040830152614b238184614a10565b9050949350505050565b5f604082019050614b405f830185613e18565b614b4d6020830184613ef2565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614b92600283614b54565b9150614b9d82614b5e565b600282019050919050565b5f819050919050565b614bc2614bbd82613a76565b614ba8565b82525050565b5f614bd282614b86565b9150614bde8285614bb1565b602082019150614bee8284614bb1565b6020820191508190509392505050565b5f604082019050614c115f830185613ef2565b8181036020830152614c238184614a10565b90509392505050565b5f81519050614c3a81613a7f565b92915050565b5f81519050614c4e8161382a565b92915050565b5f60408284031215614c6957614c686136f3565b5b614c736040613765565b90505f614c8284828501614c2c565b5f830152506020614c9584828501614c40565b60208301525092915050565b5f60408284031215614cb657614cb5613666565b5b5f614cc384828501614c54565b91505092915050565b604082015f820151614ce05f850182614675565b506020820151614cf360208501826144db565b50505050565b5f604082019050614d0c5f830184614ccc565b92915050565b5f60a082019050614d255f830188613d6c565b614d326020830187613d6c565b614d3f6040830186613d6c565b614d4c60608301856140aa565b614d596080830184613ef2565b9695505050505050565b5f81905092915050565b614d768161368d565b82525050565b5f614d878383614d6d565b60208301905092915050565b5f614d9d82614684565b614da78185614d63565b9350614db28361469e565b805f5b83811015614de2578151614dc98882614d7c565b9750614dd4836146c4565b925050600181019050614db5565b5085935050505092915050565b5f614dfa8284614d93565b915081905092915050565b5f60a082019050614e185f830188613d6c565b614e256020830187613d6c565b614e3260408301866140aa565b614e3f60608301856140aa565b614e4c6080830184613d6c565b9695505050505050565b5f606082019050614e695f830186613d6c565b614e766020830185613d6c565b614e836040830184613d6c565b949350505050565b614e9481613783565b82525050565b5f602082019050614ead5f830184614e8b565b92915050565b5f6060820190508181035f830152614ecc81868861480c565b9050614edb60208301856140aa565b614ee860408301846140aa565b95945050505050565b5f608082019050614f045f830187613d6c565b614f116020830186614e8b565b614f1e6040830185613d6c565b614f2b6060830184613d6c565b95945050505050565b5f604082019050614f475f830186613d6c565b8181036020830152614f5a81848661480c565b9050949350505050565b5f81519050614f7281613e9d565b92915050565b5f60208284031215614f8d57614f8c613666565b5b5f614f9a84828501614f64565b91505092915050565b5f606082019050614fb65f830187613d6c565b614fc36020830186613ef2565b8181036040830152614fd681848661480c565b905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f82015250565b5f615015601c83614b54565b915061502082614fe1565b601c82019050919050565b5f61503582615009565b91506150418284614bb1565b60208201915081905092915050565b5f6040820190508181035f830152615068818661472c565b9050818103602083015261507d81848661480c565b9050949350505050565b5f6020828403121561509c5761509b613666565b5b5f6150a984828501614c2c565b91505092915050565b7fff000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6150e6600183614b54565b91506150f1826150b2565b600182019050919050565b5f8160601b9050919050565b5f615112826150fc565b9050919050565b5f61512382615108565b9050919050565b61513b6151368261368d565b615119565b82525050565b5f61514b826150da565b9150615157828661512a565b6014820191506151678285614bb1565b6020820191506151778284614bb1565b602082019150819050949350505050565b5f615192826144ea565b61519c8185613609565b93506151ac818560208601614504565b80840191505092915050565b5f6151c38285615188565b91506151cf8284614bb1565b6020820191508190509392505050565b7f53657175656e6365207369676e65723a0a0000000000000000000000000000005f82015250565b5f615213601183614b54565b915061521e826151df565b601182019050919050565b5f819050919050565b61524361523e82613821565b615229565b82525050565b5f61525382615207565b915061525f828561512a565b60148201915061526f8284615232565b6020820191508190509392505050565b7f53657175656e6365206e657374656420636f6e6669673a0a00000000000000005f82015250565b5f6152b3601883614b54565b91506152be8261527f565b601882019050919050565b5f6152d3826152a7565b91506152df8286614bb1565b6020820191506152ef8285615232565b6020820191506152ff8284615232565b602082019150819050949350505050565b7f53657175656e636520737461746963206469676573743a0a00000000000000005f82015250565b5f615344601883614b54565b915061534f82615310565b601882019050919050565b5f61536482615338565b91506153708284614bb1565b60208201915081905092915050565b7f53657175656e636520616e792061646472657373207375626469676573743a0a5f82015250565b5f6153b3602083614b54565b91506153be8261537f565b602082019050919050565b5f6153d3826153a7565b91506153df8284614bb1565b60208201915081905092915050565b7f53657175656e63652073617069656e7420636f6e6669673a0a000000000000005f82015250565b5f615422601983614b54565b915061542d826153ee565b601982019050919050565b5f61544282615416565b915061544e828661512a565b60148201915061545e8285615232565b60208201915061546e8284614bb1565b602082019150819050949350505050565b5f610100820190506154935f83018b613d6c565b6154a0602083018a613ef2565b6154ad60408301896140aa565b6154ba6060830188613d6c565b6154c760808301876140aa565b6154d460a08301866140f9565b6154e160c08301856140f9565b6154ee60e08301846140aa565b999850505050505050505056fea26469706673582212203719e46a9a86dab24a35db4a3d94c62713d15f05ffd1a322e60a2ef3b78ffbf964736f6c634300081c00336080604052348015600e575f5ffd5b5061537c8061001c5f395ff3fe608060405260043610610117575f3560e01c80636ea445771161009f578063ad55366b11610063578063ad55366b14610475578063b93ea7ad146104b6578063bc197c81146104d2578063f23a6e611461050e578063f727ef1c1461054a5761011e565b80636ea445771461038e5780638943ec02146103aa5780638c3f5563146103d257806392dcb3fc1461040e578063aaf10f421461044b5761011e565b80631a9b2337116100e65780631a9b2337146102c85780631f6a1eb91461030457806329561426146103205780634fcf3eca1461034857806351605d80146103645761011e565b8063025b22bc146101f857806313792a4a14610214578063150b7a02146102505780631626ba7e1461028c5761011e565b3661011e57005b60045f369050106101f6575f61013f5f369061013a9190613487565b610572565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146101f4575f5f8273ffffffffffffffffffffffffffffffffffffffff165f3660405161019d929190613521565b5f60405180830381855af49150503d805f81146101d5576040519150601f19603f3d011682016040523d82523d5f602084013e6101da565b606091505b5091509150816101ec57805160208201fd5b805160208201f35b505b005b610212600480360381019061020d91906135a4565b6105c7565b005b34801561021f575f5ffd5b5061023a60048036038101906102359190613bcf565b610643565b6040516102479190613c57565b60405180910390f35b34801561025b575f5ffd5b5061027660048036038101906102719190613c70565b6107f2565b6040516102839190613d03565b60405180910390f35b348015610297575f5ffd5b506102b260048036038101906102ad9190613d1c565b610806565b6040516102bf9190613d03565b60405180910390f35b3480156102d3575f5ffd5b506102ee60048036038101906102e99190613da3565b610848565b6040516102fb9190613ddd565b60405180910390f35b61031e60048036038101906103199190613df6565b610859565b005b34801561032b575f5ffd5b5061034660048036038101906103419190613e74565b6108e8565b005b610362600480360381019061035d9190613da3565b610964565b005b34801561036f575f5ffd5b50610378610a59565b6040516103859190613c57565b60405180910390f35b6103a860048036038101906103a39190613e9f565b610a8a565b005b3480156103b5575f5ffd5b506103d060048036038101906103cb9190613eea565b610b29565b005b3480156103dd575f5ffd5b506103f860048036038101906103f39190613f5b565b610b2f565b6040516104059190613f95565b60405180910390f35b348015610419575f5ffd5b50610434600480360381019061042f9190613e74565b610b67565b604051610442929190613fae565b60405180910390f35b348015610456575f5ffd5b5061045f610b7b565b60405161046c9190613ddd565b60405180910390f35b348015610480575f5ffd5b5061049b60048036038101906104969190613bcf565b610b89565b6040516104ad96959493929190613fe4565b60405180910390f35b6104d060048036038101906104cb9190614043565b610bc7565b005b3480156104dd575f5ffd5b506104f860048036038101906104f391906140d6565b610cbd565b6040516105059190613d03565b60405180910390f35b348015610519575f5ffd5b50610534600480360381019061052f91906141ad565b610cd4565b6040516105419190613d03565b60405180910390f35b348015610555575f5ffd5b50610570600480360381019061056b9190614284565b610ce9565b005b5f6105be7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610db2565b5f1c9050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461063757336040517fa19dbf0000000000000000000000000000000000000000000000000000000000815260040161062e9190613ddd565b60405180910390fd5b61064081610dea565b50565b5f5f6001856101000151516106589190614301565b67ffffffffffffffff811115610671576106706135e3565b5b60405190808252806020026020018201604052801561069f5781602001602082028036833780820191505090505b5090505f5f90505b8561010001515181101561072f5785610100015181815181106106cd576106cc614334565b5b60200260200101518282815181106106e8576106e7614334565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506106a7565b503381866101000151518151811061074a57610749614334565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808561010001819052505f61079a868686610e2d565b509050806107e3578585856040517ff58cc8b50000000000000000000000000000000000000000000000000000000081526004016107da93929190614714565b60405180910390fd5b60015f1b925050509392505050565b5f63150b7a0260e01b905095945050505050565b5f5f6108118561101d565b90505f61081f828686610e2d565b50905080610834575f60e01b92505050610841565b6320c13b0b60e01b925050505b9392505050565b5f61085282610572565b9050919050565b5f5a90505f6108688686611046565b905061087c816060015182608001516114e8565b5f5f610889838787610e2d565b91509150816108d3578286866040517fa2b6d61b0000000000000000000000000000000000000000000000000000000081526004016108ca93929190614714565b60405180910390fd5b6108de84828561158c565b5050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461095857336040517fa19dbf0000000000000000000000000000000000000000000000000000000000815260040161094f9190613ddd565b60405180910390fd5b610961816118bc565b50565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d457336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016109cb9190613ddd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff166109f482610572565b73ffffffffffffffffffffffffffffffffffffffff1603610a4c57806040517f1c3812cc000000000000000000000000000000000000000000000000000000008152600401610a439190613d03565b60405180910390fd5b610a56815f61195d565b50565b5f610a857fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b6119fe565b905090565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610afa57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610af19190613ddd565b60405180910390fd5b5f5a90505f610b098484611046565b90505f610b1582611a08565b9050610b2283828461158c565b5050505050565b50505050565b5f610b5e7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b610db2565b5f1c9050919050565b5f5f610b7283611a58565b91509150915091565b5f610b84611aa9565b905090565b5f5f5f5f5f5f610b9c8989895f5f611ab1565b809550819650829750839950849a505050505050610bb983611dee565b935093975093979195509350565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c3757336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610c2e9190613ddd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610c5783610572565b73ffffffffffffffffffffffffffffffffffffffff1614610caf57816040517f5b4d6d6a000000000000000000000000000000000000000000000000000000008152600401610ca69190613d03565b60405180910390fd5b610cb9828261195d565b5050565b5f63bc197c8160e01b905098975050505050505050565b5f63f23a6e6160e01b90509695505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5957336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610d509190613ddd565b60405180910390fd5b610d728383836bffffffffffffffffffffffff16611dff565b7febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b1838383604051610da59392919061475a565b60405180910390a1505050565b5f5f8383604051602001610dc792919061478f565b604051602081830303815290604052805190602001209050805491505092915050565b610df381611e5d565b7f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca0381604051610e229190613ddd565b60405180910390a150565b5f5f5f84845f818110610e4357610e42614334565b5b9050013560f81c60f81b9050608060f81b608060f81b82167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f9c57610e8b86611a08565b91505f5f610e9884611a58565b91509150428111610ee25783816040517ff95b6ab7000000000000000000000000000000000000000000000000000000008152600401610ed99291906147b6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f4a57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610f90578333836040517f8945c313000000000000000000000000000000000000000000000000000000008152600401610f87939291906147dd565b60405180910390fd5b60019450505050611015565b5f5f5f610fac8989895f5f611ab1565b905080985081945082955083965050505050828210156110055782826040517ffd41fcba000000000000000000000000000000000000000000000000000000008152600401610ffc929190614812565b60405180910390fd5b61100e81611dee565b9550505050505b935093915050565b611025613392565b6003815f019060ff16908160ff1681525050818160e0018181525050919050565b61104e613392565b5f815f019060ff16908160ff16815250505f5f61106b8585611e63565b915060ff16915060018083160361108b575f8360600181815250506110c7565b6110a0818686611e799290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f811115611104576110f682828888611eaa9190939291909392919063ffffffff16565b856080018194508281525050505b5f6010808516036111185760019050611170565b60208085160361114b57611137838888611ed79290919263ffffffff16565b8161ffff169150809450819250505061116f565b611160838888611ef69290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561118a576111896135e3565b5b6040519080825280602002602001820160405280156111c357816020015b6111b06133dd565b8152602001906001900390816111a85790505b5085604001819052505f5f90505b818110156114dd575f6111ef858a8a611ef69290919263ffffffff16565b8096508192505050600180821660ff160361125e57308760400151838151811061121c5761121b614334565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506112ca565b611273858a8a611f119290919263ffffffff16565b8860400151848151811061128a57611289614334565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff1603611318576112ec858a8a611f429290919263ffffffff16565b8860400151848151811061130357611302614334565b5b60200260200101516020018197508281525050505b600480821660ff16036113e0575f61133b868b8b611f589290919263ffffffff16565b8162ffffff169150809750819250505089898790838961135b9190614301565b9261136893929190614841565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050886040015184815181106113c1576113c0614334565b5b60200260200101516040018190525080866113dc9190614301565b9550505b600880821660ff160361142e57611402858a8a611f429290919263ffffffff16565b8860400151848151811061141957611418614334565b5b60200260200101516060018197508281525050505b601080821660ff16148760400151838151811061144e5761144d614334565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061148457611483614334565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff16876040015183815181106114bf576114be614334565b5b602002602001015160c00181815250505080806001019150506111d1565b505050505092915050565b5f6114f283610b2f565b905081811461153c578282826040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004016115339392919061487b565b60405180910390fd5b5f60018301905061154d8482611f78565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881848260405161157e929190614812565b60405180910390a150505050565b5f5f90505f82604001515190505f5f90505b818110156118b4575f846040015182815181106115be576115bd614334565b5b602002602001015190508060a0015180156115d7575083155b1561161b577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b868360405161160d9291906147b6565b60405180910390a1506118a7565b5f93505f816060015190505f81141580156116355750805a105b1561167b5785835a6040517f21395274000000000000000000000000000000000000000000000000000000008152600401611672939291906148b0565b60405180910390fd5b5f82608001511561173057611729835f01515f841461169a578361169c565b5a5b634c4e814c60e01b8b8d898b8e606001518b604001516040516024016116c796959493929190614924565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fad565b9050611758565b611755835f015184602001515f8514611749578461174b565b5a5b8660400151611fc2565b90505b8061186a575f60ff168360c00151036117b957600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d888561179a611fd9565b6040516117a99392919061498a565b60405180910390a15050506118a7565b600160ff168360c00151036118105786846117d2611fd9565b6040517f7f6b0bb1000000000000000000000000000000000000000000000000000000008152600401611807939291906149c6565b60405180910390fd5b600260ff168360c0015103611869577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b888561184a611fd9565b6040516118599392919061498a565b60405180910390a15050506118b4565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a888560405161189b9291906147b6565b60405180910390a15050505b808060010191505061159e565b505050505050565b5f5f1b81036118f7576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119237fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b82611ff7565b7f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa816040516119529190613c57565b60405180910390a150565b6119c17fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff165f1b611ffe565b7f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed182826040516119f2929190614a09565b60405180910390a15050565b5f81549050919050565b5f5f611a18836020015130612033565b90505f611a24846120d7565b90508181604051602001611a39929190614aa4565b6040516020818303038152906040528051906020012092505050919050565b5f5f5f611a877fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b85610db2565b5f1c9050606081901c816bffffffffffffffffffffffff169250925050915091565b5f3054905090565b5f5f5f5f5f5f5f611ac28b8b611e63565b915060ff169150611ad161342e565b6040808416148015611b0e57505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611c4a57611b28828d8d611f119290919263ffffffff16565b809350819a50505089611c49575f611b4b838e8e611f589290919263ffffffff16565b8162ffffff16915080945081925050505f8d8d85908487611b6c9190614301565b92611b7993929190614841565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090508a73ffffffffffffffffffffffffffffffffffffffff1663ccce3bc830836040518363ffffffff1660e01b8152600401611bf8929190614ada565b6040805180830381865afa158015611c12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c369190614b7d565b92508184611c449190614301565b935050505b5b600180841603611c8357611c718d8a838f8f87908092611c6c93929190614841565b61230b565b97509750975097509750505050611de1565b6002808416148d60200190151590811515815250505f6002601c8516901c9050611cbf83828f8f611eaa9190939291909392919063ffffffff16565b8094508197505050505f6001600560208616901c611cdd9190614301565b9050611cfb83828f8f611eaa9190939291909392919063ffffffff16565b809450819a50505050611d0d8d611a08565b9350611d2b8d858e8e86908092611d2693929190614841565b61256d565b8097508198505050611d3f86895f1b6130e1565b9550611d4d86865f1b6130e1565b9550611d71868a73ffffffffffffffffffffffffffffffffffffffff165f1b6130e1565b95505f5f1b815f015114158015611d8b575085815f015114155b8015611d9b575080602001518511155b15611ddd57806040517fccbb534f000000000000000000000000000000000000000000000000000000008152600401611dd49190614bd5565b60405180910390fd5b5050505b9550955095509550959050565b5f611df8826130f5565b9050919050565b611e587fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b846bffffffffffffffffffffffff841660608673ffffffffffffffffffffffffffffffffffffffff16901b175f1b611ffe565b505050565b80305550565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b611fa97f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b835f1b611ffe565b5050565b5f5f5f8351602085018787f490509392505050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b8082555050565b5f838360405160200161201292919061478f565b60405160208183030381529060405280519060200120905081815550505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856120a257466120a4565b5f5b856040516020016120b9959493929190614bee565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016120ef9190614ccb565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff1603612187575f6121258460400151613138565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2818560600151866080015185604051602001612168959493929190614ce1565b6040516020818303038152906040528051906020012092505050612306565b600160ff16835f015160ff16036121f6577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a0015180519060200120826040516020016121d893929190614d32565b60405160208183030381529060405280519060200120915050612306565b600260ff16835f015160ff160361225e577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c001518260405160200161224093929190614d32565b60405160208183030381529060405280519060200120915050612306565b600360ff16835f015160ff16036122c6577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e00151826040516020016122a893929190614d32565b60405160208183030381529060405280519060200120915050612306565b825f01516040517f048183200000000000000000000000000000000000000000000000000000000081526004016122fd9190614d76565b60405180910390fd5b919050565b5f5f5f5f5f612318613392565b6002815f019060ff16908160ff16815250505f5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b89899050821015612502575f5f612372848d8d611f589290919263ffffffff16565b8162ffffff1691508095508192505050838161238e9190614301565b9150505f8b8b905082146123a2575f6123a4565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303612404576123eb8f8d8d879086926123e393929190614841565b600185611ab1565b809a50819b50829c50839d50849e505050505050612434565b612422858d8d8790869261241a93929190614841565b600185611ab1565b50809a50819b50829c50839d50505050505b8989101561248f578b8b8590849261244e93929190614841565b8b8b6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016124869493929190614d8f565b60405180910390fd5b819350878d5f0151036124a8575f5f1b8d5f0181815250505b8287106124ee5786836040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004016124e5929190614812565b60405180910390fd5b878560c00181815250508692505050612350565b5f5f1b8b5f01511415801561251b57508a602001518511155b1561255d578a6040517fccbb534f0000000000000000000000000000000000000000000000000000000081526004016125549190614bd5565b60405180910390fd5b5050509550955095509550959050565b5f5f5f5b848490508110156130d7575f612592828787611ef69290919263ffffffff16565b8160ff16915080935081925050505f600460f08316901c90505f81036126ea575f600f831690505f8160ff16036125e1576125d8848989611ef69290919263ffffffff16565b80955081925050505b5f5f6125f8868b8b6131b29290919263ffffffff16565b8097508193505050612615868b8b6131b29290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f8388866040515f815260200160405260405161267b9493929190614dcd565b6020604051602081039080840390855afa15801561269b573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f6126bd828960ff166131c8565b90505f5f1b8c036126ce57806126d9565b6126d88c826130e1565b5b9b5050505050505050505050612571565b60018103612775575f600f831690505f8160ff160361272157612718848989611ef69290919263ffffffff16565b80955081925050505b5f612737858a8a611f119290919263ffffffff16565b80965081925050505f61274d828460ff166131c8565b90505f5f1b870361275e5780612769565b61276887826130e1565b5b96505050505050612571565b60028103612974575f6003831690505f8160ff16036127ac576127a3848989611ef69290919263ffffffff16565b80955081925050505b5f6127c2858a8a611f119290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f6127f887838d8d611eaa9190939291909392919063ffffffff16565b80985081925050505f81880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261285c93929190614841565b6040518463ffffffff1660e01b815260040161287a93929190614e10565b602060405180830381865afa158015612895573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b99190614e54565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612930578c848d8d8b9085926128f193929190614841565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016129279493929190614e7f565b60405180910390fd5b8097508460ff168a0199505f612949858760ff166131c8565b90505f5f1b8a0361295a5780612965565b6129648a826130e1565b5b99505050505050505050612571565b600381036129be575f6129928489896131b29290919263ffffffff16565b80955081925050505f5f1b85036129a957806129b4565b6129b385826130e1565b5b9450505050612571565b60048103612a3d575f600f831660ff1690505f6129ed85838b8b611eaa9190939291909392919063ffffffff16565b80965081925050505f81860190505f5f612a198e8e8e8e8c908892612a1493929190614841565b61256d565b91509150829750818a019950612a2f89826130e1565b985050505050505050612571565b60068103612b4d575f6002600c841660ff16901c60ff1690505f8103612a8157612a72848989611ef69290919263ffffffff16565b8160ff16915080955081925050505b5f6003841660ff1690505f8103612ab757612aa7858a8a611ed79290919263ffffffff16565b8161ffff16915080965081925050505b5f612acd868b8b611f589290919263ffffffff16565b8162ffffff16915080975081925050505f81870190505f5f612b018f8f8f8f8d908892612afc93929190614841565b61256d565b91509150829850848210612b1557858b019a505b5f612b218287896131fa565b90505f5f1b8b03612b325780612b3d565b612b3c8b826130e1565b5b9a50505050505050505050612571565b60058103612bcf575f612b6b8489896131b29290919263ffffffff16565b8095508192505050888103612b9e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b5f612ba88261322f565b90505f5f1b8603612bb95780612bc4565b612bc386826130e1565b5b955050505050612571565b60078103612d35575f600f831690505f8160ff1603612c0657612bfd848989611ef69290919263ffffffff16565b80955081925050505b5f5f612c1d868b8b6131b29290919263ffffffff16565b8097508193505050612c3a868b8b6131b29290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f604051602001612c919190614f07565b604051602081830303815290604052805190602001208388866040515f8152602001604052604051612cc69493929190614dcd565b6020604051602081039080840390855afa158015612ce6573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612d08828960ff166131c8565b90505f5f1b8c03612d195780612d24565b612d238c826130e1565b5b9b5050505050505050505050612571565b60088103612dce575f612d538489896131b29290919263ffffffff16565b80955081925050505f612d6f5f8c61325e90919063ffffffff16565b9050808203612d9c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b5f612da6836132af565b90505f5f1b8703612db75780612dc2565b612dc187826130e1565b5b96505050505050612571565b60098103612f34575f6003831690505f8160ff1603612e0557612dfc848989611ef69290919263ffffffff16565b80955081925050505b5f612e1b858a8a611f119290919263ffffffff16565b80965081925050505f5f6002600c871660ff16901c60ff169050612e5187828d8d611eaa9190939291909392919063ffffffff16565b8098508193505050505f81870190505f8373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612e9093929190614841565b6040518463ffffffff1660e01b8152600401612eae93929190614f2c565b602060405180830381865afa158015612ec9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eed9190614f63565b90508197508460ff168a0199505f612f09858760ff16846132de565b90505f5f1b8a03612f1a5780612f25565b612f248a826130e1565b5b99505050505050505050612571565b600a810361309a575f6003831690505f8160ff1603612f6b57612f62848989611ef69290919263ffffffff16565b80955081925050505b5f612f81858a8a611f119290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f612fb787838d8d611eaa9190939291909392919063ffffffff16565b80985081925050505f81880190505f8473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d908792612ff593929190614841565b6040518463ffffffff1660e01b815260040161301393929190614e10565b602060405180830381865afa15801561302e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130529190614f63565b90508198508560ff168b019a505f61306e868860ff16846132de565b90505f5f1b8b0361307f578061308a565b6130898b826130e1565b5b9a50505050505050505050612571565b806040517fb2505f7c0000000000000000000000000000000000000000000000000000000081526004016130ce9190613f95565b60405180910390fd5b5094509492505050565b5f825f528160205260405f20905092915050565b5f5f5f1b8214158015613131575061312e7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b6119fe565b82145b9050919050565b5f60605f5f90505b83518110156131a1575f61316d8583815181106131605761315f614334565b5b6020026020010151613313565b90508281604051602001613182929190614fbe565b6040516020818303038152906040529250508080600101915050613140565b508080519060200120915050919050565b5f5f848301359150602083019050935093915050565b5f82826040516020016131dc929190615094565b60405160208183030381529060405280519060200120905092915050565b5f83838360405160200161321093929190615114565b6040516020818303038152906040528051906020012090509392505050565b5f8160405160200161324191906151a5565b604051602081830303815290604052805190602001209050919050565b5f5f61326e846020015184612033565b90505f61327a856120d7565b9050818160405160200161328f929190614aa4565b604051602081830303815290604052805190602001209250505092915050565b5f816040516020016132c19190615214565b604051602081830303815290604052805190602001209050919050565b5f8383836040516020016132f493929190615283565b6040516020818303038152906040528051906020012090509392505050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c001516040516020016133759897969594939291906152ca565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b60405180604001604052805f81526020015f81525090565b5f82905092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f82821b905092915050565b5f6134928383613446565b8261349d8135613450565b925060048210156134dd576134d87fffffffff000000000000000000000000000000000000000000000000000000008360040360080261347b565b831692505b505092915050565b5f81905092915050565b828183375f83830152505050565b5f61350883856134e5565b93506135158385846134ef565b82840190509392505050565b5f61352d8284866134fd565b91508190509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6135738261354a565b9050919050565b61358381613569565b811461358d575f5ffd5b50565b5f8135905061359e8161357a565b92915050565b5f602082840312156135b9576135b8613542565b5b5f6135c684828501613590565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613619826135d3565b810181811067ffffffffffffffff82111715613638576136376135e3565b5b80604052505050565b5f61364a613539565b90506136568282613610565b919050565b5f5ffd5b5f60ff82169050919050565b6136748161365f565b811461367e575f5ffd5b50565b5f8135905061368f8161366b565b92915050565b5f8115159050919050565b6136a981613695565b81146136b3575f5ffd5b50565b5f813590506136c4816136a0565b92915050565b5f5ffd5b5f67ffffffffffffffff8211156136e8576136e76135e3565b5b602082029050602081019050919050565b5f5ffd5b5f819050919050565b61370f816136fd565b8114613719575f5ffd5b50565b5f8135905061372a81613706565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561374e5761374d6135e3565b5b613757826135d3565b9050602081019050919050565b5f61377661377184613734565b613641565b90508281526020810184848401111561379257613791613730565b5b61379d8482856134ef565b509392505050565b5f82601f8301126137b9576137b86136ca565b5b81356137c9848260208601613764565b91505092915050565b5f60e082840312156137e7576137e66135cf565b5b6137f160e0613641565b90505f61380084828501613590565b5f8301525060206138138482850161371c565b602083015250604082013567ffffffffffffffff8111156138375761383661365b565b5b613843848285016137a5565b60408301525060606138578482850161371c565b606083015250608061386b848285016136b6565b60808301525060a061387f848285016136b6565b60a08301525060c06138938482850161371c565b60c08301525092915050565b5f6138b16138ac846136ce565b613641565b905080838252602082019050602084028301858111156138d4576138d36136f9565b5b835b8181101561391b57803567ffffffffffffffff8111156138f9576138f86136ca565b5b80860161390689826137d2565b855260208501945050506020810190506138d6565b5050509392505050565b5f82601f830112613939576139386136ca565b5b813561394984826020860161389f565b91505092915050565b5f819050919050565b61396481613952565b811461396e575f5ffd5b50565b5f8135905061397f8161395b565b92915050565b5f67ffffffffffffffff82111561399f5761399e6135e3565b5b602082029050602081019050919050565b5f6139c26139bd84613985565b613641565b905080838252602082019050602084028301858111156139e5576139e46136f9565b5b835b81811015613a0e57806139fa8882613590565b8452602084019350506020810190506139e7565b5050509392505050565b5f82601f830112613a2c57613a2b6136ca565b5b8135613a3c8482602086016139b0565b91505092915050565b5f6101208284031215613a5b57613a5a6135cf565b5b613a66610120613641565b90505f613a7584828501613681565b5f830152506020613a88848285016136b6565b602083015250604082013567ffffffffffffffff811115613aac57613aab61365b565b5b613ab884828501613925565b6040830152506060613acc8482850161371c565b6060830152506080613ae08482850161371c565b60808301525060a082013567ffffffffffffffff811115613b0457613b0361365b565b5b613b10848285016137a5565b60a08301525060c0613b2484828501613971565b60c08301525060e0613b3884828501613971565b60e08301525061010082013567ffffffffffffffff811115613b5d57613b5c61365b565b5b613b6984828501613a18565b6101008301525092915050565b5f5ffd5b5f5f83601f840112613b8f57613b8e6136ca565b5b8235905067ffffffffffffffff811115613bac57613bab613b76565b5b602083019150836001820283011115613bc857613bc76136f9565b5b9250929050565b5f5f5f60408486031215613be657613be5613542565b5b5f84013567ffffffffffffffff811115613c0357613c02613546565b5b613c0f86828701613a45565b935050602084013567ffffffffffffffff811115613c3057613c2f613546565b5b613c3c86828701613b7a565b92509250509250925092565b613c5181613952565b82525050565b5f602082019050613c6a5f830184613c48565b92915050565b5f5f5f5f5f60808688031215613c8957613c88613542565b5b5f613c9688828901613590565b9550506020613ca788828901613590565b9450506040613cb88882890161371c565b935050606086013567ffffffffffffffff811115613cd957613cd8613546565b5b613ce588828901613b7a565b92509250509295509295909350565b613cfd81613450565b82525050565b5f602082019050613d165f830184613cf4565b92915050565b5f5f5f60408486031215613d3357613d32613542565b5b5f613d4086828701613971565b935050602084013567ffffffffffffffff811115613d6157613d60613546565b5b613d6d86828701613b7a565b92509250509250925092565b613d8281613450565b8114613d8c575f5ffd5b50565b5f81359050613d9d81613d79565b92915050565b5f60208284031215613db857613db7613542565b5b5f613dc584828501613d8f565b91505092915050565b613dd781613569565b82525050565b5f602082019050613df05f830184613dce565b92915050565b5f5f5f5f60408587031215613e0e57613e0d613542565b5b5f85013567ffffffffffffffff811115613e2b57613e2a613546565b5b613e3787828801613b7a565b9450945050602085013567ffffffffffffffff811115613e5a57613e59613546565b5b613e6687828801613b7a565b925092505092959194509250565b5f60208284031215613e8957613e88613542565b5b5f613e9684828501613971565b91505092915050565b5f5f60208385031215613eb557613eb4613542565b5b5f83013567ffffffffffffffff811115613ed257613ed1613546565b5b613ede85828601613b7a565b92509250509250929050565b5f5f5f5f60608587031215613f0257613f01613542565b5b5f613f0f87828801613590565b9450506020613f208782880161371c565b935050604085013567ffffffffffffffff811115613f4157613f40613546565b5b613f4d87828801613b7a565b925092505092959194509250565b5f60208284031215613f7057613f6f613542565b5b5f613f7d8482850161371c565b91505092915050565b613f8f816136fd565b82525050565b5f602082019050613fa85f830184613f86565b92915050565b5f604082019050613fc15f830185613dce565b613fce6020830184613f86565b9392505050565b613fde81613695565b82525050565b5f60c082019050613ff75f830189613f86565b6140046020830188613f86565b6140116040830187613fd5565b61401e6060830186613c48565b61402b6080830185613f86565b61403860a0830184613c48565b979650505050505050565b5f5f6040838503121561405957614058613542565b5b5f61406685828601613d8f565b925050602061407785828601613590565b9150509250929050565b5f5f83601f840112614096576140956136ca565b5b8235905067ffffffffffffffff8111156140b3576140b2613b76565b5b6020830191508360208202830111156140cf576140ce6136f9565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156140f2576140f1613542565b5b5f6140ff8b828c01613590565b98505060206141108b828c01613590565b975050604089013567ffffffffffffffff81111561413157614130613546565b5b61413d8b828c01614081565b9650965050606089013567ffffffffffffffff8111156141605761415f613546565b5b61416c8b828c01614081565b9450945050608089013567ffffffffffffffff81111561418f5761418e613546565b5b61419b8b828c01613b7a565b92509250509295985092959890939650565b5f5f5f5f5f5f60a087890312156141c7576141c6613542565b5b5f6141d489828a01613590565b96505060206141e589828a01613590565b95505060406141f689828a0161371c565b945050606061420789828a0161371c565b935050608087013567ffffffffffffffff81111561422857614227613546565b5b61423489828a01613b7a565b92509250509295509295509295565b5f6bffffffffffffffffffffffff82169050919050565b61426381614243565b811461426d575f5ffd5b50565b5f8135905061427e8161425a565b92915050565b5f5f5f6060848603121561429b5761429a613542565b5b5f6142a886828701613971565b93505060206142b986828701613590565b92505060406142ca86828701614270565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61430b826136fd565b9150614316836136fd565b925082820190508082111561432e5761432d6142d4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61436a8161365f565b82525050565b61437981613695565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6143b181613569565b82525050565b6143c0816136fd565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6143f8826143c6565b61440281856143d0565b93506144128185602086016143e0565b61441b816135d3565b840191505092915050565b5f60e083015f83015161443b5f8601826143a8565b50602083015161444e60208601826143b7565b506040830151848203604086015261446682826143ee565b915050606083015161447b60608601826143b7565b50608083015161448e6080860182614370565b5060a08301516144a160a0860182614370565b5060c08301516144b460c08601826143b7565b508091505092915050565b5f6144ca8383614426565b905092915050565b5f602082019050919050565b5f6144e88261437f565b6144f28185614389565b93508360208202850161450485614399565b805f5b8581101561453f578484038952815161452085826144bf565b945061452b836144d2565b925060208a01995050600181019050614507565b50829750879550505050505092915050565b61455a81613952565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61459483836143a8565b60208301905092915050565b5f602082019050919050565b5f6145b682614560565b6145c0818561456a565b93506145cb8361457a565b805f5b838110156145fb5781516145e28882614589565b97506145ed836145a0565b9250506001810190506145ce565b5085935050505092915050565b5f61012083015f83015161461e5f860182614361565b5060208301516146316020860182614370565b506040830151848203604086015261464982826144de565b915050606083015161465e60608601826143b7565b50608083015161467160808601826143b7565b5060a083015184820360a086015261468982826143ee565b91505060c083015161469e60c0860182614551565b5060e08301516146b160e0860182614551565b506101008301518482036101008601526146cb82826145ac565b9150508091505092915050565b5f82825260208201905092915050565b5f6146f383856146d8565b93506147008385846134ef565b614709836135d3565b840190509392505050565b5f6040820190508181035f83015261472c8186614608565b905081810360208301526147418184866146e8565b9050949350505050565b61475481614243565b82525050565b5f60608201905061476d5f830186613c48565b61477a6020830185613dce565b614787604083018461474b565b949350505050565b5f6040820190506147a25f830185613c48565b6147af6020830184613c48565b9392505050565b5f6040820190506147c95f830185613c48565b6147d66020830184613f86565b9392505050565b5f6060820190506147f05f830186613c48565b6147fd6020830185613dce565b61480a6040830184613dce565b949350505050565b5f6040820190506148255f830185613f86565b6148326020830184613f86565b9392505050565b5f5ffd5b5f5ffd5b5f5f8585111561485457614853614839565b5b838611156148655761486461483d565b5b6001850283019150848603905094509492505050565b5f60608201905061488e5f830186613f86565b61489b6020830185613f86565b6148a86040830184613f86565b949350505050565b5f6060820190508181035f8301526148c88186614608565b90506148d76020830185613f86565b6148e46040830184613f86565b949350505050565b5f6148f6826143c6565b61490081856146d8565b93506149108185602086016143e0565b614919816135d3565b840191505092915050565b5f60c0820190506149375f830189613c48565b6149446020830188613f86565b6149516040830187613f86565b61495e6060830186613f86565b61496b6080830185613f86565b81810360a083015261497d81846148ec565b9050979650505050505050565b5f60608201905061499d5f830186613c48565b6149aa6020830185613f86565b81810360408301526149bc81846148ec565b9050949350505050565b5f6060820190508181035f8301526149de8186614608565b90506149ed6020830185613f86565b81810360408301526149ff81846148ec565b9050949350505050565b5f604082019050614a1c5f830185613cf4565b614a296020830184613dce565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614a6e600283614a30565b9150614a7982614a3a565b600282019050919050565b5f819050919050565b614a9e614a9982613952565b614a84565b82525050565b5f614aae82614a62565b9150614aba8285614a8d565b602082019150614aca8284614a8d565b6020820191508190509392505050565b5f604082019050614aed5f830185613dce565b8181036020830152614aff81846148ec565b90509392505050565b5f81519050614b168161395b565b92915050565b5f81519050614b2a81613706565b92915050565b5f60408284031215614b4557614b446135cf565b5b614b4f6040613641565b90505f614b5e84828501614b08565b5f830152506020614b7184828501614b1c565b60208301525092915050565b5f60408284031215614b9257614b91613542565b5b5f614b9f84828501614b30565b91505092915050565b604082015f820151614bbc5f850182614551565b506020820151614bcf60208501826143b7565b50505050565b5f604082019050614be85f830184614ba8565b92915050565b5f60a082019050614c015f830188613c48565b614c0e6020830187613c48565b614c1b6040830186613c48565b614c286060830185613f86565b614c356080830184613dce565b9695505050505050565b5f81905092915050565b614c5281613569565b82525050565b5f614c638383614c49565b60208301905092915050565b5f614c7982614560565b614c838185614c3f565b9350614c8e8361457a565b805f5b83811015614cbe578151614ca58882614c58565b9750614cb0836145a0565b925050600181019050614c91565b5085935050505092915050565b5f614cd68284614c6f565b915081905092915050565b5f60a082019050614cf45f830188613c48565b614d016020830187613c48565b614d0e6040830186613f86565b614d1b6060830185613f86565b614d286080830184613c48565b9695505050505050565b5f606082019050614d455f830186613c48565b614d526020830185613c48565b614d5f6040830184613c48565b949350505050565b614d708161365f565b82525050565b5f602082019050614d895f830184614d67565b92915050565b5f6060820190508181035f830152614da88186886146e8565b9050614db76020830185613f86565b614dc46040830184613f86565b95945050505050565b5f608082019050614de05f830187613c48565b614ded6020830186614d67565b614dfa6040830185613c48565b614e076060830184613c48565b95945050505050565b5f604082019050614e235f830186613c48565b8181036020830152614e368184866146e8565b9050949350505050565b5f81519050614e4e81613d79565b92915050565b5f60208284031215614e6957614e68613542565b5b5f614e7684828501614e40565b91505092915050565b5f606082019050614e925f830187613c48565b614e9f6020830186613dce565b8181036040830152614eb28184866146e8565b905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f82015250565b5f614ef1601c83614a30565b9150614efc82614ebd565b601c82019050919050565b5f614f1182614ee5565b9150614f1d8284614a8d565b60208201915081905092915050565b5f6040820190508181035f830152614f448186614608565b90508181036020830152614f598184866146e8565b9050949350505050565b5f60208284031215614f7857614f77613542565b5b5f614f8584828501614b08565b91505092915050565b5f614f98826143c6565b614fa281856134e5565b9350614fb28185602086016143e0565b80840191505092915050565b5f614fc98285614f8e565b9150614fd58284614a8d565b6020820191508190509392505050565b7f53657175656e6365207369676e65723a0a0000000000000000000000000000005f82015250565b5f615019601183614a30565b915061502482614fe5565b601182019050919050565b5f8160601b9050919050565b5f6150458261502f565b9050919050565b5f6150568261503b565b9050919050565b61506e61506982613569565b61504c565b82525050565b5f819050919050565b61508e615089826136fd565b615074565b82525050565b5f61509e8261500d565b91506150aa828561505d565b6014820191506150ba828461507d565b6020820191508190509392505050565b7f53657175656e6365206e657374656420636f6e6669673a0a00000000000000005f82015250565b5f6150fe601883614a30565b9150615109826150ca565b601882019050919050565b5f61511e826150f2565b915061512a8286614a8d565b60208201915061513a828561507d565b60208201915061514a828461507d565b602082019150819050949350505050565b7f53657175656e636520737461746963206469676573743a0a00000000000000005f82015250565b5f61518f601883614a30565b915061519a8261515b565b601882019050919050565b5f6151af82615183565b91506151bb8284614a8d565b60208201915081905092915050565b7f53657175656e636520616e792061646472657373207375626469676573743a0a5f82015250565b5f6151fe602083614a30565b9150615209826151ca565b602082019050919050565b5f61521e826151f2565b915061522a8284614a8d565b60208201915081905092915050565b7f53657175656e63652073617069656e7420636f6e6669673a0a000000000000005f82015250565b5f61526d601983614a30565b915061527882615239565b601982019050919050565b5f61528d82615261565b9150615299828661505d565b6014820191506152a9828561507d565b6020820191506152b98284614a8d565b602082019150819050949350505050565b5f610100820190506152de5f83018b613c48565b6152eb602083018a613dce565b6152f86040830189613f86565b6153056060830188613c48565b6153126080830187613f86565b61531f60a0830186613fd5565b61532c60c0830185613fd5565b61533960e0830184613f86565b999850505050505050505056fea264697066735822122019b5533fc4cbee24a73438e1a10df64732fe25b8872932ba010c1d5c7babb5eb64736f6c634300081c0033603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3000000000000000000000000bd0f8abd58b4449b39c57ac9d5c67433239ac447000000000000000000' + }, + { + checkAddr: '0x6aE2a1Bb476CF8C50ab09499b99Ec36056c53B6D', + data: '0x4af63f020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017746080604052348015600e575f5ffd5b506117588061001c5f395ff3fe608060405234801561000f575f5ffd5b505f61001b5f36610035565b90505f610027826104d7565b90506100338282610527565b005b61003d610d03565b5f815f019060ff16908160ff16815250505f5f61005a85856107e8565b915060ff16915060018083160361007a575f8360600181815250506100b6565b61008f8186866107fe9290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f8111156100f3576100e58282888861082f9190939291909392919063ffffffff16565b856080018194508281525050505b5f601080851603610107576001905061015f565b60208085160361013a5761012683888861085c9290919263ffffffff16565b8161ffff169150809450819250505061015e565b61014f83888861087b9290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561017957610178610d9f565b5b6040519080825280602002602001820160405280156101b257816020015b61019f610d4e565b8152602001906001900390816101975790505b5085604001819052505f5f90505b818110156104cc575f6101de858a8a61087b9290919263ffffffff16565b8096508192505050600180821660ff160361024d57308760400151838151811061020b5761020a610dcc565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506102b9565b610262858a8a6108969290919263ffffffff16565b8860400151848151811061027957610278610dcc565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff1603610307576102db858a8a6108c79290919263ffffffff16565b886040015184815181106102f2576102f1610dcc565b5b60200260200101516020018197508281525050505b600480821660ff16036103cf575f61032a868b8b6108dd9290919263ffffffff16565b8162ffffff169150809750819250505089898790838961034a9190610e2f565b9261035793929190610e6a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050886040015184815181106103b0576103af610dcc565b5b60200260200101516040018190525080866103cb9190610e2f565b9550505b600880821660ff160361041d576103f1858a8a6108c79290919263ffffffff16565b8860400151848151811061040857610407610dcc565b5b60200260200101516060018197508281525050505b601080821660ff16148760400151838151811061043d5761043c610dcc565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061047357610472610dcc565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff16876040015183815181106104ae576104ad610dcc565b5b602002602001015160c00181815250505080806001019150506101c0565b505050505092915050565b5f5f6104e78360200151306108fd565b90505f6104f3846109a1565b90508181604051602001610508929190610f21565b6040516020818303038152906040528051906020012092505050919050565b5f5f90505f83604001515190505f5f90505b818110156107e1575f8560400151828151811061055957610558610dcc565b5b602002602001015190508060a001518015610572575083155b156105b6577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b85836040516105a8929190610f75565b60405180910390a1506107d4565b5f93505f816060015190505f81141580156105d05750805a105b156106165786835a6040517f2139527400000000000000000000000000000000000000000000000000000000815260040161060d9392919061136a565b60405180910390fd5b81608001511561065d57826040517f230d1ccc00000000000000000000000000000000000000000000000000000000815260040161065491906113a6565b60405180910390fd5b5f610683835f015184602001515f85146106775784610679565b5a5b8660400151610bd5565b905080610797575f60ff168360c00151036106e657600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d87856106c7610bec565b6040516106d693929190611407565b60405180910390a15050506107d4565b600160ff168360c001510361073d5787846106ff610bec565b6040517f7f6b0bb100000000000000000000000000000000000000000000000000000000815260040161073493929190611443565b60405180910390fd5b600260ff168360c0015103610796577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b8785610777610bec565b60405161078693929190611407565b60405180910390a15050506107e1565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a87856040516107c8929190610f75565b60405180910390a15050505b8080600101915050610539565b5050505050565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de8561096c574661096e565b5f5b85604051602001610983959493929190611495565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016109b99190611572565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff1603610a51575f6109ef8460400151610c0a565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2818560600151866080015185604051602001610a32959493929190611588565b6040516020818303038152906040528051906020012092505050610bd0565b600160ff16835f015160ff1603610ac0577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a001518051906020012082604051602001610aa2939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b600260ff16835f015160ff1603610b28577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c0015182604051602001610b0a939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b600360ff16835f015160ff1603610b90577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e0015182604051602001610b72939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b825f01516040517f04818320000000000000000000000000000000000000000000000000000000008152600401610bc7919061161d565b60405180910390fd5b919050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b5f60605f5f90505b8351811015610c73575f610c3f858381518110610c3257610c31610dcc565b5b6020026020010151610c84565b90508281604051602001610c54929190611670565b6040516020818303038152906040529250508080600101915050610c12565b508080519060200120915050919050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c00151604051602001610ce69897969594939291906116a6565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e3982610df9565b9150610e4483610df9565b9250828201905080821115610e5c57610e5b610e02565b5b92915050565b5f5ffd5b5f5ffd5b5f5f85851115610e7d57610e7c610e62565b5b83861115610e8e57610e8d610e66565b5b6001850283019150848603905094509492505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f610ee2600283610ea4565b9150610eed82610eae565b600282019050919050565b5f819050919050565b5f819050919050565b610f1b610f1682610ef8565b610f01565b82525050565b5f610f2b82610ed6565b9150610f378285610f0a565b602082019150610f478284610f0a565b6020820191508190509392505050565b610f6081610ef8565b82525050565b610f6f81610df9565b82525050565b5f604082019050610f885f830185610f57565b610f956020830184610f66565b9392505050565b5f60ff82169050919050565b610fb181610f9c565b82525050565b5f8115159050919050565b610fcb81610fb7565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61102382610ffa565b9050919050565b61103381611019565b82525050565b61104281610df9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61108a82611048565b6110948185611052565b93506110a4818560208601611062565b6110ad81611070565b840191505092915050565b5f60e083015f8301516110cd5f86018261102a565b5060208301516110e06020860182611039565b50604083015184820360408601526110f88282611080565b915050606083015161110d6060860182611039565b5060808301516111206080860182610fc2565b5060a083015161113360a0860182610fc2565b5060c083015161114660c0860182611039565b508091505092915050565b5f61115c83836110b8565b905092915050565b5f602082019050919050565b5f61117a82610fd1565b6111848185610fdb565b93508360208202850161119685610feb565b805f5b858110156111d157848403895281516111b28582611151565b94506111bd83611164565b925060208a01995050600181019050611199565b50829750879550505050505092915050565b6111ec81610ef8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f611226838361102a565b60208301905092915050565b5f602082019050919050565b5f611248826111f2565b61125281856111fc565b935061125d8361120c565b805f5b8381101561128d578151611274888261121b565b975061127f83611232565b925050600181019050611260565b5085935050505092915050565b5f61012083015f8301516112b05f860182610fa8565b5060208301516112c36020860182610fc2565b50604083015184820360408601526112db8282611170565b91505060608301516112f06060860182611039565b5060808301516113036080860182611039565b5060a083015184820360a086015261131b8282611080565b91505060c083015161133060c08601826111e3565b5060e083015161134360e08601826111e3565b5061010083015184820361010086015261135d828261123e565b9150508091505092915050565b5f6060820190508181035f830152611382818661129a565b90506113916020830185610f66565b61139e6040830184610f66565b949350505050565b5f6020820190506113b95f830184610f66565b92915050565b5f82825260208201905092915050565b5f6113d982611048565b6113e381856113bf565b93506113f3818560208601611062565b6113fc81611070565b840191505092915050565b5f60608201905061141a5f830186610f57565b6114276020830185610f66565b818103604083015261143981846113cf565b9050949350505050565b5f6060820190508181035f83015261145b818661129a565b905061146a6020830185610f66565b818103604083015261147c81846113cf565b9050949350505050565b61148f81611019565b82525050565b5f60a0820190506114a85f830188610f57565b6114b56020830187610f57565b6114c26040830186610f57565b6114cf6060830185610f66565b6114dc6080830184611486565b9695505050505050565b5f81905092915050565b6114f981611019565b82525050565b5f61150a83836114f0565b60208301905092915050565b5f611520826111f2565b61152a81856114e6565b93506115358361120c565b805f5b8381101561156557815161154c88826114ff565b975061155783611232565b925050600181019050611538565b5085935050505092915050565b5f61157d8284611516565b915081905092915050565b5f60a08201905061159b5f830188610f57565b6115a86020830187610f57565b6115b56040830186610f66565b6115c26060830185610f66565b6115cf6080830184610f57565b9695505050505050565b5f6060820190506115ec5f830186610f57565b6115f96020830185610f57565b6116066040830184610f57565b949350505050565b61161781610f9c565b82525050565b5f6020820190506116305f83018461160e565b92915050565b5f81905092915050565b5f61164a82611048565b6116548185611636565b9350611664818560208601611062565b80840191505092915050565b5f61167b8285611640565b91506116878284610f0a565b6020820191508190509392505050565b6116a081610fb7565b82525050565b5f610100820190506116ba5f83018b610f57565b6116c7602083018a611486565b6116d46040830189610f66565b6116e16060830188610f57565b6116ee6080830187610f66565b6116fb60a0830186611697565b61170860c0830185611697565b61171560e0830184610f66565b999850505050505050505056fea2646970667358221220405f34bddc0ba9d44e3f985d8aad5d56facfea4a265ddc093628987cbf971bba64736f6c634300081c0033000000000000000000000000' + } +] as const +export const TrailsWaletContextTxs = TrailsWalletContextTxDatas.map(tx => ({ + to: TrailsWalletContextTxTo, + ...tx +})) diff --git a/scripts/types.ts b/scripts/types.ts index ec3b788..866b9d2 100644 --- a/scripts/types.ts +++ b/scripts/types.ts @@ -29,6 +29,7 @@ export type ContractName = | 'SequenceMarketV2' | 'SequenceMarketV1' | 'BatchPayableHelper' + | 'TrailsMulticall3Router' | 'ERC20ItemsFactory' | 'ERC721ItemsFactory' | 'ERC1155ItemsFactory' diff --git a/scripts/verify-contracts.ts b/scripts/verify-contracts.ts index 2f581fa..9dd3d8b 100644 --- a/scripts/verify-contracts.ts +++ b/scripts/verify-contracts.ts @@ -35,6 +35,7 @@ import { UpgradeableBeacon, UPGRADEABLEBEACON_VERIFICATION } from './factories/t // ERC721OperatorEnforcedFactory, // ERC721OPERATORENFORCEDFACTORY_VERIFICATION // } from './factories/token_library/immutable/ERC721OperatorEnforcedFactory' +import { TRAILSMULTICALL3ROUTER_VERIFICATION } from './factories/trails/TrailsMulticall3Router' import { FACTORY_V1_VERIFICATION } from './factories/v1/FactoryV1' import { GUEST_MODULE_V1_VERIFICATION } from './factories/v1/GuestModuleV1' import { MAIN_MODULE_UPGRADABLE_V1_VERIFICATION } from './factories/v1/MainModuleUpgradableV1' @@ -264,6 +265,15 @@ export const verifyContracts = async (config: Config, walletContextAddrs: Contra }) prompt.succeed('Verified Market contracts\n') + // Trails + + prompt.start('Verifying Trails contracts\n') + await verifyContract(walletContextAddrs.TrailsMulticall3Router, { + ...TRAILSMULTICALL3ROUTER_VERIFICATION, + waitForSuccess + }) + prompt.succeed('Verified Trails contracts\n') + // Library contracts prompt.start('Verifying Library contracts\n')