From 6b1835a40f6d0c6c342b3b68fa63463bd299d9e1 Mon Sep 17 00:00:00 2001 From: Greg Hysen Date: Wed, 6 Mar 2019 14:31:55 -0800 Subject: [PATCH] Renamed tec package to coordinator package --- contracts/{tec => coordinator}/CHANGELOG.json | 0 contracts/{tec => coordinator}/CHANGELOG.md | 0 contracts/{tec => coordinator}/DEPLOYS.json | 0 contracts/{tec => coordinator}/README.md | 0 contracts/{tec => coordinator}/compiler.json | 0 .../contracts/src/Coordinator.sol | 0 .../src/MixinCoordinatorApprovalVerifier.sol | 0 .../contracts/src/MixinCoordinatorCore.sol | 0 .../contracts/src/MixinSignatureValidator.sol | 0 .../ICoordinatorApprovalVerifier.sol | 0 .../src/interfaces/ICoordinatorCore.sol | 0 .../src/interfaces/ISignatureValidator.sol | 0 .../src/interfaces/ITransactions.sol | 0 .../contracts/src/libs/LibConstants.sol | 0 .../src/libs/LibCoordinatorApproval.sol | 0 .../contracts/src/libs/LibEIP712Domain.sol | 0 .../src/libs/LibZeroExTransaction.sol | 0 .../mixins/MCoordinatorApprovalVerifier.sol | 0 .../src/mixins/MSignatureValidator.sol | 0 .../contracts/test/TestLibs.sol | 0 .../contracts/test/TestMixins.sol | 0 .../generated-artifacts/Coordinator.json | 351 ++++++++++++++++++ .../generated-artifacts/TestLibs.json | 149 ++++++++ .../generated-artifacts/TestMixins.json | 284 ++++++++++++++ .../generated-wrappers/coordinator.ts | 302 +++++++++++++++ .../generated-wrappers/test_libs.ts | 148 ++++++++ .../generated-wrappers/test_mixins.ts | 192 ++++++++++ contracts/{tec => coordinator}/package.json | 0 .../{tec => coordinator}/src/artifacts.ts | 0 contracts/{tec => coordinator}/src/index.ts | 0 .../{tec => coordinator}/src/wrappers.ts | 0 .../{tec => coordinator}/test/coordinator.ts | 0 .../{tec => coordinator}/test/global_hooks.ts | 0 contracts/{tec => coordinator}/test/libs.ts | 0 contracts/{tec => coordinator}/test/mixins.ts | 0 .../test/utils/approval_factory.ts | 0 .../test/utils/constants.ts | 0 .../utils/coordinator_transaction_factory.ts | 0 .../test/utils/exchange_data_encoder.ts | 0 .../test/utils/hash_utils.ts | 0 .../{tec => coordinator}/test/utils/index.ts | 0 .../test/utils/signing_utils.ts | 0 .../{tec => coordinator}/test/utils/types.ts | 0 contracts/{tec => coordinator}/tsconfig.json | 0 contracts/{tec => coordinator}/tslint.json | 0 45 files changed, 1426 insertions(+) rename contracts/{tec => coordinator}/CHANGELOG.json (100%) rename contracts/{tec => coordinator}/CHANGELOG.md (100%) rename contracts/{tec => coordinator}/DEPLOYS.json (100%) rename contracts/{tec => coordinator}/README.md (100%) rename contracts/{tec => coordinator}/compiler.json (100%) rename contracts/{tec => coordinator}/contracts/src/Coordinator.sol (100%) rename contracts/{tec => coordinator}/contracts/src/MixinCoordinatorApprovalVerifier.sol (100%) rename contracts/{tec => coordinator}/contracts/src/MixinCoordinatorCore.sol (100%) rename contracts/{tec => coordinator}/contracts/src/MixinSignatureValidator.sol (100%) rename contracts/{tec => coordinator}/contracts/src/interfaces/ICoordinatorApprovalVerifier.sol (100%) rename contracts/{tec => coordinator}/contracts/src/interfaces/ICoordinatorCore.sol (100%) rename contracts/{tec => coordinator}/contracts/src/interfaces/ISignatureValidator.sol (100%) rename contracts/{tec => coordinator}/contracts/src/interfaces/ITransactions.sol (100%) rename contracts/{tec => coordinator}/contracts/src/libs/LibConstants.sol (100%) rename contracts/{tec => coordinator}/contracts/src/libs/LibCoordinatorApproval.sol (100%) rename contracts/{tec => coordinator}/contracts/src/libs/LibEIP712Domain.sol (100%) rename contracts/{tec => coordinator}/contracts/src/libs/LibZeroExTransaction.sol (100%) rename contracts/{tec => coordinator}/contracts/src/mixins/MCoordinatorApprovalVerifier.sol (100%) rename contracts/{tec => coordinator}/contracts/src/mixins/MSignatureValidator.sol (100%) rename contracts/{tec => coordinator}/contracts/test/TestLibs.sol (100%) rename contracts/{tec => coordinator}/contracts/test/TestMixins.sol (100%) create mode 100644 contracts/coordinator/generated-artifacts/Coordinator.json create mode 100644 contracts/coordinator/generated-artifacts/TestLibs.json create mode 100644 contracts/coordinator/generated-artifacts/TestMixins.json create mode 100644 contracts/coordinator/generated-wrappers/coordinator.ts create mode 100644 contracts/coordinator/generated-wrappers/test_libs.ts create mode 100644 contracts/coordinator/generated-wrappers/test_mixins.ts rename contracts/{tec => coordinator}/package.json (100%) rename contracts/{tec => coordinator}/src/artifacts.ts (100%) rename contracts/{tec => coordinator}/src/index.ts (100%) rename contracts/{tec => coordinator}/src/wrappers.ts (100%) rename contracts/{tec => coordinator}/test/coordinator.ts (100%) rename contracts/{tec => coordinator}/test/global_hooks.ts (100%) rename contracts/{tec => coordinator}/test/libs.ts (100%) rename contracts/{tec => coordinator}/test/mixins.ts (100%) rename contracts/{tec => coordinator}/test/utils/approval_factory.ts (100%) rename contracts/{tec => coordinator}/test/utils/constants.ts (100%) rename contracts/{tec => coordinator}/test/utils/coordinator_transaction_factory.ts (100%) rename contracts/{tec => coordinator}/test/utils/exchange_data_encoder.ts (100%) rename contracts/{tec => coordinator}/test/utils/hash_utils.ts (100%) rename contracts/{tec => coordinator}/test/utils/index.ts (100%) rename contracts/{tec => coordinator}/test/utils/signing_utils.ts (100%) rename contracts/{tec => coordinator}/test/utils/types.ts (100%) rename contracts/{tec => coordinator}/tsconfig.json (100%) rename contracts/{tec => coordinator}/tslint.json (100%) diff --git a/contracts/tec/CHANGELOG.json b/contracts/coordinator/CHANGELOG.json similarity index 100% rename from contracts/tec/CHANGELOG.json rename to contracts/coordinator/CHANGELOG.json diff --git a/contracts/tec/CHANGELOG.md b/contracts/coordinator/CHANGELOG.md similarity index 100% rename from contracts/tec/CHANGELOG.md rename to contracts/coordinator/CHANGELOG.md diff --git a/contracts/tec/DEPLOYS.json b/contracts/coordinator/DEPLOYS.json similarity index 100% rename from contracts/tec/DEPLOYS.json rename to contracts/coordinator/DEPLOYS.json diff --git a/contracts/tec/README.md b/contracts/coordinator/README.md similarity index 100% rename from contracts/tec/README.md rename to contracts/coordinator/README.md diff --git a/contracts/tec/compiler.json b/contracts/coordinator/compiler.json similarity index 100% rename from contracts/tec/compiler.json rename to contracts/coordinator/compiler.json diff --git a/contracts/tec/contracts/src/Coordinator.sol b/contracts/coordinator/contracts/src/Coordinator.sol similarity index 100% rename from contracts/tec/contracts/src/Coordinator.sol rename to contracts/coordinator/contracts/src/Coordinator.sol diff --git a/contracts/tec/contracts/src/MixinCoordinatorApprovalVerifier.sol b/contracts/coordinator/contracts/src/MixinCoordinatorApprovalVerifier.sol similarity index 100% rename from contracts/tec/contracts/src/MixinCoordinatorApprovalVerifier.sol rename to contracts/coordinator/contracts/src/MixinCoordinatorApprovalVerifier.sol diff --git a/contracts/tec/contracts/src/MixinCoordinatorCore.sol b/contracts/coordinator/contracts/src/MixinCoordinatorCore.sol similarity index 100% rename from contracts/tec/contracts/src/MixinCoordinatorCore.sol rename to contracts/coordinator/contracts/src/MixinCoordinatorCore.sol diff --git a/contracts/tec/contracts/src/MixinSignatureValidator.sol b/contracts/coordinator/contracts/src/MixinSignatureValidator.sol similarity index 100% rename from contracts/tec/contracts/src/MixinSignatureValidator.sol rename to contracts/coordinator/contracts/src/MixinSignatureValidator.sol diff --git a/contracts/tec/contracts/src/interfaces/ICoordinatorApprovalVerifier.sol b/contracts/coordinator/contracts/src/interfaces/ICoordinatorApprovalVerifier.sol similarity index 100% rename from contracts/tec/contracts/src/interfaces/ICoordinatorApprovalVerifier.sol rename to contracts/coordinator/contracts/src/interfaces/ICoordinatorApprovalVerifier.sol diff --git a/contracts/tec/contracts/src/interfaces/ICoordinatorCore.sol b/contracts/coordinator/contracts/src/interfaces/ICoordinatorCore.sol similarity index 100% rename from contracts/tec/contracts/src/interfaces/ICoordinatorCore.sol rename to contracts/coordinator/contracts/src/interfaces/ICoordinatorCore.sol diff --git a/contracts/tec/contracts/src/interfaces/ISignatureValidator.sol b/contracts/coordinator/contracts/src/interfaces/ISignatureValidator.sol similarity index 100% rename from contracts/tec/contracts/src/interfaces/ISignatureValidator.sol rename to contracts/coordinator/contracts/src/interfaces/ISignatureValidator.sol diff --git a/contracts/tec/contracts/src/interfaces/ITransactions.sol b/contracts/coordinator/contracts/src/interfaces/ITransactions.sol similarity index 100% rename from contracts/tec/contracts/src/interfaces/ITransactions.sol rename to contracts/coordinator/contracts/src/interfaces/ITransactions.sol diff --git a/contracts/tec/contracts/src/libs/LibConstants.sol b/contracts/coordinator/contracts/src/libs/LibConstants.sol similarity index 100% rename from contracts/tec/contracts/src/libs/LibConstants.sol rename to contracts/coordinator/contracts/src/libs/LibConstants.sol diff --git a/contracts/tec/contracts/src/libs/LibCoordinatorApproval.sol b/contracts/coordinator/contracts/src/libs/LibCoordinatorApproval.sol similarity index 100% rename from contracts/tec/contracts/src/libs/LibCoordinatorApproval.sol rename to contracts/coordinator/contracts/src/libs/LibCoordinatorApproval.sol diff --git a/contracts/tec/contracts/src/libs/LibEIP712Domain.sol b/contracts/coordinator/contracts/src/libs/LibEIP712Domain.sol similarity index 100% rename from contracts/tec/contracts/src/libs/LibEIP712Domain.sol rename to contracts/coordinator/contracts/src/libs/LibEIP712Domain.sol diff --git a/contracts/tec/contracts/src/libs/LibZeroExTransaction.sol b/contracts/coordinator/contracts/src/libs/LibZeroExTransaction.sol similarity index 100% rename from contracts/tec/contracts/src/libs/LibZeroExTransaction.sol rename to contracts/coordinator/contracts/src/libs/LibZeroExTransaction.sol diff --git a/contracts/tec/contracts/src/mixins/MCoordinatorApprovalVerifier.sol b/contracts/coordinator/contracts/src/mixins/MCoordinatorApprovalVerifier.sol similarity index 100% rename from contracts/tec/contracts/src/mixins/MCoordinatorApprovalVerifier.sol rename to contracts/coordinator/contracts/src/mixins/MCoordinatorApprovalVerifier.sol diff --git a/contracts/tec/contracts/src/mixins/MSignatureValidator.sol b/contracts/coordinator/contracts/src/mixins/MSignatureValidator.sol similarity index 100% rename from contracts/tec/contracts/src/mixins/MSignatureValidator.sol rename to contracts/coordinator/contracts/src/mixins/MSignatureValidator.sol diff --git a/contracts/tec/contracts/test/TestLibs.sol b/contracts/coordinator/contracts/test/TestLibs.sol similarity index 100% rename from contracts/tec/contracts/test/TestLibs.sol rename to contracts/coordinator/contracts/test/TestLibs.sol diff --git a/contracts/tec/contracts/test/TestMixins.sol b/contracts/coordinator/contracts/test/TestMixins.sol similarity index 100% rename from contracts/tec/contracts/test/TestMixins.sol rename to contracts/coordinator/contracts/test/TestMixins.sol diff --git a/contracts/coordinator/generated-artifacts/Coordinator.json b/contracts/coordinator/generated-artifacts/Coordinator.json new file mode 100644 index 0000000000..ef694975dd --- /dev/null +++ b/contracts/coordinator/generated-artifacts/Coordinator.json @@ -0,0 +1,351 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "Coordinator", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [ + { + "name": "hash", + "type": "bytes32" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "name": "getSignerAddress", + "outputs": [ + { + "name": "signerAddress", + "type": "address" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "salt", + "type": "uint256" + }, + { + "name": "signerAddress", + "type": "address" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "transaction", + "type": "tuple" + }, + { + "components": [ + { + "name": "makerAddress", + "type": "address" + }, + { + "name": "takerAddress", + "type": "address" + }, + { + "name": "feeRecipientAddress", + "type": "address" + }, + { + "name": "senderAddress", + "type": "address" + }, + { + "name": "makerAssetAmount", + "type": "uint256" + }, + { + "name": "takerAssetAmount", + "type": "uint256" + }, + { + "name": "makerFee", + "type": "uint256" + }, + { + "name": "takerFee", + "type": "uint256" + }, + { + "name": "expirationTimeSeconds", + "type": "uint256" + }, + { + "name": "salt", + "type": "uint256" + }, + { + "name": "makerAssetData", + "type": "bytes" + }, + { + "name": "takerAssetData", + "type": "bytes" + } + ], + "name": "orders", + "type": "tuple[]" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256[]" + }, + { + "name": "approvalSignatures", + "type": "bytes[]" + } + ], + "name": "assertValidTransactionOrdersApproval", + "outputs": [], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "salt", + "type": "uint256" + }, + { + "name": "signerAddress", + "type": "address" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "transaction", + "type": "tuple" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256[]" + }, + { + "name": "approvalSignatures", + "type": "bytes[]" + } + ], + "name": "assertValidCoordinatorApprovals", + "outputs": [], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "EIP712_DOMAIN_HASH", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "components": [ + { + "name": "salt", + "type": "uint256" + }, + { + "name": "signerAddress", + "type": "address" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "transaction", + "type": "tuple" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256[]" + }, + { + "name": "approvalSignatures", + "type": "bytes[]" + } + ], + "name": "executeTransaction", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_exchange", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "0x60806040523480156200001157600080fd5b50604051602080620026558339810180604052620000339190810190620001f8565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606283018085528151919092012060c2830190935260278082528493926200262e90608201398051602091820120604080518082018252600581527f312e302e3000000000000000000000000000000000000000000000000000000090840152805180840194909452838101919091527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c6060840152306080808501919091528151808503909101815260a09093019052815191012060005560018054600160a060020a031916600160a060020a03929092169190911790555062000240565b6000620001f182516200022d565b9392505050565b6000602082840312156200020b57600080fd5b6000620002198484620001e3565b949350505050565b600160a060020a031690565b60006200023a8262000221565b92915050565b6123de80620002506000396000f3fe608060405234801561001057600080fd5b5060043610610084576000357c010000000000000000000000000000000000000000000000000000000090048063cdbc45001161006d578063cdbc4500146100c7578063e306f779146100da578063f50bb641146100ef57610084565b80630f7d8e391461008957806355fc233c146100b2575b600080fd5b61009c610097366004611b6a565b610102565b6040516100a9919061212b565b60405180910390f35b6100c56100c0366004611c50565b6104f7565b005b6100c56100d5366004611d3c565b610761565b6100e2610790565b6040516100a99190612139565b6100c56100fd366004611d3c565b610796565b6000808251111515610149576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121e7565b60405180910390fd5b600061015483610840565b7f010000000000000000000000000000000000000000000000000000000000000090049050600360ff8216106101b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121b7565b60008160ff1660038111156101c757fe5b905060008160038111156101d757fe5b141561020f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121d7565b600181600381111561021d57fe5b141561035b57835160411461025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612147565b600084600081518110151561026f57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006102b186600163ffffffff61090416565b905060006102c687602163ffffffff61090416565b905060018884848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610325573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104f195505050505050565b600281600381111561036957fe5b14156104bf5783516041146103aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612147565b60008460008151811015156103bb57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006103fd86600163ffffffff61090416565b9050600061041287602163ffffffff61090416565b905060018860405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610325573d6000803e3d6000fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121b7565b92915050565b60006105028661094f565b60408051600080825260208201909252845192935091905b818110156105ee576000868281518110151561053257fe5b9060200190602002015190506105466114fb565b5060408051606081018252868152602081018a905290810182905242821161059a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612197565b60006105a582610962565b905060006105ca828a878151811015156105bb57fe5b90602001906020020151610102565b90506105dc878263ffffffff61097016565b9650506001909301925061051a915050565b50865160005b818110156107555788516000908a908390811061060d57fe5b906020019060200201516060015173ffffffffffffffffffffffffffffffffffffffff16141561063c5761074d565b6000898281518110151561064c57fe5b6020908102909101015160400151905073ffffffffffffffffffffffffffffffffffffffff81163214156106925761068a853263ffffffff61097016565b94505061074d565b60006106a4868363ffffffff610a3a16565b90508015156106df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612157565b60208c015173ffffffffffffffffffffffffffffffffffffffff163214806107125750610712863263ffffffff610a3a16565b151561074a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121f7565b50505b6001016105f4565b50505050505050505050565b60606107708560400151610ab2565b90506000815111156107895761078985828686866104f7565b5050505050565b60005481565b6107a284848484610761565b6001548451602086015160408088015190517fbfc8bfce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9094169363bfc8bfce9361080893909290918990600401612217565b600060405180830381600087803b15801561082257600080fd5b505af1158015610836573d6000803e3d6000fd5b5050505050505050565b600080825111151561087e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121c7565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106108ae57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515610946576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121a7565b50016020015190565b60006104f161095d83610f6a565b611126565b60006104f161095d83611166565b8151604051606091849060208082028084018201929101828510156109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612187565b828511156109db576109d48585836112f8565b8497508793505b600182019150602081019050808401925082945081885284604052868860018403815181101515610a0857fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152508694505050505092915050565b8151600090815b81811015610aa7578373ffffffffffffffffffffffffffffffffffffffff168582815181101515610a6e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff161415610a9f576001925050506104f1565b600101610a41565b506000949350505050565b60606000610ac6838263ffffffff6113bc16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d5000000000000000000000000000000000000000000000000000000001480610b5957507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b80610ba557507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610c2f57610bb2611520565b8351610bc890859060049063ffffffff61142916565b806020019051610bdb9190810190611bbc565b604080516001808252818301909252919250816020015b610bfa611520565b815260200190600190039081610bf257905050925080836000815181101515610c1f57fe5b6020908102909101015250610f64565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b000000000000000000000000000000000000000000000000000000001480610cc057507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b80610d0c57507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b80610d5857507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b80610da457507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b80610df057507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b80610e3c57507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b15610e71578251610e5790849060049063ffffffff61142916565b806020019051610e6a9190810190611b2d565b9150610f64565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610f6457610ec3611520565b610ecb611520565b8451610ee190869060049063ffffffff61142916565b806020019051610ef49190810190611bf1565b60408051600280825260608201909252929450909250816020015b610f17611520565b815260200190600190039081610f0f57905050935081846000815181101515610f3c57fe5b602090810290910101528351819085906001908110610f5757fe5b6020908102909101015250505b50919050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f8301528251808303840181526060909201808452825192820192909220928401518051600094938593909182918401908083835b6020831061109e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611061565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208a519a8201519883529082019990995273ffffffffffffffffffffffffffffffffffffffff90961691860191909152505050506060810192909252506080902090565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b6040517f436f6f7264696e61746f72417070726f76616c28000000000000000000000000602082019081527f62797465733332207472616e73616374696f6e486173682c000000000000000060348301527f6279746573207472616e73616374696f6e5369676e61747572652c0000000000604c83015260009182919060670160256123808239602501807f29000000000000000000000000000000000000000000000000000000000000008152506001019050604051602081830303815290604052805190602001209050600083602001516040518082805190602001908083835b6020831061128657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611249565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208a519a85015198835290820199909952918201979097526060810194909452505060809091209392505050565b6020811015611322576001816020036101000a0380198351168185511680821786525050506113b7565b8282141561132f576113b7565b828211156113695760208103905080820181840181515b82851015611361578451865260209586019590940193611346565b9052506113b7565b60208103905080820181840183515b818612156113b257825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190611378565b855250505b505050565b6000816004018351101515156113fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612207565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612167565b83518211156114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612177565b8282036040519080825280601f01601f1916602001820160405280156114cd576020820181803883390190505b5090506114ee6114dc826114f5565b846114e6876114f5565b0183516112f8565b9392505050565b60200190565b6060604051908101604052806000801916815260200160608152602001600081525090565b61018060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b60006114ee82356122f4565b60006114ee82516122f4565b6000601f8201831361160357600080fd5b813561161661161182612289565b612262565b81815260209384019390925082018360005b83811015611654578135860161163e8882611794565b8452506020928301929190910190600101611628565b5050505092915050565b6000601f8201831361166f57600080fd5b815161167d61161182612289565b81815260209384019390925082018360005b8381101561165457815186016116a58882611972565b845250602092830192919091019060010161168f565b6000601f820183136116cc57600080fd5b81356116da61161182612289565b81815260209384019390925082018360005b8381101561165457813586016117028882611829565b84525060209283019291909101906001016116ec565b6000601f8201831361172957600080fd5b813561173761161182612289565b9150818183526020840193506020810190508385602084028201111561175c57600080fd5b60005b8381101561165457816117728882611788565b845250602092830192919091019060010161175f565b60006114ee82356122ff565b6000601f820183136117a557600080fd5b81356117b3611611826122aa565b915080825260208301602083018583830111156117cf57600080fd5b6117da83828461231b565b50505092915050565b6000601f820183136117f457600080fd5b8151611802611611826122aa565b9150808252602083016020830185838301111561181e57600080fd5b6117da838284612327565b6000610180828403121561183c57600080fd5b611847610180612262565b9050600061185584846115da565b8252506020611866848483016115da565b602083015250604061187a848285016115da565b604083015250606061188e848285016115da565b60608301525060806118a284828501611788565b60808301525060a06118b684828501611788565b60a08301525060c06118ca84828501611788565b60c08301525060e06118de84828501611788565b60e0830152506101006118f384828501611788565b6101008301525061012061190984828501611788565b6101208301525061014082013567ffffffffffffffff81111561192b57600080fd5b61193784828501611794565b6101408301525061016082013567ffffffffffffffff81111561195957600080fd5b61196584828501611794565b6101608301525092915050565b6000610180828403121561198557600080fd5b611990610180612262565b9050600061199e84846115e6565b82525060206119af848483016115e6565b60208301525060406119c3848285016115e6565b60408301525060606119d7848285016115e6565b60608301525060806119eb84828501611b21565b60808301525060a06119ff84828501611b21565b60a08301525060c0611a1384828501611b21565b60c08301525060e0611a2784828501611b21565b60e083015250610100611a3c84828501611b21565b61010083015250610120611a5284828501611b21565b6101208301525061014082015167ffffffffffffffff811115611a7457600080fd5b611a80848285016117e3565b6101408301525061016082015167ffffffffffffffff811115611aa257600080fd5b611965848285016117e3565b600060608284031215611ac057600080fd5b611aca6060612262565b90506000611ad88484611788565b8252506020611ae9848483016115da565b602083015250604082013567ffffffffffffffff811115611b0957600080fd5b611b1584828501611794565b60408301525092915050565b60006114ee82516122ff565b600060208284031215611b3f57600080fd5b815167ffffffffffffffff811115611b5657600080fd5b611b628482850161165e565b949350505050565b60008060408385031215611b7d57600080fd5b6000611b898585611788565b925050602083013567ffffffffffffffff811115611ba657600080fd5b611bb285828601611794565b9150509250929050565b600060208284031215611bce57600080fd5b815167ffffffffffffffff811115611be557600080fd5b611b6284828501611972565b60008060408385031215611c0457600080fd5b825167ffffffffffffffff811115611c1b57600080fd5b611c2785828601611972565b925050602083015167ffffffffffffffff811115611c4457600080fd5b611bb285828601611972565b600080600080600060a08688031215611c6857600080fd5b853567ffffffffffffffff811115611c7f57600080fd5b611c8b88828901611aae565b955050602086013567ffffffffffffffff811115611ca857600080fd5b611cb4888289016116bb565b945050604086013567ffffffffffffffff811115611cd157600080fd5b611cdd88828901611794565b935050606086013567ffffffffffffffff811115611cfa57600080fd5b611d0688828901611718565b925050608086013567ffffffffffffffff811115611d2357600080fd5b611d2f888289016115f2565b9150509295509295909350565b60008060008060808587031215611d5257600080fd5b843567ffffffffffffffff811115611d6957600080fd5b611d7587828801611aae565b945050602085013567ffffffffffffffff811115611d9257600080fd5b611d9e87828801611794565b935050604085013567ffffffffffffffff811115611dbb57600080fd5b611dc787828801611718565b925050606085013567ffffffffffffffff811115611de457600080fd5b611df0878288016115f2565b91505092959194509250565b611e05816122f4565b82525050565b611e05816122ff565b6000611e1f826122f0565b808452611e33816020860160208601612327565b611e3c81612357565b9093016020019392505050565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b601a81527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000602082015260400190565b601a81527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000602082015260400190565b601c81527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000602082015260400190565b601781527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000602082015260400190565b601081527f415050524f56414c5f4558504952454400000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b602081016104f18284611dfc565b602081016104f18284611e0b565b602080825281016104f181611e49565b602080825281016104f181611e79565b602080825281016104f181611ea9565b602080825281016104f181611ed9565b602080825281016104f181611f09565b602080825281016104f181611f39565b602080825281016104f181611f69565b602080825281016104f181611fbf565b602080825281016104f181611fef565b602080825281016104f181612045565b602080825281016104f181612075565b602080825281016104f1816120a5565b602080825281016104f1816120d5565b608081016122258287611e0b565b6122326020830186611dfc565b81810360408301526122448185611e14565b905081810360608301526122588184611e14565b9695505050505050565b60405181810167ffffffffffffffff8111828210171561228157600080fd5b604052919050565b600067ffffffffffffffff8211156122a057600080fd5b5060209081020190565b600067ffffffffffffffff8211156122c157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b60006104f182612302565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b8381101561234257818101518382015260200161232a565b83811115612351576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169056fe75696e7432353620617070726f76616c45787069726174696f6e54696d655365636f6e6473a265627a7a723058208205289449696aa212bcd16788331ffe5e2b23492a0d6daf54aba41663bb4c5f6c6578706572696d656e74616cf5003730782050726f746f636f6c20547261646520457865637574696f6e20436f6f7264696e61746f72", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH3 0x2655 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x33 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x1F8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 DUP4 ADD DUP1 DUP6 MSTORE DUP2 MLOAD SWAP2 SWAP1 SWAP3 ADD KECCAK256 PUSH1 0xC2 DUP4 ADD SWAP1 SWAP4 MSTORE PUSH1 0x27 DUP1 DUP3 MSTORE DUP5 SWAP4 SWAP3 PUSH3 0x262E SWAP1 PUSH1 0x82 ADD CODECOPY DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE DUP1 MLOAD DUP1 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x6C015BD22B4C69690933C1058878EBDFEF31F9AAAE40BBE86D8A09FE1B2972C PUSH1 0x60 DUP5 ADD MSTORE ADDRESS PUSH1 0x80 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xA0 SWAP1 SWAP4 ADD SWAP1 MSTORE DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x0 SSTORE PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP PUSH3 0x240 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x1F1 DUP3 MLOAD PUSH3 0x22D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x20B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x219 DUP5 DUP5 PUSH3 0x1E3 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x23A DUP3 PUSH3 0x221 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x23DE DUP1 PUSH3 0x250 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x84 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV DUP1 PUSH4 0xCDBC4500 GT PUSH2 0x6D JUMPI DUP1 PUSH4 0xCDBC4500 EQ PUSH2 0xC7 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0xDA JUMPI DUP1 PUSH4 0xF50BB641 EQ PUSH2 0xEF JUMPI PUSH2 0x84 JUMP JUMPDEST DUP1 PUSH4 0xF7D8E39 EQ PUSH2 0x89 JUMPI DUP1 PUSH4 0x55FC233C EQ PUSH2 0xB2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B6A JUMP JUMPDEST PUSH2 0x102 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA9 SWAP2 SWAP1 PUSH2 0x212B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xC5 PUSH2 0xC0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C50 JUMP JUMPDEST PUSH2 0x4F7 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xC5 PUSH2 0xD5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3C JUMP JUMPDEST PUSH2 0x761 JUMP JUMPDEST PUSH2 0xE2 PUSH2 0x790 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA9 SWAP2 SWAP1 PUSH2 0x2139 JUMP JUMPDEST PUSH2 0xC5 PUSH2 0xFD CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3C JUMP JUMPDEST PUSH2 0x796 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x149 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21E7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x154 DUP4 PUSH2 0x840 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP1 POP PUSH1 0x3 PUSH1 0xFF DUP3 AND LT PUSH2 0x1B6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21B7 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1C7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1D7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x20F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21D7 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x21D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x35B JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x25E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2147 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x26F JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP1 POP PUSH1 0x0 PUSH2 0x2B1 DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x904 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2C6 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x904 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x325 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP7 POP PUSH2 0x4F1 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x369 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x4BF JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x3AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2147 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3BB JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP1 POP PUSH1 0x0 PUSH2 0x3FD DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x904 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x412 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x904 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x325 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21B7 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x502 DUP7 PUSH2 0x94F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE DUP5 MLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5EE JUMPI PUSH1 0x0 DUP7 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x532 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SWAP1 POP PUSH2 0x546 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP11 SWAP1 MSTORE SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE TIMESTAMP DUP3 GT PUSH2 0x59A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2197 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5A5 DUP3 PUSH2 0x962 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x5CA DUP3 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5BB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x102 JUMP JUMPDEST SWAP1 POP PUSH2 0x5DC DUP8 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x970 AND JUMP JUMPDEST SWAP7 POP POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 POP PUSH2 0x51A SWAP2 POP POP JUMP JUMPDEST POP DUP7 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x755 JUMPI DUP9 MLOAD PUSH1 0x0 SWAP1 DUP11 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x60D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x63C JUMPI PUSH2 0x74D JUMP JUMPDEST PUSH1 0x0 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x64C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ORIGIN EQ ISZERO PUSH2 0x692 JUMPI PUSH2 0x68A DUP6 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0x970 AND JUMP JUMPDEST SWAP5 POP POP PUSH2 0x74D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A4 DUP7 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xA3A AND JUMP JUMPDEST SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x6DF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2157 JUMP JUMPDEST PUSH1 0x20 DUP13 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ORIGIN EQ DUP1 PUSH2 0x712 JUMPI POP PUSH2 0x712 DUP7 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0xA3A AND JUMP JUMPDEST ISZERO ISZERO PUSH2 0x74A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21F7 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x5F4 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x770 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0xAB2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0x789 JUMPI PUSH2 0x789 DUP6 DUP3 DUP7 DUP7 DUP7 PUSH2 0x4F7 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x7A2 DUP5 DUP5 DUP5 DUP5 PUSH2 0x761 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP5 MLOAD PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x40 DUP1 DUP9 ADD MLOAD SWAP1 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND SWAP4 PUSH4 0xBFC8BFCE SWAP4 PUSH2 0x808 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2217 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x822 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x836 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x87E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21C7 JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x8AE JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x946 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21A7 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F1 PUSH2 0x95D DUP4 PUSH2 0xF6A JUMP JUMPDEST PUSH2 0x1126 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F1 PUSH2 0x95D DUP4 PUSH2 0x1166 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH1 0x60 SWAP2 DUP5 SWAP1 PUSH1 0x20 DUP1 DUP3 MUL DUP1 DUP5 ADD DUP3 ADD SWAP3 SWAP2 ADD DUP3 DUP6 LT ISZERO PUSH2 0x9C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2187 JUMP JUMPDEST DUP3 DUP6 GT ISZERO PUSH2 0x9DB JUMPI PUSH2 0x9D4 DUP6 DUP6 DUP4 PUSH2 0x12F8 JUMP JUMPDEST DUP5 SWAP8 POP DUP8 SWAP4 POP JUMPDEST PUSH1 0x1 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP1 DUP5 ADD SWAP3 POP DUP3 SWAP5 POP DUP2 DUP9 MSTORE DUP5 PUSH1 0x40 MSTORE DUP7 DUP9 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA08 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xAA7 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA6E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA9F JUMPI PUSH1 0x1 SWAP3 POP POP POP PUSH2 0x4F1 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xA41 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xAC6 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x13BC AND JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xB59 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3E228BAE00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xBA5 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x64A3BC1500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xC2F JUMPI PUSH2 0xBB2 PUSH2 0x1520 JUMP JUMPDEST DUP4 MLOAD PUSH2 0xBC8 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1429 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xBDB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1BBC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xBFA PUSH2 0x1520 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xBF2 JUMPI SWAP1 POP POP SWAP3 POP DUP1 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC1F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE POP PUSH2 0xF64 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x297BB70B00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xCC0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x50DDE19000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xD0C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xD58 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xDA4 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xA3E2038000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xDF0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xE3C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xDD1C7D1800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xE71 JUMPI DUP3 MLOAD PUSH2 0xE57 SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1429 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xE6A SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1B2D JUMP JUMPDEST SWAP2 POP PUSH2 0xF64 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3C28D86100000000000000000000000000000000000000000000000000000000 EQ ISZERO PUSH2 0xF64 JUMPI PUSH2 0xEC3 PUSH2 0x1520 JUMP JUMPDEST PUSH2 0xECB PUSH2 0x1520 JUMP JUMPDEST DUP5 MLOAD PUSH2 0xEE1 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1429 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xEF4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1BF1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP5 POP SWAP1 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xF17 PUSH2 0x1520 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xF0F JUMPI SWAP1 POP POP SWAP4 POP DUP2 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF3C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE DUP4 MLOAD DUP2 SWAP1 DUP6 SWAP1 PUSH1 0x1 SWAP1 DUP2 LT PUSH2 0xF57 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE POP POP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD DUP1 DUP5 MSTORE DUP3 MLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 KECCAK256 SWAP3 DUP5 ADD MLOAD DUP1 MLOAD PUSH1 0x0 SWAP5 SWAP4 DUP6 SWAP4 SWAP1 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x109E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1061 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP11 MLOAD SWAP11 DUP3 ADD MLOAD SWAP9 DUP4 MSTORE SWAP1 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND SWAP2 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE POP POP POP POP PUSH1 0x60 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x436F6F7264696E61746F72417070726F76616C28000000000000000000000000 PUSH1 0x20 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x62797465733332207472616E73616374696F6E486173682C0000000000000000 PUSH1 0x34 DUP4 ADD MSTORE PUSH32 0x6279746573207472616E73616374696F6E5369676E61747572652C0000000000 PUSH1 0x4C DUP4 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 SWAP1 PUSH1 0x67 ADD PUSH1 0x25 PUSH2 0x2380 DUP3 CODECOPY PUSH1 0x25 ADD DUP1 PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 ADD SWAP1 POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1286 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1249 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP11 MLOAD SWAP11 DUP6 ADD MLOAD SWAP9 DUP4 MSTORE SWAP1 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE SWAP2 DUP3 ADD SWAP8 SWAP1 SWAP8 MSTORE PUSH1 0x60 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1322 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x13B7 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x132F JUMPI PUSH2 0x13B7 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x1369 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x1361 JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x1346 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x13B7 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x13B2 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1378 JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13FE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2207 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0x1465 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2167 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0x14A0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2177 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x14CD JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0x14EE PUSH2 0x14DC DUP3 PUSH2 0x14F5 JUMP JUMPDEST DUP5 PUSH2 0x14E6 DUP8 PUSH2 0x14F5 JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x12F8 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x180 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14EE DUP3 CALLDATALOAD PUSH2 0x22F4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14EE DUP3 MLOAD PUSH2 0x22F4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1603 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1616 PUSH2 0x1611 DUP3 PUSH2 0x2289 JUMP JUMPDEST PUSH2 0x2262 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1654 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x163E DUP9 DUP3 PUSH2 0x1794 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1628 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x166F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x167D PUSH2 0x1611 DUP3 PUSH2 0x2289 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1654 JUMPI DUP2 MLOAD DUP7 ADD PUSH2 0x16A5 DUP9 DUP3 PUSH2 0x1972 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x168F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x16CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x16DA PUSH2 0x1611 DUP3 PUSH2 0x2289 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1654 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1702 DUP9 DUP3 PUSH2 0x1829 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x16EC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1729 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1737 PUSH2 0x1611 DUP3 PUSH2 0x2289 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x175C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1654 JUMPI DUP2 PUSH2 0x1772 DUP9 DUP3 PUSH2 0x1788 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x175F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14EE DUP3 CALLDATALOAD PUSH2 0x22FF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x17A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x17B3 PUSH2 0x1611 DUP3 PUSH2 0x22AA JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x17CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17DA DUP4 DUP3 DUP5 PUSH2 0x231B JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x17F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1802 PUSH2 0x1611 DUP3 PUSH2 0x22AA JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x181E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17DA DUP4 DUP3 DUP5 PUSH2 0x2327 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x183C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1847 PUSH2 0x180 PUSH2 0x2262 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1855 DUP5 DUP5 PUSH2 0x15DA JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1866 DUP5 DUP5 DUP4 ADD PUSH2 0x15DA JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x187A DUP5 DUP3 DUP6 ADD PUSH2 0x15DA JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x188E DUP5 DUP3 DUP6 ADD PUSH2 0x15DA JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x18A2 DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x18B6 DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x18CA DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x18DE DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x18F3 DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1909 DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x192B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1937 DUP5 DUP3 DUP6 ADD PUSH2 0x1794 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1959 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1965 DUP5 DUP3 DUP6 ADD PUSH2 0x1794 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1990 PUSH2 0x180 PUSH2 0x2262 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x199E DUP5 DUP5 PUSH2 0x15E6 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x19AF DUP5 DUP5 DUP4 ADD PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x19C3 DUP5 DUP3 DUP6 ADD PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x19D7 DUP5 DUP3 DUP6 ADD PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x19EB DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x19FF DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x1A13 DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x1A27 DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x1A3C DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1A52 DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A80 DUP5 DUP3 DUP6 ADD PUSH2 0x17E3 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1965 DUP5 DUP3 DUP6 ADD PUSH2 0x17E3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1AC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1ACA PUSH1 0x60 PUSH2 0x2262 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1AD8 DUP5 DUP5 PUSH2 0x1788 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1AE9 DUP5 DUP5 DUP4 ADD PUSH2 0x15DA JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B15 DUP5 DUP3 DUP6 ADD PUSH2 0x1794 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14EE DUP3 MLOAD PUSH2 0x22FF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B62 DUP5 DUP3 DUP6 ADD PUSH2 0x165E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1B7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1B89 DUP6 DUP6 PUSH2 0x1788 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB2 DUP6 DUP3 DUP7 ADD PUSH2 0x1794 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B62 DUP5 DUP3 DUP6 ADD PUSH2 0x1972 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C27 DUP6 DUP3 DUP7 ADD PUSH2 0x1972 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB2 DUP6 DUP3 DUP7 ADD PUSH2 0x1972 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1C68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C8B DUP9 DUP3 DUP10 ADD PUSH2 0x1AAE JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CB4 DUP9 DUP3 DUP10 ADD PUSH2 0x16BB JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CD1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CDD DUP9 DUP3 DUP10 ADD PUSH2 0x1794 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D06 DUP9 DUP3 DUP10 ADD PUSH2 0x1718 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D2F DUP9 DUP3 DUP10 ADD PUSH2 0x15F2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D75 DUP8 DUP3 DUP9 ADD PUSH2 0x1AAE JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D9E DUP8 DUP3 DUP9 ADD PUSH2 0x1794 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DC7 DUP8 DUP3 DUP9 ADD PUSH2 0x1718 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DF0 DUP8 DUP3 DUP9 ADD PUSH2 0x15F2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x1E05 DUP2 PUSH2 0x22F4 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1E05 DUP2 PUSH2 0x22FF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E1F DUP3 PUSH2 0x22F0 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1E33 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2327 JUMP JUMPDEST PUSH2 0x1E3C DUP2 PUSH2 0x2357 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x494E56414C49445F415050524F56414C5F5349474E4154555245000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x46524F4D5F4C4553535F5448414E5F544F5F5245515549524544000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1C DUP2 MSTORE PUSH32 0x544F5F4C4553535F5448414E5F4C454E4754485F524551554952454400000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F465245455F4D454D4F52595F505452000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x415050524F56414C5F4558504952454400000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x4F1 DUP3 DUP5 PUSH2 0x1DFC JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x4F1 DUP3 DUP5 PUSH2 0x1E0B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1E49 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1E79 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1EA9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1ED9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1F09 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1F39 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1F69 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1FBF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1FEF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x2045 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x2075 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x20A5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x20D5 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2225 DUP3 DUP8 PUSH2 0x1E0B JUMP JUMPDEST PUSH2 0x2232 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1DFC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2244 DUP2 DUP6 PUSH2 0x1E14 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2258 DUP2 DUP5 PUSH2 0x1E14 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2281 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x22A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x22C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F1 DUP3 PUSH2 0x2302 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2342 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x232A JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2351 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP INVALID PUSH22 0x696E7432353620617070726F76616C45787069726174 PUSH10 0x6F6E54696D655365636F PUSH15 0x6473A265627A7A7230582082052894 0x49 PUSH10 0x6AA212BCD16788331FFE 0x5e 0x2b 0x23 0x49 0x2a 0xd PUSH14 0xAF54ABA41663BB4C5F6C65787065 PUSH19 0x696D656E74616CF5003730782050726F746F63 PUSH16 0x6C20547261646520457865637574696F PUSH15 0x20436F6F7264696E61746F72000000 ", + "sourceMap": "837:227:0:-;;;977:85;8:9:-1;5:2;;;30:1;27;20:12;5:2;977:85:0;;;;;;;;;;;;;;;;;;;;;;1083:148:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1083:148:10;;;;;;1073:159;;;;;;;1549:18;;;;;;;;;;1045:9:0;;1073:159:10;1549:18;;;;;1533:36;;;;;;;1599:21;;;;;;;;;;;;;;;;1454:214;;;;;;;;;;;;;;;;1583:39;1454:214;;;;1652:4;1454:214;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1454:214:10;;;;;;1444:225;;;;;-1:-1:-1;1423:246:10;830:8:8;:35;;-1:-1:-1;;;;;;830:35:8;-1:-1:-1;;;;;830:35:8;;;;;;;;;;-1:-1:-1;837:227:0;;5:122:-1;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:263;;249:2;237:9;228:7;224:23;220:32;217:2;;;265:1;262;255:12;217:2;300:1;317:64;373:7;353:9;317:64;;;307:74;211:186;-1:-1;;;;211:186;404:128;-1:-1;;;;;473:54;;456:76;539:105;;608:31;633:5;608:31;;;597:42;591:53;-1:-1;;591:53;;837:227:0;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "0x608060405234801561001057600080fd5b5060043610610084576000357c010000000000000000000000000000000000000000000000000000000090048063cdbc45001161006d578063cdbc4500146100c7578063e306f779146100da578063f50bb641146100ef57610084565b80630f7d8e391461008957806355fc233c146100b2575b600080fd5b61009c610097366004611b6a565b610102565b6040516100a9919061212b565b60405180910390f35b6100c56100c0366004611c50565b6104f7565b005b6100c56100d5366004611d3c565b610761565b6100e2610790565b6040516100a99190612139565b6100c56100fd366004611d3c565b610796565b6000808251111515610149576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121e7565b60405180910390fd5b600061015483610840565b7f010000000000000000000000000000000000000000000000000000000000000090049050600360ff8216106101b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121b7565b60008160ff1660038111156101c757fe5b905060008160038111156101d757fe5b141561020f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121d7565b600181600381111561021d57fe5b141561035b57835160411461025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612147565b600084600081518110151561026f57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006102b186600163ffffffff61090416565b905060006102c687602163ffffffff61090416565b905060018884848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610325573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104f195505050505050565b600281600381111561036957fe5b14156104bf5783516041146103aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612147565b60008460008151811015156103bb57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006103fd86600163ffffffff61090416565b9050600061041287602163ffffffff61090416565b905060018860405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610325573d6000803e3d6000fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121b7565b92915050565b60006105028661094f565b60408051600080825260208201909252845192935091905b818110156105ee576000868281518110151561053257fe5b9060200190602002015190506105466114fb565b5060408051606081018252868152602081018a905290810182905242821161059a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612197565b60006105a582610962565b905060006105ca828a878151811015156105bb57fe5b90602001906020020151610102565b90506105dc878263ffffffff61097016565b9650506001909301925061051a915050565b50865160005b818110156107555788516000908a908390811061060d57fe5b906020019060200201516060015173ffffffffffffffffffffffffffffffffffffffff16141561063c5761074d565b6000898281518110151561064c57fe5b6020908102909101015160400151905073ffffffffffffffffffffffffffffffffffffffff81163214156106925761068a853263ffffffff61097016565b94505061074d565b60006106a4868363ffffffff610a3a16565b90508015156106df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612157565b60208c015173ffffffffffffffffffffffffffffffffffffffff163214806107125750610712863263ffffffff610a3a16565b151561074a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121f7565b50505b6001016105f4565b50505050505050505050565b60606107708560400151610ab2565b90506000815111156107895761078985828686866104f7565b5050505050565b60005481565b6107a284848484610761565b6001548451602086015160408088015190517fbfc8bfce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9094169363bfc8bfce9361080893909290918990600401612217565b600060405180830381600087803b15801561082257600080fd5b505af1158015610836573d6000803e3d6000fd5b5050505050505050565b600080825111151561087e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121c7565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106108ae57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515610946576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610140906121a7565b50016020015190565b60006104f161095d83610f6a565b611126565b60006104f161095d83611166565b8151604051606091849060208082028084018201929101828510156109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612187565b828511156109db576109d48585836112f8565b8497508793505b600182019150602081019050808401925082945081885284604052868860018403815181101515610a0857fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152508694505050505092915050565b8151600090815b81811015610aa7578373ffffffffffffffffffffffffffffffffffffffff168582815181101515610a6e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff161415610a9f576001925050506104f1565b600101610a41565b506000949350505050565b60606000610ac6838263ffffffff6113bc16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d5000000000000000000000000000000000000000000000000000000001480610b5957507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b80610ba557507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610c2f57610bb2611520565b8351610bc890859060049063ffffffff61142916565b806020019051610bdb9190810190611bbc565b604080516001808252818301909252919250816020015b610bfa611520565b815260200190600190039081610bf257905050925080836000815181101515610c1f57fe5b6020908102909101015250610f64565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b000000000000000000000000000000000000000000000000000000001480610cc057507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b80610d0c57507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b80610d5857507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b80610da457507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b80610df057507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b80610e3c57507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b15610e71578251610e5790849060049063ffffffff61142916565b806020019051610e6a9190810190611b2d565b9150610f64565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610f6457610ec3611520565b610ecb611520565b8451610ee190869060049063ffffffff61142916565b806020019051610ef49190810190611bf1565b60408051600280825260608201909252929450909250816020015b610f17611520565b815260200190600190039081610f0f57905050935081846000815181101515610f3c57fe5b602090810290910101528351819085906001908110610f5757fe5b6020908102909101015250505b50919050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f8301528251808303840181526060909201808452825192820192909220928401518051600094938593909182918401908083835b6020831061109e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611061565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208a519a8201519883529082019990995273ffffffffffffffffffffffffffffffffffffffff90961691860191909152505050506060810192909252506080902090565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b6040517f436f6f7264696e61746f72417070726f76616c28000000000000000000000000602082019081527f62797465733332207472616e73616374696f6e486173682c000000000000000060348301527f6279746573207472616e73616374696f6e5369676e61747572652c0000000000604c83015260009182919060670160256123808239602501807f29000000000000000000000000000000000000000000000000000000000000008152506001019050604051602081830303815290604052805190602001209050600083602001516040518082805190602001908083835b6020831061128657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611249565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208a519a85015198835290820199909952918201979097526060810194909452505060809091209392505050565b6020811015611322576001816020036101000a0380198351168185511680821786525050506113b7565b8282141561132f576113b7565b828211156113695760208103905080820181840181515b82851015611361578451865260209586019590940193611346565b9052506113b7565b60208103905080820181840183515b818612156113b257825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190611378565b855250505b505050565b6000816004018351101515156113fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612207565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612167565b83518211156114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014090612177565b8282036040519080825280601f01601f1916602001820160405280156114cd576020820181803883390190505b5090506114ee6114dc826114f5565b846114e6876114f5565b0183516112f8565b9392505050565b60200190565b6060604051908101604052806000801916815260200160608152602001600081525090565b61018060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b60006114ee82356122f4565b60006114ee82516122f4565b6000601f8201831361160357600080fd5b813561161661161182612289565b612262565b81815260209384019390925082018360005b83811015611654578135860161163e8882611794565b8452506020928301929190910190600101611628565b5050505092915050565b6000601f8201831361166f57600080fd5b815161167d61161182612289565b81815260209384019390925082018360005b8381101561165457815186016116a58882611972565b845250602092830192919091019060010161168f565b6000601f820183136116cc57600080fd5b81356116da61161182612289565b81815260209384019390925082018360005b8381101561165457813586016117028882611829565b84525060209283019291909101906001016116ec565b6000601f8201831361172957600080fd5b813561173761161182612289565b9150818183526020840193506020810190508385602084028201111561175c57600080fd5b60005b8381101561165457816117728882611788565b845250602092830192919091019060010161175f565b60006114ee82356122ff565b6000601f820183136117a557600080fd5b81356117b3611611826122aa565b915080825260208301602083018583830111156117cf57600080fd5b6117da83828461231b565b50505092915050565b6000601f820183136117f457600080fd5b8151611802611611826122aa565b9150808252602083016020830185838301111561181e57600080fd5b6117da838284612327565b6000610180828403121561183c57600080fd5b611847610180612262565b9050600061185584846115da565b8252506020611866848483016115da565b602083015250604061187a848285016115da565b604083015250606061188e848285016115da565b60608301525060806118a284828501611788565b60808301525060a06118b684828501611788565b60a08301525060c06118ca84828501611788565b60c08301525060e06118de84828501611788565b60e0830152506101006118f384828501611788565b6101008301525061012061190984828501611788565b6101208301525061014082013567ffffffffffffffff81111561192b57600080fd5b61193784828501611794565b6101408301525061016082013567ffffffffffffffff81111561195957600080fd5b61196584828501611794565b6101608301525092915050565b6000610180828403121561198557600080fd5b611990610180612262565b9050600061199e84846115e6565b82525060206119af848483016115e6565b60208301525060406119c3848285016115e6565b60408301525060606119d7848285016115e6565b60608301525060806119eb84828501611b21565b60808301525060a06119ff84828501611b21565b60a08301525060c0611a1384828501611b21565b60c08301525060e0611a2784828501611b21565b60e083015250610100611a3c84828501611b21565b61010083015250610120611a5284828501611b21565b6101208301525061014082015167ffffffffffffffff811115611a7457600080fd5b611a80848285016117e3565b6101408301525061016082015167ffffffffffffffff811115611aa257600080fd5b611965848285016117e3565b600060608284031215611ac057600080fd5b611aca6060612262565b90506000611ad88484611788565b8252506020611ae9848483016115da565b602083015250604082013567ffffffffffffffff811115611b0957600080fd5b611b1584828501611794565b60408301525092915050565b60006114ee82516122ff565b600060208284031215611b3f57600080fd5b815167ffffffffffffffff811115611b5657600080fd5b611b628482850161165e565b949350505050565b60008060408385031215611b7d57600080fd5b6000611b898585611788565b925050602083013567ffffffffffffffff811115611ba657600080fd5b611bb285828601611794565b9150509250929050565b600060208284031215611bce57600080fd5b815167ffffffffffffffff811115611be557600080fd5b611b6284828501611972565b60008060408385031215611c0457600080fd5b825167ffffffffffffffff811115611c1b57600080fd5b611c2785828601611972565b925050602083015167ffffffffffffffff811115611c4457600080fd5b611bb285828601611972565b600080600080600060a08688031215611c6857600080fd5b853567ffffffffffffffff811115611c7f57600080fd5b611c8b88828901611aae565b955050602086013567ffffffffffffffff811115611ca857600080fd5b611cb4888289016116bb565b945050604086013567ffffffffffffffff811115611cd157600080fd5b611cdd88828901611794565b935050606086013567ffffffffffffffff811115611cfa57600080fd5b611d0688828901611718565b925050608086013567ffffffffffffffff811115611d2357600080fd5b611d2f888289016115f2565b9150509295509295909350565b60008060008060808587031215611d5257600080fd5b843567ffffffffffffffff811115611d6957600080fd5b611d7587828801611aae565b945050602085013567ffffffffffffffff811115611d9257600080fd5b611d9e87828801611794565b935050604085013567ffffffffffffffff811115611dbb57600080fd5b611dc787828801611718565b925050606085013567ffffffffffffffff811115611de457600080fd5b611df0878288016115f2565b91505092959194509250565b611e05816122f4565b82525050565b611e05816122ff565b6000611e1f826122f0565b808452611e33816020860160208601612327565b611e3c81612357565b9093016020019392505050565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b601a81527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000602082015260400190565b601a81527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000602082015260400190565b601c81527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000602082015260400190565b601781527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000602082015260400190565b601081527f415050524f56414c5f4558504952454400000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b602081016104f18284611dfc565b602081016104f18284611e0b565b602080825281016104f181611e49565b602080825281016104f181611e79565b602080825281016104f181611ea9565b602080825281016104f181611ed9565b602080825281016104f181611f09565b602080825281016104f181611f39565b602080825281016104f181611f69565b602080825281016104f181611fbf565b602080825281016104f181611fef565b602080825281016104f181612045565b602080825281016104f181612075565b602080825281016104f1816120a5565b602080825281016104f1816120d5565b608081016122258287611e0b565b6122326020830186611dfc565b81810360408301526122448185611e14565b905081810360608301526122588184611e14565b9695505050505050565b60405181810167ffffffffffffffff8111828210171561228157600080fd5b604052919050565b600067ffffffffffffffff8211156122a057600080fd5b5060209081020190565b600067ffffffffffffffff8211156122c157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b60006104f182612302565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b8381101561234257818101518382015260200161232a565b83811115612351576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169056fe75696e7432353620617070726f76616c45787069726174696f6e54696d655365636f6e6473a265627a7a723058208205289449696aa212bcd16788331ffe5e2b23492a0d6daf54aba41663bb4c5f6c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x84 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV DUP1 PUSH4 0xCDBC4500 GT PUSH2 0x6D JUMPI DUP1 PUSH4 0xCDBC4500 EQ PUSH2 0xC7 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0xDA JUMPI DUP1 PUSH4 0xF50BB641 EQ PUSH2 0xEF JUMPI PUSH2 0x84 JUMP JUMPDEST DUP1 PUSH4 0xF7D8E39 EQ PUSH2 0x89 JUMPI DUP1 PUSH4 0x55FC233C EQ PUSH2 0xB2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B6A JUMP JUMPDEST PUSH2 0x102 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA9 SWAP2 SWAP1 PUSH2 0x212B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xC5 PUSH2 0xC0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C50 JUMP JUMPDEST PUSH2 0x4F7 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xC5 PUSH2 0xD5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3C JUMP JUMPDEST PUSH2 0x761 JUMP JUMPDEST PUSH2 0xE2 PUSH2 0x790 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA9 SWAP2 SWAP1 PUSH2 0x2139 JUMP JUMPDEST PUSH2 0xC5 PUSH2 0xFD CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3C JUMP JUMPDEST PUSH2 0x796 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x149 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21E7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x154 DUP4 PUSH2 0x840 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP1 POP PUSH1 0x3 PUSH1 0xFF DUP3 AND LT PUSH2 0x1B6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21B7 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1C7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1D7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x20F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21D7 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x21D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x35B JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x25E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2147 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x26F JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP1 POP PUSH1 0x0 PUSH2 0x2B1 DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x904 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2C6 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x904 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x325 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP7 POP PUSH2 0x4F1 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x369 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x4BF JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x3AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2147 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3BB JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP1 POP PUSH1 0x0 PUSH2 0x3FD DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x904 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x412 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x904 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x325 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21B7 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x502 DUP7 PUSH2 0x94F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE DUP5 MLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5EE JUMPI PUSH1 0x0 DUP7 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x532 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SWAP1 POP PUSH2 0x546 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP11 SWAP1 MSTORE SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE TIMESTAMP DUP3 GT PUSH2 0x59A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2197 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5A5 DUP3 PUSH2 0x962 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x5CA DUP3 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5BB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x102 JUMP JUMPDEST SWAP1 POP PUSH2 0x5DC DUP8 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x970 AND JUMP JUMPDEST SWAP7 POP POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 POP PUSH2 0x51A SWAP2 POP POP JUMP JUMPDEST POP DUP7 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x755 JUMPI DUP9 MLOAD PUSH1 0x0 SWAP1 DUP11 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x60D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x63C JUMPI PUSH2 0x74D JUMP JUMPDEST PUSH1 0x0 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x64C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ORIGIN EQ ISZERO PUSH2 0x692 JUMPI PUSH2 0x68A DUP6 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0x970 AND JUMP JUMPDEST SWAP5 POP POP PUSH2 0x74D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A4 DUP7 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xA3A AND JUMP JUMPDEST SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x6DF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2157 JUMP JUMPDEST PUSH1 0x20 DUP13 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ORIGIN EQ DUP1 PUSH2 0x712 JUMPI POP PUSH2 0x712 DUP7 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0xA3A AND JUMP JUMPDEST ISZERO ISZERO PUSH2 0x74A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21F7 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x5F4 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x770 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0xAB2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0x789 JUMPI PUSH2 0x789 DUP6 DUP3 DUP7 DUP7 DUP7 PUSH2 0x4F7 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x7A2 DUP5 DUP5 DUP5 DUP5 PUSH2 0x761 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP5 MLOAD PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x40 DUP1 DUP9 ADD MLOAD SWAP1 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND SWAP4 PUSH4 0xBFC8BFCE SWAP4 PUSH2 0x808 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2217 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x822 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x836 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x87E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21C7 JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x8AE JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x946 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x21A7 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F1 PUSH2 0x95D DUP4 PUSH2 0xF6A JUMP JUMPDEST PUSH2 0x1126 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F1 PUSH2 0x95D DUP4 PUSH2 0x1166 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH1 0x60 SWAP2 DUP5 SWAP1 PUSH1 0x20 DUP1 DUP3 MUL DUP1 DUP5 ADD DUP3 ADD SWAP3 SWAP2 ADD DUP3 DUP6 LT ISZERO PUSH2 0x9C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2187 JUMP JUMPDEST DUP3 DUP6 GT ISZERO PUSH2 0x9DB JUMPI PUSH2 0x9D4 DUP6 DUP6 DUP4 PUSH2 0x12F8 JUMP JUMPDEST DUP5 SWAP8 POP DUP8 SWAP4 POP JUMPDEST PUSH1 0x1 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP1 DUP5 ADD SWAP3 POP DUP3 SWAP5 POP DUP2 DUP9 MSTORE DUP5 PUSH1 0x40 MSTORE DUP7 DUP9 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA08 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xAA7 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA6E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA9F JUMPI PUSH1 0x1 SWAP3 POP POP POP PUSH2 0x4F1 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xA41 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xAC6 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x13BC AND JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xB59 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3E228BAE00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xBA5 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x64A3BC1500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xC2F JUMPI PUSH2 0xBB2 PUSH2 0x1520 JUMP JUMPDEST DUP4 MLOAD PUSH2 0xBC8 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1429 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xBDB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1BBC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xBFA PUSH2 0x1520 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xBF2 JUMPI SWAP1 POP POP SWAP3 POP DUP1 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC1F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE POP PUSH2 0xF64 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x297BB70B00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xCC0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x50DDE19000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xD0C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xD58 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xDA4 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xA3E2038000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xDF0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xE3C JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xDD1C7D1800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xE71 JUMPI DUP3 MLOAD PUSH2 0xE57 SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1429 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xE6A SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1B2D JUMP JUMPDEST SWAP2 POP PUSH2 0xF64 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3C28D86100000000000000000000000000000000000000000000000000000000 EQ ISZERO PUSH2 0xF64 JUMPI PUSH2 0xEC3 PUSH2 0x1520 JUMP JUMPDEST PUSH2 0xECB PUSH2 0x1520 JUMP JUMPDEST DUP5 MLOAD PUSH2 0xEE1 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1429 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xEF4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1BF1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP5 POP SWAP1 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xF17 PUSH2 0x1520 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xF0F JUMPI SWAP1 POP POP SWAP4 POP DUP2 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF3C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE DUP4 MLOAD DUP2 SWAP1 DUP6 SWAP1 PUSH1 0x1 SWAP1 DUP2 LT PUSH2 0xF57 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE POP POP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD DUP1 DUP5 MSTORE DUP3 MLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 KECCAK256 SWAP3 DUP5 ADD MLOAD DUP1 MLOAD PUSH1 0x0 SWAP5 SWAP4 DUP6 SWAP4 SWAP1 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x109E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1061 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP11 MLOAD SWAP11 DUP3 ADD MLOAD SWAP9 DUP4 MSTORE SWAP1 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND SWAP2 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE POP POP POP POP PUSH1 0x60 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x436F6F7264696E61746F72417070726F76616C28000000000000000000000000 PUSH1 0x20 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x62797465733332207472616E73616374696F6E486173682C0000000000000000 PUSH1 0x34 DUP4 ADD MSTORE PUSH32 0x6279746573207472616E73616374696F6E5369676E61747572652C0000000000 PUSH1 0x4C DUP4 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 SWAP1 PUSH1 0x67 ADD PUSH1 0x25 PUSH2 0x2380 DUP3 CODECOPY PUSH1 0x25 ADD DUP1 PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 ADD SWAP1 POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1286 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1249 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP11 MLOAD SWAP11 DUP6 ADD MLOAD SWAP9 DUP4 MSTORE SWAP1 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE SWAP2 DUP3 ADD SWAP8 SWAP1 SWAP8 MSTORE PUSH1 0x60 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1322 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x13B7 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x132F JUMPI PUSH2 0x13B7 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x1369 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x1361 JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x1346 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x13B7 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x13B2 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1378 JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13FE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2207 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0x1465 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2167 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0x14A0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x140 SWAP1 PUSH2 0x2177 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x14CD JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0x14EE PUSH2 0x14DC DUP3 PUSH2 0x14F5 JUMP JUMPDEST DUP5 PUSH2 0x14E6 DUP8 PUSH2 0x14F5 JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x12F8 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x180 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14EE DUP3 CALLDATALOAD PUSH2 0x22F4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14EE DUP3 MLOAD PUSH2 0x22F4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1603 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1616 PUSH2 0x1611 DUP3 PUSH2 0x2289 JUMP JUMPDEST PUSH2 0x2262 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1654 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x163E DUP9 DUP3 PUSH2 0x1794 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1628 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x166F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x167D PUSH2 0x1611 DUP3 PUSH2 0x2289 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1654 JUMPI DUP2 MLOAD DUP7 ADD PUSH2 0x16A5 DUP9 DUP3 PUSH2 0x1972 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x168F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x16CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x16DA PUSH2 0x1611 DUP3 PUSH2 0x2289 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1654 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1702 DUP9 DUP3 PUSH2 0x1829 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x16EC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1729 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1737 PUSH2 0x1611 DUP3 PUSH2 0x2289 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x175C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1654 JUMPI DUP2 PUSH2 0x1772 DUP9 DUP3 PUSH2 0x1788 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x175F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14EE DUP3 CALLDATALOAD PUSH2 0x22FF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x17A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x17B3 PUSH2 0x1611 DUP3 PUSH2 0x22AA JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x17CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17DA DUP4 DUP3 DUP5 PUSH2 0x231B JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x17F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1802 PUSH2 0x1611 DUP3 PUSH2 0x22AA JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x181E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x17DA DUP4 DUP3 DUP5 PUSH2 0x2327 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x183C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1847 PUSH2 0x180 PUSH2 0x2262 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1855 DUP5 DUP5 PUSH2 0x15DA JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1866 DUP5 DUP5 DUP4 ADD PUSH2 0x15DA JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x187A DUP5 DUP3 DUP6 ADD PUSH2 0x15DA JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x188E DUP5 DUP3 DUP6 ADD PUSH2 0x15DA JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x18A2 DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x18B6 DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x18CA DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x18DE DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x18F3 DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1909 DUP5 DUP3 DUP6 ADD PUSH2 0x1788 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x192B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1937 DUP5 DUP3 DUP6 ADD PUSH2 0x1794 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1959 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1965 DUP5 DUP3 DUP6 ADD PUSH2 0x1794 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1990 PUSH2 0x180 PUSH2 0x2262 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x199E DUP5 DUP5 PUSH2 0x15E6 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x19AF DUP5 DUP5 DUP4 ADD PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x19C3 DUP5 DUP3 DUP6 ADD PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x19D7 DUP5 DUP3 DUP6 ADD PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x19EB DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x19FF DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x1A13 DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x1A27 DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x1A3C DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1A52 DUP5 DUP3 DUP6 ADD PUSH2 0x1B21 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A80 DUP5 DUP3 DUP6 ADD PUSH2 0x17E3 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1965 DUP5 DUP3 DUP6 ADD PUSH2 0x17E3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1AC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1ACA PUSH1 0x60 PUSH2 0x2262 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1AD8 DUP5 DUP5 PUSH2 0x1788 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1AE9 DUP5 DUP5 DUP4 ADD PUSH2 0x15DA JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B15 DUP5 DUP3 DUP6 ADD PUSH2 0x1794 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14EE DUP3 MLOAD PUSH2 0x22FF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B62 DUP5 DUP3 DUP6 ADD PUSH2 0x165E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1B7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1B89 DUP6 DUP6 PUSH2 0x1788 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB2 DUP6 DUP3 DUP7 ADD PUSH2 0x1794 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B62 DUP5 DUP3 DUP6 ADD PUSH2 0x1972 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1C04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C27 DUP6 DUP3 DUP7 ADD PUSH2 0x1972 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB2 DUP6 DUP3 DUP7 ADD PUSH2 0x1972 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1C68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C8B DUP9 DUP3 DUP10 ADD PUSH2 0x1AAE JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CB4 DUP9 DUP3 DUP10 ADD PUSH2 0x16BB JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CD1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CDD DUP9 DUP3 DUP10 ADD PUSH2 0x1794 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D06 DUP9 DUP3 DUP10 ADD PUSH2 0x1718 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D2F DUP9 DUP3 DUP10 ADD PUSH2 0x15F2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D75 DUP8 DUP3 DUP9 ADD PUSH2 0x1AAE JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D9E DUP8 DUP3 DUP9 ADD PUSH2 0x1794 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DC7 DUP8 DUP3 DUP9 ADD PUSH2 0x1718 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DF0 DUP8 DUP3 DUP9 ADD PUSH2 0x15F2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x1E05 DUP2 PUSH2 0x22F4 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1E05 DUP2 PUSH2 0x22FF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E1F DUP3 PUSH2 0x22F0 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1E33 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2327 JUMP JUMPDEST PUSH2 0x1E3C DUP2 PUSH2 0x2357 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x494E56414C49445F415050524F56414C5F5349474E4154555245000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x46524F4D5F4C4553535F5448414E5F544F5F5245515549524544000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1C DUP2 MSTORE PUSH32 0x544F5F4C4553535F5448414E5F4C454E4754485F524551554952454400000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F465245455F4D454D4F52595F505452000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x415050524F56414C5F4558504952454400000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x4F1 DUP3 DUP5 PUSH2 0x1DFC JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x4F1 DUP3 DUP5 PUSH2 0x1E0B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1E49 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1E79 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1EA9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1ED9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1F09 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1F39 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1F69 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1FBF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x1FEF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x2045 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x2075 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x20A5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F1 DUP2 PUSH2 0x20D5 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2225 DUP3 DUP8 PUSH2 0x1E0B JUMP JUMPDEST PUSH2 0x2232 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1DFC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2244 DUP2 DUP6 PUSH2 0x1E14 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2258 DUP2 DUP5 PUSH2 0x1E14 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2281 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x22A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x22C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F1 DUP3 PUSH2 0x2302 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2342 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x232A JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2351 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP INVALID PUSH22 0x696E7432353620617070726F76616C45787069726174 PUSH10 0x6F6E54696D655365636F PUSH15 0x6473A265627A7A7230582082052894 0x49 PUSH10 0x6AA212BCD16788331FFE 0x5e 0x2b 0x23 0x49 0x2a 0xd PUSH14 0xAF54ABA41663BB4C5F6C65787065 PUSH19 0x696D656E74616CF50037000000000000000000 ", + "sourceMap": "837:227:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;837:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;988:2549:3;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3487:2936:1;;;;;;;;;:::i;:::-;;2021:861;;;;;;;;;:::i;1339:33:10:-;;;:::i;:::-;;;;;;;;1540:753:2;;;;;;;;;:::i;988:2549:3:-;1097:21;1174:1;1155:9;:16;:20;1134:97;;;;;;;;;;;;;;;;;;;;;;;;1296:22;1327:23;:9;:21;:23::i;:::-;1321:30;;;;-1:-1:-1;1449:29:3;1424:55;;;;1403:123;;;;;;;;;;;;;;1537:27;1581:16;1567:31;;;;;;;;;;1537:61;-1:-1:-1;1948:21:3;1931:13;:38;;;;;;;;;1927:1260;;;1985:27;;;;;;;;;;;1927:1260;2085:20;2068:13;:37;;;;;;;;;2064:1123;;;2146:16;;2166:2;2146:22;2121:99;;;;;;;;;;;;;;2234:7;2250:9;2260:1;2250:12;;;;;;;;;;;;;;;;;;;;;2244:19;;-1:-1:-1;2277:9:3;2289:24;:9;2311:1;2289:24;:21;:24;:::i;:::-;2277:36;-1:-1:-1;2327:9:3;2339:25;:9;2361:2;2339:25;:21;:25;:::i;:::-;2327:37;;2394:102;2421:4;2443:1;2462;2481;2394:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2394:102:3;;;;;;-1:-1:-1;2510:20:3;;-1:-1:-1;;;;;;2510:20:3;2064:1123;2607:21;2590:13;:38;;;;;;;;;2586:601;;;2669:16;;2689:2;2669:22;2644:99;;;;;;;;;;;;;;2757:7;2773:9;2783:1;2773:12;;;;;;;;;;;;;;;;;;;;;2767:19;;-1:-1:-1;2800:9:3;2812:24;:9;2834:1;2812:24;:21;:24;:::i;:::-;2800:36;-1:-1:-1;2850:9:3;2862:25;:9;2884:2;2862:25;:21;:25;:::i;:::-;2850:37;;2917:225;3048:4;2954:116;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2954:116:3;;;2944:127;;;;;;3089:1;3108;3127;2917:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;2586:601:3;3499:31;;;;;;;;;;;988:2549;;;;;:::o;3487:2936:1:-;3861:23;3887:31;3906:11;3887:18;:31::i;:::-;4021:16;;;4035:1;4021:16;;;;;;;;;4075:25;;3861:57;;-1:-1:-1;4021:16:1;4075:25;4110:1114;4134:16;4130:1;:20;4110:1114;;;4210:44;4257:29;4287:1;4257:32;;;;;;;;;;;;;;;;;;4210:79;;4303:35;;:::i;:::-;-1:-1:-1;4341:230:1;;;;;;;;;;;;;;;;;;;;;;;4759:15;4720:54;;4633:191;;;;;;;;;;;;;;4903:20;4926:36;4953:8;4926:26;:36::i;:::-;4903:59;;4976:29;5008:53;5025:12;5039:18;5058:1;5039:21;;;;;;;;;;;;;;;;;;5008:16;:53::i;:::-;4976:85;-1:-1:-1;5160:53:1;:23;4976:85;5160:53;:30;:53;:::i;:::-;5134:79;-1:-1:-1;;4152:3:1;;;;;-1:-1:-1;4110:1114:1;;-1:-1:-1;;4110:1114:1;;-1:-1:-1;5265:13:1;;5242:20;5288:1129;5312:12;5308:1;:16;5288:1129;;;5423:9;;5458:1;;5423:6;;5430:1;;5423:9;;;;;;;;;;;;;;:23;;;:37;;;5419:84;;;5480:8;;5419:84;5609:23;5635:6;5642:1;5635:9;;;;;;;;;;;;;;;;;;;:29;;;;-1:-1:-1;5682:28:1;;;5701:9;5682:28;5678:160;;;5756:41;:23;5787:9;5756:41;:30;:41;:::i;:::-;5730:67;;5815:8;;;5678:160;5929:20;5952:49;:23;5985:15;5952:49;:32;:49;:::i;:::-;5929:72;;6040:15;6015:100;;;;;;;;;;;;;;;;6273:25;;;;:38;;6302:9;6273:38;;:85;;-1:-1:-1;6315:43:1;:23;6348:9;6315:43;:32;:43;:::i;:::-;6248:158;;;;;;;;;;;;;;;;5288:1129;;;5326:3;;5288:1129;;;;3487:2936;;;;;;;;;:::o;2021:861::-;2398:30;2431:38;2452:11;:16;;;2431:20;:38::i;:::-;2398:71;;2556:1;2540:6;:13;:17;2536:340;;;2641:224;2695:11;2724:6;2748:20;2786:29;2833:18;2641:36;:224::i;:::-;2021:861;;;;;:::o;1339:33:10:-;;;;:::o;1540:753:2:-;1895:175;1940:11;1965:20;1999:29;2042:18;1895:31;:175::i;:::-;2116:8;;2157:16;;2187:25;;;;2226:16;;;;;2116:170;;;;;:8;;;;;:27;;:170;;2157:16;;2187:25;;2256:20;;2116:170;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2116:170:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2116:170:2;;;;1540:753;;;;:::o;8315:448:19:-;8399:13;8460:1;8449;:8;:12;8428:92;;;;;;;;;;;;;;;;8570:8;;8568:1;;8570:12;;;;8568:15;;;;;;;;;;8682:8;;8678:16;;8707:17;;;-1:-1:-1;8568:15:19;;;;;;;8315:448::o;13292:490::-;13413:14;13476:5;13484:2;13476:10;13464:1;:8;:22;;13443:107;;;;;;;;;;;;;;;;-1:-1:-1;13729:13:19;13631:2;13729:13;13723:20;;13292:490::o;1514:406:11:-;1627:23;1828:53;1846:34;1868:11;1846:21;:34::i;:::-;1828:17;:53::i;1761:259:9:-;1881:20;1932:52;1950:33;1974:8;1950:23;:33::i;1089:2103:18:-;1438:19;;1587:4;1581:11;1209:16;;1438:12;;1510:2;:23;;;1676:45;;;;;;1438:19;1504:30;2076:32;;;;2055:102;;;;;;;;;;;;;;2411:18;2398:10;:31;2394:273;;;2445:78;2462:10;2474:20;2496:26;2445:16;:78::i;:::-;2580:10;2564:26;;2631:12;2607:36;;2546:111;2735:1;2713:23;;;;2776:2;2746:32;;;;2832:26;2809:20;:49;2788:70;;2881:18;2868:31;;2991:18;2977:12;2970:40;3072:10;3066:4;3059:24;3141:15;3102:12;3136:1;3115:18;:22;3102:36;;;;;;;;;;:54;;;;:36;;;;;;;;;;:54;-1:-1:-1;3173:12:18;;-1:-1:-1;;;;;1089:2103:18;;;;:::o;3431:342::-;3580:19;;3543:4;;;3609:136;3633:6;3629:1;:10;3609:136;;;3683:6;3664:25;;:12;3677:1;3664:15;;;;;;;;;;;;;;;;;;:25;;;3660:75;;;3716:4;3709:11;;;;;;3660:75;3641:3;;3609:136;;;-1:-1:-1;3761:5:18;;3431:342;-1:-1:-1;;;;3431:342:18:o;6635:1760:1:-;6731:30;6777:15;6795:18;:4;6777:15;6795:18;:15;:18;:::i;:::-;6777:36;-1:-1:-1;6840:31:1;;;6852:19;6840:31;;:87;;-1:-1:-1;6887:40:1;;;6899:28;6887:40;6840:87;:142;;;-1:-1:-1;6943:39:1;;;6955:27;6943:39;6840:142;6823:1543;;;7043:27;;:::i;:::-;7116:11;;7102:26;;7116:4;;7113:1;;7102:26;:10;:26;:::i;:::-;7074:102;;;;;;;;;;;;;;7199:23;;;7220:1;7199:23;;;;;;;;;7042:134;;-1:-1:-1;7199:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;7190:32;;7248:5;7236:6;7243:1;7236:9;;;;;;;;;;;;;;;;;;:17;-1:-1:-1;6823:1543:1;;;7287:38;;;7299:26;7287:38;;:101;;-1:-1:-1;7341:47:1;;;7353:35;7341:47;7287:101;:163;;;-1:-1:-1;7404:46:1;;;7416:34;7404:46;7287:163;:217;;;-1:-1:-1;7466:38:1;;;7478:26;7466:38;7287:217;:280;;;-1:-1:-1;7520:47:1;;;7532:35;7520:47;7287:280;:335;;;-1:-1:-1;7583:39:1;;;7595:27;7583:39;7287:335;:399;;;-1:-1:-1;7638:48:1;;;7650:36;7638:48;7287:399;7270:1096;;;7835:11;;7821:26;;7835:4;;7832:1;;7821:26;:10;:26;:::i;:::-;7793:104;;;;;;;;;;;;;;7782:115;;7270:1096;;;7918:33;;;7930:21;7918:33;7914:452;;;8012:31;;:::i;:::-;8045:32;;:::i;:::-;8123:11;;8109:26;;8123:4;;8120:1;;8109:26;:10;:26;:::i;:::-;8081:118;;;;;;;;;;;;;;8261:23;;;8282:1;8261:23;;;;;;;;;8011:188;;-1:-1:-1;8011:188:1;;-1:-1:-1;8261:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8252:32;;8310:9;8298:6;8305:1;8298:9;;;;;;;;;;;;;;;;;;:21;8333:9;;8345:10;;8333:6;;8340:1;;8333:9;;;;;;;;;;;;;;:22;-1:-1:-1;;7914:452:1;-1:-1:-1;6635:1760:1;;;:::o;2167:1395:11:-;823:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;823:146:11;;;;;;;813:157;;;;;;;;;2410:16;;;;2400:27;;2283:14;;813:157;2283:14;;823:146;;;;2400:27;;;;823:146;2400:27;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2400:27:11;;;;;;;;;;;;2525:16;;2575:25;;;;2999:26;;;3125:15;;;3118:29;;;;3270:42;3251:62;;;3234:15;;;3227:87;;;;-1:-1:-1;;;;3364:2:11;3352:15;;3345:33;;;;-1:-1:-1;3519:3:11;3501:22;;;2167:1395::o;1872:924:10:-;1966:14;2023:18;2335:2;2329:9;2367:66;2352:82;;2484:1;2472:14;;2465:40;;;;2602:2;2590:15;;2583:35;;;;2754:2;2736:21;;;1872:924::o;2360:1389:9:-;834:191;;;;;;;;;;;;;;;;;;;2477:14;;;;834:191;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;834:191:9;;;824:202;;;;;;2507:60;;2577:32;2622:8;:29;;;2612:40;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2612:40:9;;;;;;;;;;;;2761:24;;2835:38;;;;3280:26;;;3373:15;;;3366:40;;;;3460:15;;;3453:49;;;;3568:2;3556:15;;3549:54;;;;-1:-1:-1;;3706:3:9;3688:22;;;;2360:1389;-1:-1:-1;;;2360:1389:9:o;1808:4337:19:-;1958:2;1949:6;:11;1945:4194;;;2247:1;2237:6;2233:2;2229:15;2224:3;2220:25;2216:33;2298:4;2294:9;2285:6;2279:13;2275:29;2347:4;2340;2334:11;2330:22;2388:1;2385;2382:8;2376:4;2369:22;2186:219;;;;;;2509:4;2499:6;:14;2495:59;;;2533:7;;2495:59;3243:4;3234:6;:13;3230:2899;;;3569:2;3561:6;3557:15;3547:25;;3617:6;3609;3605:19;3667:6;3661:4;3657:17;3974:4;3968:11;4242:198;4260:4;4252:6;4249:16;4242:198;;;4308:13;;4295:27;;4369:2;4405:13;;;;4357:15;;;;4242:198;;;4529:18;;-1:-1:-1;3276:1289:19;;;4810:2;4802:6;4798:15;4788:25;;4858:6;4850;4846:19;4908:6;4902:4;4898:17;5218:6;5212:13;5797:191;5814:4;5808;5804:15;5797:191;;;5862:11;;5849:25;;5907:13;;;;;5953;;;;5797:191;;;6078:19;;-1:-1:-1;;4612:1503:19;1808:4337;;;:::o;15595:687::-;15715:13;15777:5;15785:1;15777:9;15765:1;:8;:21;;15744:105;;;;;;;;;;;;;;;;-1:-1:-1;16023:13:19;15926:2;16023:13;16017:20;16176:66;16164:79;;15595:687::o;6453:617::-;6587:19;6643:10;;;;6622:83;;;;;;;;;;;;;;6742:8;;6736:14;;;6715:89;;;;;;;;;;;;;;6905:4;6900:2;:9;6890:20;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;6890:20:19;87:34:-1;135:17;;-1:-1;6890:20:19;;6881:29;;6920:120;6941:23;:6;:21;:23::i;:::-;6999:4;6978:18;:1;:16;:18::i;:::-;:25;7017:6;:13;6920:7;:120::i;:::-;6453:617;;;;;:::o;1341:228::-;1520:2;1509:14;;1341:228::o;837:227:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:122;;208:39;239:6;233:13;208:39;;275:693;;390:4;378:17;;374:27;-1:-1;364:2;;415:1;412;405:12;364:2;452:6;439:20;474:85;489:69;551:6;489:69;;;474:85;;;587:21;;;631:4;619:17;;;;465:94;;-1:-1;644:14;;619:17;739:1;724:238;749:6;746:1;743:13;724:238;;;832:3;819:17;811:6;807:30;856:42;894:3;882:10;856:42;;;844:55;;-1:-1;922:4;913:14;;;;941;;;;;771:1;764:9;724:238;;;728:14;357:611;;;;;;;;1008:735;;1144:4;1132:17;;1128:27;-1:-1;1118:2;;1169:1;1166;1159:12;1118:2;1199:6;1193:13;1221:95;1236:79;1308:6;1236:79;;1221:95;1344:21;;;1388:4;1376:17;;;;1212:104;;-1:-1;1401:14;;1376:17;1496:1;1481:256;1506:6;1503:1;1500:13;1481:256;;;1582:3;1576:10;1568:6;1564:23;1606:67;1669:3;1657:10;1606:67;;;1594:80;;-1:-1;1697:4;1688:14;;;;1716;;;;;1528:1;1521:9;1481:256;;1783:735;;1912:4;1900:17;;1896:27;-1:-1;1886:2;;1937:1;1934;1927:12;1886:2;1974:6;1961:20;1996:99;2011:83;2087:6;2011:83;;1996:99;2123:21;;;2167:4;2155:17;;;;1987:108;;-1:-1;2180:14;;2155:17;2275:1;2260:252;2285:6;2282:1;2279:13;2260:252;;;2368:3;2355:17;2347:6;2343:30;2392:56;2444:3;2432:10;2392:56;;;2380:69;;-1:-1;2472:4;2463:14;;;;2491;;;;;2307:1;2300:9;2260:252;;2544:707;;2654:4;2642:17;;2638:27;-1:-1;2628:2;;2679:1;2676;2669:12;2628:2;2716:6;2703:20;2738:80;2753:64;2810:6;2753:64;;2738:80;2729:89;;2835:5;2860:6;2853:5;2846:21;2890:4;2882:6;2878:17;2868:27;;2912:4;2907:3;2903:14;2896:21;;2965:6;3012:3;3004:4;2996:6;2992:17;2987:3;2983:27;2980:36;2977:2;;;3029:1;3026;3019:12;2977:2;3054:1;3039:206;3064:6;3061:1;3058:13;3039:206;;;3122:3;3144:37;3177:3;3165:10;3144:37;;;3132:50;;-1:-1;3205:4;3196:14;;;;3224;;;;;3086:1;3079:9;3039:206;;3259:118;;3326:46;3364:6;3351:20;3326:46;;3385:432;;3475:4;3463:17;;3459:27;-1:-1;3449:2;;3500:1;3497;3490:12;3449:2;3537:6;3524:20;3559:60;3574:44;3611:6;3574:44;;3559:60;3550:69;;3639:6;3632:5;3625:21;3675:4;3667:6;3663:17;3708:4;3701:5;3697:16;3743:3;3734:6;3729:3;3725:16;3722:25;3719:2;;;3760:1;3757;3750:12;3719:2;3770:41;3804:6;3799:3;3794;3770:41;;;3442:375;;;;;;;;3826:434;;3927:4;3915:17;;3911:27;-1:-1;3901:2;;3952:1;3949;3942:12;3901:2;3982:6;3976:13;4004:60;4019:44;4056:6;4019:44;;4004:60;3995:69;;4084:6;4077:5;4070:21;4120:4;4112:6;4108:17;4153:4;4146:5;4142:16;4188:3;4179:6;4174:3;4170:16;4167:25;4164:2;;;4205:1;4202;4195:12;4164:2;4215:39;4247:6;4242:3;4237;4215:39;;4745:2205;;4853:5;4841:9;4836:3;4832:19;4828:31;4825:2;;;4872:1;4869;4862:12;4825:2;4890:21;4905:5;4890:21;;;4881:30;-1:-1;4969:1;5000:49;5045:3;5025:9;5000:49;;;4976:74;;-1:-1;5119:2;5152:49;5197:3;5173:22;;;5152:49;;;5145:4;5138:5;5134:16;5127:75;5071:142;5278:2;5311:49;5356:3;5347:6;5336:9;5332:22;5311:49;;;5304:4;5297:5;5293:16;5286:75;5223:149;5431:2;5464:49;5509:3;5500:6;5489:9;5485:22;5464:49;;;5457:4;5450:5;5446:16;5439:75;5382:143;5587:3;5621:49;5666:3;5657:6;5646:9;5642:22;5621:49;;;5614:4;5607:5;5603:16;5596:75;5535:147;5744:3;5778:49;5823:3;5814:6;5803:9;5799:22;5778:49;;;5771:4;5764:5;5760:16;5753:75;5692:147;5893:3;5927:49;5972:3;5963:6;5952:9;5948:22;5927:49;;;5920:4;5913:5;5909:16;5902:75;5849:139;6042:3;6076:49;6121:3;6112:6;6101:9;6097:22;6076:49;;;6069:4;6062:5;6058:16;6051:75;5998:139;6204:3;6239:49;6284:3;6275:6;6264:9;6260:22;6239:49;;;6231:5;6224;6220:17;6213:76;6147:153;6350:3;6385:49;6430:3;6421:6;6410:9;6406:22;6385:49;;;6377:5;6370;6366:17;6359:76;6310:136;6534:3;6523:9;6519:19;6506:33;6559:18;6551:6;6548:30;6545:2;;;6591:1;6588;6581:12;6545:2;6627:54;6677:3;6668:6;6657:9;6653:22;6627:54;;;6619:5;6612;6608:17;6601:81;6456:237;6781:3;6770:9;6766:19;6753:33;6806:18;6798:6;6795:30;6792:2;;;6838:1;6835;6828:12;6792:2;6874:54;6924:3;6915:6;6904:9;6900:22;6874:54;;;6866:5;6859;6855:17;6848:81;6703:237;4819:2131;;;;;6985:2334;;7104:5;7092:9;7087:3;7083:19;7079:31;7076:2;;;7123:1;7120;7113:12;7076:2;7141:21;7156:5;7141:21;;;7132:30;-1:-1;7220:1;7251:60;7307:3;7287:9;7251:60;;;7227:85;;-1:-1;7381:2;7414:60;7470:3;7446:22;;;7414:60;;;7407:4;7400:5;7396:16;7389:86;7333:153;7551:2;7584:60;7640:3;7631:6;7620:9;7616:22;7584:60;;;7577:4;7570:5;7566:16;7559:86;7496:160;7715:2;7748:60;7804:3;7795:6;7784:9;7780:22;7748:60;;;7741:4;7734:5;7730:16;7723:86;7666:154;7882:3;7916:60;7972:3;7963:6;7952:9;7948:22;7916:60;;;7909:4;7902:5;7898:16;7891:86;7830:158;8050:3;8084:60;8140:3;8131:6;8120:9;8116:22;8084:60;;;8077:4;8070:5;8066:16;8059:86;7998:158;8210:3;8244:60;8300:3;8291:6;8280:9;8276:22;8244:60;;;8237:4;8230:5;8226:16;8219:86;8166:150;8370:3;8404:60;8460:3;8451:6;8440:9;8436:22;8404:60;;;8397:4;8390:5;8386:16;8379:86;8326:150;8543:3;8578:60;8634:3;8625:6;8614:9;8610:22;8578:60;;;8570:5;8563;8559:17;8552:87;8486:164;8700:3;8735:60;8791:3;8782:6;8771:9;8767:22;8735:60;;;8727:5;8720;8716:17;8709:87;8660:147;8888:3;8877:9;8873:19;8867:26;8913:18;8905:6;8902:30;8899:2;;;8945:1;8942;8935:12;8899:2;8981:65;9042:3;9033:6;9022:9;9018:22;8981:65;;;8973:5;8966;8962:17;8955:92;8817:241;9139:3;9128:9;9124:19;9118:26;9164:18;9156:6;9153:30;9150:2;;;9196:1;9193;9186:12;9150:2;9232:65;9293:3;9284:6;9273:9;9269:22;9232:65;;9378:719;;9501:4;9489:9;9484:3;9480:19;9476:30;9473:2;;;9519:1;9516;9509:12;9473:2;9537:20;9552:4;9537:20;;;9528:29;-1:-1;9607:1;9638:49;9683:3;9663:9;9638:49;;;9614:74;;-1:-1;9758:2;9791:49;9836:3;9812:22;;;9791:49;;;9784:4;9777:5;9773:16;9766:75;9709:143;9930:2;9919:9;9915:18;9902:32;9954:18;9946:6;9943:30;9940:2;;;9986:1;9983;9976:12;9940:2;10021:54;10071:3;10062:6;10051:9;10047:22;10021:54;;;10014:4;10007:5;10003:16;9996:80;9862:225;9467:630;;;;;10229:122;;10307:39;10338:6;10332:13;10307:39;;10358:422;;10513:2;10501:9;10492:7;10488:23;10484:32;10481:2;;;10529:1;10526;10519:12;10481:2;10564:24;;10608:18;10597:30;;10594:2;;;10640:1;10637;10630:12;10594:2;10660:104;10756:7;10747:6;10736:9;10732:22;10660:104;;;10650:114;10475:305;-1:-1;;;;10475:305;10787:470;;;10917:2;10905:9;10896:7;10892:23;10888:32;10885:2;;;10933:1;10930;10923:12;10885:2;10968:1;10985:53;11030:7;11010:9;10985:53;;;10975:63;;10947:97;11103:2;11092:9;11088:18;11075:32;11127:18;11119:6;11116:30;11113:2;;;11159:1;11156;11149:12;11113:2;11179:62;11233:7;11224:6;11213:9;11209:22;11179:62;;;11169:72;;11054:193;10879:378;;;;;;11264:380;;11398:2;11386:9;11377:7;11373:23;11369:32;11366:2;;;11414:1;11411;11404:12;11366:2;11449:24;;11493:18;11482:30;;11479:2;;;11525:1;11522;11515:12;11479:2;11545:83;11620:7;11611:6;11600:9;11596:22;11545:83;;11651:633;;;11821:2;11809:9;11800:7;11796:23;11792:32;11789:2;;;11837:1;11834;11827:12;11789:2;11872:24;;11916:18;11905:30;;11902:2;;;11948:1;11945;11938:12;11902:2;11968:83;12043:7;12034:6;12023:9;12019:22;11968:83;;;11958:93;;11851:206;12109:2;12098:9;12094:18;12088:25;12133:18;12125:6;12122:30;12119:2;;;12165:1;12162;12155:12;12119:2;12185:83;12260:7;12251:6;12240:9;12236:22;12185:83;;12291:1457;;;;;;12605:3;12593:9;12584:7;12580:23;12576:33;12573:2;;;12622:1;12619;12612:12;12573:2;12657:31;;12708:18;12697:30;;12694:2;;;12740:1;12737;12730:12;12694:2;12760:87;12839:7;12830:6;12819:9;12815:22;12760:87;;;12750:97;;12636:217;12912:2;12901:9;12897:18;12884:32;12936:18;12928:6;12925:30;12922:2;;;12968:1;12965;12958:12;12922:2;12988:97;13077:7;13068:6;13057:9;13053:22;12988:97;;;12978:107;;12863:228;13150:2;13139:9;13135:18;13122:32;13174:18;13166:6;13163:30;13160:2;;;13206:1;13203;13196:12;13160:2;13226:62;13280:7;13271:6;13260:9;13256:22;13226:62;;;13216:72;;13101:193;13353:2;13342:9;13338:18;13325:32;13377:18;13369:6;13366:30;13363:2;;;13409:1;13406;13399:12;13363:2;13429:78;13499:7;13490:6;13479:9;13475:22;13429:78;;;13419:88;;13304:209;13572:3;13561:9;13557:19;13544:33;13597:18;13589:6;13586:30;13583:2;;;13629:1;13626;13619:12;13583:2;13649:83;13724:7;13715:6;13704:9;13700:22;13649:83;;;13639:93;;13523:215;12567:1181;;;;;;;;;13755:1157;;;;;14008:3;13996:9;13987:7;13983:23;13979:33;13976:2;;;14025:1;14022;14015:12;13976:2;14060:31;;14111:18;14100:30;;14097:2;;;14143:1;14140;14133:12;14097:2;14163:87;14242:7;14233:6;14222:9;14218:22;14163:87;;;14153:97;;14039:217;14315:2;14304:9;14300:18;14287:32;14339:18;14331:6;14328:30;14325:2;;;14371:1;14368;14361:12;14325:2;14391:62;14445:7;14436:6;14425:9;14421:22;14391:62;;;14381:72;;14266:193;14518:2;14507:9;14503:18;14490:32;14542:18;14534:6;14531:30;14528:2;;;14574:1;14571;14564:12;14528:2;14594:78;14664:7;14655:6;14644:9;14640:22;14594:78;;;14584:88;;14469:209;14737:2;14726:9;14722:18;14709:32;14761:18;14753:6;14750:30;14747:2;;;14793:1;14790;14783:12;14747:2;14813:83;14888:7;14879:6;14868:9;14864:22;14813:83;;;14803:93;;14688:214;13970:942;;;;;;;;14919:120;15002:31;15027:5;15002:31;;;14997:3;14990:44;14984:55;;;15046:120;15129:31;15154:5;15129:31;;15173:307;;15283:38;15315:5;15283:38;;;15338:6;15333:3;15326:19;15350:63;15406:6;15399:4;15394:3;15390:14;15383:4;15376:5;15372:16;15350:63;;;15445:29;15467:6;15445:29;;;15425:50;;;15438:4;15425:50;;15263:217;-1:-1;;;15263:217;15794:306;15959:2;15947:15;;15996:66;15991:2;15982:12;;15975:88;16091:2;16082:12;;15940:160;16109:306;16274:2;16262:15;;16311:66;16306:2;16297:12;;16290:88;16406:2;16397:12;;16255:160;16424:306;16589:2;16577:15;;16626:66;16621:2;16612:12;;16605:88;16721:2;16712:12;;16570:160;16739:306;16904:2;16892:15;;16941:66;16936:2;16927:12;;16920:88;17036:2;17027:12;;16885:160;17054:306;17219:2;17207:15;;17256:66;17251:2;17242:12;;17235:88;17351:2;17342:12;;17200:160;17369:306;17534:2;17522:15;;17571:66;17566:2;17557:12;;17550:88;17666:2;17657:12;;17515:160;17684:407;17849:2;17837:15;;17886:66;17881:2;17872:12;;17865:88;17987:66;17982:2;17973:12;;17966:88;18082:2;18073:12;;17830:261;18100:306;18265:2;18253:15;;18302:66;18297:2;18288:12;;18281:88;18397:2;18388:12;;18246:160;18415:407;18580:2;18568:15;;18617:66;18612:2;18603:12;;18596:88;18718:66;18713:2;18704:12;;18697:88;18813:2;18804:12;;18561:261;18831:306;18996:2;18984:15;;19033:66;19028:2;19019:12;;19012:88;19128:2;19119:12;;18977:160;19146:306;19311:2;19299:15;;19348:66;19343:2;19334:12;;19327:88;19443:2;19434:12;;19292:160;19461:306;19626:2;19614:15;;19663:66;19658:2;19649:12;;19642:88;19758:2;19749:12;;19607:160;19776:407;19941:2;19929:15;;19978:66;19973:2;19964:12;;19957:88;20079:66;20074:2;20065:12;;20058:88;20174:2;20165:12;;19922:261;20318:213;20436:2;20421:18;;20450:71;20425:9;20494:6;20450:71;;20538:213;20656:2;20641:18;;20670:71;20645:9;20714:6;20670:71;;20758:407;20949:2;20963:47;;;20934:18;;21024:131;20934:18;21024:131;;21172:407;21363:2;21377:47;;;21348:18;;21438:131;21348:18;21438:131;;21586:407;21777:2;21791:47;;;21762:18;;21852:131;21762:18;21852:131;;22000:407;22191:2;22205:47;;;22176:18;;22266:131;22176:18;22266:131;;22414:407;22605:2;22619:47;;;22590:18;;22680:131;22590:18;22680:131;;22828:407;23019:2;23033:47;;;23004:18;;23094:131;23004:18;23094:131;;23242:407;23433:2;23447:47;;;23418:18;;23508:131;23418:18;23508:131;;23656:407;23847:2;23861:47;;;23832:18;;23922:131;23832:18;23922:131;;24070:407;24261:2;24275:47;;;24246:18;;24336:131;24246:18;24336:131;;24484:407;24675:2;24689:47;;;24660:18;;24750:131;24660:18;24750:131;;24898:407;25089:2;25103:47;;;25074:18;;25164:131;25074:18;25164:131;;25312:407;25503:2;25517:47;;;25488:18;;25578:131;25488:18;25578:131;;25726:407;25917:2;25931:47;;;25902:18;;25992:131;25902:18;25992:131;;26140:707;26374:3;26359:19;;26389:71;26363:9;26433:6;26389:71;;;26471:72;26539:2;26528:9;26524:18;26515:6;26471:72;;;26591:9;26585:4;26581:20;26576:2;26565:9;26561:18;26554:48;26616:72;26683:4;26674:6;26616:72;;;26608:80;;26736:9;26730:4;26726:20;26721:2;26710:9;26706:18;26699:48;26761:76;26832:4;26823:6;26761:76;;;26753:84;26345:502;-1:-1;;;;;;26345:502;26854:256;26916:2;26910:9;26942:17;;;27017:18;27002:34;;27038:22;;;26999:62;26996:2;;;27074:1;27071;27064:12;26996:2;27090;27083:22;26894:216;;-1:-1;26894:216;27117:263;;27281:18;27273:6;27270:30;27267:2;;;27313:1;27310;27303:12;27267:2;-1:-1;27342:4;27330:17;;;27360:15;;27204:176;28216:254;;28355:18;28347:6;28344:30;28341:2;;;28387:1;28384;28377:12;28341:2;-1:-1;28460:4;28431;28408:17;;;;28427:9;28404:33;28450:15;;28278:192;28742:87;28812:12;;28796:33;28934:105;;29003:31;29028:5;29003:31;;29046:79;29115:5;29098:27;29132:128;29212:42;29201:54;;29184:76;29638:145;29719:6;29714:3;29709;29696:30;-1:-1;29775:1;29757:16;;29750:27;29689:94;29792:268;29857:1;29864:101;29878:6;29875:1;29872:13;29864:101;;;29945:11;;;29939:18;29926:11;;;29919:39;29900:2;29893:10;29864:101;;;29980:6;29977:1;29974:13;29971:2;;;30045:1;30036:6;30031:3;30027:16;30020:27;29971:2;29841:219;;;;;30068:97;30156:2;30136:14;30152:7;30132:28;;30116:49" + } + } + }, + "sources": { + "src/Coordinator.sol": { + "id": 0 + }, + "src/libs/LibConstants.sol": { + "id": 8 + }, + "src/interfaces/ITransactions.sol": { + "id": 7 + }, + "src/MixinSignatureValidator.sol": { + "id": 3 + }, + "@0x/contracts-utils/contracts/src/LibBytes.sol": { + "id": 19 + }, + "src/mixins/MSignatureValidator.sol": { + "id": 13 + }, + "src/interfaces/ISignatureValidator.sol": { + "id": 6 + }, + "src/MixinCoordinatorApprovalVerifier.sol": { + "id": 1 + }, + "@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol": { + "id": 16 + }, + "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": { + "id": 17 + }, + "@0x/contracts-exchange-libs/contracts/src/LibEIP712.sol": { + "id": 15 + }, + "@0x/contracts-utils/contracts/src/LibAddressArray.sol": { + "id": 18 + }, + "src/libs/LibCoordinatorApproval.sol": { + "id": 9 + }, + "src/libs/LibEIP712Domain.sol": { + "id": 10 + }, + "src/libs/LibZeroExTransaction.sol": { + "id": 11 + }, + "src/mixins/MCoordinatorApprovalVerifier.sol": { + "id": 12 + }, + "src/interfaces/ICoordinatorApprovalVerifier.sol": { + "id": 4 + }, + "src/MixinCoordinatorCore.sol": { + "id": 2 + }, + "src/interfaces/ICoordinatorCore.sol": { + "id": 5 + } + }, + "sourceCodes": { + "src/Coordinator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"./libs/LibConstants.sol\";\nimport \"./MixinSignatureValidator.sol\";\nimport \"./MixinCoordinatorApprovalVerifier.sol\";\nimport \"./MixinCoordinatorCore.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Coordinator is\n LibConstants,\n MixinSignatureValidator,\n MixinCoordinatorApprovalVerifier,\n MixinCoordinatorCore\n{\n constructor (address _exchange)\n public\n LibConstants(_exchange)\n {}\n}\n", + "src/libs/LibConstants.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"../interfaces/ITransactions.sol\";\n\n\ncontract LibConstants {\n\n // solhint-disable-next-line var-name-mixedcase\n ITransactions internal EXCHANGE;\n\n constructor (address _exchange)\n public\n {\n EXCHANGE = ITransactions(_exchange);\n }\n}\n", + "src/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.5.3;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes calldata data,\n bytes calldata signature\n )\n external;\n}\n", + "src/MixinSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\n\n\ncontract MixinSignatureValidator is\n MSignatureValidator\n{\n using LibBytes for bytes;\n\n /// @dev Recovers the address of a signer given a hash and signature.\n /// @param hash Any 32 byte hash.\n /// @param signature Proof that the hash has been signed by signer.\n function getSignerAddress(bytes32 hash, bytes memory signature)\n public\n pure\n returns (address signerAddress)\n {\n require(\n signature.length > 0,\n \"LENGTH_GREATER_THAN_0_REQUIRED\"\n );\n\n // Pop last byte off of signature byte array.\n uint8 signatureTypeRaw = uint8(signature.popLastByte());\n\n // Ensure signature is supported\n require(\n signatureTypeRaw < uint8(SignatureType.NSignatureTypes),\n \"SIGNATURE_UNSUPPORTED\"\n );\n\n SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(\"SIGNATURE_ILLEGAL\");\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n uint8 v = uint8(signature[0]);\n bytes32 r = signature.readBytes32(1);\n bytes32 s = signature.readBytes32(33);\n signerAddress = ecrecover(\n hash,\n v,\n r,\n s\n );\n return signerAddress;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n uint8 v = uint8(signature[0]);\n bytes32 r = signature.readBytes32(1);\n bytes32 s = signature.readBytes32(33);\n signerAddress = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n32\",\n hash\n )),\n v,\n r,\n s\n );\n return signerAddress;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(\"SIGNATURE_UNSUPPORTED\");\n }\n}\n", + "@0x/contracts-utils/contracts/src/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to <= b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length\n );\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to <= b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n result = uint256(readBytes32(b, index));\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 32 byte length field\n index += 32;\n\n // Read the bytes4 from array memory\n assembly {\n result := mload(add(b, index))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy into \n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of \n input.length + 32 // +32 bytes to store length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n", + "src/mixins/MSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n EIP712, // 0x01\n EthSign, // 0x02\n NSignatureTypes // 0x03, number of signature types. Always leave at end.\n }\n}\n", + "src/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract ISignatureValidator {\n\n /// @dev Recovers the address of a signer given a hash and signature.\n /// @param hash Any 32 byte hash.\n /// @param signature Proof that the hash has been signed by signer.\n function getSignerAddress(bytes32 hash, bytes memory signature)\n public\n pure\n returns (address signerAddress);\n}\n", + "src/MixinCoordinatorApprovalVerifier.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibAddressArray.sol\";\nimport \"./libs/LibCoordinatorApproval.sol\";\nimport \"./libs/LibZeroExTransaction.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MCoordinatorApprovalVerifier.sol\";\n\n\n// solhint-disable avoid-tx-origin\ncontract MixinCoordinatorApprovalVerifier is\n LibExchangeSelectors,\n LibCoordinatorApproval,\n LibZeroExTransaction,\n MSignatureValidator,\n MCoordinatorApprovalVerifier\n{\n using LibBytes for bytes;\n using LibAddressArray for address[];\n\n /// @dev Validates that the 0x transaction has been approved by all of the feeRecipients\n /// that correspond to each order in the transaction's Exchange calldata.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order in the transaction's Exchange calldata.\n function assertValidCoordinatorApprovals(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n view\n {\n // Get the orders from the the Exchange calldata in the 0x transaction\n LibOrder.Order[] memory orders = decodeFillDataOrders(transaction.data);\n\n // No approval is required for non-fill methods\n if (orders.length > 0) {\n // Revert if approval is invalid for transaction orders\n assertValidTransactionOrdersApproval(\n transaction,\n orders,\n transactionSignature,\n approvalExpirationTimeSeconds,\n approvalSignatures\n );\n }\n }\n\n /// @dev Validates that the feeRecipients of a batch of order have approved a 0x transaction.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param orders Array of order structs containing order specifications.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order.\n function assertValidTransactionOrdersApproval(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n LibOrder.Order[] memory orders,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n view\n {\n // Hash 0x transaction\n bytes32 transactionHash = getTransactionHash(transaction);\n\n // Create empty list of approval signers\n address[] memory approvalSignerAddresses = new address[](0);\n\n uint256 signaturesLength = approvalSignatures.length;\n for (uint256 i = 0; i < signaturesLength; i++) {\n // Create approval message\n uint256 currentApprovalExpirationTimeSeconds = approvalExpirationTimeSeconds[i];\n CoordinatorApproval memory approval = CoordinatorApproval({\n transactionHash: transactionHash,\n transactionSignature: transactionSignature,\n approvalExpirationTimeSeconds: currentApprovalExpirationTimeSeconds\n });\n\n // Ensure approval has not expired\n require(\n // solhint-disable-next-line not-rely-on-time\n currentApprovalExpirationTimeSeconds > block.timestamp,\n \"APPROVAL_EXPIRED\"\n );\n\n // Hash approval message and recover signer address\n bytes32 approvalHash = getCoordinatorApprovalHash(approval);\n address approvalSignerAddress = getSignerAddress(approvalHash, approvalSignatures[i]);\n \n // Add approval signer to list of signers\n approvalSignerAddresses = approvalSignerAddresses.append(approvalSignerAddress);\n }\n \n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i < ordersLength; i++) {\n // Do not check approval if the order's senderAddress is null\n if (orders[i].senderAddress == address(0)) {\n continue;\n }\n \n // Ethereum transaction signer gives implicit signature of approval\n address approverAddress = orders[i].feeRecipientAddress;\n if (approverAddress == tx.origin) {\n approvalSignerAddresses = approvalSignerAddresses.append(tx.origin);\n continue;\n }\n\n // Ensure feeRecipient of order has approved this 0x transaction\n bool isOrderApproved = approvalSignerAddresses.contains(approverAddress);\n require(\n isOrderApproved,\n \"INVALID_APPROVAL_SIGNATURE\"\n );\n\n // The Ethereum transaction signer must be the 0x transaction signer or an approver of the 0x transaction\n require(\n transaction.signerAddress == tx.origin || approvalSignerAddresses.contains(tx.origin),\n \"INVALID_SENDER\"\n );\n }\n }\n\n /// @dev Decodes the orders from Exchange calldata representing any fill method.\n /// @param data Exchange calldata representing a fill method.\n /// @return The orders from the Exchange calldata.\n function decodeFillDataOrders(bytes memory data)\n internal\n pure\n returns (LibOrder.Order[] memory orders)\n {\n bytes4 selector = data.readBytes4(0);\n if (\n selector == FILL_ORDER_SELECTOR ||\n selector == FILL_ORDER_NO_THROW_SELECTOR ||\n selector == FILL_OR_KILL_ORDER_SELECTOR\n ) {\n // Decode single order\n (LibOrder.Order memory order) = abi.decode(\n data.slice(4, data.length),\n (LibOrder.Order)\n );\n orders = new LibOrder.Order[](1);\n orders[0] = order;\n } else if (\n selector == BATCH_FILL_ORDERS_SELECTOR ||\n selector == BATCH_FILL_ORDERS_NO_THROW_SELECTOR ||\n selector == BATCH_FILL_OR_KILL_ORDERS_SELECTOR ||\n selector == MARKET_BUY_ORDERS_SELECTOR ||\n selector == MARKET_BUY_ORDERS_NO_THROW_SELECTOR ||\n selector == MARKET_SELL_ORDERS_SELECTOR ||\n selector == MARKET_SELL_ORDERS_NO_THROW_SELECTOR\n ) {\n // Decode all orders\n // solhint-disable indent\n (orders) = abi.decode(\n data.slice(4, data.length),\n (LibOrder.Order[])\n );\n } else if (selector == MATCH_ORDERS_SELECTOR) {\n // Decode left and right orders\n (LibOrder.Order memory leftOrder, LibOrder.Order memory rightOrder) = abi.decode(\n data.slice(4, data.length),\n (LibOrder.Order, LibOrder.Order)\n );\n\n // Create array of orders\n orders = new LibOrder.Order[](2);\n orders[0] = leftOrder;\n orders[1] = rightOrder;\n }\n return orders;\n }\n}\n", + "@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract LibExchangeSelectors {\n\n // solhint-disable max-line-length\n // allowedValidators\n bytes4 constant internal ALLOWED_VALIDATORS_SELECTOR = 0x7b8e3514;\n bytes4 constant internal ALLOWED_VALIDATORS_SELECTOR_GENERATOR = bytes4(keccak256(\"allowedValidators(address,address)\"));\n\n // assetProxies\n bytes4 constant internal ASSET_PROXIES_SELECTOR = 0x3fd3c997;\n bytes4 constant internal ASSET_PROXIES_SELECTOR_GENERATOR = bytes4(keccak256(\"assetProxies(bytes4)\"));\n\n // batchCancelOrders\n bytes4 constant internal BATCH_CANCEL_ORDERS_SELECTOR = 0x4ac14782;\n bytes4 constant internal BATCH_CANCEL_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"batchCancelOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\"));\n\n // batchFillOrKillOrders\n bytes4 constant internal BATCH_FILL_OR_KILL_ORDERS_SELECTOR = 0x4d0ae546;\n bytes4 constant internal BATCH_FILL_OR_KILL_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"batchFillOrKillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])\"));\n\n // batchFillOrders\n bytes4 constant internal BATCH_FILL_ORDERS_SELECTOR = 0x297bb70b;\n bytes4 constant internal BATCH_FILL_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"batchFillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])\"));\n\n // batchFillOrdersNoThrow\n bytes4 constant internal BATCH_FILL_ORDERS_NO_THROW_SELECTOR = 0x50dde190;\n bytes4 constant internal BATCH_FILL_ORDERS_NO_THROW_SELECTOR_GENERATOR = bytes4(keccak256(\"batchFillOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])\"));\n\n // cancelOrder\n bytes4 constant internal CANCEL_ORDER_SELECTOR = 0xd46b02c3;\n bytes4 constant internal CANCEL_ORDER_SELECTOR_GENERATOR = bytes4(keccak256(\"cancelOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\"));\n\n // cancelOrdersUpTo\n bytes4 constant internal CANCEL_ORDERS_UP_TO_SELECTOR = 0x4f9559b1;\n bytes4 constant internal CANCEL_ORDERS_UP_TO_SELECTOR_GENERATOR = bytes4(keccak256(\"cancelOrdersUpTo(uint256)\"));\n\n // cancelled\n bytes4 constant internal CANCELLED_SELECTOR = 0x2ac12622;\n bytes4 constant internal CANCELLED_SELECTOR_GENERATOR = bytes4(keccak256(\"cancelled(bytes32)\"));\n\n // currentContextAddress\n bytes4 constant internal CURRENT_CONTEXT_ADDRESS_SELECTOR = 0xeea086ba;\n bytes4 constant internal CURRENT_CONTEXT_ADDRESS_SELECTOR_GENERATOR = bytes4(keccak256(\"currentContextAddress()\"));\n\n // executeTransaction\n bytes4 constant internal EXECUTE_TRANSACTION_SELECTOR = 0xbfc8bfce;\n bytes4 constant internal EXECUTE_TRANSACTION_SELECTOR_GENERATOR = bytes4(keccak256(\"executeTransaction(uint256,address,bytes,bytes)\"));\n\n // fillOrKillOrder\n bytes4 constant internal FILL_OR_KILL_ORDER_SELECTOR = 0x64a3bc15;\n bytes4 constant internal FILL_OR_KILL_ORDER_SELECTOR_GENERATOR = bytes4(keccak256(\"fillOrKillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"));\n\n // fillOrder\n bytes4 constant internal FILL_ORDER_SELECTOR = 0xb4be83d5;\n bytes4 constant internal FILL_ORDER_SELECTOR_GENERATOR = bytes4(keccak256(\"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"));\n\n // fillOrderNoThrow\n bytes4 constant internal FILL_ORDER_NO_THROW_SELECTOR = 0x3e228bae;\n bytes4 constant internal FILL_ORDER_NO_THROW_SELECTOR_GENERATOR = bytes4(keccak256(\"fillOrderNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"));\n\n // filled\n bytes4 constant internal FILLED_SELECTOR = 0x288cdc91;\n bytes4 constant internal FILLED_SELECTOR_GENERATOR = bytes4(keccak256(\"filled(bytes32)\"));\n\n // getAssetProxy\n bytes4 constant internal GET_ASSET_PROXY_SELECTOR = 0x60704108;\n bytes4 constant internal GET_ASSET_PROXY_SELECTOR_GENERATOR = bytes4(keccak256(\"getAssetProxy(bytes4)\"));\n\n // getOrderInfo\n bytes4 constant internal GET_ORDER_INFO_SELECTOR = 0xc75e0a81;\n bytes4 constant internal GET_ORDER_INFO_SELECTOR_GENERATOR = bytes4(keccak256(\"getOrderInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\"));\n\n // getOrdersInfo\n bytes4 constant internal GET_ORDERS_INFO_SELECTOR = 0x7e9d74dc;\n bytes4 constant internal GET_ORDERS_INFO_SELECTOR_GENERATOR = bytes4(keccak256(\"getOrdersInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\"));\n\n // isValidSignature\n bytes4 constant internal IS_VALID_SIGNATURE_SELECTOR = 0x93634702;\n bytes4 constant internal IS_VALID_SIGNATURE_SELECTOR_GENERATOR = bytes4(keccak256(\"isValidSignature(bytes32,address,bytes)\"));\n\n // marketBuyOrders\n bytes4 constant internal MARKET_BUY_ORDERS_SELECTOR = 0xe5fa431b;\n bytes4 constant internal MARKET_BUY_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"marketBuyOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])\"));\n\n // marketBuyOrdersNoThrow\n bytes4 constant internal MARKET_BUY_ORDERS_NO_THROW_SELECTOR = 0xa3e20380;\n bytes4 constant internal MARKET_BUY_ORDERS_NO_THROW_SELECTOR_GENERATOR = bytes4(keccak256(\"marketBuyOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])\"));\n\n // marketSellOrders\n bytes4 constant internal MARKET_SELL_ORDERS_SELECTOR = 0x7e1d9808;\n bytes4 constant internal MARKET_SELL_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"marketSellOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])\"));\n\n // marketSellOrdersNoThrow\n bytes4 constant internal MARKET_SELL_ORDERS_NO_THROW_SELECTOR = 0xdd1c7d18;\n bytes4 constant internal MARKET_SELL_ORDERS_NO_THROW_SELECTOR_GENERATOR = bytes4(keccak256(\"marketSellOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])\"));\n\n // matchOrders\n bytes4 constant internal MATCH_ORDERS_SELECTOR = 0x3c28d861;\n bytes4 constant internal MATCH_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"matchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes,bytes)\"));\n\n // orderEpoch\n bytes4 constant internal ORDER_EPOCH_SELECTOR = 0xd9bfa73e;\n bytes4 constant internal ORDER_EPOCH_SELECTOR_GENERATOR = bytes4(keccak256(\"orderEpoch(address,address)\"));\n\n // owner\n bytes4 constant internal OWNER_SELECTOR = 0x8da5cb5b;\n bytes4 constant internal OWNER_SELECTOR_GENERATOR = bytes4(keccak256(\"owner()\"));\n\n // preSign\n bytes4 constant internal PRE_SIGN_SELECTOR = 0x3683ef8e;\n bytes4 constant internal PRE_SIGN_SELECTOR_GENERATOR = bytes4(keccak256(\"preSign(bytes32,address,bytes)\"));\n\n // preSigned\n bytes4 constant internal PRE_SIGNED_SELECTOR = 0x82c174d0;\n bytes4 constant internal PRE_SIGNED_SELECTOR_GENERATOR = bytes4(keccak256(\"preSigned(bytes32,address)\"));\n\n // registerAssetProxy\n bytes4 constant internal REGISTER_ASSET_PROXY_SELECTOR = 0xc585bb93;\n bytes4 constant internal REGISTER_ASSET_PROXY_SELECTOR_GENERATOR = bytes4(keccak256(\"registerAssetProxy(address)\"));\n\n // setSignatureValidatorApproval\n bytes4 constant internal SET_SIGNATURE_VALIDATOR_APPROVAL_SELECTOR = 0x77fcce68;\n bytes4 constant internal SET_SIGNATURE_VALIDATOR_APPROVAL_SELECTOR_GENERATOR = bytes4(keccak256(\"setSignatureValidatorApproval(address,bool)\"));\n\n // transactions\n bytes4 constant internal TRANSACTIONS_SELECTOR = 0x642f2eaf;\n bytes4 constant internal TRANSACTIONS_SELECTOR_GENERATOR = bytes4(keccak256(\"transactions(bytes32)\"));\n\n // transferOwnership\n bytes4 constant internal TRANSFER_OWNERSHIP_SELECTOR = 0xf2fde38b;\n bytes4 constant internal TRANSFER_OWNERSHIP_SELECTOR_GENERATOR = bytes4(keccak256(\"transferOwnership(address)\"));\n}", + "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // bytes32(order.makerAddress),\n // bytes32(order.takerAddress),\n // bytes32(order.feeRecipientAddress),\n // bytes32(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n \n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, makerAssetDataHash)\n mstore(pos3, takerAssetDataHash)\n result := keccak256(pos1, 416)\n \n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n }\n return result;\n }\n}\n", + "@0x/contracts-exchange-libs/contracts/src/LibEIP712.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract LibEIP712 {\n\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n uint256(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n", + "@0x/contracts-utils/contracts/src/LibAddressArray.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibBytes.sol\";\n\n\nlibrary LibAddressArray {\n\n /// @dev Append a new address to an array of addresses.\n /// The `addressArray` may need to be reallocated to make space\n /// for the new address. Because of this we return the resulting\n /// memory location of `addressArray`.\n /// @param addressArray Array of addresses.\n /// @param addressToAppend Address to append.\n /// @return Array of addresses: [... addressArray, addressToAppend]\n function append(address[] memory addressArray, address addressToAppend) \n internal\n pure\n returns (address[] memory)\n {\n // Get stats on address array and free memory\n uint256 freeMemPtr = 0;\n uint256 addressArrayBeginPtr = 0;\n uint256 addressArrayEndPtr = 0;\n uint256 addressArrayLength = addressArray.length;\n uint256 addressArrayMemSizeInBytes = 32 + (32 * addressArrayLength);\n assembly {\n freeMemPtr := mload(0x40)\n addressArrayBeginPtr := addressArray\n addressArrayEndPtr := add(addressArray, addressArrayMemSizeInBytes)\n }\n\n // Cases for `freeMemPtr`:\n // `freeMemPtr` == `addressArrayEndPtr`: Nothing occupies memory after `addressArray`\n // `freeMemPtr` > `addressArrayEndPtr`: Some value occupies memory after `addressArray`\n // `freeMemPtr` < `addressArrayEndPtr`: Memory has not been managed properly.\n require(\n freeMemPtr >= addressArrayEndPtr,\n \"INVALID_FREE_MEMORY_PTR\"\n );\n\n // If free memory begins at the end of `addressArray`\n // then we can append `addressToAppend` directly.\n // Otherwise, we must copy the array to free memory\n // before appending new values to it.\n if (freeMemPtr > addressArrayEndPtr) {\n LibBytes.memCopy(freeMemPtr, addressArrayBeginPtr, addressArrayMemSizeInBytes);\n assembly {\n addressArray := freeMemPtr\n addressArrayBeginPtr := addressArray\n }\n }\n\n // Append `addressToAppend`\n addressArrayLength += 1;\n addressArrayMemSizeInBytes += 32;\n addressArrayEndPtr = addressArrayBeginPtr + addressArrayMemSizeInBytes;\n freeMemPtr = addressArrayEndPtr;\n assembly {\n // Store new array length\n mstore(addressArray, addressArrayLength)\n\n // Update `freeMemPtr`\n mstore(0x40, freeMemPtr)\n }\n addressArray[addressArrayLength - 1] = addressToAppend;\n return addressArray;\n }\n\n /// @dev Checks if an address array contains the target address.\n /// @param addressArray Array of addresses.\n /// @param target Address to search for in array.\n /// @return True if the addressArray contains the target.\n function contains(address[] memory addressArray, address target)\n internal\n pure\n returns (bool)\n {\n uint256 length = addressArray.length;\n for (uint256 i = 0; i < length; i++) {\n if (addressArray[i] == target) {\n return true;\n }\n }\n return false;\n }\n\n /// @dev Finds the index of an address within an array.\n /// @param addressArray Array of addresses.\n /// @param target Address to search for in array.\n /// @return Existence and index of the target in the array.\n function indexOf(address[] memory addressArray, address target)\n internal\n pure\n returns (bool, uint256)\n {\n uint256 length = addressArray.length;\n for (uint256 i = 0; i < length; i++) {\n if (addressArray[i] == target) {\n return (true, i);\n }\n }\n return (false, 0);\n }\n}\n", + "src/libs/LibCoordinatorApproval.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibEIP712Domain.sol\";\n\n\ncontract LibCoordinatorApproval is\n LibEIP712Domain\n{\n // Hash for the EIP712 Coordinator approval message\n bytes32 constant internal EIP712_Coordinator_APPROVAL_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"CoordinatorApproval(\",\n \"bytes32 transactionHash,\",\n \"bytes transactionSignature,\",\n \"uint256 approvalExpirationTimeSeconds\",\n \")\"\n ));\n\n struct CoordinatorApproval {\n bytes32 transactionHash; // EIP712 hash of the transaction, using the domain separator of this contract.\n bytes transactionSignature; // Signature of the 0x transaction.\n uint256 approvalExpirationTimeSeconds; // Timestamp in seconds for which the signature expires.\n }\n\n /// @dev Calculated the EIP712 hash of the Coordinator approval mesasage using the domain separator of this contract.\n /// @param approval Coordinator approval message containing the transaction hash, transaction signature, and expiration of the approval.\n /// @return EIP712 hash of the Coordinator approval message with the domain separator of this contract.\n function getCoordinatorApprovalHash(CoordinatorApproval memory approval)\n internal\n view\n returns (bytes32 approvalHash)\n {\n approvalHash = hashEIP712Message(hashCoordinatorApproval(approval));\n return approvalHash;\n }\n\n /// @dev Calculated the EIP712 hash of the Coordinator approval mesasage with no domain separator.\n /// @param approval Coordinator approval message containing the transaction hash, transaction signature, and expiration of the approval.\n /// @return EIP712 hash of the Coordinator approval message with no domain separator.\n function hashCoordinatorApproval(CoordinatorApproval memory approval)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_Coordinator_APPROVAL_SCHEMA_HASH;\n bytes32 transactionSignatureHash = keccak256(approval.transactionSignature);\n // TODO(abandeali1): optimize by loading from memory in assembly\n bytes32 transactionHash = approval.transactionHash;\n uint256 approvalExpirationTimeSeconds = approval.approvalExpirationTimeSeconds;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_Coordinator_APPROVAL_SCHEMA_HASH,\n // approval.transactionHash,\n // keccak256(approval.transactionSignature)\n // approval.expiration,\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), transactionHash) // transactionHash\n mstore(add(memPtr, 64), transactionSignatureHash) // transactionSignatureHash\n mstore(add(memPtr, 96), approvalExpirationTimeSeconds) // approvalExpirationTimeSeconds\n // Compute hash\n result := keccak256(memPtr, 128)\n }\n return result;\n }\n}\n", + "src/libs/LibEIP712Domain.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract LibEIP712Domain {\n\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol Trade Execution Coordinator\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"1.0.0\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n uint256(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n", + "src/libs/LibZeroExTransaction.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibEIP712Domain.sol\";\n\n\ncontract LibZeroExTransaction is\n LibEIP712Domain\n{\n // Hash for the EIP712 0x transaction schema\n bytes32 constant internal EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"ZeroExTransaction(\",\n \"uint256 salt,\",\n \"address signerAddress,\",\n \"bytes data\",\n \")\"\n ));\n\n struct ZeroExTransaction {\n uint256 salt; // Arbitrary number to ensure uniqueness of transaction hash.\n address signerAddress; // Address of transaction signer.\n bytes data; // AbiV2 encoded calldata.\n }\n\n /// @dev Calculates the EIP712 hash of a 0x transaction using the domain separator of this contract.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @return EIP712 hash of the transaction with the domain separator of this contract.\n function getTransactionHash(ZeroExTransaction memory transaction)\n internal\n view\n returns (bytes32 transactionHash)\n {\n // Note: this transaction hash will differ from the hash produced by the Exchange contract because it utilizes a different domain hash.\n transactionHash = hashEIP712Message(hashZeroExTransaction(transaction));\n return transactionHash;\n }\n\n /// @dev Calculates EIP712 hash of the 0x transaction with no domain separator.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @return EIP712 hash of the transaction with no domain separator.\n function hashZeroExTransaction(ZeroExTransaction memory transaction)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes32 dataHash = keccak256(transaction.data);\n // TODO(abandeali1): optimize by loading from memory in assembly\n uint256 salt = transaction.salt;\n address signerAddress = transaction.signerAddress;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,\n // transaction.salt,\n // uint256(transaction.signerAddress),\n // keccak256(transaction.data)\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), salt) // salt\n mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff)) // signerAddress\n mstore(add(memPtr, 96), dataHash) // hash of data\n\n // Compute hash\n result := keccak256(memPtr, 128)\n }\n return result;\n }\n}\n", + "src/mixins/MCoordinatorApprovalVerifier.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"../interfaces/ICoordinatorApprovalVerifier.sol\";\n\n\ncontract MCoordinatorApprovalVerifier is\n ICoordinatorApprovalVerifier\n{\n /// @dev Decodes the orders from Exchange calldata representing any fill method.\n /// @param data Exchange calldata representing a fill method.\n /// @return The orders from the Exchange calldata.\n function decodeFillDataOrders(bytes memory data)\n internal\n pure\n returns (LibOrder.Order[] memory orders);\n}\n", + "src/interfaces/ICoordinatorApprovalVerifier.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"../libs/LibZeroExTransaction.sol\";\n\n\ncontract ICoordinatorApprovalVerifier {\n\n /// @dev Validates that the 0x transaction has been approved by all of the feeRecipients\n /// that correspond to each order in the transaction's Exchange calldata.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order in the transaction's Exchange calldata.\n function assertValidCoordinatorApprovals(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n view;\n\n /// @dev Validates that the feeRecipients of a batch of order have approved a 0x transaction.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param orders Array of order structs containing order specifications.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order.\n function assertValidTransactionOrdersApproval(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n LibOrder.Order[] memory orders,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n view;\n}\n", + "src/MixinCoordinatorCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"./libs/LibZeroExTransaction.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MCoordinatorApprovalVerifier.sol\";\nimport \"./interfaces/ICoordinatorCore.sol\";\n\n\ncontract MixinCoordinatorCore is\n LibConstants,\n MCoordinatorApprovalVerifier,\n ICoordinatorCore\n{\n /// @dev Executes a 0x transaction that has been signed by the feeRecipients that correspond to each order in the transaction's Exchange calldata.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order in the transaction's Exchange calldata.\n function executeTransaction(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n {\n // Validate that the 0x transaction has been approves by each feeRecipient\n assertValidCoordinatorApprovals(\n transaction,\n transactionSignature,\n approvalExpirationTimeSeconds,\n approvalSignatures\n );\n\n // Execute the transaction\n EXCHANGE.executeTransaction(\n transaction.salt,\n transaction.signerAddress,\n transaction.data,\n transactionSignature\n );\n }\n}\n", + "src/interfaces/ICoordinatorCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"../libs/LibZeroExTransaction.sol\";\n\n\ncontract ICoordinatorCore {\n\n /// @dev Executes a 0x transaction that has been signed by the feeRecipients that correspond to each order in the transaction's Exchange calldata.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order in the transaction's Exchange calldata.\n function executeTransaction(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public;\n}\n" + }, + "sourceTreeHashHex": "0xfea3995456e5ce49ec3931dee2a06ebf5514f865cf84d8202ed65ca92fa8c883", + "compiler": { + "name": "solc", + "version": "0.5.3+commit.10d17f24.Linux.g++", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "remappings": [ + "@0x/contracts-utils=/Users/greg/dev/0x-monorepo/contracts/tec/node_modules/@0x/contracts-utils", + "@0x/contracts-exchange-libs=/Users/greg/dev/0x-monorepo/contracts/tec/node_modules/@0x/contracts-exchange-libs" + ] + } + }, + "networks": {} +} \ No newline at end of file diff --git a/contracts/coordinator/generated-artifacts/TestLibs.json b/contracts/coordinator/generated-artifacts/TestLibs.json new file mode 100644 index 0000000000..7d352bc07b --- /dev/null +++ b/contracts/coordinator/generated-artifacts/TestLibs.json @@ -0,0 +1,149 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "TestLibs", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "salt", + "type": "uint256" + }, + { + "name": "signerAddress", + "type": "address" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "transaction", + "type": "tuple" + } + ], + "name": "publicGetTransactionHash", + "outputs": [ + { + "name": "transactionHash", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "transactionHash", + "type": "bytes32" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256" + } + ], + "name": "approval", + "type": "tuple" + } + ], + "name": "publicGetCoordinatorApprovalHash", + "outputs": [ + { + "name": "approvalHash", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "EIP712_DOMAIN_HASH", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "0x60806040526200001060a06200025f565b6040516020818303038152906040528051906020012060405180606001604052806027815260200162000a6c602791398051602091820120604080518082018252600581527f312e302e300000000000000000000000000000000000000000000000000000009084015251620000ac93927f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c913091016200020f565b60408051601f198184030181529190528051602090910120600055620002ae565b620000e2620000dc82620002ab565b620002ab565b82525050565b6000620000f7600c83620002a6565b7f737472696e67206e616d652c00000000000000000000000000000000000000008152600c0192915050565b600062000132601983620002a6565b7f6164647265737320766572696679696e67436f6e747261637400000000000000815260190192915050565b60006200016d600183620002a6565b7f2900000000000000000000000000000000000000000000000000000000000000815260010192915050565b6000620001a8600f83620002a6565b7f737472696e672076657273696f6e2c00000000000000000000000000000000008152600f0192915050565b6000620001e3600d83620002a6565b7f454950373132446f6d61696e28000000000000000000000000000000000000008152600d0192915050565b60006200021d8287620000cd565b6020820191506200022f8286620000cd565b602082019150620002418285620000cd565b602082019150620002538284620000cd565b50602001949350505050565b60006200026c82620001d4565b91506200027982620000e8565b9150620002868262000199565b9150620002938262000123565b9150620002a0826200015e565b92915050565b919050565b90565b6107ae80620002be6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80637b837ad114610046578063a2d7c53d1461006f578063e306f77914610082575b600080fd5b61005961005436600461038a565b61008a565b6040516100669190610693565b60405180910390f35b61005961007d36600461034d565b61009b565b6100596100a6565b6000610095826100ac565b92915050565b6000610095826100bf565b60005481565b60006100956100ba836100cd565b610153565b60006100956100ba83610193565b6000806040516020016100df90610630565b6040516020818303038152906040528051906020012090506000836040015160405161010b9190610624565b60408051918290038220865160208089015196855284015273ffffffffffffffffffffffffffffffffffffffff90941690820152606081019290925250608090209050919050565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b6000806040516020016101a590610667565b604051602081830303815290604052805190602001209050600083602001516040516101d19190610624565b604080519182900382208651968201519483526020830196909652810194909452506060830152506080902090565b600061020c823561071a565b9392505050565b600061020c8235610717565b6000601f8201831361023057600080fd5b813561024361023e826106c8565b6106a1565b9150808252602083016020830185838301111561025f57600080fd5b61026a838284610738565b50505092915050565b60006060828403121561028557600080fd5b61028f60606106a1565b9050600061029d8484610213565b825250602082013567ffffffffffffffff8111156102ba57600080fd5b6102c68482850161021f565b60208301525060406102da84828501610213565b60408301525092915050565b6000606082840312156102f857600080fd5b61030260606106a1565b905060006103108484610213565b825250602061032184848301610200565b602083015250604082013567ffffffffffffffff81111561034157600080fd5b6102da8482850161021f565b60006020828403121561035f57600080fd5b813567ffffffffffffffff81111561037657600080fd5b61038284828501610273565b949350505050565b60006020828403121561039c57600080fd5b813567ffffffffffffffff8111156103b357600080fd5b610382848285016102e6565b6103c881610717565b82525050565b60006103d98261070e565b6103e38185610712565b93506103f3818560208601610744565b9290920192915050565b600061040a601283610712565b7f5a65726f45785472616e73616374696f6e280000000000000000000000000000815260120192915050565b6000610443601b83610712565b7f6279746573207472616e73616374696f6e5369676e61747572652c00000000008152601b0192915050565b600061047c600183610712565b7f2900000000000000000000000000000000000000000000000000000000000000815260010192915050565b60006104b5601483610712565b7f436f6f7264696e61746f72417070726f76616c28000000000000000000000000815260140192915050565b60006104ee600d83610712565b7f75696e743235362073616c742c000000000000000000000000000000000000008152600d0192915050565b6000610527600a83610712565b7f62797465732064617461000000000000000000000000000000000000000000008152600a0192915050565b6000610560602583610712565b7f75696e7432353620617070726f76616c45787069726174696f6e54696d65536581527f636f6e6473000000000000000000000000000000000000000000000000000000602082015260250192915050565b60006105bf601683610712565b7f61646472657373207369676e6572416464726573732c00000000000000000000815260160192915050565b60006105f8601883610712565b7f62797465733332207472616e73616374696f6e486173682c0000000000000000815260180192915050565b600061020c82846103ce565b600061063b826103fd565b9150610646826104e1565b9150610651826105b2565b915061065c8261051a565b91506100958261046f565b6000610672826104a8565b915061067d826105eb565b915061068882610436565b915061065c82610553565b6020810161009582846103bf565b60405181810167ffffffffffffffff811182821017156106c057600080fd5b604052919050565b600067ffffffffffffffff8211156106df57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b919050565b90565b600073ffffffffffffffffffffffffffffffffffffffff8216610095565b82818337506000910152565b60005b8381101561075f578181015183820152602001610747565b8381111561076e576000848401525b5050505056fea265627a7a72305820fd18db31ffe951b55e945cfc55ca4f3efee15343884f5c93eca886fc4800e74d6c6578706572696d656e74616cf5003730782050726f746f636f6c20547261646520457865637574696f6e20436f6f7264696e61746f72", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH3 0x10 PUSH1 0xA0 PUSH3 0x25F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0xA6C PUSH1 0x27 SWAP2 CODECOPY DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE MLOAD PUSH3 0xAC SWAP4 SWAP3 PUSH32 0x6C015BD22B4C69690933C1058878EBDFEF31F9AAAE40BBE86D8A09FE1B2972C SWAP2 ADDRESS SWAP2 ADD PUSH3 0x20F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 PUSH1 0x0 SSTORE PUSH3 0x2AE JUMP JUMPDEST PUSH3 0xE2 PUSH3 0xDC DUP3 PUSH3 0x2AB JUMP JUMPDEST PUSH3 0x2AB JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0xF7 PUSH1 0xC DUP4 PUSH3 0x2A6 JUMP JUMPDEST PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0xC ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x132 PUSH1 0x19 DUP4 PUSH3 0x2A6 JUMP JUMPDEST PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 DUP2 MSTORE PUSH1 0x19 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x16D PUSH1 0x1 DUP4 PUSH3 0x2A6 JUMP JUMPDEST PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x1A8 PUSH1 0xF DUP4 PUSH3 0x2A6 JUMP JUMPDEST PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 DUP2 MSTORE PUSH1 0xF ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x1E3 PUSH1 0xD DUP4 PUSH3 0x2A6 JUMP JUMPDEST PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0xD ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x21D DUP3 DUP8 PUSH3 0xCD JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH3 0x22F DUP3 DUP7 PUSH3 0xCD JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH3 0x241 DUP3 DUP6 PUSH3 0xCD JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH3 0x253 DUP3 DUP5 PUSH3 0xCD JUMP JUMPDEST POP PUSH1 0x20 ADD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x26C DUP3 PUSH3 0x1D4 JUMP JUMPDEST SWAP2 POP PUSH3 0x279 DUP3 PUSH3 0xE8 JUMP JUMPDEST SWAP2 POP PUSH3 0x286 DUP3 PUSH3 0x199 JUMP JUMPDEST SWAP2 POP PUSH3 0x293 DUP3 PUSH3 0x123 JUMP JUMPDEST SWAP2 POP PUSH3 0x2A0 DUP3 PUSH3 0x15E JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7AE DUP1 PUSH3 0x2BE PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7B837AD1 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xA2D7C53D EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x82 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x54 CALLDATASIZE PUSH1 0x4 PUSH2 0x38A JUMP JUMPDEST PUSH2 0x8A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x66 SWAP2 SWAP1 PUSH2 0x693 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x59 PUSH2 0x7D CALLDATASIZE PUSH1 0x4 PUSH2 0x34D JUMP JUMPDEST PUSH2 0x9B JUMP JUMPDEST PUSH2 0x59 PUSH2 0xA6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x95 DUP3 PUSH2 0xAC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x95 DUP3 PUSH2 0xBF JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x95 PUSH2 0xBA DUP4 PUSH2 0xCD JUMP JUMPDEST PUSH2 0x153 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x95 PUSH2 0xBA DUP4 PUSH2 0x193 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xDF SWAP1 PUSH2 0x630 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x40 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x10B SWAP2 SWAP1 PUSH2 0x624 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB DUP3 KECCAK256 DUP7 MLOAD PUSH1 0x20 DUP1 DUP10 ADD MLOAD SWAP7 DUP6 MSTORE DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x80 SWAP1 KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A5 SWAP1 PUSH2 0x667 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x1D1 SWAP2 SWAP1 PUSH2 0x624 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB DUP3 KECCAK256 DUP7 MLOAD SWAP7 DUP3 ADD MLOAD SWAP5 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP7 SWAP1 SWAP7 MSTORE DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20C DUP3 CALLDATALOAD PUSH2 0x71A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20C DUP3 CALLDATALOAD PUSH2 0x717 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x230 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x243 PUSH2 0x23E DUP3 PUSH2 0x6C8 JUMP JUMPDEST PUSH2 0x6A1 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26A DUP4 DUP3 DUP5 PUSH2 0x738 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x28F PUSH1 0x60 PUSH2 0x6A1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x29D DUP5 DUP5 PUSH2 0x213 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 DUP5 DUP3 DUP6 ADD PUSH2 0x21F JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2DA DUP5 DUP3 DUP6 ADD PUSH2 0x213 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x302 PUSH1 0x60 PUSH2 0x6A1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x310 DUP5 DUP5 PUSH2 0x213 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x321 DUP5 DUP5 DUP4 ADD PUSH2 0x200 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2DA DUP5 DUP3 DUP6 ADD PUSH2 0x21F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x35F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x382 DUP5 DUP3 DUP6 ADD PUSH2 0x273 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x39C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x382 DUP5 DUP3 DUP6 ADD PUSH2 0x2E6 JUMP JUMPDEST PUSH2 0x3C8 DUP2 PUSH2 0x717 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D9 DUP3 PUSH2 0x70E JUMP JUMPDEST PUSH2 0x3E3 DUP2 DUP6 PUSH2 0x712 JUMP JUMPDEST SWAP4 POP PUSH2 0x3F3 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x744 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x40A PUSH1 0x12 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 DUP2 MSTORE PUSH1 0x12 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x443 PUSH1 0x1B DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x6279746573207472616E73616374696F6E5369676E61747572652C0000000000 DUP2 MSTORE PUSH1 0x1B ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x47C PUSH1 0x1 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4B5 PUSH1 0x14 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x436F6F7264696E61746F72417070726F76616C28000000000000000000000000 DUP2 MSTORE PUSH1 0x14 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4EE PUSH1 0xD DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0xD ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x527 PUSH1 0xA DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0xA ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x560 PUSH1 0x25 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x75696E7432353620617070726F76616C45787069726174696F6E54696D655365 DUP2 MSTORE PUSH32 0x636F6E6473000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x25 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5BF PUSH1 0x16 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 DUP2 MSTORE PUSH1 0x16 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5F8 PUSH1 0x18 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x62797465733332207472616E73616374696F6E486173682C0000000000000000 DUP2 MSTORE PUSH1 0x18 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20C DUP3 DUP5 PUSH2 0x3CE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x63B DUP3 PUSH2 0x3FD JUMP JUMPDEST SWAP2 POP PUSH2 0x646 DUP3 PUSH2 0x4E1 JUMP JUMPDEST SWAP2 POP PUSH2 0x651 DUP3 PUSH2 0x5B2 JUMP JUMPDEST SWAP2 POP PUSH2 0x65C DUP3 PUSH2 0x51A JUMP JUMPDEST SWAP2 POP PUSH2 0x95 DUP3 PUSH2 0x46F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x672 DUP3 PUSH2 0x4A8 JUMP JUMPDEST SWAP2 POP PUSH2 0x67D DUP3 PUSH2 0x5EB JUMP JUMPDEST SWAP2 POP PUSH2 0x688 DUP3 PUSH2 0x436 JUMP JUMPDEST SWAP2 POP PUSH2 0x65C DUP3 PUSH2 0x553 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x95 DUP3 DUP5 PUSH2 0x3BF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x6C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x95 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x75F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x747 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x76E JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP INVALID LOG2 PUSH6 0x627A7A723058 KECCAK256 REVERT XOR 0xdb BALANCE SELFDESTRUCT 0xe9 MLOAD 0xb5 0x5e SWAP5 0x5c 0xfc SSTORE 0xca 0x4f RETURNDATACOPY INVALID 0xe1 MSTORE8 NUMBER DUP9 0x4f 0x5c SWAP4 0xec 0xa8 DUP7 0xfc 0x48 STOP 0xe7 0x4d PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ADDRESS PUSH25 0x2050726F746F636F6C20547261646520457865637574696F6E KECCAK256 NUMBER PUSH16 0x6F7264696E61746F7200000000000000 ", + "sourceMap": "739:1230:3:-;;;1083:148:1;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1083:148:1;;;1073:159;;;;;;1549:18;;;;;;;;;;;;;;;;;1533:36;;;;;;;1599:21;;;;;;;;;;;;;;;;1454:214;;;;1583:39;;1652:4;;1454:214;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;1454:214:1;;;1444:225;;49:4:-1;1444:225:1;;;;1423:18;:246;739:1230:3;;5:159:-1;106:52;126:31;151:5;126:31;;;106:52;;;101:3;94:65;88:76;;;172:400;;350:85;432:2;427:3;350:85;;;468:66;448:87;;563:2;554:12;;336:236;-1:-1;;336:236;581:400;;759:85;841:2;836:3;759:85;;;877:66;857:87;;972:2;963:12;;745:236;-1:-1;;745:236;990:398;;1168:84;1250:1;1245:3;1168:84;;;1285:66;1265:87;;1380:1;1371:11;;1154:234;-1:-1;;1154:234;1397:400;;1575:85;1657:2;1652:3;1575:85;;;1693:66;1673:87;;1788:2;1779:12;;1561:236;-1:-1;;1561:236;1806:400;;1984:85;2066:2;2061:3;1984:85;;;2102:66;2082:87;;2197:2;2188:12;;1970:236;-1:-1;;1970:236;2380:661;;2583:75;2654:3;2645:6;2583:75;;;2680:2;2675:3;2671:12;2664:19;;2694:75;2765:3;2756:6;2694:75;;;2791:2;2786:3;2782:12;2775:19;;2805:75;2876:3;2867:6;2805:75;;;2902:2;2897:3;2893:12;2886:19;;2916:75;2987:3;2978:6;2916:75;;;-1:-1;3013:2;3004:12;;2571:470;-1:-1;;;;2571:470;3048:1440;;3651:148;3795:3;3651:148;;;3644:155;;3817:148;3961:3;3817:148;;;3810:155;;3983:148;4127:3;3983:148;;;3976:155;;4149:148;4293:3;4149:148;;;4142:155;;4315:148;4459:3;4315:148;;;4308:155;3632:856;-1:-1;;3632:856;4496:145;4632:3;4610:31;-1:-1;4610:31;4649:79;4718:5;4701:27;;739:1230:3;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80637b837ad114610046578063a2d7c53d1461006f578063e306f77914610082575b600080fd5b61005961005436600461038a565b61008a565b6040516100669190610693565b60405180910390f35b61005961007d36600461034d565b61009b565b6100596100a6565b6000610095826100ac565b92915050565b6000610095826100bf565b60005481565b60006100956100ba836100cd565b610153565b60006100956100ba83610193565b6000806040516020016100df90610630565b6040516020818303038152906040528051906020012090506000836040015160405161010b9190610624565b60408051918290038220865160208089015196855284015273ffffffffffffffffffffffffffffffffffffffff90941690820152606081019290925250608090209050919050565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b6000806040516020016101a590610667565b604051602081830303815290604052805190602001209050600083602001516040516101d19190610624565b604080519182900382208651968201519483526020830196909652810194909452506060830152506080902090565b600061020c823561071a565b9392505050565b600061020c8235610717565b6000601f8201831361023057600080fd5b813561024361023e826106c8565b6106a1565b9150808252602083016020830185838301111561025f57600080fd5b61026a838284610738565b50505092915050565b60006060828403121561028557600080fd5b61028f60606106a1565b9050600061029d8484610213565b825250602082013567ffffffffffffffff8111156102ba57600080fd5b6102c68482850161021f565b60208301525060406102da84828501610213565b60408301525092915050565b6000606082840312156102f857600080fd5b61030260606106a1565b905060006103108484610213565b825250602061032184848301610200565b602083015250604082013567ffffffffffffffff81111561034157600080fd5b6102da8482850161021f565b60006020828403121561035f57600080fd5b813567ffffffffffffffff81111561037657600080fd5b61038284828501610273565b949350505050565b60006020828403121561039c57600080fd5b813567ffffffffffffffff8111156103b357600080fd5b610382848285016102e6565b6103c881610717565b82525050565b60006103d98261070e565b6103e38185610712565b93506103f3818560208601610744565b9290920192915050565b600061040a601283610712565b7f5a65726f45785472616e73616374696f6e280000000000000000000000000000815260120192915050565b6000610443601b83610712565b7f6279746573207472616e73616374696f6e5369676e61747572652c00000000008152601b0192915050565b600061047c600183610712565b7f2900000000000000000000000000000000000000000000000000000000000000815260010192915050565b60006104b5601483610712565b7f436f6f7264696e61746f72417070726f76616c28000000000000000000000000815260140192915050565b60006104ee600d83610712565b7f75696e743235362073616c742c000000000000000000000000000000000000008152600d0192915050565b6000610527600a83610712565b7f62797465732064617461000000000000000000000000000000000000000000008152600a0192915050565b6000610560602583610712565b7f75696e7432353620617070726f76616c45787069726174696f6e54696d65536581527f636f6e6473000000000000000000000000000000000000000000000000000000602082015260250192915050565b60006105bf601683610712565b7f61646472657373207369676e6572416464726573732c00000000000000000000815260160192915050565b60006105f8601883610712565b7f62797465733332207472616e73616374696f6e486173682c0000000000000000815260180192915050565b600061020c82846103ce565b600061063b826103fd565b9150610646826104e1565b9150610651826105b2565b915061065c8261051a565b91506100958261046f565b6000610672826104a8565b915061067d826105eb565b915061068882610436565b915061065c82610553565b6020810161009582846103bf565b60405181810167ffffffffffffffff811182821017156106c057600080fd5b604052919050565b600067ffffffffffffffff8211156106df57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b919050565b90565b600073ffffffffffffffffffffffffffffffffffffffff8216610095565b82818337506000910152565b60005b8381101561075f578181015183820152602001610747565b8381111561076e576000848401525b5050505056fea265627a7a72305820fd18db31ffe951b55e945cfc55ca4f3efee15343884f5c93eca886fc4800e74d6c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7B837AD1 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xA2D7C53D EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x82 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x54 CALLDATASIZE PUSH1 0x4 PUSH2 0x38A JUMP JUMPDEST PUSH2 0x8A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x66 SWAP2 SWAP1 PUSH2 0x693 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x59 PUSH2 0x7D CALLDATASIZE PUSH1 0x4 PUSH2 0x34D JUMP JUMPDEST PUSH2 0x9B JUMP JUMPDEST PUSH2 0x59 PUSH2 0xA6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x95 DUP3 PUSH2 0xAC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x95 DUP3 PUSH2 0xBF JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x95 PUSH2 0xBA DUP4 PUSH2 0xCD JUMP JUMPDEST PUSH2 0x153 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x95 PUSH2 0xBA DUP4 PUSH2 0x193 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xDF SWAP1 PUSH2 0x630 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x40 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x10B SWAP2 SWAP1 PUSH2 0x624 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB DUP3 KECCAK256 DUP7 MLOAD PUSH1 0x20 DUP1 DUP10 ADD MLOAD SWAP7 DUP6 MSTORE DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x80 SWAP1 KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A5 SWAP1 PUSH2 0x667 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x1D1 SWAP2 SWAP1 PUSH2 0x624 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB DUP3 KECCAK256 DUP7 MLOAD SWAP7 DUP3 ADD MLOAD SWAP5 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP7 SWAP1 SWAP7 MSTORE DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20C DUP3 CALLDATALOAD PUSH2 0x71A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20C DUP3 CALLDATALOAD PUSH2 0x717 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x230 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x243 PUSH2 0x23E DUP3 PUSH2 0x6C8 JUMP JUMPDEST PUSH2 0x6A1 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26A DUP4 DUP3 DUP5 PUSH2 0x738 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x28F PUSH1 0x60 PUSH2 0x6A1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x29D DUP5 DUP5 PUSH2 0x213 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 DUP5 DUP3 DUP6 ADD PUSH2 0x21F JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2DA DUP5 DUP3 DUP6 ADD PUSH2 0x213 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x302 PUSH1 0x60 PUSH2 0x6A1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x310 DUP5 DUP5 PUSH2 0x213 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x321 DUP5 DUP5 DUP4 ADD PUSH2 0x200 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2DA DUP5 DUP3 DUP6 ADD PUSH2 0x21F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x35F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x382 DUP5 DUP3 DUP6 ADD PUSH2 0x273 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x39C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x382 DUP5 DUP3 DUP6 ADD PUSH2 0x2E6 JUMP JUMPDEST PUSH2 0x3C8 DUP2 PUSH2 0x717 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D9 DUP3 PUSH2 0x70E JUMP JUMPDEST PUSH2 0x3E3 DUP2 DUP6 PUSH2 0x712 JUMP JUMPDEST SWAP4 POP PUSH2 0x3F3 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x744 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x40A PUSH1 0x12 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 DUP2 MSTORE PUSH1 0x12 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x443 PUSH1 0x1B DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x6279746573207472616E73616374696F6E5369676E61747572652C0000000000 DUP2 MSTORE PUSH1 0x1B ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x47C PUSH1 0x1 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4B5 PUSH1 0x14 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x436F6F7264696E61746F72417070726F76616C28000000000000000000000000 DUP2 MSTORE PUSH1 0x14 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4EE PUSH1 0xD DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0xD ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x527 PUSH1 0xA DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0xA ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x560 PUSH1 0x25 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x75696E7432353620617070726F76616C45787069726174696F6E54696D655365 DUP2 MSTORE PUSH32 0x636F6E6473000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x25 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5BF PUSH1 0x16 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 DUP2 MSTORE PUSH1 0x16 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5F8 PUSH1 0x18 DUP4 PUSH2 0x712 JUMP JUMPDEST PUSH32 0x62797465733332207472616E73616374696F6E486173682C0000000000000000 DUP2 MSTORE PUSH1 0x18 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20C DUP3 DUP5 PUSH2 0x3CE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x63B DUP3 PUSH2 0x3FD JUMP JUMPDEST SWAP2 POP PUSH2 0x646 DUP3 PUSH2 0x4E1 JUMP JUMPDEST SWAP2 POP PUSH2 0x651 DUP3 PUSH2 0x5B2 JUMP JUMPDEST SWAP2 POP PUSH2 0x65C DUP3 PUSH2 0x51A JUMP JUMPDEST SWAP2 POP PUSH2 0x95 DUP3 PUSH2 0x46F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x672 DUP3 PUSH2 0x4A8 JUMP JUMPDEST SWAP2 POP PUSH2 0x67D DUP3 PUSH2 0x5EB JUMP JUMPDEST SWAP2 POP PUSH2 0x688 DUP3 PUSH2 0x436 JUMP JUMPDEST SWAP2 POP PUSH2 0x65C DUP3 PUSH2 0x553 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x95 DUP3 DUP5 PUSH2 0x3BF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x6C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x95 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x75F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x747 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x76E JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP INVALID LOG2 PUSH6 0x627A7A723058 KECCAK256 REVERT XOR 0xdb BALANCE SELFDESTRUCT 0xe9 MLOAD 0xb5 0x5e SWAP5 0x5c 0xfc SSTORE 0xca 0x4f RETURNDATACOPY INVALID 0xe1 MSTORE8 NUMBER DUP9 0x4f 0x5c SWAP4 0xec 0xa8 DUP7 0xfc 0x48 STOP 0xe7 0x4d PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", + "sourceMap": "739:1230:3:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;739:1230:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1723:244;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1190:247;;;;;;;;;:::i;1339:33:1:-;;;:::i;1723:244:3:-;1840:23;1897:31;1916:11;1897:18;:31::i;:::-;1879:49;1723:244;-1:-1:-1;;1723:244:3:o;1190:247::-;1314:20;1365:36;1392:8;1365:26;:36::i;1339:33:1:-;;;;:::o;1514:406:2:-;1627:23;1828:53;1846:34;1868:11;1846:21;:34::i;:::-;1828:17;:53::i;1761:259:0:-;1881:20;1932:52;1950:33;1974:8;1950:23;:33::i;2167:1395:2:-;2283:14;2313:18;823:146;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;823:146:2;;;813:157;;;;;;2313:58;;2381:16;2410:11;:16;;;2400:27;;;;;;;;;;;;;;;;;2525:16;;2575:25;;;;;2999:26;;;3125:15;;3118:29;3270:42;3251:62;;;3234:15;;;3227:87;3364:2;3352:15;;3345:33;;;;-1:-1:-1;3519:3:2;3501:22;;;-1:-1:-1;2167:1395:2;;;:::o;1872:924:1:-;1966:14;2023:18;2335:2;2329:9;2367:66;2352:82;;2484:1;2472:14;;2465:40;;;;2602:2;2590:15;;2583:35;;;;2754:2;2736:21;;;1872:924::o;2360:1389:0:-;2477:14;2507:18;834:191;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;834:191:0;;;824:202;;;;;;2507:60;;2577:32;2622:8;:29;;;2612:40;;;;;;;;;;;;;;;;;2761:24;;2835:38;;;;3280:26;;;3385:2;3373:15;;3366:40;;;;3460:15;;3453:49;;;;-1:-1:-1;3568:2:0;3556:15;;3549:54;-1:-1:-1;3706:3:0;3688:22;;;2360:1389::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:118;;197:46;235:6;222:20;197:46;;256:432;;346:4;334:17;;330:27;-1:-1;320:2;;371:1;368;361:12;320:2;408:6;395:20;430:60;445:44;482:6;445:44;;;430:60;;;421:69;;510:6;503:5;496:21;546:4;538:6;534:17;579:4;572:5;568:16;614:3;605:6;600:3;596:16;593:25;590:2;;;631:1;628;621:12;590:2;641:41;675:6;670:3;665;641:41;;;313:375;;;;;;;;752:763;;876:4;864:9;859:3;855:19;851:30;848:2;;;894:1;891;884:12;848:2;912:20;927:4;912:20;;;903:29;-1:-1;993:1;1024:49;1069:3;1049:9;1024:49;;;1000:74;;-1:-1;1179:2;1164:18;;1151:32;1203:18;1192:30;;1189:2;;;1235:1;1232;1225:12;1189:2;1270:54;1320:3;1311:6;1300:9;1296:22;1270:54;;;1263:4;1256:5;1252:16;1245:80;1095:241;1411:2;1444:49;1489:3;1480:6;1469:9;1465:22;1444:49;;;1437:4;1430:5;1426:16;1419:75;1346:159;842:673;;;;;1574:719;;1697:4;1685:9;1680:3;1676:19;1672:30;1669:2;;;1715:1;1712;1705:12;1669:2;1733:20;1748:4;1733:20;;;1724:29;-1:-1;1803:1;1834:49;1879:3;1859:9;1834:49;;;1810:74;;-1:-1;1954:2;1987:49;2032:3;2008:22;;;1987:49;;;1980:4;1973:5;1969:16;1962:75;1905:143;2126:2;2115:9;2111:18;2098:32;2150:18;2142:6;2139:30;2136:2;;;2182:1;2179;2172:12;2136:2;2217:54;2267:3;2258:6;2247:9;2243:22;2217:54;;2425:397;;2564:2;2552:9;2543:7;2539:23;2535:32;2532:2;;;2580:1;2577;2570:12;2532:2;2615:31;;2666:18;2655:30;;2652:2;;;2698:1;2695;2688:12;2652:2;2718:88;2798:7;2789:6;2778:9;2774:22;2718:88;;;2708:98;2526:296;-1:-1;;;;2526:296;2829:395;;2967:2;2955:9;2946:7;2942:23;2938:32;2935:2;;;2983:1;2980;2973:12;2935:2;3018:31;;3069:18;3058:30;;3055:2;;;3101:1;3098;3091:12;3055:2;3121:87;3200:7;3191:6;3180:9;3176:22;3121:87;;3231:120;3314:31;3339:5;3314:31;;;3309:3;3302:44;3296:55;;;3358:348;;3482:34;3510:5;3482:34;;;3528:88;3609:6;3604:3;3528:88;;;3521:95;;3621:52;3666:6;3661:3;3654:4;3647:5;3643:16;3621:52;;;3685:16;;;;;3462:244;-1:-1;;3462:244;3714:400;;3892:85;3974:2;3969:3;3892:85;;;4010:66;3990:87;;4105:2;4096:12;;3878:236;-1:-1;;3878:236;4123:400;;4301:85;4383:2;4378:3;4301:85;;;4419:66;4399:87;;4514:2;4505:12;;4287:236;-1:-1;;4287:236;4532:398;;4710:84;4792:1;4787:3;4710:84;;;4827:66;4807:87;;4922:1;4913:11;;4696:234;-1:-1;;4696:234;4939:400;;5117:85;5199:2;5194:3;5117:85;;;5235:66;5215:87;;5330:2;5321:12;;5103:236;-1:-1;;5103:236;5348:400;;5526:85;5608:2;5603:3;5526:85;;;5644:66;5624:87;;5739:2;5730:12;;5512:236;-1:-1;;5512:236;5757:400;;5935:85;6017:2;6012:3;5935:85;;;6053:66;6033:87;;6148:2;6139:12;;5921:236;-1:-1;;5921:236;6166:501;;6344:85;6426:2;6421:3;6344:85;;;6462:66;6442:87;;6563:66;6558:2;6549:12;;6542:88;6658:2;6649:12;;6330:337;-1:-1;;6330:337;6676:400;;6854:85;6936:2;6931:3;6854:85;;;6972:66;6952:87;;7067:2;7058:12;;6840:236;-1:-1;;6840:236;7085:400;;7263:85;7345:2;7340:3;7263:85;;;7381:66;7361:87;;7476:2;7467:12;;7249:236;-1:-1;;7249:236;7493:254;;7633:89;7718:3;7709:6;7633:89;;7754:1440;;8357:148;8501:3;8357:148;;;8350:155;;8523:148;8667:3;8523:148;;;8516:155;;8689:148;8833:3;8689:148;;;8682:155;;8855:148;8999:3;8855:148;;;8848:155;;9021:148;9165:3;9021:148;;9201:1440;;9804:148;9948:3;9804:148;;;9797:155;;9970:148;10114:3;9970:148;;;9963:155;;10136:148;10280:3;10136:148;;;10129:155;;10302:148;10446:3;10302:148;;10648:213;10766:2;10751:18;;10780:71;10755:9;10824:6;10780:71;;10868:256;10930:2;10924:9;10956:17;;;11031:18;11016:34;;11052:22;;;11013:62;11010:2;;;11088:1;11085;11078:12;11010:2;11104;11097:22;10908:216;;-1:-1;10908:216;11131:254;;11270:18;11262:6;11259:30;11256:2;;;11302:1;11299;11292:12;11256:2;-1:-1;11375:4;11346;11323:17;;;;11342:9;11319:33;11365:15;;11193:192;11392:87;11462:12;;11446:33;11487:144;11622:3;11600:31;-1:-1;11600:31;11793:79;11862:5;11845:27;11879:105;;12157:42;12146:54;;11948:31;12129:76;12299:145;12380:6;12375:3;12370;12357:30;-1:-1;12436:1;12418:16;;12411:27;12350:94;12453:268;12518:1;12525:101;12539:6;12536:1;12533:13;12525:101;;;12606:11;;;12600:18;12587:11;;;12580:39;12561:2;12554:10;12525:101;;;12641:6;12638:1;12635:13;12632:2;;;12706:1;12697:6;12692:3;12688:16;12681:27;12632:2;12502:219;;;;" + } + } + }, + "sources": { + "test/TestLibs.sol": { + "id": 3 + }, + "src/libs/LibCoordinatorApproval.sol": { + "id": 0 + }, + "src/libs/LibEIP712Domain.sol": { + "id": 1 + }, + "src/libs/LibZeroExTransaction.sol": { + "id": 2 + } + }, + "sourceCodes": { + "test/TestLibs.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"../src/libs/LibCoordinatorApproval.sol\";\nimport \"../src/libs/LibZeroExTransaction.sol\";\n\n\ncontract TestLibs is\n LibCoordinatorApproval,\n LibZeroExTransaction\n{\n /// @dev Calculated the EIP712 hash of the Coordinator approval mesasage using the domain separator of this contract.\n /// @param approval Coordinator approval message containing the transaction hash, transaction signature, and expiration of the approval.\n /// @return EIP712 hash of the Coordinator approval message with the domain separator of this contract.\n function publicGetCoordinatorApprovalHash(CoordinatorApproval memory approval)\n public\n view\n returns (bytes32 approvalHash)\n {\n approvalHash = getCoordinatorApprovalHash(approval);\n return approvalHash;\n }\n\n /// @dev Calculates the EIP712 hash of a 0x transaction using the domain separator of this contract.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @return EIP712 hash of the transaction with the domain separator of this contract.\n function publicGetTransactionHash(ZeroExTransaction memory transaction)\n public\n view\n returns (bytes32 transactionHash)\n {\n transactionHash = getTransactionHash(transaction);\n return transactionHash;\n }\n}\n", + "src/libs/LibCoordinatorApproval.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibEIP712Domain.sol\";\n\n\ncontract LibCoordinatorApproval is\n LibEIP712Domain\n{\n // Hash for the EIP712 Coordinator approval message\n bytes32 constant internal EIP712_Coordinator_APPROVAL_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"CoordinatorApproval(\",\n \"bytes32 transactionHash,\",\n \"bytes transactionSignature,\",\n \"uint256 approvalExpirationTimeSeconds\",\n \")\"\n ));\n\n struct CoordinatorApproval {\n bytes32 transactionHash; // EIP712 hash of the transaction, using the domain separator of this contract.\n bytes transactionSignature; // Signature of the 0x transaction.\n uint256 approvalExpirationTimeSeconds; // Timestamp in seconds for which the signature expires.\n }\n\n /// @dev Calculated the EIP712 hash of the Coordinator approval mesasage using the domain separator of this contract.\n /// @param approval Coordinator approval message containing the transaction hash, transaction signature, and expiration of the approval.\n /// @return EIP712 hash of the Coordinator approval message with the domain separator of this contract.\n function getCoordinatorApprovalHash(CoordinatorApproval memory approval)\n internal\n view\n returns (bytes32 approvalHash)\n {\n approvalHash = hashEIP712Message(hashCoordinatorApproval(approval));\n return approvalHash;\n }\n\n /// @dev Calculated the EIP712 hash of the Coordinator approval mesasage with no domain separator.\n /// @param approval Coordinator approval message containing the transaction hash, transaction signature, and expiration of the approval.\n /// @return EIP712 hash of the Coordinator approval message with no domain separator.\n function hashCoordinatorApproval(CoordinatorApproval memory approval)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_Coordinator_APPROVAL_SCHEMA_HASH;\n bytes32 transactionSignatureHash = keccak256(approval.transactionSignature);\n // TODO(abandeali1): optimize by loading from memory in assembly\n bytes32 transactionHash = approval.transactionHash;\n uint256 approvalExpirationTimeSeconds = approval.approvalExpirationTimeSeconds;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_Coordinator_APPROVAL_SCHEMA_HASH,\n // approval.transactionHash,\n // keccak256(approval.transactionSignature)\n // approval.expiration,\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), transactionHash) // transactionHash\n mstore(add(memPtr, 64), transactionSignatureHash) // transactionSignatureHash\n mstore(add(memPtr, 96), approvalExpirationTimeSeconds) // approvalExpirationTimeSeconds\n // Compute hash\n result := keccak256(memPtr, 128)\n }\n return result;\n }\n}\n", + "src/libs/LibEIP712Domain.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract LibEIP712Domain {\n\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol Trade Execution Coordinator\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"1.0.0\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n uint256(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n", + "src/libs/LibZeroExTransaction.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibEIP712Domain.sol\";\n\n\ncontract LibZeroExTransaction is\n LibEIP712Domain\n{\n // Hash for the EIP712 0x transaction schema\n bytes32 constant internal EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"ZeroExTransaction(\",\n \"uint256 salt,\",\n \"address signerAddress,\",\n \"bytes data\",\n \")\"\n ));\n\n struct ZeroExTransaction {\n uint256 salt; // Arbitrary number to ensure uniqueness of transaction hash.\n address signerAddress; // Address of transaction signer.\n bytes data; // AbiV2 encoded calldata.\n }\n\n /// @dev Calculates the EIP712 hash of a 0x transaction using the domain separator of this contract.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @return EIP712 hash of the transaction with the domain separator of this contract.\n function getTransactionHash(ZeroExTransaction memory transaction)\n internal\n view\n returns (bytes32 transactionHash)\n {\n // Note: this transaction hash will differ from the hash produced by the Exchange contract because it utilizes a different domain hash.\n transactionHash = hashEIP712Message(hashZeroExTransaction(transaction));\n return transactionHash;\n }\n\n /// @dev Calculates EIP712 hash of the 0x transaction with no domain separator.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @return EIP712 hash of the transaction with no domain separator.\n function hashZeroExTransaction(ZeroExTransaction memory transaction)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes32 dataHash = keccak256(transaction.data);\n // TODO(abandeali1): optimize by loading from memory in assembly\n uint256 salt = transaction.salt;\n address signerAddress = transaction.signerAddress;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,\n // transaction.salt,\n // uint256(transaction.signerAddress),\n // keccak256(transaction.data)\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), salt) // salt\n mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff)) // signerAddress\n mstore(add(memPtr, 96), dataHash) // hash of data\n\n // Compute hash\n result := keccak256(memPtr, 128)\n }\n return result;\n }\n}\n" + }, + "sourceTreeHashHex": "0x3b6621340f3b596b4e0d4a7d3cab17a64f54b61312d53ca9b90831b420b3c6a9", + "compiler": { + "name": "solc", + "version": "0.5.5+commit.47a71e8f.Linux.g++", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "remappings": [ + "@0x/contracts-utils=/Users/greg/dev/0x-monorepo/contracts/tec/node_modules/@0x/contracts-utils", + "@0x/contracts-exchange-libs=/Users/greg/dev/0x-monorepo/contracts/tec/node_modules/@0x/contracts-exchange-libs" + ] + } + }, + "networks": {} +} \ No newline at end of file diff --git a/contracts/coordinator/generated-artifacts/TestMixins.json b/contracts/coordinator/generated-artifacts/TestMixins.json new file mode 100644 index 0000000000..26b2006eef --- /dev/null +++ b/contracts/coordinator/generated-artifacts/TestMixins.json @@ -0,0 +1,284 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "TestMixins", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [ + { + "name": "hash", + "type": "bytes32" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "name": "getSignerAddress", + "outputs": [ + { + "name": "signerAddress", + "type": "address" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "salt", + "type": "uint256" + }, + { + "name": "signerAddress", + "type": "address" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "transaction", + "type": "tuple" + }, + { + "components": [ + { + "name": "makerAddress", + "type": "address" + }, + { + "name": "takerAddress", + "type": "address" + }, + { + "name": "feeRecipientAddress", + "type": "address" + }, + { + "name": "senderAddress", + "type": "address" + }, + { + "name": "makerAssetAmount", + "type": "uint256" + }, + { + "name": "takerAssetAmount", + "type": "uint256" + }, + { + "name": "makerFee", + "type": "uint256" + }, + { + "name": "takerFee", + "type": "uint256" + }, + { + "name": "expirationTimeSeconds", + "type": "uint256" + }, + { + "name": "salt", + "type": "uint256" + }, + { + "name": "makerAssetData", + "type": "bytes" + }, + { + "name": "takerAssetData", + "type": "bytes" + } + ], + "name": "orders", + "type": "tuple[]" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256[]" + }, + { + "name": "approvalSignatures", + "type": "bytes[]" + } + ], + "name": "assertValidTransactionOrdersApproval", + "outputs": [], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "salt", + "type": "uint256" + }, + { + "name": "signerAddress", + "type": "address" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "transaction", + "type": "tuple" + }, + { + "name": "transactionSignature", + "type": "bytes" + }, + { + "name": "approvalExpirationTimeSeconds", + "type": "uint256[]" + }, + { + "name": "approvalSignatures", + "type": "bytes[]" + } + ], + "name": "assertValidCoordinatorApprovals", + "outputs": [], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "EIP712_DOMAIN_HASH", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "0x7f454950373132446f6d61696e280000000000000000000000000000000000000060a09081527f737472696e67206e616d652c000000000000000000000000000000000000000060ad527f737472696e672076657273696f6e2c000000000000000000000000000000000060b9527f6164647265737320766572696679696e67436f6e74726163740000000000000060c8527f290000000000000000000000000000000000000000000000000000000000000060e152604260808190529020610142604052602760e2818152906123ce610102398051602091820120604080518082018252600581527f312e302e3000000000000000000000000000000000000000000000000000000090840152805180840194909452838101919091527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c6060840152306080808501919091528151808503909101815260a090930190528151910120600055612259806101756000396000f3fe608060405234801561001057600080fd5b5060043610610068577c010000000000000000000000000000000000000000000000000000000060003504630f7d8e39811461006d57806355fc233c14610096578063cdbc4500146100ab578063e306f779146100be575b600080fd5b61008061007b366004611a91565b6100d3565b60405161008d919061201d565b60405180910390f35b6100a96100a4366004611b77565b6104c8565b005b6100a96100b9366004611c63565b610732565b6100c6610761565b60405161008d919061202b565b600080825111151561011a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120d9565b60405180910390fd5b600061012583610767565b7f010000000000000000000000000000000000000000000000000000000000000090049050600360ff821610610187576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120a9565b60008160ff16600381111561019857fe5b905060008160038111156101a857fe5b14156101e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120c9565b60018160038111156101ee57fe5b141561032c57835160411461022f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612039565b600084600081518110151561024057fe5b01602001517f0100000000000000000000000000000000000000000000000000000000000000908190048102049050600061028286600163ffffffff61082b16565b9050600061029787602163ffffffff61082b16565b905060018884848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156102f6573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104c295505050505050565b600281600381111561033a57fe5b141561049057835160411461037b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612039565b600084600081518110151561038c57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006103ce86600163ffffffff61082b16565b905060006103e387602163ffffffff61082b16565b905060018860405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156102f6573d6000803e3d6000fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120a9565b92915050565b60006104d386610876565b60408051600080825260208201909252845192935091905b818110156105bf576000868281518110151561050357fe5b906020019060200201519050610517611422565b5060408051606081018252868152602081018a905290810182905242821161056b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612089565b600061057682610889565b9050600061059b828a8781518110151561058c57fe5b906020019060200201516100d3565b90506105ad878263ffffffff61089716565b965050600190930192506104eb915050565b50865160005b818110156107265788516000908a90839081106105de57fe5b906020019060200201516060015173ffffffffffffffffffffffffffffffffffffffff16141561060d5761071e565b6000898281518110151561061d57fe5b6020908102909101015160400151905073ffffffffffffffffffffffffffffffffffffffff81163214156106635761065b853263ffffffff61089716565b94505061071e565b6000610675868363ffffffff61096116565b90508015156106b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612049565b60208c015173ffffffffffffffffffffffffffffffffffffffff163214806106e357506106e3863263ffffffff61096116565b151561071b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120e9565b50505b6001016105c5565b50505050505050505050565b606061074185604001516109d9565b905060008151111561075a5761075a85828686866104c8565b5050505050565b60005481565b60008082511115156107a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120b9565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106107d557fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b60008160200183511015151561086d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612099565b50016020015190565b60006104c261088483610e91565b61104d565b60006104c26108848361108d565b8151604051606091849060208082028084018201929101828510156108e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612079565b82851115610902576108fb85858361121f565b8497508793505b60018201915060208101905080840192508294508188528460405286886001840381518110151561092f57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152508694505050505092915050565b8151600090815b818110156109ce578373ffffffffffffffffffffffffffffffffffffffff16858281518110151561099557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614156109c6576001925050506104c2565b600101610968565b506000949350505050565b606060006109ed838263ffffffff6112e316565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d5000000000000000000000000000000000000000000000000000000001480610a8057507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b80610acc57507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610b5657610ad9611447565b8351610aef90859060049063ffffffff61135016565b806020019051610b029190810190611ae3565b604080516001808252818301909252919250816020015b610b21611447565b815260200190600190039081610b1957905050925080836000815181101515610b4657fe5b6020908102909101015250610e8b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b000000000000000000000000000000000000000000000000000000001480610be757507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b80610c3357507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b80610c7f57507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b80610ccb57507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b80610d1757507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b80610d6357507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b15610d98578251610d7e90849060049063ffffffff61135016565b806020019051610d919190810190611a54565b9150610e8b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610e8b57610dea611447565b610df2611447565b8451610e0890869060049063ffffffff61135016565b806020019051610e1b9190810190611b18565b60408051600280825260608201909252929450909250816020015b610e3e611447565b815260200190600190039081610e3657905050935081846000815181101515610e6357fe5b602090810290910101528351819085906001908110610e7e57fe5b6020908102909101015250505b50919050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f8301528251808303840181526060909201808452825192820192909220928401518051600094938593909182918401908083835b60208310610fc557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f88565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208a519a8201519883529082019990995273ffffffffffffffffffffffffffffffffffffffff90961691860191909152505050506060810192909252506080902090565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b6040517f436f6f7264696e61746f72417070726f76616c28000000000000000000000000602082019081527f62797465733332207472616e73616374696f6e486173682c000000000000000060348301527f6279746573207472616e73616374696f6e5369676e61747572652c0000000000604c83015260009182919060670160256121fb8239602501807f29000000000000000000000000000000000000000000000000000000000000008152506001019050604051602081830303815290604052805190602001209050600083602001516040518082805190602001908083835b602083106111ad57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611170565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208a519a85015198835290820199909952918201979097526060810194909452505060809091209392505050565b6020811015611249576001816020036101000a0380198351168185511680821786525050506112de565b82821415611256576112de565b828211156112905760208103905080820181840181515b8285101561128857845186526020958601959094019361126d565b9052506112de565b60208103905080820181840183515b818612156112d957825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0928301929091019061129f565b855250505b505050565b600081600401835110151515611325576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120f9565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60608183111561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612059565b83518211156113c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612069565b8282036040519080825280601f01601f1916602001820160405280156113f4576020820181803883390190505b5090506114156114038261141c565b8461140d8761141c565b01835161121f565b9392505050565b60200190565b6060604051908101604052806000801916815260200160608152602001600081525090565b61018060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b60006114158235612197565b60006114158251612197565b6000601f8201831361152a57600080fd5b813561153d61153882612130565b612109565b81815260209384019390925082018360005b8381101561157b578135860161156588826116bb565b845250602092830192919091019060010161154f565b5050505092915050565b6000601f8201831361159657600080fd5b81516115a461153882612130565b81815260209384019390925082018360005b8381101561157b57815186016115cc8882611899565b84525060209283019291909101906001016115b6565b6000601f820183136115f357600080fd5b813561160161153882612130565b81815260209384019390925082018360005b8381101561157b57813586016116298882611750565b8452506020928301929190910190600101611613565b6000601f8201831361165057600080fd5b813561165e61153882612130565b9150818183526020840193506020810190508385602084028201111561168357600080fd5b60005b8381101561157b578161169988826116af565b8452506020928301929190910190600101611686565b600061141582356121a2565b6000601f820183136116cc57600080fd5b81356116da61153882612151565b915080825260208301602083018583830111156116f657600080fd5b6117018382846121be565b50505092915050565b6000601f8201831361171b57600080fd5b815161172961153882612151565b9150808252602083016020830185838301111561174557600080fd5b6117018382846121ca565b6000610180828403121561176357600080fd5b61176e610180612109565b9050600061177c8484611501565b825250602061178d84848301611501565b60208301525060406117a184828501611501565b60408301525060606117b584828501611501565b60608301525060806117c9848285016116af565b60808301525060a06117dd848285016116af565b60a08301525060c06117f1848285016116af565b60c08301525060e0611805848285016116af565b60e08301525061010061181a848285016116af565b61010083015250610120611830848285016116af565b6101208301525061014082013567ffffffffffffffff81111561185257600080fd5b61185e848285016116bb565b6101408301525061016082013567ffffffffffffffff81111561188057600080fd5b61188c848285016116bb565b6101608301525092915050565b600061018082840312156118ac57600080fd5b6118b7610180612109565b905060006118c5848461150d565b82525060206118d68484830161150d565b60208301525060406118ea8482850161150d565b60408301525060606118fe8482850161150d565b606083015250608061191284828501611a48565b60808301525060a061192684828501611a48565b60a08301525060c061193a84828501611a48565b60c08301525060e061194e84828501611a48565b60e08301525061010061196384828501611a48565b6101008301525061012061197984828501611a48565b6101208301525061014082015167ffffffffffffffff81111561199b57600080fd5b6119a78482850161170a565b6101408301525061016082015167ffffffffffffffff8111156119c957600080fd5b61188c8482850161170a565b6000606082840312156119e757600080fd5b6119f16060612109565b905060006119ff84846116af565b8252506020611a1084848301611501565b602083015250604082013567ffffffffffffffff811115611a3057600080fd5b611a3c848285016116bb565b60408301525092915050565b600061141582516121a2565b600060208284031215611a6657600080fd5b815167ffffffffffffffff811115611a7d57600080fd5b611a8984828501611585565b949350505050565b60008060408385031215611aa457600080fd5b6000611ab085856116af565b925050602083013567ffffffffffffffff811115611acd57600080fd5b611ad9858286016116bb565b9150509250929050565b600060208284031215611af557600080fd5b815167ffffffffffffffff811115611b0c57600080fd5b611a8984828501611899565b60008060408385031215611b2b57600080fd5b825167ffffffffffffffff811115611b4257600080fd5b611b4e85828601611899565b925050602083015167ffffffffffffffff811115611b6b57600080fd5b611ad985828601611899565b600080600080600060a08688031215611b8f57600080fd5b853567ffffffffffffffff811115611ba657600080fd5b611bb2888289016119d5565b955050602086013567ffffffffffffffff811115611bcf57600080fd5b611bdb888289016115e2565b945050604086013567ffffffffffffffff811115611bf857600080fd5b611c04888289016116bb565b935050606086013567ffffffffffffffff811115611c2157600080fd5b611c2d8882890161163f565b925050608086013567ffffffffffffffff811115611c4a57600080fd5b611c5688828901611519565b9150509295509295909350565b60008060008060808587031215611c7957600080fd5b843567ffffffffffffffff811115611c9057600080fd5b611c9c878288016119d5565b945050602085013567ffffffffffffffff811115611cb957600080fd5b611cc5878288016116bb565b935050604085013567ffffffffffffffff811115611ce257600080fd5b611cee8782880161163f565b925050606085013567ffffffffffffffff811115611d0b57600080fd5b611d1787828801611519565b91505092959194509250565b611d2c81612197565b82525050565b611d2c816121a2565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b601a81527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000602082015260400190565b601a81527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000602082015260400190565b601c81527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000602082015260400190565b601781527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000602082015260400190565b601081527f415050524f56414c5f4558504952454400000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b602081016104c28284611d23565b602081016104c28284611d32565b602080825281016104c281611d3b565b602080825281016104c281611d6b565b602080825281016104c281611d9b565b602080825281016104c281611dcb565b602080825281016104c281611dfb565b602080825281016104c281611e2b565b602080825281016104c281611e5b565b602080825281016104c281611eb1565b602080825281016104c281611ee1565b602080825281016104c281611f37565b602080825281016104c281611f67565b602080825281016104c281611f97565b602080825281016104c281611fc7565b60405181810167ffffffffffffffff8111828210171561212857600080fd5b604052919050565b600067ffffffffffffffff82111561214757600080fd5b5060209081020190565b600067ffffffffffffffff82111561216857600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60006104c2826121a5565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b838110156121e55781810151838201526020016121cd565b838111156121f4576000848401525b5050505056fe75696e7432353620617070726f76616c45787069726174696f6e54696d655365636f6e6473a265627a7a7230582071ae6d988dbd93e0872afc6c575d3aec20617670170c8d38c02dd9025485b1666c6578706572696d656e74616cf5003730782050726f746f636f6c20547261646520457865637574696f6e20436f6f7264696e61746f72", + "opcodes": "PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0xA0 SWAP1 DUP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0xAD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0xB9 MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0xC8 MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0xE1 MSTORE PUSH1 0x42 PUSH1 0x80 DUP2 SWAP1 MSTORE SWAP1 KECCAK256 PUSH2 0x142 PUSH1 0x40 MSTORE PUSH1 0x27 PUSH1 0xE2 DUP2 DUP2 MSTORE SWAP1 PUSH2 0x23CE PUSH2 0x102 CODECOPY DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE DUP1 MLOAD DUP1 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x6C015BD22B4C69690933C1058878EBDFEF31F9AAAE40BBE86D8A09FE1B2972C PUSH1 0x60 DUP5 ADD MSTORE ADDRESS PUSH1 0x80 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xA0 SWAP1 SWAP4 ADD SWAP1 MSTORE DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x0 SSTORE PUSH2 0x2259 DUP1 PUSH2 0x175 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x68 JUMPI PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV PUSH4 0xF7D8E39 DUP2 EQ PUSH2 0x6D JUMPI DUP1 PUSH4 0x55FC233C EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0xCDBC4500 EQ PUSH2 0xAB JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0xBE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x80 PUSH2 0x7B CALLDATASIZE PUSH1 0x4 PUSH2 0x1A91 JUMP JUMPDEST PUSH2 0xD3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8D SWAP2 SWAP1 PUSH2 0x201D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA9 PUSH2 0xA4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B77 JUMP JUMPDEST PUSH2 0x4C8 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xA9 PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C63 JUMP JUMPDEST PUSH2 0x732 JUMP JUMPDEST PUSH2 0xC6 PUSH2 0x761 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8D SWAP2 SWAP1 PUSH2 0x202B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x11A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20D9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x125 DUP4 PUSH2 0x767 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP1 POP PUSH1 0x3 PUSH1 0xFF DUP3 AND LT PUSH2 0x187 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20A9 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x198 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1A8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20C9 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1EE JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x32C JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x22F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2039 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x240 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP1 POP PUSH1 0x0 PUSH2 0x282 DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x82B AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x297 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x82B AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP7 POP PUSH2 0x4C2 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x33A JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x490 JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x37B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2039 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x38C JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP1 POP PUSH1 0x0 PUSH2 0x3CE DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x82B AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3E3 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x82B AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20A9 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4D3 DUP7 PUSH2 0x876 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE DUP5 MLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5BF JUMPI PUSH1 0x0 DUP7 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x503 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SWAP1 POP PUSH2 0x517 PUSH2 0x1422 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP11 SWAP1 MSTORE SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE TIMESTAMP DUP3 GT PUSH2 0x56B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2089 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x576 DUP3 PUSH2 0x889 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x59B DUP3 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x58C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xD3 JUMP JUMPDEST SWAP1 POP PUSH2 0x5AD DUP8 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x897 AND JUMP JUMPDEST SWAP7 POP POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 POP PUSH2 0x4EB SWAP2 POP POP JUMP JUMPDEST POP DUP7 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x726 JUMPI DUP9 MLOAD PUSH1 0x0 SWAP1 DUP11 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x5DE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x60D JUMPI PUSH2 0x71E JUMP JUMPDEST PUSH1 0x0 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x61D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ORIGIN EQ ISZERO PUSH2 0x663 JUMPI PUSH2 0x65B DUP6 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0x897 AND JUMP JUMPDEST SWAP5 POP POP PUSH2 0x71E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x675 DUP7 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x961 AND JUMP JUMPDEST SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x6B0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2049 JUMP JUMPDEST PUSH1 0x20 DUP13 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ORIGIN EQ DUP1 PUSH2 0x6E3 JUMPI POP PUSH2 0x6E3 DUP7 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0x961 AND JUMP JUMPDEST ISZERO ISZERO PUSH2 0x71B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20E9 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x5C5 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x741 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x9D9 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0x75A JUMPI PUSH2 0x75A DUP6 DUP3 DUP7 DUP7 DUP7 PUSH2 0x4C8 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x7A5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20B9 JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7D5 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x86D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2099 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C2 PUSH2 0x884 DUP4 PUSH2 0xE91 JUMP JUMPDEST PUSH2 0x104D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C2 PUSH2 0x884 DUP4 PUSH2 0x108D JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH1 0x60 SWAP2 DUP5 SWAP1 PUSH1 0x20 DUP1 DUP3 MUL DUP1 DUP5 ADD DUP3 ADD SWAP3 SWAP2 ADD DUP3 DUP6 LT ISZERO PUSH2 0x8E8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2079 JUMP JUMPDEST DUP3 DUP6 GT ISZERO PUSH2 0x902 JUMPI PUSH2 0x8FB DUP6 DUP6 DUP4 PUSH2 0x121F JUMP JUMPDEST DUP5 SWAP8 POP DUP8 SWAP4 POP JUMPDEST PUSH1 0x1 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP1 DUP5 ADD SWAP3 POP DUP3 SWAP5 POP DUP2 DUP9 MSTORE DUP5 PUSH1 0x40 MSTORE DUP7 DUP9 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x92F JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9CE JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x995 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x9C6 JUMPI PUSH1 0x1 SWAP3 POP POP POP PUSH2 0x4C2 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x968 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x9ED DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x12E3 AND JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xA80 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3E228BAE00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xACC JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x64A3BC1500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xB56 JUMPI PUSH2 0xAD9 PUSH2 0x1447 JUMP JUMPDEST DUP4 MLOAD PUSH2 0xAEF SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1350 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xB02 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1AE3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xB21 PUSH2 0x1447 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xB19 JUMPI SWAP1 POP POP SWAP3 POP DUP1 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB46 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE POP PUSH2 0xE8B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x297BB70B00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xBE7 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x50DDE19000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xC33 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xC7F JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xCCB JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xA3E2038000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xD17 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xD63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xDD1C7D1800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xD98 JUMPI DUP3 MLOAD PUSH2 0xD7E SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1350 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xD91 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1A54 JUMP JUMPDEST SWAP2 POP PUSH2 0xE8B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3C28D86100000000000000000000000000000000000000000000000000000000 EQ ISZERO PUSH2 0xE8B JUMPI PUSH2 0xDEA PUSH2 0x1447 JUMP JUMPDEST PUSH2 0xDF2 PUSH2 0x1447 JUMP JUMPDEST DUP5 MLOAD PUSH2 0xE08 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1350 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xE1B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1B18 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP5 POP SWAP1 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xE3E PUSH2 0x1447 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xE36 JUMPI SWAP1 POP POP SWAP4 POP DUP2 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE63 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE DUP4 MLOAD DUP2 SWAP1 DUP6 SWAP1 PUSH1 0x1 SWAP1 DUP2 LT PUSH2 0xE7E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE POP POP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD DUP1 DUP5 MSTORE DUP3 MLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 KECCAK256 SWAP3 DUP5 ADD MLOAD DUP1 MLOAD PUSH1 0x0 SWAP5 SWAP4 DUP6 SWAP4 SWAP1 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xFC5 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF88 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP11 MLOAD SWAP11 DUP3 ADD MLOAD SWAP9 DUP4 MSTORE SWAP1 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND SWAP2 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE POP POP POP POP PUSH1 0x60 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x436F6F7264696E61746F72417070726F76616C28000000000000000000000000 PUSH1 0x20 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x62797465733332207472616E73616374696F6E486173682C0000000000000000 PUSH1 0x34 DUP4 ADD MSTORE PUSH32 0x6279746573207472616E73616374696F6E5369676E61747572652C0000000000 PUSH1 0x4C DUP4 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 SWAP1 PUSH1 0x67 ADD PUSH1 0x25 PUSH2 0x21FB DUP3 CODECOPY PUSH1 0x25 ADD DUP1 PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 ADD SWAP1 POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x11AD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1170 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP11 MLOAD SWAP11 DUP6 ADD MLOAD SWAP9 DUP4 MSTORE SWAP1 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE SWAP2 DUP3 ADD SWAP8 SWAP1 SWAP8 MSTORE PUSH1 0x60 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1249 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x12DE JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x1256 JUMPI PUSH2 0x12DE JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x1290 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x1288 JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x126D JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x12DE JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x12D9 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x129F JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1325 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20F9 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0x138C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2059 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0x13C7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2069 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x13F4 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0x1415 PUSH2 0x1403 DUP3 PUSH2 0x141C JUMP JUMPDEST DUP5 PUSH2 0x140D DUP8 PUSH2 0x141C JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x121F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x180 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1415 DUP3 CALLDATALOAD PUSH2 0x2197 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1415 DUP3 MLOAD PUSH2 0x2197 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x152A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x153D PUSH2 0x1538 DUP3 PUSH2 0x2130 JUMP JUMPDEST PUSH2 0x2109 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x157B JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1565 DUP9 DUP3 PUSH2 0x16BB JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x154F JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1596 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x15A4 PUSH2 0x1538 DUP3 PUSH2 0x2130 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x157B JUMPI DUP2 MLOAD DUP7 ADD PUSH2 0x15CC DUP9 DUP3 PUSH2 0x1899 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x15B6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x15F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1601 PUSH2 0x1538 DUP3 PUSH2 0x2130 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x157B JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1629 DUP9 DUP3 PUSH2 0x1750 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1613 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x165E PUSH2 0x1538 DUP3 PUSH2 0x2130 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1683 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x157B JUMPI DUP2 PUSH2 0x1699 DUP9 DUP3 PUSH2 0x16AF JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1686 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1415 DUP3 CALLDATALOAD PUSH2 0x21A2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x16CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x16DA PUSH2 0x1538 DUP3 PUSH2 0x2151 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x16F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1701 DUP4 DUP3 DUP5 PUSH2 0x21BE JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x171B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1729 PUSH2 0x1538 DUP3 PUSH2 0x2151 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1701 DUP4 DUP3 DUP5 PUSH2 0x21CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1763 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x176E PUSH2 0x180 PUSH2 0x2109 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x177C DUP5 DUP5 PUSH2 0x1501 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x178D DUP5 DUP5 DUP4 ADD PUSH2 0x1501 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x17A1 DUP5 DUP3 DUP6 ADD PUSH2 0x1501 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x17B5 DUP5 DUP3 DUP6 ADD PUSH2 0x1501 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x17C9 DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x17DD DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x17F1 DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x1805 DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x181A DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1830 DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1852 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x185E DUP5 DUP3 DUP6 ADD PUSH2 0x16BB JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1880 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x188C DUP5 DUP3 DUP6 ADD PUSH2 0x16BB JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x18AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x18B7 PUSH2 0x180 PUSH2 0x2109 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x18C5 DUP5 DUP5 PUSH2 0x150D JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x18D6 DUP5 DUP5 DUP4 ADD PUSH2 0x150D JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x18EA DUP5 DUP3 DUP6 ADD PUSH2 0x150D JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x18FE DUP5 DUP3 DUP6 ADD PUSH2 0x150D JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x1912 DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x1926 DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x193A DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x194E DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x1963 DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1979 DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x199B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19A7 DUP5 DUP3 DUP6 ADD PUSH2 0x170A JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x188C DUP5 DUP3 DUP6 ADD PUSH2 0x170A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19F1 PUSH1 0x60 PUSH2 0x2109 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x19FF DUP5 DUP5 PUSH2 0x16AF JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1A10 DUP5 DUP5 DUP4 ADD PUSH2 0x1501 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A3C DUP5 DUP3 DUP6 ADD PUSH2 0x16BB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1415 DUP3 MLOAD PUSH2 0x21A2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A89 DUP5 DUP3 DUP6 ADD PUSH2 0x1585 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1AA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1AB0 DUP6 DUP6 PUSH2 0x16AF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1ACD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AD9 DUP6 DUP3 DUP7 ADD PUSH2 0x16BB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1AF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B0C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A89 DUP5 DUP3 DUP6 ADD PUSH2 0x1899 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1B2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B4E DUP6 DUP3 DUP7 ADD PUSH2 0x1899 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AD9 DUP6 DUP3 DUP7 ADD PUSH2 0x1899 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1B8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB2 DUP9 DUP3 DUP10 ADD PUSH2 0x19D5 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BCF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BDB DUP9 DUP3 DUP10 ADD PUSH2 0x15E2 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C04 DUP9 DUP3 DUP10 ADD PUSH2 0x16BB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C2D DUP9 DUP3 DUP10 ADD PUSH2 0x163F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C56 DUP9 DUP3 DUP10 ADD PUSH2 0x1519 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1C79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C90 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C9C DUP8 DUP3 DUP9 ADD PUSH2 0x19D5 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CC5 DUP8 DUP3 DUP9 ADD PUSH2 0x16BB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CEE DUP8 DUP3 DUP9 ADD PUSH2 0x163F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D17 DUP8 DUP3 DUP9 ADD PUSH2 0x1519 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x1D2C DUP2 PUSH2 0x2197 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1D2C DUP2 PUSH2 0x21A2 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x494E56414C49445F415050524F56414C5F5349474E4154555245000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x46524F4D5F4C4553535F5448414E5F544F5F5245515549524544000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1C DUP2 MSTORE PUSH32 0x544F5F4C4553535F5448414E5F4C454E4754485F524551554952454400000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F465245455F4D454D4F52595F505452000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x415050524F56414C5F4558504952454400000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x4C2 DUP3 DUP5 PUSH2 0x1D23 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x4C2 DUP3 DUP5 PUSH2 0x1D32 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1D3B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1D6B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1D9B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1DCB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1DFB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1E2B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1E5B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1EB1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1EE1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1F37 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1F67 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1FC7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2128 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2168 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C2 DUP3 PUSH2 0x21A5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x21E5 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x21CD JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x21F4 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP INVALID PUSH22 0x696E7432353620617070726F76616C45787069726174 PUSH10 0x6F6E54696D655365636F PUSH15 0x6473A265627A7A7230582071AE6D98 DUP14 0xbd SWAP4 0xe0 DUP8 0x2a 0xfc PUSH13 0x575D3AEC20617670170C8D38C0 0x2d 0xd9 MUL SLOAD DUP6 0xb1 PUSH7 0x6C657870657269 PUSH14 0x656E74616CF5003730782050726F PUSH21 0x6F636F6C20547261646520457865637574696F6E20 NUMBER PUSH16 0x6F7264696E61746F7200000000000000 ", + "sourceMap": "1083:148:10:-;;;;;;;;;;;;;;;;;22:32:-1;776:91:14;6:49:-1;;;1073:159:10;;1549:18;776:91:14;1549:18:10;;1083:148;1549:18;;;1083:148;1549:18;;;1533:36;;;;;;;1599:21;;;;;;;;;;;;;;;;1454:214;;;;;;;;;;;;;;;;1583:39;1454:214;;;;1652:4;1454:214;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1454:214:10;;;;;;1444:225;;;;;-1:-1:-1;1423:246:10;776:91:14;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "0x608060405234801561001057600080fd5b5060043610610068577c010000000000000000000000000000000000000000000000000000000060003504630f7d8e39811461006d57806355fc233c14610096578063cdbc4500146100ab578063e306f779146100be575b600080fd5b61008061007b366004611a91565b6100d3565b60405161008d919061201d565b60405180910390f35b6100a96100a4366004611b77565b6104c8565b005b6100a96100b9366004611c63565b610732565b6100c6610761565b60405161008d919061202b565b600080825111151561011a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120d9565b60405180910390fd5b600061012583610767565b7f010000000000000000000000000000000000000000000000000000000000000090049050600360ff821610610187576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120a9565b60008160ff16600381111561019857fe5b905060008160038111156101a857fe5b14156101e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120c9565b60018160038111156101ee57fe5b141561032c57835160411461022f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612039565b600084600081518110151561024057fe5b01602001517f0100000000000000000000000000000000000000000000000000000000000000908190048102049050600061028286600163ffffffff61082b16565b9050600061029787602163ffffffff61082b16565b905060018884848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156102f6573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015196506104c295505050505050565b600281600381111561033a57fe5b141561049057835160411461037b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612039565b600084600081518110151561038c57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204905060006103ce86600163ffffffff61082b16565b905060006103e387602163ffffffff61082b16565b905060018860405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156102f6573d6000803e3d6000fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120a9565b92915050565b60006104d386610876565b60408051600080825260208201909252845192935091905b818110156105bf576000868281518110151561050357fe5b906020019060200201519050610517611422565b5060408051606081018252868152602081018a905290810182905242821161056b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612089565b600061057682610889565b9050600061059b828a8781518110151561058c57fe5b906020019060200201516100d3565b90506105ad878263ffffffff61089716565b965050600190930192506104eb915050565b50865160005b818110156107265788516000908a90839081106105de57fe5b906020019060200201516060015173ffffffffffffffffffffffffffffffffffffffff16141561060d5761071e565b6000898281518110151561061d57fe5b6020908102909101015160400151905073ffffffffffffffffffffffffffffffffffffffff81163214156106635761065b853263ffffffff61089716565b94505061071e565b6000610675868363ffffffff61096116565b90508015156106b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612049565b60208c015173ffffffffffffffffffffffffffffffffffffffff163214806106e357506106e3863263ffffffff61096116565b151561071b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120e9565b50505b6001016105c5565b50505050505050505050565b606061074185604001516109d9565b905060008151111561075a5761075a85828686866104c8565b5050505050565b60005481565b60008082511115156107a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120b9565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106107d557fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b60008160200183511015151561086d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612099565b50016020015190565b60006104c261088483610e91565b61104d565b60006104c26108848361108d565b8151604051606091849060208082028084018201929101828510156108e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612079565b82851115610902576108fb85858361121f565b8497508793505b60018201915060208101905080840192508294508188528460405286886001840381518110151561092f57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152508694505050505092915050565b8151600090815b818110156109ce578373ffffffffffffffffffffffffffffffffffffffff16858281518110151561099557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614156109c6576001925050506104c2565b600101610968565b506000949350505050565b606060006109ed838263ffffffff6112e316565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d5000000000000000000000000000000000000000000000000000000001480610a8057507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b80610acc57507fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc1500000000000000000000000000000000000000000000000000000000145b15610b5657610ad9611447565b8351610aef90859060049063ffffffff61135016565b806020019051610b029190810190611ae3565b604080516001808252818301909252919250816020015b610b21611447565b815260200190600190039081610b1957905050925080836000815181101515610b4657fe5b6020908102909101015250610e8b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b000000000000000000000000000000000000000000000000000000001480610be757507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b80610c3357507fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae54600000000000000000000000000000000000000000000000000000000145b80610c7f57507fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000145b80610ccb57507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b80610d1757507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b80610d6357507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b15610d98578251610d7e90849060049063ffffffff61135016565b806020019051610d919190810190611a54565b9150610e8b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610e8b57610dea611447565b610df2611447565b8451610e0890869060049063ffffffff61135016565b806020019051610e1b9190810190611b18565b60408051600280825260608201909252929450909250816020015b610e3e611447565b815260200190600190039081610e3657905050935081846000815181101515610e6357fe5b602090810290910101528351819085906001908110610e7e57fe5b6020908102909101015250505b50919050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f8301528251808303840181526060909201808452825192820192909220928401518051600094938593909182918401908083835b60208310610fc557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f88565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208a519a8201519883529082019990995273ffffffffffffffffffffffffffffffffffffffff90961691860191909152505050506060810192909252506080902090565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b6040517f436f6f7264696e61746f72417070726f76616c28000000000000000000000000602082019081527f62797465733332207472616e73616374696f6e486173682c000000000000000060348301527f6279746573207472616e73616374696f6e5369676e61747572652c0000000000604c83015260009182919060670160256121fb8239602501807f29000000000000000000000000000000000000000000000000000000000000008152506001019050604051602081830303815290604052805190602001209050600083602001516040518082805190602001908083835b602083106111ad57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611170565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208a519a85015198835290820199909952918201979097526060810194909452505060809091209392505050565b6020811015611249576001816020036101000a0380198351168185511680821786525050506112de565b82821415611256576112de565b828211156112905760208103905080820181840181515b8285101561128857845186526020958601959094019361126d565b9052506112de565b60208103905080820181840183515b818612156112d957825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0928301929091019061129f565b855250505b505050565b600081600401835110151515611325576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610111906120f9565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60608183111561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612059565b83518211156113c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011190612069565b8282036040519080825280601f01601f1916602001820160405280156113f4576020820181803883390190505b5090506114156114038261141c565b8461140d8761141c565b01835161121f565b9392505050565b60200190565b6060604051908101604052806000801916815260200160608152602001600081525090565b61018060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b60006114158235612197565b60006114158251612197565b6000601f8201831361152a57600080fd5b813561153d61153882612130565b612109565b81815260209384019390925082018360005b8381101561157b578135860161156588826116bb565b845250602092830192919091019060010161154f565b5050505092915050565b6000601f8201831361159657600080fd5b81516115a461153882612130565b81815260209384019390925082018360005b8381101561157b57815186016115cc8882611899565b84525060209283019291909101906001016115b6565b6000601f820183136115f357600080fd5b813561160161153882612130565b81815260209384019390925082018360005b8381101561157b57813586016116298882611750565b8452506020928301929190910190600101611613565b6000601f8201831361165057600080fd5b813561165e61153882612130565b9150818183526020840193506020810190508385602084028201111561168357600080fd5b60005b8381101561157b578161169988826116af565b8452506020928301929190910190600101611686565b600061141582356121a2565b6000601f820183136116cc57600080fd5b81356116da61153882612151565b915080825260208301602083018583830111156116f657600080fd5b6117018382846121be565b50505092915050565b6000601f8201831361171b57600080fd5b815161172961153882612151565b9150808252602083016020830185838301111561174557600080fd5b6117018382846121ca565b6000610180828403121561176357600080fd5b61176e610180612109565b9050600061177c8484611501565b825250602061178d84848301611501565b60208301525060406117a184828501611501565b60408301525060606117b584828501611501565b60608301525060806117c9848285016116af565b60808301525060a06117dd848285016116af565b60a08301525060c06117f1848285016116af565b60c08301525060e0611805848285016116af565b60e08301525061010061181a848285016116af565b61010083015250610120611830848285016116af565b6101208301525061014082013567ffffffffffffffff81111561185257600080fd5b61185e848285016116bb565b6101408301525061016082013567ffffffffffffffff81111561188057600080fd5b61188c848285016116bb565b6101608301525092915050565b600061018082840312156118ac57600080fd5b6118b7610180612109565b905060006118c5848461150d565b82525060206118d68484830161150d565b60208301525060406118ea8482850161150d565b60408301525060606118fe8482850161150d565b606083015250608061191284828501611a48565b60808301525060a061192684828501611a48565b60a08301525060c061193a84828501611a48565b60c08301525060e061194e84828501611a48565b60e08301525061010061196384828501611a48565b6101008301525061012061197984828501611a48565b6101208301525061014082015167ffffffffffffffff81111561199b57600080fd5b6119a78482850161170a565b6101408301525061016082015167ffffffffffffffff8111156119c957600080fd5b61188c8482850161170a565b6000606082840312156119e757600080fd5b6119f16060612109565b905060006119ff84846116af565b8252506020611a1084848301611501565b602083015250604082013567ffffffffffffffff811115611a3057600080fd5b611a3c848285016116bb565b60408301525092915050565b600061141582516121a2565b600060208284031215611a6657600080fd5b815167ffffffffffffffff811115611a7d57600080fd5b611a8984828501611585565b949350505050565b60008060408385031215611aa457600080fd5b6000611ab085856116af565b925050602083013567ffffffffffffffff811115611acd57600080fd5b611ad9858286016116bb565b9150509250929050565b600060208284031215611af557600080fd5b815167ffffffffffffffff811115611b0c57600080fd5b611a8984828501611899565b60008060408385031215611b2b57600080fd5b825167ffffffffffffffff811115611b4257600080fd5b611b4e85828601611899565b925050602083015167ffffffffffffffff811115611b6b57600080fd5b611ad985828601611899565b600080600080600060a08688031215611b8f57600080fd5b853567ffffffffffffffff811115611ba657600080fd5b611bb2888289016119d5565b955050602086013567ffffffffffffffff811115611bcf57600080fd5b611bdb888289016115e2565b945050604086013567ffffffffffffffff811115611bf857600080fd5b611c04888289016116bb565b935050606086013567ffffffffffffffff811115611c2157600080fd5b611c2d8882890161163f565b925050608086013567ffffffffffffffff811115611c4a57600080fd5b611c5688828901611519565b9150509295509295909350565b60008060008060808587031215611c7957600080fd5b843567ffffffffffffffff811115611c9057600080fd5b611c9c878288016119d5565b945050602085013567ffffffffffffffff811115611cb957600080fd5b611cc5878288016116bb565b935050604085013567ffffffffffffffff811115611ce257600080fd5b611cee8782880161163f565b925050606085013567ffffffffffffffff811115611d0b57600080fd5b611d1787828801611519565b91505092959194509250565b611d2c81612197565b82525050565b611d2c816121a2565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b601a81527f494e56414c49445f415050524f56414c5f5349474e4154555245000000000000602082015260400190565b601a81527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000602082015260400190565b601c81527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000602082015260400190565b601781527f494e56414c49445f465245455f4d454d4f52595f505452000000000000000000602082015260400190565b601081527f415050524f56414c5f4558504952454400000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b602081016104c28284611d23565b602081016104c28284611d32565b602080825281016104c281611d3b565b602080825281016104c281611d6b565b602080825281016104c281611d9b565b602080825281016104c281611dcb565b602080825281016104c281611dfb565b602080825281016104c281611e2b565b602080825281016104c281611e5b565b602080825281016104c281611eb1565b602080825281016104c281611ee1565b602080825281016104c281611f37565b602080825281016104c281611f67565b602080825281016104c281611f97565b602080825281016104c281611fc7565b60405181810167ffffffffffffffff8111828210171561212857600080fd5b604052919050565b600067ffffffffffffffff82111561214757600080fd5b5060209081020190565b600067ffffffffffffffff82111561216857600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60006104c2826121a5565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b838110156121e55781810151838201526020016121cd565b838111156121f4576000848401525b5050505056fe75696e7432353620617070726f76616c45787069726174696f6e54696d655365636f6e6473a265627a7a7230582071ae6d988dbd93e0872afc6c575d3aec20617670170c8d38c02dd9025485b1666c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x68 JUMPI PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV PUSH4 0xF7D8E39 DUP2 EQ PUSH2 0x6D JUMPI DUP1 PUSH4 0x55FC233C EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0xCDBC4500 EQ PUSH2 0xAB JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0xBE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x80 PUSH2 0x7B CALLDATASIZE PUSH1 0x4 PUSH2 0x1A91 JUMP JUMPDEST PUSH2 0xD3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8D SWAP2 SWAP1 PUSH2 0x201D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA9 PUSH2 0xA4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B77 JUMP JUMPDEST PUSH2 0x4C8 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xA9 PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C63 JUMP JUMPDEST PUSH2 0x732 JUMP JUMPDEST PUSH2 0xC6 PUSH2 0x761 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8D SWAP2 SWAP1 PUSH2 0x202B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x11A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20D9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x125 DUP4 PUSH2 0x767 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP1 POP PUSH1 0x3 PUSH1 0xFF DUP3 AND LT PUSH2 0x187 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20A9 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x198 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1A8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20C9 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1EE JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x32C JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x22F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2039 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x240 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP1 POP PUSH1 0x0 PUSH2 0x282 DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x82B AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x297 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x82B AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP7 POP PUSH2 0x4C2 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x33A JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x490 JUMPI DUP4 MLOAD PUSH1 0x41 EQ PUSH2 0x37B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2039 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x38C JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP1 POP PUSH1 0x0 PUSH2 0x3CE DUP7 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x82B AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3E3 DUP8 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x82B AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20A9 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4D3 DUP7 PUSH2 0x876 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE DUP5 MLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5BF JUMPI PUSH1 0x0 DUP7 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x503 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SWAP1 POP PUSH2 0x517 PUSH2 0x1422 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP11 SWAP1 MSTORE SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE TIMESTAMP DUP3 GT PUSH2 0x56B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2089 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x576 DUP3 PUSH2 0x889 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x59B DUP3 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x58C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xD3 JUMP JUMPDEST SWAP1 POP PUSH2 0x5AD DUP8 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x897 AND JUMP JUMPDEST SWAP7 POP POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 POP PUSH2 0x4EB SWAP2 POP POP JUMP JUMPDEST POP DUP7 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x726 JUMPI DUP9 MLOAD PUSH1 0x0 SWAP1 DUP11 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x5DE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x60D JUMPI PUSH2 0x71E JUMP JUMPDEST PUSH1 0x0 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x61D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ORIGIN EQ ISZERO PUSH2 0x663 JUMPI PUSH2 0x65B DUP6 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0x897 AND JUMP JUMPDEST SWAP5 POP POP PUSH2 0x71E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x675 DUP7 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x961 AND JUMP JUMPDEST SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x6B0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2049 JUMP JUMPDEST PUSH1 0x20 DUP13 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ORIGIN EQ DUP1 PUSH2 0x6E3 JUMPI POP PUSH2 0x6E3 DUP7 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0x961 AND JUMP JUMPDEST ISZERO ISZERO PUSH2 0x71B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20E9 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x5C5 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x741 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x9D9 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0x75A JUMPI PUSH2 0x75A DUP6 DUP3 DUP7 DUP7 DUP7 PUSH2 0x4C8 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x7A5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20B9 JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7D5 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x86D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2099 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C2 PUSH2 0x884 DUP4 PUSH2 0xE91 JUMP JUMPDEST PUSH2 0x104D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C2 PUSH2 0x884 DUP4 PUSH2 0x108D JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH1 0x60 SWAP2 DUP5 SWAP1 PUSH1 0x20 DUP1 DUP3 MUL DUP1 DUP5 ADD DUP3 ADD SWAP3 SWAP2 ADD DUP3 DUP6 LT ISZERO PUSH2 0x8E8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2079 JUMP JUMPDEST DUP3 DUP6 GT ISZERO PUSH2 0x902 JUMPI PUSH2 0x8FB DUP6 DUP6 DUP4 PUSH2 0x121F JUMP JUMPDEST DUP5 SWAP8 POP DUP8 SWAP4 POP JUMPDEST PUSH1 0x1 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP1 DUP5 ADD SWAP3 POP DUP3 SWAP5 POP DUP2 DUP9 MSTORE DUP5 PUSH1 0x40 MSTORE DUP7 DUP9 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x92F JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9CE JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x995 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x9C6 JUMPI PUSH1 0x1 SWAP3 POP POP POP PUSH2 0x4C2 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x968 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x9ED DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x12E3 AND JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xA80 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3E228BAE00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xACC JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x64A3BC1500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xB56 JUMPI PUSH2 0xAD9 PUSH2 0x1447 JUMP JUMPDEST DUP4 MLOAD PUSH2 0xAEF SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1350 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xB02 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1AE3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xB21 PUSH2 0x1447 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xB19 JUMPI SWAP1 POP POP SWAP3 POP DUP1 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB46 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE POP PUSH2 0xE8B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x297BB70B00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xBE7 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x50DDE19000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xC33 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xC7F JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xCCB JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xA3E2038000000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xD17 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0xD63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xDD1C7D1800000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xD98 JUMPI DUP3 MLOAD PUSH2 0xD7E SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1350 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xD91 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1A54 JUMP JUMPDEST SWAP2 POP PUSH2 0xE8B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x3C28D86100000000000000000000000000000000000000000000000000000000 EQ ISZERO PUSH2 0xE8B JUMPI PUSH2 0xDEA PUSH2 0x1447 JUMP JUMPDEST PUSH2 0xDF2 PUSH2 0x1447 JUMP JUMPDEST DUP5 MLOAD PUSH2 0xE08 SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1350 AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xE1B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1B18 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP5 POP SWAP1 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xE3E PUSH2 0x1447 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xE36 JUMPI SWAP1 POP POP SWAP4 POP DUP2 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE63 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE DUP4 MLOAD DUP2 SWAP1 DUP6 SWAP1 PUSH1 0x1 SWAP1 DUP2 LT PUSH2 0xE7E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE POP POP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD DUP1 DUP5 MSTORE DUP3 MLOAD SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 KECCAK256 SWAP3 DUP5 ADD MLOAD DUP1 MLOAD PUSH1 0x0 SWAP5 SWAP4 DUP6 SWAP4 SWAP1 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xFC5 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF88 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP11 MLOAD SWAP11 DUP3 ADD MLOAD SWAP9 DUP4 MSTORE SWAP1 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND SWAP2 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE POP POP POP POP PUSH1 0x60 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x436F6F7264696E61746F72417070726F76616C28000000000000000000000000 PUSH1 0x20 DUP3 ADD SWAP1 DUP2 MSTORE PUSH32 0x62797465733332207472616E73616374696F6E486173682C0000000000000000 PUSH1 0x34 DUP4 ADD MSTORE PUSH32 0x6279746573207472616E73616374696F6E5369676E61747572652C0000000000 PUSH1 0x4C DUP4 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 SWAP1 PUSH1 0x67 ADD PUSH1 0x25 PUSH2 0x21FB DUP3 CODECOPY PUSH1 0x25 ADD DUP1 PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 ADD SWAP1 POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x11AD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1170 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP11 MLOAD SWAP11 DUP6 ADD MLOAD SWAP9 DUP4 MSTORE SWAP1 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE SWAP2 DUP3 ADD SWAP8 SWAP1 SWAP8 MSTORE PUSH1 0x60 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1249 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x12DE JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x1256 JUMPI PUSH2 0x12DE JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x1290 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x1288 JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x126D JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x12DE JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x12D9 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x129F JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1325 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x20F9 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0x138C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2059 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0x13C7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x111 SWAP1 PUSH2 0x2069 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x13F4 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0x1415 PUSH2 0x1403 DUP3 PUSH2 0x141C JUMP JUMPDEST DUP5 PUSH2 0x140D DUP8 PUSH2 0x141C JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x121F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x180 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1415 DUP3 CALLDATALOAD PUSH2 0x2197 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1415 DUP3 MLOAD PUSH2 0x2197 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x152A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x153D PUSH2 0x1538 DUP3 PUSH2 0x2130 JUMP JUMPDEST PUSH2 0x2109 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x157B JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1565 DUP9 DUP3 PUSH2 0x16BB JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x154F JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1596 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x15A4 PUSH2 0x1538 DUP3 PUSH2 0x2130 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x157B JUMPI DUP2 MLOAD DUP7 ADD PUSH2 0x15CC DUP9 DUP3 PUSH2 0x1899 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x15B6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x15F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1601 PUSH2 0x1538 DUP3 PUSH2 0x2130 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x157B JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1629 DUP9 DUP3 PUSH2 0x1750 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1613 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x165E PUSH2 0x1538 DUP3 PUSH2 0x2130 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1683 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x157B JUMPI DUP2 PUSH2 0x1699 DUP9 DUP3 PUSH2 0x16AF JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1686 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1415 DUP3 CALLDATALOAD PUSH2 0x21A2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x16CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x16DA PUSH2 0x1538 DUP3 PUSH2 0x2151 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x16F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1701 DUP4 DUP3 DUP5 PUSH2 0x21BE JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x171B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1729 PUSH2 0x1538 DUP3 PUSH2 0x2151 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1701 DUP4 DUP3 DUP5 PUSH2 0x21CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1763 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x176E PUSH2 0x180 PUSH2 0x2109 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x177C DUP5 DUP5 PUSH2 0x1501 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x178D DUP5 DUP5 DUP4 ADD PUSH2 0x1501 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x17A1 DUP5 DUP3 DUP6 ADD PUSH2 0x1501 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x17B5 DUP5 DUP3 DUP6 ADD PUSH2 0x1501 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x17C9 DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x17DD DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x17F1 DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x1805 DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x181A DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1830 DUP5 DUP3 DUP6 ADD PUSH2 0x16AF JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1852 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x185E DUP5 DUP3 DUP6 ADD PUSH2 0x16BB JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1880 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x188C DUP5 DUP3 DUP6 ADD PUSH2 0x16BB JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x18AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x18B7 PUSH2 0x180 PUSH2 0x2109 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x18C5 DUP5 DUP5 PUSH2 0x150D JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x18D6 DUP5 DUP5 DUP4 ADD PUSH2 0x150D JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x18EA DUP5 DUP3 DUP6 ADD PUSH2 0x150D JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x18FE DUP5 DUP3 DUP6 ADD PUSH2 0x150D JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x1912 DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x1926 DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x193A DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x194E DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x1963 DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1979 DUP5 DUP3 DUP6 ADD PUSH2 0x1A48 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x199B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19A7 DUP5 DUP3 DUP6 ADD PUSH2 0x170A JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x188C DUP5 DUP3 DUP6 ADD PUSH2 0x170A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19F1 PUSH1 0x60 PUSH2 0x2109 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x19FF DUP5 DUP5 PUSH2 0x16AF JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1A10 DUP5 DUP5 DUP4 ADD PUSH2 0x1501 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A3C DUP5 DUP3 DUP6 ADD PUSH2 0x16BB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1415 DUP3 MLOAD PUSH2 0x21A2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1A66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A89 DUP5 DUP3 DUP6 ADD PUSH2 0x1585 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1AA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1AB0 DUP6 DUP6 PUSH2 0x16AF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1ACD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AD9 DUP6 DUP3 DUP7 ADD PUSH2 0x16BB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1AF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B0C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A89 DUP5 DUP3 DUP6 ADD PUSH2 0x1899 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1B2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B4E DUP6 DUP3 DUP7 ADD PUSH2 0x1899 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1B6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AD9 DUP6 DUP3 DUP7 ADD PUSH2 0x1899 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1B8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB2 DUP9 DUP3 DUP10 ADD PUSH2 0x19D5 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BCF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BDB DUP9 DUP3 DUP10 ADD PUSH2 0x15E2 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1BF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C04 DUP9 DUP3 DUP10 ADD PUSH2 0x16BB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C2D DUP9 DUP3 DUP10 ADD PUSH2 0x163F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C56 DUP9 DUP3 DUP10 ADD PUSH2 0x1519 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1C79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C90 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C9C DUP8 DUP3 DUP9 ADD PUSH2 0x19D5 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CC5 DUP8 DUP3 DUP9 ADD PUSH2 0x16BB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CEE DUP8 DUP3 DUP9 ADD PUSH2 0x163F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D17 DUP8 DUP3 DUP9 ADD PUSH2 0x1519 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x1D2C DUP2 PUSH2 0x2197 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1D2C DUP2 PUSH2 0x21A2 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x494E56414C49445F415050524F56414C5F5349474E4154555245000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x46524F4D5F4C4553535F5448414E5F544F5F5245515549524544000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1C DUP2 MSTORE PUSH32 0x544F5F4C4553535F5448414E5F4C454E4754485F524551554952454400000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F465245455F4D454D4F52595F505452000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x415050524F56414C5F4558504952454400000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x4C2 DUP3 DUP5 PUSH2 0x1D23 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x4C2 DUP3 DUP5 PUSH2 0x1D32 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1D3B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1D6B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1D9B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1DCB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1DFB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1E2B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1E5B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1EB1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1EE1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1F37 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1F67 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4C2 DUP2 PUSH2 0x1FC7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2128 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2168 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C2 DUP3 PUSH2 0x21A5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x21E5 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x21CD JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x21F4 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP INVALID PUSH22 0x696E7432353620617070726F76616C45787069726174 PUSH10 0x6F6E54696D655365636F PUSH15 0x6473A265627A7A7230582071AE6D98 DUP14 0xbd SWAP4 0xe0 DUP8 0x2a 0xfc PUSH13 0x575D3AEC20617670170C8D38C0 0x2d 0xd9 MUL SLOAD DUP6 0xb1 PUSH7 0x6C657870657269 PUSH14 0x656E74616CF50037000000000000 ", + "sourceMap": "776:91:14:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;776:91:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;988:2549:3;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3487:2936:1;;;;;;;;;:::i;:::-;;2021:861;;;;;;;;;:::i;1339:33:10:-;;;:::i;:::-;;;;;;;;988:2549:3;1097:21;1174:1;1155:9;:16;:20;1134:97;;;;;;;;;;;;;;;;;;;;;;;;1296:22;1327:23;:9;:21;:23::i;:::-;1321:30;;;;-1:-1:-1;1449:29:3;1424:55;;;;1403:123;;;;;;;;;;;;;;1537:27;1581:16;1567:31;;;;;;;;;;1537:61;-1:-1:-1;1948:21:3;1931:13;:38;;;;;;;;;1927:1260;;;1985:27;;;;;;;;;;;1927:1260;2085:20;2068:13;:37;;;;;;;;;2064:1123;;;2146:16;;2166:2;2146:22;2121:99;;;;;;;;;;;;;;2234:7;2250:9;2260:1;2250:12;;;;;;;;;;;;;;;;;;;;;2244:19;;-1:-1:-1;2277:9:3;2289:24;:9;2311:1;2289:24;:21;:24;:::i;:::-;2277:36;-1:-1:-1;2327:9:3;2339:25;:9;2361:2;2339:25;:21;:25;:::i;:::-;2327:37;;2394:102;2421:4;2443:1;2462;2481;2394:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2394:102:3;;;;;;-1:-1:-1;2510:20:3;;-1:-1:-1;;;;;;2510:20:3;2064:1123;2607:21;2590:13;:38;;;;;;;;;2586:601;;;2669:16;;2689:2;2669:22;2644:99;;;;;;;;;;;;;;2757:7;2773:9;2783:1;2773:12;;;;;;;;;;;;;;;;;;;;;2767:19;;-1:-1:-1;2800:9:3;2812:24;:9;2834:1;2812:24;:21;:24;:::i;:::-;2800:36;-1:-1:-1;2850:9:3;2862:25;:9;2884:2;2862:25;:21;:25;:::i;:::-;2850:37;;2917:225;3048:4;2954:116;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2954:116:3;;;2944:127;;;;;;3089:1;3108;3127;2917:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;2586:601:3;3499:31;;;;;;;;;;;988:2549;;;;;:::o;3487:2936:1:-;3861:23;3887:31;3906:11;3887:18;:31::i;:::-;4021:16;;;4035:1;4021:16;;;;;;;;;4075:25;;3861:57;;-1:-1:-1;4021:16:1;4075:25;4110:1114;4134:16;4130:1;:20;4110:1114;;;4210:44;4257:29;4287:1;4257:32;;;;;;;;;;;;;;;;;;4210:79;;4303:35;;:::i;:::-;-1:-1:-1;4341:230:1;;;;;;;;;;;;;;;;;;;;;;;4759:15;4720:54;;4633:191;;;;;;;;;;;;;;4903:20;4926:36;4953:8;4926:26;:36::i;:::-;4903:59;;4976:29;5008:53;5025:12;5039:18;5058:1;5039:21;;;;;;;;;;;;;;;;;;5008:16;:53::i;:::-;4976:85;-1:-1:-1;5160:53:1;:23;4976:85;5160:53;:30;:53;:::i;:::-;5134:79;-1:-1:-1;;4152:3:1;;;;;-1:-1:-1;4110:1114:1;;-1:-1:-1;;4110:1114:1;;-1:-1:-1;5265:13:1;;5242:20;5288:1129;5312:12;5308:1;:16;5288:1129;;;5423:9;;5458:1;;5423:6;;5430:1;;5423:9;;;;;;;;;;;;;;:23;;;:37;;;5419:84;;;5480:8;;5419:84;5609:23;5635:6;5642:1;5635:9;;;;;;;;;;;;;;;;;;;:29;;;;-1:-1:-1;5682:28:1;;;5701:9;5682:28;5678:160;;;5756:41;:23;5787:9;5756:41;:30;:41;:::i;:::-;5730:67;;5815:8;;;5678:160;5929:20;5952:49;:23;5985:15;5952:49;:32;:49;:::i;:::-;5929:72;;6040:15;6015:100;;;;;;;;;;;;;;;;6273:25;;;;:38;;6302:9;6273:38;;:85;;-1:-1:-1;6315:43:1;:23;6348:9;6315:43;:32;:43;:::i;:::-;6248:158;;;;;;;;;;;;;;;;5288:1129;;;5326:3;;5288:1129;;;;3487:2936;;;;;;;;;:::o;2021:861::-;2398:30;2431:38;2452:11;:16;;;2431:20;:38::i;:::-;2398:71;;2556:1;2540:6;:13;:17;2536:340;;;2641:224;2695:11;2724:6;2748:20;2786:29;2833:18;2641:36;:224::i;:::-;2021:861;;;;;:::o;1339:33:10:-;;;;:::o;8315:448:19:-;8399:13;8460:1;8449;:8;:12;8428:92;;;;;;;;;;;;;;;;8570:8;;8568:1;;8570:12;;;;8568:15;;;;;;;;;;8682:8;;8678:16;;8707:17;;;-1:-1:-1;8568:15:19;;;;;;;8315:448::o;13292:490::-;13413:14;13476:5;13484:2;13476:10;13464:1;:8;:22;;13443:107;;;;;;;;;;;;;;;;-1:-1:-1;13729:13:19;13631:2;13729:13;13723:20;;13292:490::o;1514:406:11:-;1627:23;1828:53;1846:34;1868:11;1846:21;:34::i;:::-;1828:17;:53::i;1761:259:9:-;1881:20;1932:52;1950:33;1974:8;1950:23;:33::i;1089:2103:18:-;1438:19;;1587:4;1581:11;1209:16;;1438:12;;1510:2;:23;;;1676:45;;;;;;1438:19;1504:30;2076:32;;;;2055:102;;;;;;;;;;;;;;2411:18;2398:10;:31;2394:273;;;2445:78;2462:10;2474:20;2496:26;2445:16;:78::i;:::-;2580:10;2564:26;;2631:12;2607:36;;2546:111;2735:1;2713:23;;;;2776:2;2746:32;;;;2832:26;2809:20;:49;2788:70;;2881:18;2868:31;;2991:18;2977:12;2970:40;3072:10;3066:4;3059:24;3141:15;3102:12;3136:1;3115:18;:22;3102:36;;;;;;;;;;:54;;;;:36;;;;;;;;;;:54;-1:-1:-1;3173:12:18;;-1:-1:-1;;;;;1089:2103:18;;;;:::o;3431:342::-;3580:19;;3543:4;;;3609:136;3633:6;3629:1;:10;3609:136;;;3683:6;3664:25;;:12;3677:1;3664:15;;;;;;;;;;;;;;;;;;:25;;;3660:75;;;3716:4;3709:11;;;;;;3660:75;3641:3;;3609:136;;;-1:-1:-1;3761:5:18;;3431:342;-1:-1:-1;;;;3431:342:18:o;6635:1760:1:-;6731:30;6777:15;6795:18;:4;6777:15;6795:18;:15;:18;:::i;:::-;6777:36;-1:-1:-1;6840:31:1;;;6852:19;6840:31;;:87;;-1:-1:-1;6887:40:1;;;6899:28;6887:40;6840:87;:142;;;-1:-1:-1;6943:39:1;;;6955:27;6943:39;6840:142;6823:1543;;;7043:27;;:::i;:::-;7116:11;;7102:26;;7116:4;;7113:1;;7102:26;:10;:26;:::i;:::-;7074:102;;;;;;;;;;;;;;7199:23;;;7220:1;7199:23;;;;;;;;;7042:134;;-1:-1:-1;7199:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;7190:32;;7248:5;7236:6;7243:1;7236:9;;;;;;;;;;;;;;;;;;:17;-1:-1:-1;6823:1543:1;;;7287:38;;;7299:26;7287:38;;:101;;-1:-1:-1;7341:47:1;;;7353:35;7341:47;7287:101;:163;;;-1:-1:-1;7404:46:1;;;7416:34;7404:46;7287:163;:217;;;-1:-1:-1;7466:38:1;;;7478:26;7466:38;7287:217;:280;;;-1:-1:-1;7520:47:1;;;7532:35;7520:47;7287:280;:335;;;-1:-1:-1;7583:39:1;;;7595:27;7583:39;7287:335;:399;;;-1:-1:-1;7638:48:1;;;7650:36;7638:48;7287:399;7270:1096;;;7835:11;;7821:26;;7835:4;;7832:1;;7821:26;:10;:26;:::i;:::-;7793:104;;;;;;;;;;;;;;7782:115;;7270:1096;;;7918:33;;;7930:21;7918:33;7914:452;;;8012:31;;:::i;:::-;8045:32;;:::i;:::-;8123:11;;8109:26;;8123:4;;8120:1;;8109:26;:10;:26;:::i;:::-;8081:118;;;;;;;;;;;;;;8261:23;;;8282:1;8261:23;;;;;;;;;8011:188;;-1:-1:-1;8011:188:1;;-1:-1:-1;8261:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8252:32;;8310:9;8298:6;8305:1;8298:9;;;;;;;;;;;;;;;;;;:21;8333:9;;8345:10;;8333:6;;8340:1;;8333:9;;;;;;;;;;;;;;:22;-1:-1:-1;;7914:452:1;-1:-1:-1;6635:1760:1;;;:::o;2167:1395:11:-;823:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;823:146:11;;;;;;;813:157;;;;;;;;;2410:16;;;;2400:27;;2283:14;;813:157;2283:14;;823:146;;;;2400:27;;;;823:146;2400:27;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2400:27:11;;;;;;;;;;;;2525:16;;2575:25;;;;2999:26;;;3125:15;;;3118:29;;;;3270:42;3251:62;;;3234:15;;;3227:87;;;;-1:-1:-1;;;;3364:2:11;3352:15;;3345:33;;;;-1:-1:-1;3519:3:11;3501:22;;;2167:1395::o;1872:924:10:-;1966:14;2023:18;2335:2;2329:9;2367:66;2352:82;;2484:1;2472:14;;2465:40;;;;2602:2;2590:15;;2583:35;;;;2754:2;2736:21;;;1872:924::o;2360:1389:9:-;834:191;;;;;;;;;;;;;;;;;;;2477:14;;;;834:191;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;834:191:9;;;824:202;;;;;;2507:60;;2577:32;2622:8;:29;;;2612:40;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2612:40:9;;;;;;;;;;;;2761:24;;2835:38;;;;3280:26;;;3373:15;;;3366:40;;;;3460:15;;;3453:49;;;;3568:2;3556:15;;3549:54;;;;-1:-1:-1;;3706:3:9;3688:22;;;;2360:1389;-1:-1:-1;;;2360:1389:9:o;1808:4337:19:-;1958:2;1949:6;:11;1945:4194;;;2247:1;2237:6;2233:2;2229:15;2224:3;2220:25;2216:33;2298:4;2294:9;2285:6;2279:13;2275:29;2347:4;2340;2334:11;2330:22;2388:1;2385;2382:8;2376:4;2369:22;2186:219;;;;;;2509:4;2499:6;:14;2495:59;;;2533:7;;2495:59;3243:4;3234:6;:13;3230:2899;;;3569:2;3561:6;3557:15;3547:25;;3617:6;3609;3605:19;3667:6;3661:4;3657:17;3974:4;3968:11;4242:198;4260:4;4252:6;4249:16;4242:198;;;4308:13;;4295:27;;4369:2;4405:13;;;;4357:15;;;;4242:198;;;4529:18;;-1:-1:-1;3276:1289:19;;;4810:2;4802:6;4798:15;4788:25;;4858:6;4850;4846:19;4908:6;4902:4;4898:17;5218:6;5212:13;5797:191;5814:4;5808;5804:15;5797:191;;;5862:11;;5849:25;;5907:13;;;;;5953;;;;5797:191;;;6078:19;;-1:-1:-1;;4612:1503:19;1808:4337;;;:::o;15595:687::-;15715:13;15777:5;15785:1;15777:9;15765:1;:8;:21;;15744:105;;;;;;;;;;;;;;;;-1:-1:-1;16023:13:19;15926:2;16023:13;16017:20;16176:66;16164:79;;15595:687::o;6453:617::-;6587:19;6643:10;;;;6622:83;;;;;;;;;;;;;;6742:8;;6736:14;;;6715:89;;;;;;;;;;;;;;6905:4;6900:2;:9;6890:20;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;6890:20:19;87:34:-1;135:17;;-1:-1;6890:20:19;;6881:29;;6920:120;6941:23;:6;:21;:23::i;:::-;6999:4;6978:18;:1;:16;:18::i;:::-;:25;7017:6;:13;6920:7;:120::i;:::-;6453:617;;;;;:::o;1341:228::-;1520:2;1509:14;;1341:228::o;776:91:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:122;;208:39;239:6;233:13;208:39;;275:693;;390:4;378:17;;374:27;-1:-1;364:2;;415:1;412;405:12;364:2;452:6;439:20;474:85;489:69;551:6;489:69;;;474:85;;;587:21;;;631:4;619:17;;;;465:94;;-1:-1;644:14;;619:17;739:1;724:238;749:6;746:1;743:13;724:238;;;832:3;819:17;811:6;807:30;856:42;894:3;882:10;856:42;;;844:55;;-1:-1;922:4;913:14;;;;941;;;;;771:1;764:9;724:238;;;728:14;357:611;;;;;;;;1008:735;;1144:4;1132:17;;1128:27;-1:-1;1118:2;;1169:1;1166;1159:12;1118:2;1199:6;1193:13;1221:95;1236:79;1308:6;1236:79;;1221:95;1344:21;;;1388:4;1376:17;;;;1212:104;;-1:-1;1401:14;;1376:17;1496:1;1481:256;1506:6;1503:1;1500:13;1481:256;;;1582:3;1576:10;1568:6;1564:23;1606:67;1669:3;1657:10;1606:67;;;1594:80;;-1:-1;1697:4;1688:14;;;;1716;;;;;1528:1;1521:9;1481:256;;1783:735;;1912:4;1900:17;;1896:27;-1:-1;1886:2;;1937:1;1934;1927:12;1886:2;1974:6;1961:20;1996:99;2011:83;2087:6;2011:83;;1996:99;2123:21;;;2167:4;2155:17;;;;1987:108;;-1:-1;2180:14;;2155:17;2275:1;2260:252;2285:6;2282:1;2279:13;2260:252;;;2368:3;2355:17;2347:6;2343:30;2392:56;2444:3;2432:10;2392:56;;;2380:69;;-1:-1;2472:4;2463:14;;;;2491;;;;;2307:1;2300:9;2260:252;;2544:707;;2654:4;2642:17;;2638:27;-1:-1;2628:2;;2679:1;2676;2669:12;2628:2;2716:6;2703:20;2738:80;2753:64;2810:6;2753:64;;2738:80;2729:89;;2835:5;2860:6;2853:5;2846:21;2890:4;2882:6;2878:17;2868:27;;2912:4;2907:3;2903:14;2896:21;;2965:6;3012:3;3004:4;2996:6;2992:17;2987:3;2983:27;2980:36;2977:2;;;3029:1;3026;3019:12;2977:2;3054:1;3039:206;3064:6;3061:1;3058:13;3039:206;;;3122:3;3144:37;3177:3;3165:10;3144:37;;;3132:50;;-1:-1;3205:4;3196:14;;;;3224;;;;;3086:1;3079:9;3039:206;;3259:118;;3326:46;3364:6;3351:20;3326:46;;3385:432;;3475:4;3463:17;;3459:27;-1:-1;3449:2;;3500:1;3497;3490:12;3449:2;3537:6;3524:20;3559:60;3574:44;3611:6;3574:44;;3559:60;3550:69;;3639:6;3632:5;3625:21;3675:4;3667:6;3663:17;3708:4;3701:5;3697:16;3743:3;3734:6;3729:3;3725:16;3722:25;3719:2;;;3760:1;3757;3750:12;3719:2;3770:41;3804:6;3799:3;3794;3770:41;;;3442:375;;;;;;;;3826:434;;3927:4;3915:17;;3911:27;-1:-1;3901:2;;3952:1;3949;3942:12;3901:2;3982:6;3976:13;4004:60;4019:44;4056:6;4019:44;;4004:60;3995:69;;4084:6;4077:5;4070:21;4120:4;4112:6;4108:17;4153:4;4146:5;4142:16;4188:3;4179:6;4174:3;4170:16;4167:25;4164:2;;;4205:1;4202;4195:12;4164:2;4215:39;4247:6;4242:3;4237;4215:39;;4745:2205;;4853:5;4841:9;4836:3;4832:19;4828:31;4825:2;;;4872:1;4869;4862:12;4825:2;4890:21;4905:5;4890:21;;;4881:30;-1:-1;4969:1;5000:49;5045:3;5025:9;5000:49;;;4976:74;;-1:-1;5119:2;5152:49;5197:3;5173:22;;;5152:49;;;5145:4;5138:5;5134:16;5127:75;5071:142;5278:2;5311:49;5356:3;5347:6;5336:9;5332:22;5311:49;;;5304:4;5297:5;5293:16;5286:75;5223:149;5431:2;5464:49;5509:3;5500:6;5489:9;5485:22;5464:49;;;5457:4;5450:5;5446:16;5439:75;5382:143;5587:3;5621:49;5666:3;5657:6;5646:9;5642:22;5621:49;;;5614:4;5607:5;5603:16;5596:75;5535:147;5744:3;5778:49;5823:3;5814:6;5803:9;5799:22;5778:49;;;5771:4;5764:5;5760:16;5753:75;5692:147;5893:3;5927:49;5972:3;5963:6;5952:9;5948:22;5927:49;;;5920:4;5913:5;5909:16;5902:75;5849:139;6042:3;6076:49;6121:3;6112:6;6101:9;6097:22;6076:49;;;6069:4;6062:5;6058:16;6051:75;5998:139;6204:3;6239:49;6284:3;6275:6;6264:9;6260:22;6239:49;;;6231:5;6224;6220:17;6213:76;6147:153;6350:3;6385:49;6430:3;6421:6;6410:9;6406:22;6385:49;;;6377:5;6370;6366:17;6359:76;6310:136;6534:3;6523:9;6519:19;6506:33;6559:18;6551:6;6548:30;6545:2;;;6591:1;6588;6581:12;6545:2;6627:54;6677:3;6668:6;6657:9;6653:22;6627:54;;;6619:5;6612;6608:17;6601:81;6456:237;6781:3;6770:9;6766:19;6753:33;6806:18;6798:6;6795:30;6792:2;;;6838:1;6835;6828:12;6792:2;6874:54;6924:3;6915:6;6904:9;6900:22;6874:54;;;6866:5;6859;6855:17;6848:81;6703:237;4819:2131;;;;;6985:2334;;7104:5;7092:9;7087:3;7083:19;7079:31;7076:2;;;7123:1;7120;7113:12;7076:2;7141:21;7156:5;7141:21;;;7132:30;-1:-1;7220:1;7251:60;7307:3;7287:9;7251:60;;;7227:85;;-1:-1;7381:2;7414:60;7470:3;7446:22;;;7414:60;;;7407:4;7400:5;7396:16;7389:86;7333:153;7551:2;7584:60;7640:3;7631:6;7620:9;7616:22;7584:60;;;7577:4;7570:5;7566:16;7559:86;7496:160;7715:2;7748:60;7804:3;7795:6;7784:9;7780:22;7748:60;;;7741:4;7734:5;7730:16;7723:86;7666:154;7882:3;7916:60;7972:3;7963:6;7952:9;7948:22;7916:60;;;7909:4;7902:5;7898:16;7891:86;7830:158;8050:3;8084:60;8140:3;8131:6;8120:9;8116:22;8084:60;;;8077:4;8070:5;8066:16;8059:86;7998:158;8210:3;8244:60;8300:3;8291:6;8280:9;8276:22;8244:60;;;8237:4;8230:5;8226:16;8219:86;8166:150;8370:3;8404:60;8460:3;8451:6;8440:9;8436:22;8404:60;;;8397:4;8390:5;8386:16;8379:86;8326:150;8543:3;8578:60;8634:3;8625:6;8614:9;8610:22;8578:60;;;8570:5;8563;8559:17;8552:87;8486:164;8700:3;8735:60;8791:3;8782:6;8771:9;8767:22;8735:60;;;8727:5;8720;8716:17;8709:87;8660:147;8888:3;8877:9;8873:19;8867:26;8913:18;8905:6;8902:30;8899:2;;;8945:1;8942;8935:12;8899:2;8981:65;9042:3;9033:6;9022:9;9018:22;8981:65;;;8973:5;8966;8962:17;8955:92;8817:241;9139:3;9128:9;9124:19;9118:26;9164:18;9156:6;9153:30;9150:2;;;9196:1;9193;9186:12;9150:2;9232:65;9293:3;9284:6;9273:9;9269:22;9232:65;;9378:719;;9501:4;9489:9;9484:3;9480:19;9476:30;9473:2;;;9519:1;9516;9509:12;9473:2;9537:20;9552:4;9537:20;;;9528:29;-1:-1;9607:1;9638:49;9683:3;9663:9;9638:49;;;9614:74;;-1:-1;9758:2;9791:49;9836:3;9812:22;;;9791:49;;;9784:4;9777:5;9773:16;9766:75;9709:143;9930:2;9919:9;9915:18;9902:32;9954:18;9946:6;9943:30;9940:2;;;9986:1;9983;9976:12;9940:2;10021:54;10071:3;10062:6;10051:9;10047:22;10021:54;;;10014:4;10007:5;10003:16;9996:80;9862:225;9467:630;;;;;10229:122;;10307:39;10338:6;10332:13;10307:39;;10358:422;;10513:2;10501:9;10492:7;10488:23;10484:32;10481:2;;;10529:1;10526;10519:12;10481:2;10564:24;;10608:18;10597:30;;10594:2;;;10640:1;10637;10630:12;10594:2;10660:104;10756:7;10747:6;10736:9;10732:22;10660:104;;;10650:114;10475:305;-1:-1;;;;10475:305;10787:470;;;10917:2;10905:9;10896:7;10892:23;10888:32;10885:2;;;10933:1;10930;10923:12;10885:2;10968:1;10985:53;11030:7;11010:9;10985:53;;;10975:63;;10947:97;11103:2;11092:9;11088:18;11075:32;11127:18;11119:6;11116:30;11113:2;;;11159:1;11156;11149:12;11113:2;11179:62;11233:7;11224:6;11213:9;11209:22;11179:62;;;11169:72;;11054:193;10879:378;;;;;;11264:380;;11398:2;11386:9;11377:7;11373:23;11369:32;11366:2;;;11414:1;11411;11404:12;11366:2;11449:24;;11493:18;11482:30;;11479:2;;;11525:1;11522;11515:12;11479:2;11545:83;11620:7;11611:6;11600:9;11596:22;11545:83;;11651:633;;;11821:2;11809:9;11800:7;11796:23;11792:32;11789:2;;;11837:1;11834;11827:12;11789:2;11872:24;;11916:18;11905:30;;11902:2;;;11948:1;11945;11938:12;11902:2;11968:83;12043:7;12034:6;12023:9;12019:22;11968:83;;;11958:93;;11851:206;12109:2;12098:9;12094:18;12088:25;12133:18;12125:6;12122:30;12119:2;;;12165:1;12162;12155:12;12119:2;12185:83;12260:7;12251:6;12240:9;12236:22;12185:83;;12291:1457;;;;;;12605:3;12593:9;12584:7;12580:23;12576:33;12573:2;;;12622:1;12619;12612:12;12573:2;12657:31;;12708:18;12697:30;;12694:2;;;12740:1;12737;12730:12;12694:2;12760:87;12839:7;12830:6;12819:9;12815:22;12760:87;;;12750:97;;12636:217;12912:2;12901:9;12897:18;12884:32;12936:18;12928:6;12925:30;12922:2;;;12968:1;12965;12958:12;12922:2;12988:97;13077:7;13068:6;13057:9;13053:22;12988:97;;;12978:107;;12863:228;13150:2;13139:9;13135:18;13122:32;13174:18;13166:6;13163:30;13160:2;;;13206:1;13203;13196:12;13160:2;13226:62;13280:7;13271:6;13260:9;13256:22;13226:62;;;13216:72;;13101:193;13353:2;13342:9;13338:18;13325:32;13377:18;13369:6;13366:30;13363:2;;;13409:1;13406;13399:12;13363:2;13429:78;13499:7;13490:6;13479:9;13475:22;13429:78;;;13419:88;;13304:209;13572:3;13561:9;13557:19;13544:33;13597:18;13589:6;13586:30;13583:2;;;13629:1;13626;13619:12;13583:2;13649:83;13724:7;13715:6;13704:9;13700:22;13649:83;;;13639:93;;13523:215;12567:1181;;;;;;;;;13755:1157;;;;;14008:3;13996:9;13987:7;13983:23;13979:33;13976:2;;;14025:1;14022;14015:12;13976:2;14060:31;;14111:18;14100:30;;14097:2;;;14143:1;14140;14133:12;14097:2;14163:87;14242:7;14233:6;14222:9;14218:22;14163:87;;;14153:97;;14039:217;14315:2;14304:9;14300:18;14287:32;14339:18;14331:6;14328:30;14325:2;;;14371:1;14368;14361:12;14325:2;14391:62;14445:7;14436:6;14425:9;14421:22;14391:62;;;14381:72;;14266:193;14518:2;14507:9;14503:18;14490:32;14542:18;14534:6;14531:30;14528:2;;;14574:1;14571;14564:12;14528:2;14594:78;14664:7;14655:6;14644:9;14640:22;14594:78;;;14584:88;;14469:209;14737:2;14726:9;14722:18;14709:32;14761:18;14753:6;14750:30;14747:2;;;14793:1;14790;14783:12;14747:2;14813:83;14888:7;14879:6;14868:9;14864:22;14813:83;;;14803:93;;14688:214;13970:942;;;;;;;;14919:120;15002:31;15027:5;15002:31;;;14997:3;14990:44;14984:55;;;15046:120;15129:31;15154:5;15129:31;;15174:306;15339:2;15327:15;;15376:66;15371:2;15362:12;;15355:88;15471:2;15462:12;;15320:160;15489:306;15654:2;15642:15;;15691:66;15686:2;15677:12;;15670:88;15786:2;15777:12;;15635:160;15804:306;15969:2;15957:15;;16006:66;16001:2;15992:12;;15985:88;16101:2;16092:12;;15950:160;16119:306;16284:2;16272:15;;16321:66;16316:2;16307:12;;16300:88;16416:2;16407:12;;16265:160;16434:306;16599:2;16587:15;;16636:66;16631:2;16622:12;;16615:88;16731:2;16722:12;;16580:160;16749:306;16914:2;16902:15;;16951:66;16946:2;16937:12;;16930:88;17046:2;17037:12;;16895:160;17064:407;17229:2;17217:15;;17266:66;17261:2;17252:12;;17245:88;17367:66;17362:2;17353:12;;17346:88;17462:2;17453:12;;17210:261;17480:306;17645:2;17633:15;;17682:66;17677:2;17668:12;;17661:88;17777:2;17768:12;;17626:160;17795:407;17960:2;17948:15;;17997:66;17992:2;17983:12;;17976:88;18098:66;18093:2;18084:12;;18077:88;18193:2;18184:12;;17941:261;18211:306;18376:2;18364:15;;18413:66;18408:2;18399:12;;18392:88;18508:2;18499:12;;18357:160;18526:306;18691:2;18679:15;;18728:66;18723:2;18714:12;;18707:88;18823:2;18814:12;;18672:160;18841:306;19006:2;18994:15;;19043:66;19038:2;19029:12;;19022:88;19138:2;19129:12;;18987:160;19156:407;19321:2;19309:15;;19358:66;19353:2;19344:12;;19337:88;19459:66;19454:2;19445:12;;19438:88;19554:2;19545:12;;19302:261;19571:213;19689:2;19674:18;;19703:71;19678:9;19747:6;19703:71;;19791:213;19909:2;19894:18;;19923:71;19898:9;19967:6;19923:71;;20011:407;20202:2;20216:47;;;20187:18;;20277:131;20187:18;20277:131;;20425:407;20616:2;20630:47;;;20601:18;;20691:131;20601:18;20691:131;;20839:407;21030:2;21044:47;;;21015:18;;21105:131;21015:18;21105:131;;21253:407;21444:2;21458:47;;;21429:18;;21519:131;21429:18;21519:131;;21667:407;21858:2;21872:47;;;21843:18;;21933:131;21843:18;21933:131;;22081:407;22272:2;22286:47;;;22257:18;;22347:131;22257:18;22347:131;;22495:407;22686:2;22700:47;;;22671:18;;22761:131;22671:18;22761:131;;22909:407;23100:2;23114:47;;;23085:18;;23175:131;23085:18;23175:131;;23323:407;23514:2;23528:47;;;23499:18;;23589:131;23499:18;23589:131;;23737:407;23928:2;23942:47;;;23913:18;;24003:131;23913:18;24003:131;;24151:407;24342:2;24356:47;;;24327:18;;24417:131;24327:18;24417:131;;24565:407;24756:2;24770:47;;;24741:18;;24831:131;24741:18;24831:131;;24979:407;25170:2;25184:47;;;25155:18;;25245:131;25155:18;25245:131;;25393:256;25455:2;25449:9;25481:17;;;25556:18;25541:34;;25577:22;;;25538:62;25535:2;;;25613:1;25610;25603:12;25535:2;25629;25622:22;25433:216;;-1:-1;25433:216;25656:263;;25820:18;25812:6;25809:30;25806:2;;;25852:1;25849;25842:12;25806:2;-1:-1;25881:4;25869:17;;;25899:15;;25743:176;26755:254;;26894:18;26886:6;26883:30;26880:2;;;26926:1;26923;26916:12;26880:2;-1:-1;26999:4;26970;26947:17;;;;26966:9;26943:33;26989:15;;26817:192;27281:105;;27350:31;27375:5;27350:31;;27393:79;27462:5;27445:27;27479:128;27559:42;27548:54;;27531:76;27899:145;27980:6;27975:3;27970;27957:30;-1:-1;28036:1;28018:16;;28011:27;27950:94;28053:268;28118:1;28125:101;28139:6;28136:1;28133:13;28125:101;;;28206:11;;;28200:18;28187:11;;;28180:39;28161:2;28154:10;28125:101;;;28241:6;28238:1;28235:13;28232:2;;;28306:1;28297:6;28292:3;28288:16;28281:27;28232:2;28102:219;;;;" + } + } + }, + "sources": { + "test/TestMixins.sol": { + "id": 14 + }, + "src/MixinSignatureValidator.sol": { + "id": 3 + }, + "@0x/contracts-utils/contracts/src/LibBytes.sol": { + "id": 19 + }, + "src/mixins/MSignatureValidator.sol": { + "id": 13 + }, + "src/interfaces/ISignatureValidator.sol": { + "id": 6 + }, + "src/MixinCoordinatorApprovalVerifier.sol": { + "id": 1 + }, + "@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol": { + "id": 16 + }, + "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": { + "id": 17 + }, + "@0x/contracts-exchange-libs/contracts/src/LibEIP712.sol": { + "id": 15 + }, + "@0x/contracts-utils/contracts/src/LibAddressArray.sol": { + "id": 18 + }, + "src/libs/LibCoordinatorApproval.sol": { + "id": 9 + }, + "src/libs/LibEIP712Domain.sol": { + "id": 10 + }, + "src/libs/LibZeroExTransaction.sol": { + "id": 11 + }, + "src/mixins/MCoordinatorApprovalVerifier.sol": { + "id": 12 + }, + "src/interfaces/ICoordinatorApprovalVerifier.sol": { + "id": 4 + } + }, + "sourceCodes": { + "test/TestMixins.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"../src/MixinSignatureValidator.sol\";\nimport \"../src/MixinCoordinatorApprovalVerifier.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract TestMixins is\n MixinSignatureValidator,\n MixinCoordinatorApprovalVerifier\n{}\n", + "src/MixinSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\n\n\ncontract MixinSignatureValidator is\n MSignatureValidator\n{\n using LibBytes for bytes;\n\n /// @dev Recovers the address of a signer given a hash and signature.\n /// @param hash Any 32 byte hash.\n /// @param signature Proof that the hash has been signed by signer.\n function getSignerAddress(bytes32 hash, bytes memory signature)\n public\n pure\n returns (address signerAddress)\n {\n require(\n signature.length > 0,\n \"LENGTH_GREATER_THAN_0_REQUIRED\"\n );\n\n // Pop last byte off of signature byte array.\n uint8 signatureTypeRaw = uint8(signature.popLastByte());\n\n // Ensure signature is supported\n require(\n signatureTypeRaw < uint8(SignatureType.NSignatureTypes),\n \"SIGNATURE_UNSUPPORTED\"\n );\n\n SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(\"SIGNATURE_ILLEGAL\");\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n uint8 v = uint8(signature[0]);\n bytes32 r = signature.readBytes32(1);\n bytes32 s = signature.readBytes32(33);\n signerAddress = ecrecover(\n hash,\n v,\n r,\n s\n );\n return signerAddress;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n uint8 v = uint8(signature[0]);\n bytes32 r = signature.readBytes32(1);\n bytes32 s = signature.readBytes32(33);\n signerAddress = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n32\",\n hash\n )),\n v,\n r,\n s\n );\n return signerAddress;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(\"SIGNATURE_UNSUPPORTED\");\n }\n}\n", + "@0x/contracts-utils/contracts/src/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to <= b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length\n );\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to <= b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n result = uint256(readBytes32(b, index));\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 32 byte length field\n index += 32;\n\n // Read the bytes4 from array memory\n assembly {\n result := mload(add(b, index))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy into \n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of \n input.length + 32 // +32 bytes to store length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n", + "src/mixins/MSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n EIP712, // 0x01\n EthSign, // 0x02\n NSignatureTypes // 0x03, number of signature types. Always leave at end.\n }\n}\n", + "src/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract ISignatureValidator {\n\n /// @dev Recovers the address of a signer given a hash and signature.\n /// @param hash Any 32 byte hash.\n /// @param signature Proof that the hash has been signed by signer.\n function getSignerAddress(bytes32 hash, bytes memory signature)\n public\n pure\n returns (address signerAddress);\n}\n", + "src/MixinCoordinatorApprovalVerifier.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibAddressArray.sol\";\nimport \"./libs/LibCoordinatorApproval.sol\";\nimport \"./libs/LibZeroExTransaction.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MCoordinatorApprovalVerifier.sol\";\n\n\n// solhint-disable avoid-tx-origin\ncontract MixinCoordinatorApprovalVerifier is\n LibExchangeSelectors,\n LibCoordinatorApproval,\n LibZeroExTransaction,\n MSignatureValidator,\n MCoordinatorApprovalVerifier\n{\n using LibBytes for bytes;\n using LibAddressArray for address[];\n\n /// @dev Validates that the 0x transaction has been approved by all of the feeRecipients\n /// that correspond to each order in the transaction's Exchange calldata.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order in the transaction's Exchange calldata.\n function assertValidCoordinatorApprovals(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n view\n {\n // Get the orders from the the Exchange calldata in the 0x transaction\n LibOrder.Order[] memory orders = decodeFillDataOrders(transaction.data);\n\n // No approval is required for non-fill methods\n if (orders.length > 0) {\n // Revert if approval is invalid for transaction orders\n assertValidTransactionOrdersApproval(\n transaction,\n orders,\n transactionSignature,\n approvalExpirationTimeSeconds,\n approvalSignatures\n );\n }\n }\n\n /// @dev Validates that the feeRecipients of a batch of order have approved a 0x transaction.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param orders Array of order structs containing order specifications.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order.\n function assertValidTransactionOrdersApproval(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n LibOrder.Order[] memory orders,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n view\n {\n // Hash 0x transaction\n bytes32 transactionHash = getTransactionHash(transaction);\n\n // Create empty list of approval signers\n address[] memory approvalSignerAddresses = new address[](0);\n\n uint256 signaturesLength = approvalSignatures.length;\n for (uint256 i = 0; i < signaturesLength; i++) {\n // Create approval message\n uint256 currentApprovalExpirationTimeSeconds = approvalExpirationTimeSeconds[i];\n CoordinatorApproval memory approval = CoordinatorApproval({\n transactionHash: transactionHash,\n transactionSignature: transactionSignature,\n approvalExpirationTimeSeconds: currentApprovalExpirationTimeSeconds\n });\n\n // Ensure approval has not expired\n require(\n // solhint-disable-next-line not-rely-on-time\n currentApprovalExpirationTimeSeconds > block.timestamp,\n \"APPROVAL_EXPIRED\"\n );\n\n // Hash approval message and recover signer address\n bytes32 approvalHash = getCoordinatorApprovalHash(approval);\n address approvalSignerAddress = getSignerAddress(approvalHash, approvalSignatures[i]);\n \n // Add approval signer to list of signers\n approvalSignerAddresses = approvalSignerAddresses.append(approvalSignerAddress);\n }\n \n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i < ordersLength; i++) {\n // Do not check approval if the order's senderAddress is null\n if (orders[i].senderAddress == address(0)) {\n continue;\n }\n \n // Ethereum transaction signer gives implicit signature of approval\n address approverAddress = orders[i].feeRecipientAddress;\n if (approverAddress == tx.origin) {\n approvalSignerAddresses = approvalSignerAddresses.append(tx.origin);\n continue;\n }\n\n // Ensure feeRecipient of order has approved this 0x transaction\n bool isOrderApproved = approvalSignerAddresses.contains(approverAddress);\n require(\n isOrderApproved,\n \"INVALID_APPROVAL_SIGNATURE\"\n );\n\n // The Ethereum transaction signer must be the 0x transaction signer or an approver of the 0x transaction\n require(\n transaction.signerAddress == tx.origin || approvalSignerAddresses.contains(tx.origin),\n \"INVALID_SENDER\"\n );\n }\n }\n\n /// @dev Decodes the orders from Exchange calldata representing any fill method.\n /// @param data Exchange calldata representing a fill method.\n /// @return The orders from the Exchange calldata.\n function decodeFillDataOrders(bytes memory data)\n internal\n pure\n returns (LibOrder.Order[] memory orders)\n {\n bytes4 selector = data.readBytes4(0);\n if (\n selector == FILL_ORDER_SELECTOR ||\n selector == FILL_ORDER_NO_THROW_SELECTOR ||\n selector == FILL_OR_KILL_ORDER_SELECTOR\n ) {\n // Decode single order\n (LibOrder.Order memory order) = abi.decode(\n data.slice(4, data.length),\n (LibOrder.Order)\n );\n orders = new LibOrder.Order[](1);\n orders[0] = order;\n } else if (\n selector == BATCH_FILL_ORDERS_SELECTOR ||\n selector == BATCH_FILL_ORDERS_NO_THROW_SELECTOR ||\n selector == BATCH_FILL_OR_KILL_ORDERS_SELECTOR ||\n selector == MARKET_BUY_ORDERS_SELECTOR ||\n selector == MARKET_BUY_ORDERS_NO_THROW_SELECTOR ||\n selector == MARKET_SELL_ORDERS_SELECTOR ||\n selector == MARKET_SELL_ORDERS_NO_THROW_SELECTOR\n ) {\n // Decode all orders\n // solhint-disable indent\n (orders) = abi.decode(\n data.slice(4, data.length),\n (LibOrder.Order[])\n );\n } else if (selector == MATCH_ORDERS_SELECTOR) {\n // Decode left and right orders\n (LibOrder.Order memory leftOrder, LibOrder.Order memory rightOrder) = abi.decode(\n data.slice(4, data.length),\n (LibOrder.Order, LibOrder.Order)\n );\n\n // Create array of orders\n orders = new LibOrder.Order[](2);\n orders[0] = leftOrder;\n orders[1] = rightOrder;\n }\n return orders;\n }\n}\n", + "@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract LibExchangeSelectors {\n\n // solhint-disable max-line-length\n // allowedValidators\n bytes4 constant internal ALLOWED_VALIDATORS_SELECTOR = 0x7b8e3514;\n bytes4 constant internal ALLOWED_VALIDATORS_SELECTOR_GENERATOR = bytes4(keccak256(\"allowedValidators(address,address)\"));\n\n // assetProxies\n bytes4 constant internal ASSET_PROXIES_SELECTOR = 0x3fd3c997;\n bytes4 constant internal ASSET_PROXIES_SELECTOR_GENERATOR = bytes4(keccak256(\"assetProxies(bytes4)\"));\n\n // batchCancelOrders\n bytes4 constant internal BATCH_CANCEL_ORDERS_SELECTOR = 0x4ac14782;\n bytes4 constant internal BATCH_CANCEL_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"batchCancelOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\"));\n\n // batchFillOrKillOrders\n bytes4 constant internal BATCH_FILL_OR_KILL_ORDERS_SELECTOR = 0x4d0ae546;\n bytes4 constant internal BATCH_FILL_OR_KILL_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"batchFillOrKillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])\"));\n\n // batchFillOrders\n bytes4 constant internal BATCH_FILL_ORDERS_SELECTOR = 0x297bb70b;\n bytes4 constant internal BATCH_FILL_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"batchFillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])\"));\n\n // batchFillOrdersNoThrow\n bytes4 constant internal BATCH_FILL_ORDERS_NO_THROW_SELECTOR = 0x50dde190;\n bytes4 constant internal BATCH_FILL_ORDERS_NO_THROW_SELECTOR_GENERATOR = bytes4(keccak256(\"batchFillOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])\"));\n\n // cancelOrder\n bytes4 constant internal CANCEL_ORDER_SELECTOR = 0xd46b02c3;\n bytes4 constant internal CANCEL_ORDER_SELECTOR_GENERATOR = bytes4(keccak256(\"cancelOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\"));\n\n // cancelOrdersUpTo\n bytes4 constant internal CANCEL_ORDERS_UP_TO_SELECTOR = 0x4f9559b1;\n bytes4 constant internal CANCEL_ORDERS_UP_TO_SELECTOR_GENERATOR = bytes4(keccak256(\"cancelOrdersUpTo(uint256)\"));\n\n // cancelled\n bytes4 constant internal CANCELLED_SELECTOR = 0x2ac12622;\n bytes4 constant internal CANCELLED_SELECTOR_GENERATOR = bytes4(keccak256(\"cancelled(bytes32)\"));\n\n // currentContextAddress\n bytes4 constant internal CURRENT_CONTEXT_ADDRESS_SELECTOR = 0xeea086ba;\n bytes4 constant internal CURRENT_CONTEXT_ADDRESS_SELECTOR_GENERATOR = bytes4(keccak256(\"currentContextAddress()\"));\n\n // executeTransaction\n bytes4 constant internal EXECUTE_TRANSACTION_SELECTOR = 0xbfc8bfce;\n bytes4 constant internal EXECUTE_TRANSACTION_SELECTOR_GENERATOR = bytes4(keccak256(\"executeTransaction(uint256,address,bytes,bytes)\"));\n\n // fillOrKillOrder\n bytes4 constant internal FILL_OR_KILL_ORDER_SELECTOR = 0x64a3bc15;\n bytes4 constant internal FILL_OR_KILL_ORDER_SELECTOR_GENERATOR = bytes4(keccak256(\"fillOrKillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"));\n\n // fillOrder\n bytes4 constant internal FILL_ORDER_SELECTOR = 0xb4be83d5;\n bytes4 constant internal FILL_ORDER_SELECTOR_GENERATOR = bytes4(keccak256(\"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"));\n\n // fillOrderNoThrow\n bytes4 constant internal FILL_ORDER_NO_THROW_SELECTOR = 0x3e228bae;\n bytes4 constant internal FILL_ORDER_NO_THROW_SELECTOR_GENERATOR = bytes4(keccak256(\"fillOrderNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"));\n\n // filled\n bytes4 constant internal FILLED_SELECTOR = 0x288cdc91;\n bytes4 constant internal FILLED_SELECTOR_GENERATOR = bytes4(keccak256(\"filled(bytes32)\"));\n\n // getAssetProxy\n bytes4 constant internal GET_ASSET_PROXY_SELECTOR = 0x60704108;\n bytes4 constant internal GET_ASSET_PROXY_SELECTOR_GENERATOR = bytes4(keccak256(\"getAssetProxy(bytes4)\"));\n\n // getOrderInfo\n bytes4 constant internal GET_ORDER_INFO_SELECTOR = 0xc75e0a81;\n bytes4 constant internal GET_ORDER_INFO_SELECTOR_GENERATOR = bytes4(keccak256(\"getOrderInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes))\"));\n\n // getOrdersInfo\n bytes4 constant internal GET_ORDERS_INFO_SELECTOR = 0x7e9d74dc;\n bytes4 constant internal GET_ORDERS_INFO_SELECTOR_GENERATOR = bytes4(keccak256(\"getOrdersInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])\"));\n\n // isValidSignature\n bytes4 constant internal IS_VALID_SIGNATURE_SELECTOR = 0x93634702;\n bytes4 constant internal IS_VALID_SIGNATURE_SELECTOR_GENERATOR = bytes4(keccak256(\"isValidSignature(bytes32,address,bytes)\"));\n\n // marketBuyOrders\n bytes4 constant internal MARKET_BUY_ORDERS_SELECTOR = 0xe5fa431b;\n bytes4 constant internal MARKET_BUY_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"marketBuyOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])\"));\n\n // marketBuyOrdersNoThrow\n bytes4 constant internal MARKET_BUY_ORDERS_NO_THROW_SELECTOR = 0xa3e20380;\n bytes4 constant internal MARKET_BUY_ORDERS_NO_THROW_SELECTOR_GENERATOR = bytes4(keccak256(\"marketBuyOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])\"));\n\n // marketSellOrders\n bytes4 constant internal MARKET_SELL_ORDERS_SELECTOR = 0x7e1d9808;\n bytes4 constant internal MARKET_SELL_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"marketSellOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])\"));\n\n // marketSellOrdersNoThrow\n bytes4 constant internal MARKET_SELL_ORDERS_NO_THROW_SELECTOR = 0xdd1c7d18;\n bytes4 constant internal MARKET_SELL_ORDERS_NO_THROW_SELECTOR_GENERATOR = bytes4(keccak256(\"marketSellOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])\"));\n\n // matchOrders\n bytes4 constant internal MATCH_ORDERS_SELECTOR = 0x3c28d861;\n bytes4 constant internal MATCH_ORDERS_SELECTOR_GENERATOR = bytes4(keccak256(\"matchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes,bytes)\"));\n\n // orderEpoch\n bytes4 constant internal ORDER_EPOCH_SELECTOR = 0xd9bfa73e;\n bytes4 constant internal ORDER_EPOCH_SELECTOR_GENERATOR = bytes4(keccak256(\"orderEpoch(address,address)\"));\n\n // owner\n bytes4 constant internal OWNER_SELECTOR = 0x8da5cb5b;\n bytes4 constant internal OWNER_SELECTOR_GENERATOR = bytes4(keccak256(\"owner()\"));\n\n // preSign\n bytes4 constant internal PRE_SIGN_SELECTOR = 0x3683ef8e;\n bytes4 constant internal PRE_SIGN_SELECTOR_GENERATOR = bytes4(keccak256(\"preSign(bytes32,address,bytes)\"));\n\n // preSigned\n bytes4 constant internal PRE_SIGNED_SELECTOR = 0x82c174d0;\n bytes4 constant internal PRE_SIGNED_SELECTOR_GENERATOR = bytes4(keccak256(\"preSigned(bytes32,address)\"));\n\n // registerAssetProxy\n bytes4 constant internal REGISTER_ASSET_PROXY_SELECTOR = 0xc585bb93;\n bytes4 constant internal REGISTER_ASSET_PROXY_SELECTOR_GENERATOR = bytes4(keccak256(\"registerAssetProxy(address)\"));\n\n // setSignatureValidatorApproval\n bytes4 constant internal SET_SIGNATURE_VALIDATOR_APPROVAL_SELECTOR = 0x77fcce68;\n bytes4 constant internal SET_SIGNATURE_VALIDATOR_APPROVAL_SELECTOR_GENERATOR = bytes4(keccak256(\"setSignatureValidatorApproval(address,bool)\"));\n\n // transactions\n bytes4 constant internal TRANSACTIONS_SELECTOR = 0x642f2eaf;\n bytes4 constant internal TRANSACTIONS_SELECTOR_GENERATOR = bytes4(keccak256(\"transactions(bytes32)\"));\n\n // transferOwnership\n bytes4 constant internal TRANSFER_OWNERSHIP_SELECTOR = 0xf2fde38b;\n bytes4 constant internal TRANSFER_OWNERSHIP_SELECTOR_GENERATOR = bytes4(keccak256(\"transferOwnership(address)\"));\n}", + "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // bytes32(order.makerAddress),\n // bytes32(order.takerAddress),\n // bytes32(order.feeRecipientAddress),\n // bytes32(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n \n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, makerAssetDataHash)\n mstore(pos3, takerAssetDataHash)\n result := keccak256(pos1, 416)\n \n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n }\n return result;\n }\n}\n", + "@0x/contracts-exchange-libs/contracts/src/LibEIP712.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract LibEIP712 {\n\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n uint256(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n", + "@0x/contracts-utils/contracts/src/LibAddressArray.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibBytes.sol\";\n\n\nlibrary LibAddressArray {\n\n /// @dev Append a new address to an array of addresses.\n /// The `addressArray` may need to be reallocated to make space\n /// for the new address. Because of this we return the resulting\n /// memory location of `addressArray`.\n /// @param addressArray Array of addresses.\n /// @param addressToAppend Address to append.\n /// @return Array of addresses: [... addressArray, addressToAppend]\n function append(address[] memory addressArray, address addressToAppend) \n internal\n pure\n returns (address[] memory)\n {\n // Get stats on address array and free memory\n uint256 freeMemPtr = 0;\n uint256 addressArrayBeginPtr = 0;\n uint256 addressArrayEndPtr = 0;\n uint256 addressArrayLength = addressArray.length;\n uint256 addressArrayMemSizeInBytes = 32 + (32 * addressArrayLength);\n assembly {\n freeMemPtr := mload(0x40)\n addressArrayBeginPtr := addressArray\n addressArrayEndPtr := add(addressArray, addressArrayMemSizeInBytes)\n }\n\n // Cases for `freeMemPtr`:\n // `freeMemPtr` == `addressArrayEndPtr`: Nothing occupies memory after `addressArray`\n // `freeMemPtr` > `addressArrayEndPtr`: Some value occupies memory after `addressArray`\n // `freeMemPtr` < `addressArrayEndPtr`: Memory has not been managed properly.\n require(\n freeMemPtr >= addressArrayEndPtr,\n \"INVALID_FREE_MEMORY_PTR\"\n );\n\n // If free memory begins at the end of `addressArray`\n // then we can append `addressToAppend` directly.\n // Otherwise, we must copy the array to free memory\n // before appending new values to it.\n if (freeMemPtr > addressArrayEndPtr) {\n LibBytes.memCopy(freeMemPtr, addressArrayBeginPtr, addressArrayMemSizeInBytes);\n assembly {\n addressArray := freeMemPtr\n addressArrayBeginPtr := addressArray\n }\n }\n\n // Append `addressToAppend`\n addressArrayLength += 1;\n addressArrayMemSizeInBytes += 32;\n addressArrayEndPtr = addressArrayBeginPtr + addressArrayMemSizeInBytes;\n freeMemPtr = addressArrayEndPtr;\n assembly {\n // Store new array length\n mstore(addressArray, addressArrayLength)\n\n // Update `freeMemPtr`\n mstore(0x40, freeMemPtr)\n }\n addressArray[addressArrayLength - 1] = addressToAppend;\n return addressArray;\n }\n\n /// @dev Checks if an address array contains the target address.\n /// @param addressArray Array of addresses.\n /// @param target Address to search for in array.\n /// @return True if the addressArray contains the target.\n function contains(address[] memory addressArray, address target)\n internal\n pure\n returns (bool)\n {\n uint256 length = addressArray.length;\n for (uint256 i = 0; i < length; i++) {\n if (addressArray[i] == target) {\n return true;\n }\n }\n return false;\n }\n\n /// @dev Finds the index of an address within an array.\n /// @param addressArray Array of addresses.\n /// @param target Address to search for in array.\n /// @return Existence and index of the target in the array.\n function indexOf(address[] memory addressArray, address target)\n internal\n pure\n returns (bool, uint256)\n {\n uint256 length = addressArray.length;\n for (uint256 i = 0; i < length; i++) {\n if (addressArray[i] == target) {\n return (true, i);\n }\n }\n return (false, 0);\n }\n}\n", + "src/libs/LibCoordinatorApproval.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibEIP712Domain.sol\";\n\n\ncontract LibCoordinatorApproval is\n LibEIP712Domain\n{\n // Hash for the EIP712 Coordinator approval message\n bytes32 constant internal EIP712_Coordinator_APPROVAL_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"CoordinatorApproval(\",\n \"bytes32 transactionHash,\",\n \"bytes transactionSignature,\",\n \"uint256 approvalExpirationTimeSeconds\",\n \")\"\n ));\n\n struct CoordinatorApproval {\n bytes32 transactionHash; // EIP712 hash of the transaction, using the domain separator of this contract.\n bytes transactionSignature; // Signature of the 0x transaction.\n uint256 approvalExpirationTimeSeconds; // Timestamp in seconds for which the signature expires.\n }\n\n /// @dev Calculated the EIP712 hash of the Coordinator approval mesasage using the domain separator of this contract.\n /// @param approval Coordinator approval message containing the transaction hash, transaction signature, and expiration of the approval.\n /// @return EIP712 hash of the Coordinator approval message with the domain separator of this contract.\n function getCoordinatorApprovalHash(CoordinatorApproval memory approval)\n internal\n view\n returns (bytes32 approvalHash)\n {\n approvalHash = hashEIP712Message(hashCoordinatorApproval(approval));\n return approvalHash;\n }\n\n /// @dev Calculated the EIP712 hash of the Coordinator approval mesasage with no domain separator.\n /// @param approval Coordinator approval message containing the transaction hash, transaction signature, and expiration of the approval.\n /// @return EIP712 hash of the Coordinator approval message with no domain separator.\n function hashCoordinatorApproval(CoordinatorApproval memory approval)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_Coordinator_APPROVAL_SCHEMA_HASH;\n bytes32 transactionSignatureHash = keccak256(approval.transactionSignature);\n // TODO(abandeali1): optimize by loading from memory in assembly\n bytes32 transactionHash = approval.transactionHash;\n uint256 approvalExpirationTimeSeconds = approval.approvalExpirationTimeSeconds;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_Coordinator_APPROVAL_SCHEMA_HASH,\n // approval.transactionHash,\n // keccak256(approval.transactionSignature)\n // approval.expiration,\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), transactionHash) // transactionHash\n mstore(add(memPtr, 64), transactionSignatureHash) // transactionSignatureHash\n mstore(add(memPtr, 96), approvalExpirationTimeSeconds) // approvalExpirationTimeSeconds\n // Compute hash\n result := keccak256(memPtr, 128)\n }\n return result;\n }\n}\n", + "src/libs/LibEIP712Domain.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\n\ncontract LibEIP712Domain {\n\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol Trade Execution Coordinator\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"1.0.0\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n uint256(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n", + "src/libs/LibZeroExTransaction.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\n\nimport \"./LibEIP712Domain.sol\";\n\n\ncontract LibZeroExTransaction is\n LibEIP712Domain\n{\n // Hash for the EIP712 0x transaction schema\n bytes32 constant internal EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"ZeroExTransaction(\",\n \"uint256 salt,\",\n \"address signerAddress,\",\n \"bytes data\",\n \")\"\n ));\n\n struct ZeroExTransaction {\n uint256 salt; // Arbitrary number to ensure uniqueness of transaction hash.\n address signerAddress; // Address of transaction signer.\n bytes data; // AbiV2 encoded calldata.\n }\n\n /// @dev Calculates the EIP712 hash of a 0x transaction using the domain separator of this contract.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @return EIP712 hash of the transaction with the domain separator of this contract.\n function getTransactionHash(ZeroExTransaction memory transaction)\n internal\n view\n returns (bytes32 transactionHash)\n {\n // Note: this transaction hash will differ from the hash produced by the Exchange contract because it utilizes a different domain hash.\n transactionHash = hashEIP712Message(hashZeroExTransaction(transaction));\n return transactionHash;\n }\n\n /// @dev Calculates EIP712 hash of the 0x transaction with no domain separator.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @return EIP712 hash of the transaction with no domain separator.\n function hashZeroExTransaction(ZeroExTransaction memory transaction)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes32 dataHash = keccak256(transaction.data);\n // TODO(abandeali1): optimize by loading from memory in assembly\n uint256 salt = transaction.salt;\n address signerAddress = transaction.signerAddress;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,\n // transaction.salt,\n // uint256(transaction.signerAddress),\n // keccak256(transaction.data)\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), salt) // salt\n mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff)) // signerAddress\n mstore(add(memPtr, 96), dataHash) // hash of data\n\n // Compute hash\n result := keccak256(memPtr, 128)\n }\n return result;\n }\n}\n", + "src/mixins/MCoordinatorApprovalVerifier.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"../interfaces/ICoordinatorApprovalVerifier.sol\";\n\n\ncontract MCoordinatorApprovalVerifier is\n ICoordinatorApprovalVerifier\n{\n /// @dev Decodes the orders from Exchange calldata representing any fill method.\n /// @param data Exchange calldata representing a fill method.\n /// @return The orders from the Exchange calldata.\n function decodeFillDataOrders(bytes memory data)\n internal\n pure\n returns (LibOrder.Order[] memory orders);\n}\n", + "src/interfaces/ICoordinatorApprovalVerifier.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.3;\npragma experimental \"ABIEncoderV2\";\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"../libs/LibZeroExTransaction.sol\";\n\n\ncontract ICoordinatorApprovalVerifier {\n\n /// @dev Validates that the 0x transaction has been approved by all of the feeRecipients\n /// that correspond to each order in the transaction's Exchange calldata.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order in the transaction's Exchange calldata.\n function assertValidCoordinatorApprovals(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n view;\n\n /// @dev Validates that the feeRecipients of a batch of order have approved a 0x transaction.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param orders Array of order structs containing order specifications.\n /// @param transactionSignature Proof that the transaction has been signed by the signer.\n /// @param approvalExpirationTimeSeconds Array of expiration times in seconds for which each corresponding approval signature expires.\n /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order.\n function assertValidTransactionOrdersApproval(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n LibOrder.Order[] memory orders,\n bytes memory transactionSignature,\n uint256[] memory approvalExpirationTimeSeconds,\n bytes[] memory approvalSignatures\n )\n public\n view;\n}\n" + }, + "sourceTreeHashHex": "0xfbe6e84a830b9d16ad545c23cef0506bad3beafb806bd03829d7e6a52f09eee5", + "compiler": { + "name": "solc", + "version": "0.5.3+commit.10d17f24.Linux.g++", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "remappings": [ + "@0x/contracts-utils=/Users/greg/dev/0x-monorepo/contracts/tec/node_modules/@0x/contracts-utils", + "@0x/contracts-exchange-libs=/Users/greg/dev/0x-monorepo/contracts/tec/node_modules/@0x/contracts-exchange-libs" + ] + } + }, + "networks": {} +} \ No newline at end of file diff --git a/contracts/coordinator/generated-wrappers/coordinator.ts b/contracts/coordinator/generated-wrappers/coordinator.ts new file mode 100644 index 0000000000..7bad236866 --- /dev/null +++ b/contracts/coordinator/generated-wrappers/coordinator.ts @@ -0,0 +1,302 @@ +// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma whitespace class-name +// tslint:disable:no-unused-variable +// tslint:disable:no-unbound-method +import { BaseContract } from '@0x/base-contract'; +import { BlockParam, BlockParamLiteral, CallData, ContractAbi, ContractArtifact, DecodedLogArgs, MethodAbi, TxData, TxDataPayable, SupportedProvider } from 'ethereum-types'; +import { BigNumber, classUtils, logUtils, providerUtils } from '@0x/utils'; +import { SimpleContractArtifact } from '@0x/types'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import * as ethers from 'ethers'; +import * as _ from 'lodash'; +// tslint:enable:no-unused-variable + + +/* istanbul ignore next */ +// tslint:disable:no-parameter-reassignment +// tslint:disable-next-line:class-name +export class CoordinatorContract extends BaseContract { + public getSignerAddress = { + async callAsync( + hash: string, + signature: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as CoordinatorContract; + const encodedData = self._strictEncodeArguments('getSignerAddress(bytes32,bytes)', [hash, + signature + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getSignerAddress(bytes32,bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public assertValidTransactionOrdersApproval = { + async callAsync( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + orders: Array<{makerAddress: string;takerAddress: string;feeRecipientAddress: string;senderAddress: string;makerAssetAmount: BigNumber;takerAssetAmount: BigNumber;makerFee: BigNumber;takerFee: BigNumber;expirationTimeSeconds: BigNumber;salt: BigNumber;makerAssetData: string;takerAssetData: string}>, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as CoordinatorContract; + const encodedData = self._strictEncodeArguments('assertValidTransactionOrdersApproval((uint256,address,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes,uint256[],bytes[])', [transaction, + orders, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('assertValidTransactionOrdersApproval((uint256,address,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes,uint256[],bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public assertValidCoordinatorApprovals = { + async callAsync( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as CoordinatorContract; + const encodedData = self._strictEncodeArguments('assertValidCoordinatorApprovals((uint256,address,bytes),bytes,uint256[],bytes[])', [transaction, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('assertValidCoordinatorApprovals((uint256,address,bytes),bytes,uint256[],bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public EIP712_DOMAIN_HASH = { + async callAsync( + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as CoordinatorContract; + const encodedData = self._strictEncodeArguments('EIP712_DOMAIN_HASH()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('EIP712_DOMAIN_HASH()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public executeTransaction = { + async sendTransactionAsync( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + txData: Partial = {}, + ): Promise { + const self = this as any as CoordinatorContract; + const encodedData = self._strictEncodeArguments('executeTransaction((uint256,address,bytes),bytes,uint256[],bytes[])', [transaction, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ]); + const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...txData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + self.executeTransaction.estimateGasAsync.bind( + self, + transaction, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ), + ); + const txHash = await self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); + return txHash; + }, + async estimateGasAsync( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + txData: Partial = {}, + ): Promise { + const self = this as any as CoordinatorContract; + const encodedData = self._strictEncodeArguments('executeTransaction((uint256,address,bytes),bytes,uint256[],bytes[])', [transaction, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ]); + const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...txData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const gas = await self._web3Wrapper.estimateGasAsync(txDataWithDefaults); + return gas; + }, + getABIEncodedTransactionData( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + ): string { + const self = this as any as CoordinatorContract; + const abiEncodedTransactionData = self._strictEncodeArguments('executeTransaction((uint256,address,bytes),bytes,uint256[],bytes[])', [transaction, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ]); + return abiEncodedTransactionData; + }, + async callAsync( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as CoordinatorContract; + const encodedData = self._strictEncodeArguments('executeTransaction((uint256,address,bytes),bytes,uint256[],bytes[])', [transaction, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('executeTransaction((uint256,address,bytes),bytes,uint256[],bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public static async deployFrom0xArtifactAsync( + artifact: ContractArtifact | SimpleContractArtifact, + supportedProvider: SupportedProvider, + txDefaults: Partial, + _exchange: string, + ): Promise { + if (_.isUndefined(artifact.compilerOutput)) { + throw new Error('Compiler output not found in the artifact file'); + } + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const bytecode = artifact.compilerOutput.evm.bytecode.object; + const abi = artifact.compilerOutput.abi; + return CoordinatorContract.deployAsync(bytecode, abi, provider, txDefaults, _exchange +); + } + public static async deployAsync( + bytecode: string, + abi: ContractAbi, + supportedProvider: SupportedProvider, + txDefaults: Partial, + _exchange: string, + ): Promise { + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const constructorAbi = BaseContract._lookupConstructorAbi(abi); + [_exchange +] = BaseContract._formatABIDataItemList( + constructorAbi.inputs, + [_exchange +], + BaseContract._bigNumberToString, + ); + const iface = new ethers.utils.Interface(abi); + const deployInfo = iface.deployFunction; + const txData = deployInfo.encode(bytecode, [_exchange +]); + const web3Wrapper = new Web3Wrapper(provider); + const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + {data: txData}, + txDefaults, + web3Wrapper.estimateGasAsync.bind(web3Wrapper), + ); + const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); + logUtils.log(`transactionHash: ${txHash}`); + const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); + logUtils.log(`Coordinator successfully deployed at ${txReceipt.contractAddress}`); + const contractInstance = new CoordinatorContract(abi, txReceipt.contractAddress as string, provider, txDefaults); + contractInstance.constructorArgs = [_exchange +]; + return contractInstance; + } + constructor(abi: ContractAbi, address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { + super('Coordinator', abi, address, supportedProvider, txDefaults); + classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', 'abi', '_web3Wrapper']); + } +} // tslint:disable:max-file-line-count +// tslint:enable:no-unbound-method diff --git a/contracts/coordinator/generated-wrappers/test_libs.ts b/contracts/coordinator/generated-wrappers/test_libs.ts new file mode 100644 index 0000000000..74e0fb5728 --- /dev/null +++ b/contracts/coordinator/generated-wrappers/test_libs.ts @@ -0,0 +1,148 @@ +// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma whitespace class-name +// tslint:disable:no-unused-variable +// tslint:disable:no-unbound-method +import { BaseContract } from '@0x/base-contract'; +import { BlockParam, BlockParamLiteral, CallData, ContractAbi, ContractArtifact, DecodedLogArgs, MethodAbi, TxData, TxDataPayable, SupportedProvider } from 'ethereum-types'; +import { BigNumber, classUtils, logUtils, providerUtils } from '@0x/utils'; +import { SimpleContractArtifact } from '@0x/types'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import * as ethers from 'ethers'; +import * as _ from 'lodash'; +// tslint:enable:no-unused-variable + + +/* istanbul ignore next */ +// tslint:disable:no-parameter-reassignment +// tslint:disable-next-line:class-name +export class TestLibsContract extends BaseContract { + public publicGetTransactionHash = { + async callAsync( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as TestLibsContract; + const encodedData = self._strictEncodeArguments('publicGetTransactionHash((uint256,address,bytes))', [transaction + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('publicGetTransactionHash((uint256,address,bytes))'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public publicGetCoordinatorApprovalHash = { + async callAsync( + approval: {transactionHash: string;transactionSignature: string;approvalExpirationTimeSeconds: BigNumber}, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as TestLibsContract; + const encodedData = self._strictEncodeArguments('publicGetCoordinatorApprovalHash((bytes32,bytes,uint256))', [approval + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('publicGetCoordinatorApprovalHash((bytes32,bytes,uint256))'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public EIP712_DOMAIN_HASH = { + async callAsync( + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as TestLibsContract; + const encodedData = self._strictEncodeArguments('EIP712_DOMAIN_HASH()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('EIP712_DOMAIN_HASH()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public static async deployFrom0xArtifactAsync( + artifact: ContractArtifact | SimpleContractArtifact, + supportedProvider: SupportedProvider, + txDefaults: Partial, + ): Promise { + if (_.isUndefined(artifact.compilerOutput)) { + throw new Error('Compiler output not found in the artifact file'); + } + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const bytecode = artifact.compilerOutput.evm.bytecode.object; + const abi = artifact.compilerOutput.abi; + return TestLibsContract.deployAsync(bytecode, abi, provider, txDefaults, ); + } + public static async deployAsync( + bytecode: string, + abi: ContractAbi, + supportedProvider: SupportedProvider, + txDefaults: Partial, + ): Promise { + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const constructorAbi = BaseContract._lookupConstructorAbi(abi); + [] = BaseContract._formatABIDataItemList( + constructorAbi.inputs, + [], + BaseContract._bigNumberToString, + ); + const iface = new ethers.utils.Interface(abi); + const deployInfo = iface.deployFunction; + const txData = deployInfo.encode(bytecode, []); + const web3Wrapper = new Web3Wrapper(provider); + const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + {data: txData}, + txDefaults, + web3Wrapper.estimateGasAsync.bind(web3Wrapper), + ); + const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); + logUtils.log(`transactionHash: ${txHash}`); + const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); + logUtils.log(`TestLibs successfully deployed at ${txReceipt.contractAddress}`); + const contractInstance = new TestLibsContract(abi, txReceipt.contractAddress as string, provider, txDefaults); + contractInstance.constructorArgs = []; + return contractInstance; + } + constructor(abi: ContractAbi, address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { + super('TestLibs', abi, address, supportedProvider, txDefaults); + classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', 'abi', '_web3Wrapper']); + } +} // tslint:disable:max-file-line-count +// tslint:enable:no-unbound-method diff --git a/contracts/coordinator/generated-wrappers/test_mixins.ts b/contracts/coordinator/generated-wrappers/test_mixins.ts new file mode 100644 index 0000000000..8a76af1c22 --- /dev/null +++ b/contracts/coordinator/generated-wrappers/test_mixins.ts @@ -0,0 +1,192 @@ +// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma whitespace class-name +// tslint:disable:no-unused-variable +// tslint:disable:no-unbound-method +import { BaseContract } from '@0x/base-contract'; +import { BlockParam, BlockParamLiteral, CallData, ContractAbi, ContractArtifact, DecodedLogArgs, MethodAbi, TxData, TxDataPayable, SupportedProvider } from 'ethereum-types'; +import { BigNumber, classUtils, logUtils, providerUtils } from '@0x/utils'; +import { SimpleContractArtifact } from '@0x/types'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import * as ethers from 'ethers'; +import * as _ from 'lodash'; +// tslint:enable:no-unused-variable + + +/* istanbul ignore next */ +// tslint:disable:no-parameter-reassignment +// tslint:disable-next-line:class-name +export class TestMixinsContract extends BaseContract { + public getSignerAddress = { + async callAsync( + hash: string, + signature: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as TestMixinsContract; + const encodedData = self._strictEncodeArguments('getSignerAddress(bytes32,bytes)', [hash, + signature + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getSignerAddress(bytes32,bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public assertValidTransactionOrdersApproval = { + async callAsync( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + orders: Array<{makerAddress: string;takerAddress: string;feeRecipientAddress: string;senderAddress: string;makerAssetAmount: BigNumber;takerAssetAmount: BigNumber;makerFee: BigNumber;takerFee: BigNumber;expirationTimeSeconds: BigNumber;salt: BigNumber;makerAssetData: string;takerAssetData: string}>, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as TestMixinsContract; + const encodedData = self._strictEncodeArguments('assertValidTransactionOrdersApproval((uint256,address,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes,uint256[],bytes[])', [transaction, + orders, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('assertValidTransactionOrdersApproval((uint256,address,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes,uint256[],bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public assertValidCoordinatorApprovals = { + async callAsync( + transaction: {salt: BigNumber;signerAddress: string;data: string}, + transactionSignature: string, + approvalExpirationTimeSeconds: BigNumber[], + approvalSignatures: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as TestMixinsContract; + const encodedData = self._strictEncodeArguments('assertValidCoordinatorApprovals((uint256,address,bytes),bytes,uint256[],bytes[])', [transaction, + transactionSignature, + approvalExpirationTimeSeconds, + approvalSignatures + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('assertValidCoordinatorApprovals((uint256,address,bytes),bytes,uint256[],bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public EIP712_DOMAIN_HASH = { + async callAsync( + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + const self = this as any as TestMixinsContract; + const encodedData = self._strictEncodeArguments('EIP712_DOMAIN_HASH()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('EIP712_DOMAIN_HASH()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + }; + public static async deployFrom0xArtifactAsync( + artifact: ContractArtifact | SimpleContractArtifact, + supportedProvider: SupportedProvider, + txDefaults: Partial, + ): Promise { + if (_.isUndefined(artifact.compilerOutput)) { + throw new Error('Compiler output not found in the artifact file'); + } + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const bytecode = artifact.compilerOutput.evm.bytecode.object; + const abi = artifact.compilerOutput.abi; + return TestMixinsContract.deployAsync(bytecode, abi, provider, txDefaults, ); + } + public static async deployAsync( + bytecode: string, + abi: ContractAbi, + supportedProvider: SupportedProvider, + txDefaults: Partial, + ): Promise { + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const constructorAbi = BaseContract._lookupConstructorAbi(abi); + [] = BaseContract._formatABIDataItemList( + constructorAbi.inputs, + [], + BaseContract._bigNumberToString, + ); + const iface = new ethers.utils.Interface(abi); + const deployInfo = iface.deployFunction; + const txData = deployInfo.encode(bytecode, []); + const web3Wrapper = new Web3Wrapper(provider); + const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + {data: txData}, + txDefaults, + web3Wrapper.estimateGasAsync.bind(web3Wrapper), + ); + const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); + logUtils.log(`transactionHash: ${txHash}`); + const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); + logUtils.log(`TestMixins successfully deployed at ${txReceipt.contractAddress}`); + const contractInstance = new TestMixinsContract(abi, txReceipt.contractAddress as string, provider, txDefaults); + contractInstance.constructorArgs = []; + return contractInstance; + } + constructor(abi: ContractAbi, address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { + super('TestMixins', abi, address, supportedProvider, txDefaults); + classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', 'abi', '_web3Wrapper']); + } +} // tslint:disable:max-file-line-count +// tslint:enable:no-unbound-method diff --git a/contracts/tec/package.json b/contracts/coordinator/package.json similarity index 100% rename from contracts/tec/package.json rename to contracts/coordinator/package.json diff --git a/contracts/tec/src/artifacts.ts b/contracts/coordinator/src/artifacts.ts similarity index 100% rename from contracts/tec/src/artifacts.ts rename to contracts/coordinator/src/artifacts.ts diff --git a/contracts/tec/src/index.ts b/contracts/coordinator/src/index.ts similarity index 100% rename from contracts/tec/src/index.ts rename to contracts/coordinator/src/index.ts diff --git a/contracts/tec/src/wrappers.ts b/contracts/coordinator/src/wrappers.ts similarity index 100% rename from contracts/tec/src/wrappers.ts rename to contracts/coordinator/src/wrappers.ts diff --git a/contracts/tec/test/coordinator.ts b/contracts/coordinator/test/coordinator.ts similarity index 100% rename from contracts/tec/test/coordinator.ts rename to contracts/coordinator/test/coordinator.ts diff --git a/contracts/tec/test/global_hooks.ts b/contracts/coordinator/test/global_hooks.ts similarity index 100% rename from contracts/tec/test/global_hooks.ts rename to contracts/coordinator/test/global_hooks.ts diff --git a/contracts/tec/test/libs.ts b/contracts/coordinator/test/libs.ts similarity index 100% rename from contracts/tec/test/libs.ts rename to contracts/coordinator/test/libs.ts diff --git a/contracts/tec/test/mixins.ts b/contracts/coordinator/test/mixins.ts similarity index 100% rename from contracts/tec/test/mixins.ts rename to contracts/coordinator/test/mixins.ts diff --git a/contracts/tec/test/utils/approval_factory.ts b/contracts/coordinator/test/utils/approval_factory.ts similarity index 100% rename from contracts/tec/test/utils/approval_factory.ts rename to contracts/coordinator/test/utils/approval_factory.ts diff --git a/contracts/tec/test/utils/constants.ts b/contracts/coordinator/test/utils/constants.ts similarity index 100% rename from contracts/tec/test/utils/constants.ts rename to contracts/coordinator/test/utils/constants.ts diff --git a/contracts/tec/test/utils/coordinator_transaction_factory.ts b/contracts/coordinator/test/utils/coordinator_transaction_factory.ts similarity index 100% rename from contracts/tec/test/utils/coordinator_transaction_factory.ts rename to contracts/coordinator/test/utils/coordinator_transaction_factory.ts diff --git a/contracts/tec/test/utils/exchange_data_encoder.ts b/contracts/coordinator/test/utils/exchange_data_encoder.ts similarity index 100% rename from contracts/tec/test/utils/exchange_data_encoder.ts rename to contracts/coordinator/test/utils/exchange_data_encoder.ts diff --git a/contracts/tec/test/utils/hash_utils.ts b/contracts/coordinator/test/utils/hash_utils.ts similarity index 100% rename from contracts/tec/test/utils/hash_utils.ts rename to contracts/coordinator/test/utils/hash_utils.ts diff --git a/contracts/tec/test/utils/index.ts b/contracts/coordinator/test/utils/index.ts similarity index 100% rename from contracts/tec/test/utils/index.ts rename to contracts/coordinator/test/utils/index.ts diff --git a/contracts/tec/test/utils/signing_utils.ts b/contracts/coordinator/test/utils/signing_utils.ts similarity index 100% rename from contracts/tec/test/utils/signing_utils.ts rename to contracts/coordinator/test/utils/signing_utils.ts diff --git a/contracts/tec/test/utils/types.ts b/contracts/coordinator/test/utils/types.ts similarity index 100% rename from contracts/tec/test/utils/types.ts rename to contracts/coordinator/test/utils/types.ts diff --git a/contracts/tec/tsconfig.json b/contracts/coordinator/tsconfig.json similarity index 100% rename from contracts/tec/tsconfig.json rename to contracts/coordinator/tsconfig.json diff --git a/contracts/tec/tslint.json b/contracts/coordinator/tslint.json similarity index 100% rename from contracts/tec/tslint.json rename to contracts/coordinator/tslint.json