{
"schemaVersion": "2.0.0",
"contractName": "TestLibs",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "numerator",
"type": "uint256"
},
{
"name": "denominator",
"type": "uint256"
},
{
"name": "target",
"type": "uint256"
}
],
"name": "publicIsRoundingErrorFloor",
"outputs": [
{
"name": "isError",
"type": "bool"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "numerator",
"type": "uint256"
},
{
"name": "denominator",
"type": "uint256"
},
{
"name": "target",
"type": "uint256"
}
],
"name": "publicGetPartialAmountCeil",
"outputs": [
{
"name": "partialAmount",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getDomainSeparatorSchemaHash",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"name": "makerFeePaid",
"type": "uint256"
},
{
"name": "takerFeePaid",
"type": "uint256"
}
],
"name": "totalFillResults",
"type": "tuple"
},
{
"components": [
{
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"name": "makerFeePaid",
"type": "uint256"
},
{
"name": "takerFeePaid",
"type": "uint256"
}
],
"name": "singleFillResults",
"type": "tuple"
}
],
"name": "publicAddFillResults",
"outputs": [
{
"components": [
{
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"name": "makerFeePaid",
"type": "uint256"
},
{
"name": "takerFeePaid",
"type": "uint256"
}
],
"name": "",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "numerator",
"type": "uint256"
},
{
"name": "denominator",
"type": "uint256"
},
{
"name": "target",
"type": "uint256"
}
],
"name": "publicIsRoundingErrorCeil",
"outputs": [
{
"name": "isError",
"type": "bool"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getOrderSchemaHash",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "numerator",
"type": "uint256"
},
{
"name": "denominator",
"type": "uint256"
},
{
"name": "target",
"type": "uint256"
}
],
"name": "publicGetPartialAmountFloor",
"outputs": [
{
"name": "partialAmount",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"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": "order",
"type": "tuple"
}
],
"name": "publicGetOrderHash",
"outputs": [
{
"name": "orderHash",
"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"
},
{
"constant": true,
"inputs": [
{
"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": "order",
"type": "tuple"
},
{
"name": "takerAssetFillAmount",
"type": "uint256"
},
{
"name": "signature",
"type": "bytes"
}
],
"name": "publicAbiEncodeFillOrder",
"outputs": [
{
"name": "fillOrderCalldata",
"type": "bytes"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
}
],
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x7f454950373132446f6d61696e280000000000000000000000000000000000000060a09081527f737472696e67206e616d652c000000000000000000000000000000000000000060ad527f737472696e672076657273696f6e2c000000000000000000000000000000000060b9527f6164647265737320766572696679696e67436f6e74726163740000000000000060c8527f290000000000000000000000000000000000000000000000000000000000000060e1526042608081815260e26040819052909290918291908083835b602083106100ed5780518252601f1990920191602091820191016100ce565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208285018552600b8084527f30782050726f746f636f6c000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106101755780518252601f199092019160209182019101610156565b51815160209384036101000a600019018019909216911617905260408051929094018290038220828501855260018084527f3200000000000000000000000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106101fd5780518252601f1990920191602091820191016101de565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208282019890985281840196909652606081019690965250306080808701919091528151808703909101815260a09095019081905284519093849350850191508083835b602083106102865780518252601f199092019160209182019101610267565b5181516000196020949094036101000a939093019283169219169190911790526040519201829003909120600055505050611634806102c66000396000f3006080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631be2390181146100a857806320777f70146100de578063494d92971461010b57806366758d7b14610120578063679d2f9a1461014d5780637d33c6ee1461016d578063be7ada1e14610182578063d9802088146101a2578063e306f779146101c2578063e9c7aa1a146101d7575b600080fd5b3480156100b457600080fd5b506100c86100c336600461132d565b610204565b6040516100d5919061149d565b60405180910390f35b3480156100ea57600080fd5b506100fe6100f936600461132d565b610219565b6040516100d591906114ab565b34801561011757600080fd5b506100fe610226565b34801561012c57600080fd5b5061014061013b366004611241565b61037e565b6040516100d591906114fa565b34801561015957600080fd5b506100c861016836600461132d565b610399565b34801561017957600080fd5b506100fe6103a6565b34801561018e57600080fd5b506100fe61019d36600461132d565b610626565b3480156101ae57600080fd5b506100fe6101bd36600461127c565b610633565b3480156101ce57600080fd5b506100fe61063e565b3480156101e357600080fd5b506101f76101f23660046112b1565b610644565b6040516100d591906114b9565b6000610211848484610651565b949350505050565b60006102118484846106e1565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f29000000000000000000000000000000000000000000000000000000000000006061830152825160428184030181526062909201928390528151600093918291908401908083835b6020831061034c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161030f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b610386610fed565b6103908383610742565b50815b92915050565b60006102118484846107a4565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b909201928390528151600093918291908401908083836020831061034c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161030f565b6000610211848484610829565b600061039382610871565b60005481565b6060610211848484610884565b600080808411610696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114da565b60405180910390fd5b8215806106a1575084155b156106af57600091506106d9565b838015156106b957fe5b85840990506106c88584610a56565b6106d46103e883610a56565b101591505b509392505050565b600080831161071c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114da565b61021161073c61072c8685610a56565b610737866001610abc565b610afe565b84610b3d565b815181516107509190610afe565b8252602080830151908201516107669190610afe565b60208301526040808301519082015161077f9190610afe565b6040830152606080830151908201516107989190610afe565b60609092019190915250565b6000808084116107e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114da565b8215806107eb575084155b156107f957600091506106d9565b8380151561080357fe5b8584099050836108138583610abc565b81151561081c57fe5b0690506106c88584610a56565b6000808311610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114da565b61021161073c8584610a56565b600061039361087f83610b54565b610fad565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b8181101561098b57835185526020948501949093019260010161096d565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b818110156109d45783518552602094850194909301926001016109b6565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b81811015610a1c5783518552602094850194909301926001016109fe565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08883030188525060405250505050509392505050565b600080831515610a695760009150610ab5565b50828202828482811515610a7957fe5b0414610ab1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114ea565b8091505b5092915050565b600082821115610af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114ca565b50900390565b600082820183811015610ab1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114ea565b6000808284811515610b4b57fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b60208310610ddc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d9f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b60208310610e7757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610e3a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310610f1257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610ed5565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b60006110228235611581565b9392505050565b6000601f8201831361103a57600080fd5b813561104d6110488261152f565b611508565b9150808252602083016020830185838301111561106957600080fd5b61107483828461159a565b50505092915050565b60006080828403121561108f57600080fd5b6110996080611508565b905060006110a78484611235565b82525060206110b884848301611235565b60208301525060406110cc84828501611235565b60408301525060606110e084828501611235565b60608301525092915050565b600061018082840312156110ff57600080fd5b61110a610180611508565b905060006111188484611016565b825250602061112984848301611016565b602083015250604061113d84828501611016565b604083015250606061115184828501611016565b606083015250608061116584828501611235565b60808301525060a061117984828501611235565b60a08301525060c061118d84828501611235565b60c08301525060e06111a184828501611235565b60e0830152506101006111b684828501611235565b610100830152506101206111cc84828501611235565b6101208301525061014082013567ffffffffffffffff8111156111ee57600080fd5b6111fa84828501611029565b6101408301525061016082013567ffffffffffffffff81111561121c57600080fd5b61122884828501611029565b6101608301525092915050565b6000611022823561157e565b600080610100838503121561125557600080fd5b6000611261858561107d565b92505060806112728582860161107d565b9150509250929050565b60006020828403121561128e57600080fd5b813567ffffffffffffffff8111156112a557600080fd5b610211848285016110ec565b6000806000606084860312156112c657600080fd5b833567ffffffffffffffff8111156112dd57600080fd5b6112e9868287016110ec565b93505060206112fa86828701611235565b925050604084013567ffffffffffffffff81111561131757600080fd5b61132386828701611029565b9150509250925092565b60008060006060848603121561134257600080fd5b600061134e8686611235565b935050602061135f86828701611235565b925050604061132386828701611235565b61137981611579565b82525050565b6113798161157e565b600061139382611575565b8084526113a78160208601602086016115a6565b6113b0816115d2565b9093016020019392505050565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b601081527f4449564953494f4e5f42595f5a45524f00000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b8051608083019061145e848261137f565b506020820151611471602085018261137f565b506040820151611484604085018261137f565b506060820151611497606085018261137f565b50505050565b602081016103938284611370565b60208101610393828461137f565b602080825281016110228184611388565b60208082528101610393816113bd565b60208082528101610393816113ed565b602080825281016103938161141d565b60808101610393828461144d565b60405181810167ffffffffffffffff8111828210171561152757600080fd5b604052919050565b600067ffffffffffffffff82111561154657600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b151590565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b838110156115c15781810151838201526020016115a9565b838111156114975750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a7230582054bf246f11dbed15e52bfe7f20ff4b47b9f6d2d020efc54b73bb8fd1cd94115f6c6578706572696d656e74616cf50037",
"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 DUP2 MSTORE PUSH1 0xE2 PUSH1 0x40 DUP2 SWAP1 MSTORE SWAP1 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xED JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0xB DUP1 DUP5 MSTORE PUSH32 0x30782050726F746F636F6C000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x175 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x156 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0x1 DUP1 DUP5 MSTORE PUSH32 0x3200000000000000000000000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1FD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1DE JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP3 ADD SWAP9 SWAP1 SWAP9 MSTORE DUP2 DUP5 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x60 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE POP ADDRESS PUSH1 0x80 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP8 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xA0 SWAP1 SWAP6 ADD SWAP1 DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 SWAP4 DUP5 SWAP4 POP DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x286 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x267 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP SWAP4 SWAP1 SWAP4 ADD SWAP3 DUP4 AND SWAP3 NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x0 SSTORE POP POP POP PUSH2 0x1634 DUP1 PUSH2 0x2C6 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1BE23901 DUP2 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x20777F70 EQ PUSH2 0xDE JUMPI DUP1 PUSH4 0x494D9297 EQ PUSH2 0x10B JUMPI DUP1 PUSH4 0x66758D7B EQ PUSH2 0x120 JUMPI DUP1 PUSH4 0x679D2F9A EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0x7D33C6EE EQ PUSH2 0x16D JUMPI DUP1 PUSH4 0xBE7ADA1E EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0xD9802088 EQ PUSH2 0x1A2 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x1C2 JUMPI DUP1 PUSH4 0xE9C7AA1A EQ PUSH2 0x1D7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC8 PUSH2 0xC3 CALLDATASIZE PUSH1 0x4 PUSH2 0x132D JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x149D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0xF9 CALLDATASIZE PUSH1 0x4 PUSH2 0x132D JUMP JUMPDEST PUSH2 0x219 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x14AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x226 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x140 PUSH2 0x13B CALLDATASIZE PUSH1 0x4 PUSH2 0x1241 JUMP JUMPDEST PUSH2 0x37E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x14FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC8 PUSH2 0x168 CALLDATASIZE PUSH1 0x4 PUSH2 0x132D JUMP JUMPDEST PUSH2 0x399 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x179 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x3A6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x19D CALLDATASIZE PUSH1 0x4 PUSH2 0x132D JUMP JUMPDEST PUSH2 0x626 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x1BD CALLDATASIZE PUSH1 0x4 PUSH2 0x127C JUMP JUMPDEST PUSH2 0x633 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x63E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F7 PUSH2 0x1F2 CALLDATASIZE PUSH1 0x4 PUSH2 0x12B1 JUMP JUMPDEST PUSH2 0x644 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x14B9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x651 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x6E1 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 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x34C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x30F JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x386 PUSH2 0xFED JUMP JUMPDEST PUSH2 0x390 DUP4 DUP4 PUSH2 0x742 JUMP JUMPDEST POP DUP2 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x7A4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x34C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x30F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x829 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x393 DUP3 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x884 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP5 GT PUSH2 0x696 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 ISZERO DUP1 PUSH2 0x6A1 JUMPI POP DUP5 ISZERO JUMPDEST ISZERO PUSH2 0x6AF JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x6D9 JUMP JUMPDEST DUP4 DUP1 ISZERO ISZERO PUSH2 0x6B9 JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP PUSH2 0x6C8 DUP6 DUP5 PUSH2 0xA56 JUMP JUMPDEST PUSH2 0x6D4 PUSH2 0x3E8 DUP4 PUSH2 0xA56 JUMP JUMPDEST LT ISZERO SWAP2 POP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 GT PUSH2 0x71C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14DA JUMP JUMPDEST PUSH2 0x211 PUSH2 0x73C PUSH2 0x72C DUP7 DUP6 PUSH2 0xA56 JUMP JUMPDEST PUSH2 0x737 DUP7 PUSH1 0x1 PUSH2 0xABC JUMP JUMPDEST PUSH2 0xAFE JUMP JUMPDEST DUP5 PUSH2 0xB3D JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x750 SWAP2 SWAP1 PUSH2 0xAFE JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x766 SWAP2 SWAP1 PUSH2 0xAFE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x77F SWAP2 SWAP1 PUSH2 0xAFE JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x798 SWAP2 SWAP1 PUSH2 0xAFE JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP5 GT PUSH2 0x7E0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14DA JUMP JUMPDEST DUP3 ISZERO DUP1 PUSH2 0x7EB JUMPI POP DUP5 ISZERO JUMPDEST ISZERO PUSH2 0x7F9 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x6D9 JUMP JUMPDEST DUP4 DUP1 ISZERO ISZERO PUSH2 0x803 JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP DUP4 PUSH2 0x813 DUP6 DUP4 PUSH2 0xABC JUMP JUMPDEST DUP2 ISZERO ISZERO PUSH2 0x81C JUMPI INVALID JUMPDEST MOD SWAP1 POP PUSH2 0x6C8 DUP6 DUP5 PUSH2 0xA56 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 GT PUSH2 0x864 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14DA JUMP JUMPDEST PUSH2 0x211 PUSH2 0x73C DUP6 DUP5 PUSH2 0xA56 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x393 PUSH2 0x87F DUP4 PUSH2 0xB54 JUMP JUMPDEST PUSH2 0xFAD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x98B JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x96D JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9D4 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x9B6 JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA1C JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x9FE JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP9 DUP4 SUB ADD DUP9 MSTORE POP PUSH1 0x40 MSTORE POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0xA69 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0xAB5 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0xA79 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0xAB1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14EA JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xAF8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14CA JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xAB1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14EA JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0xB4B JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xDDC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xD9F 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 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xE77 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE3A 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 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xF12 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xED5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 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 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 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 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1022 DUP3 CALLDATALOAD PUSH2 0x1581 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x103A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x104D PUSH2 0x1048 DUP3 PUSH2 0x152F JUMP JUMPDEST PUSH2 0x1508 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1069 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1074 DUP4 DUP3 DUP5 PUSH2 0x159A JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x108F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1099 PUSH1 0x80 PUSH2 0x1508 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x10A7 DUP5 DUP5 PUSH2 0x1235 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x10B8 DUP5 DUP5 DUP4 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x10CC DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x10E0 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x10FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x110A PUSH2 0x180 PUSH2 0x1508 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1118 DUP5 DUP5 PUSH2 0x1016 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1129 DUP5 DUP5 DUP4 ADD PUSH2 0x1016 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x113D DUP5 DUP3 DUP6 ADD PUSH2 0x1016 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x1151 DUP5 DUP3 DUP6 ADD PUSH2 0x1016 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x1165 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x1179 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x118D DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x11A1 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x11B6 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x11CC DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11FA DUP5 DUP3 DUP6 ADD PUSH2 0x1029 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x121C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1228 DUP5 DUP3 DUP6 ADD PUSH2 0x1029 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1022 DUP3 CALLDATALOAD PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x100 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1255 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1261 DUP6 DUP6 PUSH2 0x107D JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x1272 DUP6 DUP3 DUP7 ADD PUSH2 0x107D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x128E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x211 DUP5 DUP3 DUP6 ADD PUSH2 0x10EC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x12C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12E9 DUP7 DUP3 DUP8 ADD PUSH2 0x10EC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x12FA DUP7 DUP3 DUP8 ADD PUSH2 0x1235 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1323 DUP7 DUP3 DUP8 ADD PUSH2 0x1029 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1342 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x134E DUP7 DUP7 PUSH2 0x1235 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x135F DUP7 DUP3 DUP8 ADD PUSH2 0x1235 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x1323 DUP7 DUP3 DUP8 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH2 0x1379 DUP2 PUSH2 0x1579 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1379 DUP2 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1393 DUP3 PUSH2 0x1575 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x13A7 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15A6 JUMP JUMPDEST PUSH2 0x13B0 DUP2 PUSH2 0x15D2 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4449564953494F4E5F42595F5A45524F00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x145E DUP5 DUP3 PUSH2 0x137F JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x1471 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x137F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1484 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x137F JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x1497 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x137F JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x393 DUP3 DUP5 PUSH2 0x1370 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x393 DUP3 DUP5 PUSH2 0x137F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1022 DUP2 DUP5 PUSH2 0x1388 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x393 DUP2 PUSH2 0x13BD JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x393 DUP2 PUSH2 0x13ED JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x393 DUP2 PUSH2 0x141D JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x393 DUP3 DUP5 PUSH2 0x144D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1527 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1546 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 ISZERO ISZERO SWAP1 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 0x15C1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15A9 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1497 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SLOAD 0xbf 0x24 PUSH16 0x11DBED15E52BFE7F20FF4B47B9F6D2D0 KECCAK256 0xef 0xc5 0x4b PUSH20 0xBB8FD1CD94115F6C6578706572696D656E74616C 0xf5 STOP CALLDATACOPY ",
"sourceMap": "1045:148:44:-;;;;;;;;;;;;;;;;;22:32:-1;859:2673:67;6:49:-1;;;1045:148:44;859:2673:67;1045:148:44;;;859:2673:67;;1045:148:44;;;;;22:32:-1;1045:148:44;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1035:159:44;;;;;;;;;;;;1511:18;;;;;;;;;;;;;;;;1495:36;;1035:159;;-1:-1:-1;1035:159:44;;-1:-1:-1;1495:36:44;;;;-1:-1:-1;1511:18:44;1495:36;1511:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1495:36:44;;;;;;;;;;;;1561:21;;;;;274:1:-1;1561:21:44;;;;;;;;;;1545:39;;1495:36;;-1:-1:-1;1495:36:44;;-1:-1:-1;1545:39:44;;;;-1:-1:-1;274:1;1545:39:44;1561:21;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1545:39:44;;;;;;;;;;;;1416:214;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1614:4:44;1416:214;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1416:214:44;;;;;;;;1406:225;;1416:214;;;;-1:-1:-1;1406:225:44;;;-1:-1:-1;1406:225:44;1416:214;1406:225;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;;254:3;250:22;246:30;;;;340:21;;;311:9;;295:26;377:20;;;;365:33;;1406:225:44;;;;;;;;;;-1:-1:-1;1385:246:44;-1:-1:-1;;;859:2673:67;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631be2390181146100a857806320777f70146100de578063494d92971461010b57806366758d7b14610120578063679d2f9a1461014d5780637d33c6ee1461016d578063be7ada1e14610182578063d9802088146101a2578063e306f779146101c2578063e9c7aa1a146101d7575b600080fd5b3480156100b457600080fd5b506100c86100c336600461132d565b610204565b6040516100d5919061149d565b60405180910390f35b3480156100ea57600080fd5b506100fe6100f936600461132d565b610219565b6040516100d591906114ab565b34801561011757600080fd5b506100fe610226565b34801561012c57600080fd5b5061014061013b366004611241565b61037e565b6040516100d591906114fa565b34801561015957600080fd5b506100c861016836600461132d565b610399565b34801561017957600080fd5b506100fe6103a6565b34801561018e57600080fd5b506100fe61019d36600461132d565b610626565b3480156101ae57600080fd5b506100fe6101bd36600461127c565b610633565b3480156101ce57600080fd5b506100fe61063e565b3480156101e357600080fd5b506101f76101f23660046112b1565b610644565b6040516100d591906114b9565b6000610211848484610651565b949350505050565b60006102118484846106e1565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f29000000000000000000000000000000000000000000000000000000000000006061830152825160428184030181526062909201928390528151600093918291908401908083835b6020831061034c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161030f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b610386610fed565b6103908383610742565b50815b92915050565b60006102118484846107a4565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b909201928390528151600093918291908401908083836020831061034c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161030f565b6000610211848484610829565b600061039382610871565b60005481565b6060610211848484610884565b600080808411610696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114da565b60405180910390fd5b8215806106a1575084155b156106af57600091506106d9565b838015156106b957fe5b85840990506106c88584610a56565b6106d46103e883610a56565b101591505b509392505050565b600080831161071c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114da565b61021161073c61072c8685610a56565b610737866001610abc565b610afe565b84610b3d565b815181516107509190610afe565b8252602080830151908201516107669190610afe565b60208301526040808301519082015161077f9190610afe565b6040830152606080830151908201516107989190610afe565b60609092019190915250565b6000808084116107e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114da565b8215806107eb575084155b156107f957600091506106d9565b8380151561080357fe5b8584099050836108138583610abc565b81151561081c57fe5b0690506106c88584610a56565b6000808311610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114da565b61021161073c8584610a56565b600061039361087f83610b54565b610fad565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b8181101561098b57835185526020948501949093019260010161096d565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b818110156109d45783518552602094850194909301926001016109b6565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b81811015610a1c5783518552602094850194909301926001016109fe565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08883030188525060405250505050509392505050565b600080831515610a695760009150610ab5565b50828202828482811515610a7957fe5b0414610ab1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114ea565b8091505b5092915050565b600082821115610af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114ca565b50900390565b600082820183811015610ab1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906114ea565b6000808284811515610b4b57fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b60208310610ddc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d9f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b60208310610e7757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610e3a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310610f1257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610ed5565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b60006110228235611581565b9392505050565b6000601f8201831361103a57600080fd5b813561104d6110488261152f565b611508565b9150808252602083016020830185838301111561106957600080fd5b61107483828461159a565b50505092915050565b60006080828403121561108f57600080fd5b6110996080611508565b905060006110a78484611235565b82525060206110b884848301611235565b60208301525060406110cc84828501611235565b60408301525060606110e084828501611235565b60608301525092915050565b600061018082840312156110ff57600080fd5b61110a610180611508565b905060006111188484611016565b825250602061112984848301611016565b602083015250604061113d84828501611016565b604083015250606061115184828501611016565b606083015250608061116584828501611235565b60808301525060a061117984828501611235565b60a08301525060c061118d84828501611235565b60c08301525060e06111a184828501611235565b60e0830152506101006111b684828501611235565b610100830152506101206111cc84828501611235565b6101208301525061014082013567ffffffffffffffff8111156111ee57600080fd5b6111fa84828501611029565b6101408301525061016082013567ffffffffffffffff81111561121c57600080fd5b61122884828501611029565b6101608301525092915050565b6000611022823561157e565b600080610100838503121561125557600080fd5b6000611261858561107d565b92505060806112728582860161107d565b9150509250929050565b60006020828403121561128e57600080fd5b813567ffffffffffffffff8111156112a557600080fd5b610211848285016110ec565b6000806000606084860312156112c657600080fd5b833567ffffffffffffffff8111156112dd57600080fd5b6112e9868287016110ec565b93505060206112fa86828701611235565b925050604084013567ffffffffffffffff81111561131757600080fd5b61132386828701611029565b9150509250925092565b60008060006060848603121561134257600080fd5b600061134e8686611235565b935050602061135f86828701611235565b925050604061132386828701611235565b61137981611579565b82525050565b6113798161157e565b600061139382611575565b8084526113a78160208601602086016115a6565b6113b0816115d2565b9093016020019392505050565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b601081527f4449564953494f4e5f42595f5a45524f00000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b8051608083019061145e848261137f565b506020820151611471602085018261137f565b506040820151611484604085018261137f565b506060820151611497606085018261137f565b50505050565b602081016103938284611370565b60208101610393828461137f565b602080825281016110228184611388565b60208082528101610393816113bd565b60208082528101610393816113ed565b602080825281016103938161141d565b60808101610393828461144d565b60405181810167ffffffffffffffff8111828210171561152757600080fd5b604052919050565b600067ffffffffffffffff82111561154657600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b151590565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b838110156115c15781810151838201526020016115a9565b838111156114975750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a7230582054bf246f11dbed15e52bfe7f20ff4b47b9f6d2d020efc54b73bb8fd1cd94115f6c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1BE23901 DUP2 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x20777F70 EQ PUSH2 0xDE JUMPI DUP1 PUSH4 0x494D9297 EQ PUSH2 0x10B JUMPI DUP1 PUSH4 0x66758D7B EQ PUSH2 0x120 JUMPI DUP1 PUSH4 0x679D2F9A EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0x7D33C6EE EQ PUSH2 0x16D JUMPI DUP1 PUSH4 0xBE7ADA1E EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0xD9802088 EQ PUSH2 0x1A2 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x1C2 JUMPI DUP1 PUSH4 0xE9C7AA1A EQ PUSH2 0x1D7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC8 PUSH2 0xC3 CALLDATASIZE PUSH1 0x4 PUSH2 0x132D JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x149D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0xF9 CALLDATASIZE PUSH1 0x4 PUSH2 0x132D JUMP JUMPDEST PUSH2 0x219 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x14AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x226 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x140 PUSH2 0x13B CALLDATASIZE PUSH1 0x4 PUSH2 0x1241 JUMP JUMPDEST PUSH2 0x37E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x14FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC8 PUSH2 0x168 CALLDATASIZE PUSH1 0x4 PUSH2 0x132D JUMP JUMPDEST PUSH2 0x399 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x179 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x3A6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x19D CALLDATASIZE PUSH1 0x4 PUSH2 0x132D JUMP JUMPDEST PUSH2 0x626 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x1BD CALLDATASIZE PUSH1 0x4 PUSH2 0x127C JUMP JUMPDEST PUSH2 0x633 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFE PUSH2 0x63E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F7 PUSH2 0x1F2 CALLDATASIZE PUSH1 0x4 PUSH2 0x12B1 JUMP JUMPDEST PUSH2 0x644 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x14B9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x651 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x6E1 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 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x34C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x30F JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x386 PUSH2 0xFED JUMP JUMPDEST PUSH2 0x390 DUP4 DUP4 PUSH2 0x742 JUMP JUMPDEST POP DUP2 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x7A4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x34C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x30F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x829 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x393 DUP3 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x211 DUP5 DUP5 DUP5 PUSH2 0x884 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP5 GT PUSH2 0x696 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 ISZERO DUP1 PUSH2 0x6A1 JUMPI POP DUP5 ISZERO JUMPDEST ISZERO PUSH2 0x6AF JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x6D9 JUMP JUMPDEST DUP4 DUP1 ISZERO ISZERO PUSH2 0x6B9 JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP PUSH2 0x6C8 DUP6 DUP5 PUSH2 0xA56 JUMP JUMPDEST PUSH2 0x6D4 PUSH2 0x3E8 DUP4 PUSH2 0xA56 JUMP JUMPDEST LT ISZERO SWAP2 POP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 GT PUSH2 0x71C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14DA JUMP JUMPDEST PUSH2 0x211 PUSH2 0x73C PUSH2 0x72C DUP7 DUP6 PUSH2 0xA56 JUMP JUMPDEST PUSH2 0x737 DUP7 PUSH1 0x1 PUSH2 0xABC JUMP JUMPDEST PUSH2 0xAFE JUMP JUMPDEST DUP5 PUSH2 0xB3D JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x750 SWAP2 SWAP1 PUSH2 0xAFE JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x766 SWAP2 SWAP1 PUSH2 0xAFE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x77F SWAP2 SWAP1 PUSH2 0xAFE JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x798 SWAP2 SWAP1 PUSH2 0xAFE JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP5 GT PUSH2 0x7E0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14DA JUMP JUMPDEST DUP3 ISZERO DUP1 PUSH2 0x7EB JUMPI POP DUP5 ISZERO JUMPDEST ISZERO PUSH2 0x7F9 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x6D9 JUMP JUMPDEST DUP4 DUP1 ISZERO ISZERO PUSH2 0x803 JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP DUP4 PUSH2 0x813 DUP6 DUP4 PUSH2 0xABC JUMP JUMPDEST DUP2 ISZERO ISZERO PUSH2 0x81C JUMPI INVALID JUMPDEST MOD SWAP1 POP PUSH2 0x6C8 DUP6 DUP5 PUSH2 0xA56 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 GT PUSH2 0x864 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14DA JUMP JUMPDEST PUSH2 0x211 PUSH2 0x73C DUP6 DUP5 PUSH2 0xA56 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x393 PUSH2 0x87F DUP4 PUSH2 0xB54 JUMP JUMPDEST PUSH2 0xFAD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x98B JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x96D JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9D4 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x9B6 JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA1C JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x9FE JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP9 DUP4 SUB ADD DUP9 MSTORE POP PUSH1 0x40 MSTORE POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0xA69 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0xAB5 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0xA79 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0xAB1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14EA JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xAF8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14CA JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xAB1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x68D SWAP1 PUSH2 0x14EA JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0xB4B JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xDDC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xD9F 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 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xE77 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE3A 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 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xF12 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xED5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 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 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 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 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1022 DUP3 CALLDATALOAD PUSH2 0x1581 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x103A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x104D PUSH2 0x1048 DUP3 PUSH2 0x152F JUMP JUMPDEST PUSH2 0x1508 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1069 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1074 DUP4 DUP3 DUP5 PUSH2 0x159A JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x108F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1099 PUSH1 0x80 PUSH2 0x1508 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x10A7 DUP5 DUP5 PUSH2 0x1235 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x10B8 DUP5 DUP5 DUP4 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x10CC DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x10E0 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x10FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x110A PUSH2 0x180 PUSH2 0x1508 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1118 DUP5 DUP5 PUSH2 0x1016 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1129 DUP5 DUP5 DUP4 ADD PUSH2 0x1016 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x113D DUP5 DUP3 DUP6 ADD PUSH2 0x1016 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x1151 DUP5 DUP3 DUP6 ADD PUSH2 0x1016 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x1165 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x1179 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x118D DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x11A1 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x11B6 DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x11CC DUP5 DUP3 DUP6 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11FA DUP5 DUP3 DUP6 ADD PUSH2 0x1029 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x121C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1228 DUP5 DUP3 DUP6 ADD PUSH2 0x1029 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1022 DUP3 CALLDATALOAD PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x100 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1255 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1261 DUP6 DUP6 PUSH2 0x107D JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x1272 DUP6 DUP3 DUP7 ADD PUSH2 0x107D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x128E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x211 DUP5 DUP3 DUP6 ADD PUSH2 0x10EC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x12C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12E9 DUP7 DUP3 DUP8 ADD PUSH2 0x10EC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x12FA DUP7 DUP3 DUP8 ADD PUSH2 0x1235 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1323 DUP7 DUP3 DUP8 ADD PUSH2 0x1029 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1342 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x134E DUP7 DUP7 PUSH2 0x1235 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x135F DUP7 DUP3 DUP8 ADD PUSH2 0x1235 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x1323 DUP7 DUP3 DUP8 ADD PUSH2 0x1235 JUMP JUMPDEST PUSH2 0x1379 DUP2 PUSH2 0x1579 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1379 DUP2 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1393 DUP3 PUSH2 0x1575 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x13A7 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15A6 JUMP JUMPDEST PUSH2 0x13B0 DUP2 PUSH2 0x15D2 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4449564953494F4E5F42595F5A45524F00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x145E DUP5 DUP3 PUSH2 0x137F JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x1471 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x137F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1484 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x137F JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x1497 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x137F JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x393 DUP3 DUP5 PUSH2 0x1370 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x393 DUP3 DUP5 PUSH2 0x137F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1022 DUP2 DUP5 PUSH2 0x1388 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x393 DUP2 PUSH2 0x13BD JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x393 DUP2 PUSH2 0x13ED JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x393 DUP2 PUSH2 0x141D JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x393 DUP3 DUP5 PUSH2 0x144D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1527 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1546 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 ISZERO ISZERO SWAP1 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 0x15C1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15A9 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1497 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SLOAD 0xbf 0x24 PUSH16 0x11DBED15E52BFE7F20FF4B47B9F6D2D0 KECCAK256 0xef 0xc5 0x4b PUSH20 0xBB8FD1CD94115F6C6578706572696D656E74616C 0xf5 STOP CALLDATACOPY ",
"sourceMap": "859:2673:67:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2076:334;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2076:334:67;;;;;;;;;;;;;;;;;;;;;;;;;1715:355;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1715:355:67;;;;;;;;;;;;;;;;;3092:157;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3092:157:67;;;;3255:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3255:275:67;;;;;;;;;;;;;;;;;2416:332;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2416:332:67;;;;;;;;;2950:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2950:136:67;;;;1352:357;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1352:357:67;;;;;;;;;2754:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2754:190:67;;;;;;;;;1301:33:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1301:33:44;;;;952:394:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;952:394:67;;;;;;;;;;;;;;;;;2076:334;2243:12;2281:98;2315:9;2338:11;2363:6;2281:20;:98::i;:::-;2271:108;2076:334;-1:-1:-1;;;;2076:334:67:o;1715:355::-;1882:21;1935:98;1969:9;1992:11;2017:6;1935:20;:98::i;3092:157::-;1045:148:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1045:148:44;;;;;;;;1035:159;;3177:7:67;;1045:148:44;;;1035:159;;;;;1045:148;1035:159;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1035:159:44;;;;;;;;;;;;;;;;3200:42:67;;3092:157;:::o;3255:275::-;3405:11;;:::i;:::-;3439:51;3454:16;3472:17;3439:14;:51::i;:::-;-1:-1:-1;3507:16:67;3255:275;;;;;:::o;2416:332::-;2582:12;2620:97;2653:9;2676:11;2701:6;2620:19;:97::i;2950:136::-;777:457:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;777:457:48;;;;;;;;767:468;;3025:7:67;;777:457:48;;;767:468;;;;;777:457;767:468;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;1352:357:67;1520:21;1573:99;1608:9;1631:11;1656:6;1573:21;:99::i;2754:190::-;2847:17;2892:19;2905:5;2892:12;:19::i;1301:33:44:-;;;;:::o;952:394:67:-;1135:30;1201:104;1233:5;1252:20;1286:9;1201:18;:104::i;4779:1869:47:-;4942:12;;4991:15;;;4970:78;;;;;;;;;;;;;;;;;;;;;;5868:11;;;:29;;-1:-1:-1;5883:14:47;;5868:29;5864:72;;;5920:5;5913:12;;;;5864:72;6522:11;6459:84;;;;;;;6499:9;6479:6;6459:84;6439:104;;6591:26;6599:9;6610:6;6591:7;:26::i;:::-;6563:24;6571:4;6577:9;6563:7;:24::i;:::-;:54;;;-1:-1:-1;4779:1869:47;;;;;;;:::o;3825:691::-;3988:21;4046:15;;;4025:78;;;;;;;;;;;;;;4317:162;4338:106;4363:26;4371:9;4382:6;4363:7;:26::i;:::-;4407:23;4415:11;4428:1;4407:7;:23::i;:::-;4338:7;:106::i;:::-;4458:11;4317:7;:162::i;1771:648:46:-;1964:39;;2005:40;;1956:90;;1964:39;1956:7;:90::i;:::-;1914:132;;2106:39;;;;;2147:40;;;;2098:90;;2106:39;2098:7;:90::i;:::-;2056:39;;;:132;2238:29;;;;;2269:30;;;;2230:70;;2238:29;2230:7;:70::i;:::-;2198:29;;;:102;2350:29;;;;;2381:30;;;;2342:70;;2350:29;2342:7;:70::i;:::-;2310:29;;;;:102;;;;-1:-1:-1;1771:648:46:o;6909:918:47:-;7071:12;;7120:15;;;7099:78;;;;;;;;;;;;;;7250:11;;;:29;;-1:-1:-1;7265:14:47;;7250:29;7246:257;;;7487:5;7480:12;;;;7246:257;7634:11;7571:84;;;;;;;7611:9;7591:6;7571:84;7551:104;;7711:11;7677:31;7685:11;7698:9;7677:7;:31::i;:::-;:45;;;;;;;;7665:57;;7770:26;7778:9;7789:6;7770:7;:26::i;3123:425::-;3287:21;3345:15;;;3324:78;;;;;;;;;;;;;;3429:82;3450:26;3458:9;3469:6;3450:7;:26::i;4211:202:48:-;4300:17;4345:35;4363:16;4373:5;4363:9;:16::i;:::-;4345:17;:35::i;1011:10099:42:-;5031:4;5025:11;;5321:66;5314:4;5291:28;;;5284:104;;;;1199:30;5445:4;5422:28;;6444:59;;;6770:19;;5736:26;;;6750:40;;;6883:23;;;6877:30;6853:22;;;6846:62;6979:23;;;6973:30;6949:22;;;6942:62;7082:23;;;7076:30;7052:22;;;7045:62;7197:4;7179:23;;7173:30;7149:22;;;7142:62;7297:4;7279:23;;7273:30;7249:22;;;7242:62;7397:4;7379:23;;7373:30;7349:22;;;7342:62;7495:4;7477:23;;7471:30;7447:22;;;7440:62;7594:5;7576:24;;7570:31;7545:23;;;7538:64;7699:5;7681:24;;7675:31;7650:23;;;7643:64;7787:5;7769:24;;7763:31;;7738:23;;;7731:64;;;7895:5;7877:24;;7871:31;7846:23;;;7839:64;7979:5;8106:74;;8268:24;8340:19;;7962:23;;;8544:34;;;5025:11;;5422:28;;;;6536:27;;;;5736:26;;8606:22;;;;8388:23;;;;8464:4;8445:24;;8441:35;6190:1;8698:237;8721:13;8718:1;8715:20;8698:237;;;8791:19;;8771:40;;8860:4;8843:22;;;;8898:23;;;;8749:1;8742:9;8698:237;;;-1:-1:-1;;;;9045:31:42;;;9029:13;9010:33;;;9003:74;;;;9171:17;;9165:24;9237:19;;9441:34;;;9037:4;9503:22;;;;9285:23;;;;9361:4;9342:24;;9338:35;9610:1;9596:237;9619:13;9616:1;9613:20;9596:237;;;9689:19;;9669:40;;9758:4;9741:22;;;;9796:23;;;;9647:1;9640:9;9596:237;;;-1:-1:-1;;;9902:46:42;;;-1:-1:-1;10133:33:42;;;10003:4;9981:27;;;10108:59;;;10281:19;;10472:34;;;9981:27;;10534:22;;;;10329:23;;;;10281:19;10405:4;10386:24;;10382:35;-1:-1:-1;10613:237:42;10636:13;10633:1;10630:20;10613:237;;;10706:19;;10686:40;;10775:4;10758:22;;;;10813:23;;;;10664:1;10657:9;10613:237;;;-1:-1:-1;;;10928:46:42;;;;;10902:73;;-1:-1:-1;11041:4:42;11034:25;-1:-1:-1;;;;;1011:10099:42;;;;;:::o;51:288:84:-;137:7;;164:6;;160:45;;;193:1;186:8;;;;160:45;-1:-1:-1;226:5:84;;;230:1;226;:5;262;;;;;;;;:10;241:73;;;;;;;;;;;;;;331:1;324:8;;51:288;;;;;;:::o;502:208::-;588:7;632:6;;;;611:70;;;;;;;;;;;;;;-1:-1:-1;698:5:84;;;502:208::o;716:230::-;802:7;837:5;;;873:6;;;;852:69;;;;;;;;;;;;;345:151;431:7;454:9;470:1;466;:5;;;;;;;;;345:151;-1:-1:-1;;;;345:151:84:o;4553:1678:48:-;777:457;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;777:457:48;;;;;;;;767:468;;4639:14;;;;;;;;777:457;;;;;767:468;;;;777:457;767:468;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;;767:468:48;;;;;;;;;;;4763:20;;;;4753:31;;767:468;;-1:-1:-1;4763:20:48;-1:-1:-1;767:468:48;;-1:-1:-1;767:468:48;;4753:31;;;-1:-1:-1;4753:31:48;767:468;4753:31;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;;4753:31:48;;;;;;;;;;;4833:20;;;;4823:31;;4753;;-1:-1:-1;4833:20:48;-1:-1:-1;4753:31:48;;-1:-1:-1;4753:31:48;;4823;;;-1:-1:-1;4823:31:48;4753;4823;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;;4823:31:48;;;;;;;;;;5620:14;;;5763:11;;5670:3;5659:15;;5800:11;;5710:3;5699:15;;;5837:11;;5903:24;;;5940:32;;;5985;;;6056:3;6040:20;;6109:19;;6141;;;-1:-1:-1;;;6173:19:48;;;-1:-1:-1;6040:20:48;;4553:1678;-1:-1:-1;4553:1678:48:o;1834:924:44:-;1928:14;1985:18;2297:2;2291:9;2329:66;2314:82;;2446:1;2434:14;;2427:40;;;;2564:2;2552:15;;2545:35;;;;2716:2;2698:21;;;1834:924::o;859:2673:67:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;131:432;;221:4;209:17;;205:27;-1:-1;195:2;;246:1;243;236:12;195:2;283:6;270:20;305:60;320:44;357:6;320:44;;;305:60;;;296:69;;385:6;378:5;371:21;421:4;413:6;409:17;454:4;447:5;443:16;489:3;480:6;475:3;471:16;468:25;465:2;;;506:1;503;496:12;465:2;516:41;550:6;545:3;540;516:41;;;188:375;;;;;;;;1060:811;;1179:4;1167:9;1162:3;1158:19;1154:30;1151:2;;;1197:1;1194;1187:12;1151:2;1215:20;1230:4;1215:20;;;1206:29;-1:-1;1303:1;1334:49;1379:3;1359:9;1334:49;;;1310:74;;-1:-1;1463:2;1496:49;1541:3;1517:22;;;1496:49;;;1489:4;1482:5;1478:16;1471:75;1405:152;1615:2;1648:49;1693:3;1684:6;1673:9;1669:22;1648:49;;;1641:4;1634:5;1630:16;1623:75;1567:142;1767:2;1800:49;1845:3;1836:6;1825:9;1821:22;1800:49;;;1793:4;1786:5;1782:16;1775:75;1719:142;1145:726;;;;;1906:2209;;2018:5;2006:9;2001:3;1997:19;1993:31;1990:2;;;2037:1;2034;2027:12;1990:2;2055:21;2070:5;2055:21;;;2046:30;-1:-1;2134:1;2165:49;2210:3;2190:9;2165:49;;;2141:74;;-1:-1;2284:2;2317:49;2362:3;2338:22;;;2317:49;;;2310:4;2303:5;2299:16;2292:75;2236:142;2443:2;2476:49;2521:3;2512:6;2501:9;2497:22;2476:49;;;2469:4;2462:5;2458:16;2451:75;2388:149;2596:2;2629:49;2674:3;2665:6;2654:9;2650:22;2629:49;;;2622:4;2615:5;2611:16;2604:75;2547:143;2752:3;2786:49;2831:3;2822:6;2811:9;2807:22;2786:49;;;2779:4;2772:5;2768:16;2761:75;2700:147;2909:3;2943:49;2988:3;2979:6;2968:9;2964:22;2943:49;;;2936:4;2929:5;2925:16;2918:75;2857:147;3058:3;3092:49;3137:3;3128:6;3117:9;3113:22;3092:49;;;3085:4;3078:5;3074:16;3067:75;3014:139;3207:3;3241:49;3286:3;3277:6;3266:9;3262:22;3241:49;;;3234:4;3227:5;3223:16;3216:75;3163:139;3369:3;3404:49;3449:3;3440:6;3429:9;3425:22;3404:49;;;3396:5;3389;3385:17;3378:76;3312:153;3515:3;3550:49;3595:3;3586:6;3575:9;3571:22;3550:49;;;3542:5;3535;3531:17;3524:76;3475:136;3699:3;3688:9;3684:19;3671:33;3724:18;3716:6;3713:30;3710:2;;;3756:1;3753;3746:12;3710:2;3792:54;3842:3;3833:6;3822:9;3818:22;3792:54;;;3784:5;3777;3773:17;3766:81;3621:237;3946:3;3935:9;3931:19;3918:33;3971:18;3963:6;3960:30;3957:2;;;4003:1;4000;3993:12;3957:2;4039:54;4089:3;4080:6;4069:9;4065:22;4039:54;;;4031:5;4024;4020:17;4013:81;3868:237;1984:2131;;;;;4122:118;;4189:46;4227:6;4214:20;4189:46;;4247:488;;;4428:3;4416:9;4407:7;4403:23;4399:33;4396:2;;;4445:1;4442;4435:12;4396:2;4480:1;4497:83;4572:7;4552:9;4497:83;;;4487:93;;4459:127;4617:3;4636:83;4711:7;4702:6;4691:9;4687:22;4636:83;;;4626:93;;4596:129;4390:345;;;;;;4742:373;;4869:2;4857:9;4848:7;4844:23;4840:32;4837:2;;;4885:1;4882;4875:12;4837:2;4920:31;;4971:18;4960:30;;4957:2;;;5003:1;5000;4993:12;4957:2;5023:76;5091:7;5082:6;5071:9;5067:22;5023:76;;5122:727;;;;5292:2;5280:9;5271:7;5267:23;5263:32;5260:2;;;5308:1;5305;5298:12;5260:2;5343:31;;5394:18;5383:30;;5380:2;;;5426:1;5423;5416:12;5380:2;5446:76;5514:7;5505:6;5494:9;5490:22;5446:76;;;5436:86;;5322:206;5559:2;5577:53;5622:7;5613:6;5602:9;5598:22;5577:53;;;5567:63;;5538:98;5695:2;5684:9;5680:18;5667:32;5719:18;5711:6;5708:30;5705:2;;;5751:1;5748;5741:12;5705:2;5771:62;5825:7;5816:6;5805:9;5801:22;5771:62;;;5761:72;;5646:193;5254:595;;;;;;5856:491;;;;5994:2;5982:9;5973:7;5969:23;5965:32;5962:2;;;6010:1;6007;6000:12;5962:2;6045:1;6062:53;6107:7;6087:9;6062:53;;;6052:63;;6024:97;6152:2;6170:53;6215:7;6206:6;6195:9;6191:22;6170:53;;;6160:63;;6131:98;6260:2;6278:53;6323:7;6314:6;6303:9;6299:22;6278:53;;6354:101;6421:28;6443:5;6421:28;;;6416:3;6409:41;6403:52;;;6462:110;6535:31;6560:5;6535:31;;6579:297;;6679:38;6711:5;6679:38;;;6734:6;6729:3;6722:19;6746:63;6802:6;6795:4;6790:3;6786:14;6779:4;6772:5;6768:16;6746:63;;;6841:29;6863:6;6841:29;;;6821:50;;;6834:4;6821:50;;6659:217;-1:-1;;;6659:217;6884:296;7039:2;7027:15;;7076:66;7071:2;7062:12;;7055:88;7171:2;7162:12;;7020:160;7189:296;7344:2;7332:15;;7381:66;7376:2;7367:12;;7360:88;7476:2;7467:12;;7325:160;7494:296;7649:2;7637:15;;7686:66;7681:2;7672:12;;7665:88;7781:2;7772:12;;7630:160;7875:890;8105:22;;8018:4;8009:14;;;8139:61;8013:3;8105:22;8139:61;;;8038:174;8306:4;8299:5;8295:16;8289:23;8324:62;8380:4;8375:3;8371:14;8358:11;8324:62;;;8222:176;8482:4;8475:5;8471:16;8465:23;8500:62;8556:4;8551:3;8547:14;8534:11;8500:62;;;8408:166;8658:4;8651:5;8647:16;8641:23;8676:62;8732:4;8727:3;8723:14;8710:11;8676:62;;;8584:166;7991:774;;;;8889:181;8991:2;8976:18;;9005:55;8980:9;9033:6;9005:55;;9077:193;9185:2;9170:18;;9199:61;9174:9;9233:6;9199:61;;9277:277;9403:2;9417:47;;;9388:18;;9478:66;9388:18;9530:6;9478:66;;9561:387;9742:2;9756:47;;;9727:18;;9817:121;9727:18;9817:121;;9955:387;10136:2;10150:47;;;10121:18;;10211:121;10121:18;10211:121;;10349:387;10530:2;10544:47;;;10515:18;;10605:121;10515:18;10605:121;;10743:314;10911:3;10896:19;;10926:121;10900:9;11020:6;10926:121;;11264:256;11326:2;11320:9;11352:17;;;11427:18;11412:34;;11448:22;;;11409:62;11406:2;;;11484:1;11481;11474:12;11406:2;11500;11493:22;11304:216;;-1:-1;11304:216;11527:254;;11666:18;11658:6;11655:30;11652:2;;;11698:1;11695;11688:12;11652:2;-1:-1;11771:4;11742;11719:17;;;;11738:9;11715:33;11761:15;;11589:192;12053:91;12127:12;;12111:33;12151:92;12224:13;12217:21;;12200:43;12250:79;12319:5;12302:27;12422:128;12502:42;12491:54;;12474:76;12644:145;12725:6;12720:3;12715;12702:30;-1:-1;12781:1;12763:16;;12756:27;12695:94;12798:268;12863:1;12870:101;12884:6;12881:1;12878:13;12870:101;;;12951:11;;;12945:18;12932:11;;;12925:39;12906:2;12899:10;12870:101;;;12986:6;12983:1;12980:13;12977:2;;;-1:-1;;13051:1;13033:16;;13026:27;12847:219;13074:97;13162:2;13142:14;13158:7;13138:28;;13122:49"
}
}
},
"sources": {
"test/TestLibs/TestLibs.sol": {
"id": 67
},
"protocol/Exchange/libs/LibMath.sol": {
"id": 47
},
"utils/SafeMath/SafeMath.sol": {
"id": 84
},
"protocol/Exchange/libs/LibOrder.sol": {
"id": 48
},
"protocol/Exchange/libs/LibEIP712.sol": {
"id": 44
},
"protocol/Exchange/libs/LibFillResults.sol": {
"id": 46
},
"protocol/Exchange/libs/LibAbiEncoder.sol": {
"id": 42
}
},
"sourceCodes": {
"test/TestLibs/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.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibMath.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../../protocol/Exchange/libs/LibAbiEncoder.sol\";\n\n\ncontract TestLibs is \n LibMath,\n LibOrder,\n LibFillResults,\n LibAbiEncoder\n{\n function publicAbiEncodeFillOrder(\n Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n pure\n returns (bytes memory fillOrderCalldata)\n {\n fillOrderCalldata = abiEncodeFillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n return fillOrderCalldata;\n }\n\n function publicGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n public\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = getPartialAmountFloor(\n numerator,\n denominator,\n target\n );\n return partialAmount;\n }\n\n function publicGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n public\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = getPartialAmountCeil(\n numerator,\n denominator,\n target\n );\n return partialAmount;\n }\n\n function publicIsRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n public\n pure\n returns (bool isError)\n {\n isError = isRoundingErrorFloor(\n numerator,\n denominator,\n target\n );\n return isError;\n }\n\n function publicIsRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n public\n pure\n returns (bool isError)\n {\n isError = isRoundingErrorCeil(\n numerator,\n denominator,\n target\n );\n return isError;\n }\n\n function publicGetOrderHash(Order memory order)\n public\n view\n returns (bytes32 orderHash)\n {\n orderHash = getOrderHash(order);\n return orderHash;\n }\n\n function getOrderSchemaHash()\n public\n pure\n returns (bytes32)\n {\n return EIP712_ORDER_SCHEMA_HASH;\n }\n\n function getDomainSeparatorSchemaHash()\n public\n pure\n returns (bytes32)\n {\n return EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n }\n\n function publicAddFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n public\n pure\n returns (FillResults memory)\n {\n addFillResults(totalFillResults, singleFillResults);\n return totalFillResults;\n }\n}\n",
"protocol/Exchange/libs/LibMath.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.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibMath is\n SafeMath\n{\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function safeGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n require(\n denominator > 0,\n \"DIVISION_BY_ZERO\"\n );\n\n require(\n !isRoundingErrorFloor(\n numerator,\n denominator,\n target\n ),\n \"ROUNDING_ERROR\"\n );\n \n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function safeGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n require(\n denominator > 0,\n \"DIVISION_BY_ZERO\"\n );\n\n require(\n !isRoundingErrorCeil(\n numerator,\n denominator,\n target\n ),\n \"ROUNDING_ERROR\"\n );\n \n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = safeDiv(\n safeAdd(\n safeMul(numerator, target),\n safeSub(denominator, 1)\n ),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function getPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n require(\n denominator > 0,\n \"DIVISION_BY_ZERO\"\n );\n\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n \n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function getPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n require(\n denominator > 0,\n \"DIVISION_BY_ZERO\"\n );\n\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = safeDiv(\n safeAdd(\n safeMul(numerator, target),\n safeSub(denominator, 1)\n ),\n denominator\n );\n return partialAmount;\n }\n \n /// @dev Checks if rounding error >= 0.1% when rounding down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n require(\n denominator > 0,\n \"DIVISION_BY_ZERO\"\n );\n \n // The absolute rounding error is the difference between the rounded\n // value and the ideal value. The relative rounding error is the\n // absolute rounding error divided by the absolute value of the\n // ideal value. This is undefined when the ideal value is zero.\n //\n // The ideal value is `numerator * target / denominator`.\n // Let's call `numerator * target % denominator` the remainder.\n // The absolute error is `remainder / denominator`.\n //\n // When the ideal value is zero, we require the absolute error to\n // be zero. Fortunately, this is always the case. The ideal value is\n // zero iff `numerator == 0` and/or `target == 0`. In this case the\n // remainder and absolute error are also zero. \n if (target == 0 || numerator == 0) {\n return false;\n }\n \n // Otherwise, we want the relative rounding error to be strictly\n // less than 0.1%.\n // The relative error is `remainder / (numerator * target)`.\n // We want the relative error less than 1 / 1000:\n // remainder / (numerator * denominator) < 1 / 1000\n // or equivalently:\n // 1000 * remainder < numerator * target\n // so we have a rounding error iff:\n // 1000 * remainder >= numerator * target\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n isError = safeMul(1000, remainder) >= safeMul(numerator, target);\n return isError;\n }\n \n /// @dev Checks if rounding error >= 0.1% when rounding up.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n require(\n denominator > 0,\n \"DIVISION_BY_ZERO\"\n );\n \n // See the comments in `isRoundingError`.\n if (target == 0 || numerator == 0) {\n // When either is zero, the ideal value and rounded value are zero\n // and there is no rounding error. (Although the relative error\n // is undefined.)\n return false;\n }\n // Compute remainder as before\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n remainder = safeSub(denominator, remainder) % denominator;\n isError = safeMul(1000, remainder) >= safeMul(numerator, target);\n return isError;\n }\n}\n",
"utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n",
"protocol/Exchange/libs/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.4.24;\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",
"protocol/Exchange/libs/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.4.24;\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 bytes32(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",
"protocol/Exchange/libs/LibFillResults.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.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
"protocol/Exchange/libs/LibAbiEncoder.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.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./LibOrder.sol\";\n\n\ncontract LibAbiEncoder {\n\n /// @dev ABI encodes calldata for `fillOrder`.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return ABI encoded calldata for `fillOrder`.\n function abiEncodeFillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory fillOrderCalldata)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. Start -- Start of this area in memory\n // 2. End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n fillOrderCalldata := mload(0x40)\n // bytes4(keccak256(\"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"))\n // = 0xb4be83d5\n // Leave 0x20 bytes to store the length\n mstore(add(fillOrderCalldata, 0x20), 0xb4be83d500000000000000000000000000000000000000000000000000000000)\n let headerAreaEnd := add(fillOrderCalldata, 0x24)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to \n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of \n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of \n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of \n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to \n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of \n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of \n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of \n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Set length of calldata\n mstore(fillOrderCalldata, sub(dataAreaEnd, add(fillOrderCalldata, 0x20)))\n\n // Increment free memory pointer\n mstore(0x40, dataAreaEnd)\n }\n\n return fillOrderCalldata;\n }\n}\n"
},
"sourceTreeHashHex": "0xa2e6ced6e8fad38f3b25688799aa4500fc942b7cb81f73860acffb06bbb5f763",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"enabled": true,
"runs": 1000000
},
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap"
]
}
}
}
},
"networks": {}
}