{
"schemaVersion": "2.0.0",
"contractName": "TestAssetDataDecoders",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
}
],
"name": "addAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "authorities",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "assetData",
"type": "bytes[]"
},
{
"name": "from",
"type": "address[]"
},
{
"name": "to",
"type": "address[]"
},
{
"name": "amounts",
"type": "uint256[]"
}
],
"name": "batchTransferFrom",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
}
],
"name": "removeAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "assetData",
"type": "bytes"
}
],
"name": "publicDecodeERC721Data",
"outputs": [
{
"name": "token",
"type": "address"
},
{
"name": "tokenId",
"type": "uint256"
},
{
"name": "receiverData",
"type": "bytes"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
},
{
"name": "index",
"type": "uint256"
}
],
"name": "removeAuthorizedAddressAtIndex",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "assetData",
"type": "bytes"
},
{
"name": "from",
"type": "address"
},
{
"name": "to",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getProxyId",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "authorized",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getAuthorizedAddresses",
"outputs": [
{
"name": "",
"type": "address[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "target",
"type": "address"
},
{
"indexed": true,
"name": "caller",
"type": "address"
}
],
"name": "AuthorizedAddressAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "target",
"type": "address"
},
{
"indexed": true,
"name": "caller",
"type": "address"
}
],
"name": "AuthorizedAddressRemoved",
"type": "event"
}
],
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405260008054600160a060020a03191633179055611558806100256000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100be578063494503d4146100e0578063563c875d14610116578063707129391461013657806372c2f527146101565780638da5cb5b146101855780639ad267441461019a578063a85e59e4146101ba578063ae25532e146101da578063b9181611146101fc578063d39de6e914610229578063f2fde38b1461024b575b600080fd5b3480156100ca57600080fd5b506100de6100d9366004611075565b61026b565b005b3480156100ec57600080fd5b506101006100fb366004611247565b6103b2565b60405161010d9190611371565b60405180910390f35b34801561012257600080fd5b506100de6101313660046110d5565b6103da565b34801561014257600080fd5b506100de610151366004611075565b6104cd565b34801561016257600080fd5b50610176610171366004611212565b61069b565b60405161010d939291906113c3565b34801561019157600080fd5b506101006106b6565b3480156101a657600080fd5b506100de6101b536600461109b565b6106c5565b3480156101c657600080fd5b506100de6101d5366004611195565b610887565b3480156101e657600080fd5b506101ef610933565b60405161010d9190611439565b34801561020857600080fd5b5061021c610217366004611075565b610939565b60405161010d919061140a565b34801561023557600080fd5b5061023e61094e565b60405161010d91906113f9565b34801561025757600080fd5b506100de610266366004611075565b6109b0565b600054600160a060020a031633146102a15760405160e560020a62461bcd02815260040161029890611429565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103165760405160e560020a62461bcd0281526004016102989190611418565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103c057fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104475760405160e560020a62461bcd0281526004016102989190611418565b50600090505b84518110156104c6576104be858281518110151561046757fe5b90602001906020020151858381518110151561047f57fe5b90602001906020020151858481518110151561049757fe5b9060200190602002015185858151811015156104af57fe5b90602001906020020151610a18565b60010161044d565b5050505050565b60008054600160a060020a031633146104fb5760405160e560020a62461bcd02815260040161029890611429565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105715760405160e560020a62461bcd0281526004016102989190611418565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106615781600160a060020a03166002828154811015156105b757fe5b600091825260209091200154600160a060020a03161415610659576002805460001981019081106105e457fe5b60009182526020909120015460028054600160a060020a03909216918390811061060a57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106539082610e3c565b50610661565b600101610594565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60008060606106a984610b11565b9196909550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061071f5760405160e560020a62461bcd0281526004016102989190611418565b5081600160a060020a031660028281548110151561073957fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107aa5760405160e560020a62461bcd0281526004016102989190611418565b50600160a060020a0382166000908152600160205260409020805460ff191690556002805460001981019081106107dd57fe5b60009182526020909120015460028054600160a060020a03909216918390811061080357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061084c9082610e3c565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156108f45760405160e560020a62461bcd0281526004016102989190611418565b506104c685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a18565b60025b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156109a657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610988575b5050505050905090565b600054600160a060020a031633146109dd5760405160e560020a62461bcd02815260040161029890611429565b600160a060020a03811615610a15576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600e81527f494e56414c49445f414d4f554e540000000000000000000000000000000000006020820152600090819060609060018514610a785760405160e560020a62461bcd0281526004016102989190611418565b50610a8287610b11565b92509250925082600160a060020a031663b88d4fde878785856040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610ad6949392919061137f565b600060405180830381600087803b158015610af057600080fd5b505af1158015610b04573d6000803e3d6000fd5b5050505050505050505050565b6000806060610b21846000610b4f565b9250610b2e846014610bf6565b9150603484511115610b4857610b45846034610c09565b90505b9193909250565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610bd95760405160e560020a62461bcd0281526004016102989190611418565b50506014818301810151910190600160a060020a03165b92915050565b6000610c028383610d02565b9392505050565b60606000610c178484610bf6565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610ca65760405160e560020a62461bcd0281526004016102989190611418565b50806040519080825280601f01601f191660200182016040528015610cd5578160200160208202803883390190505b509150610cfb610ce483610936565b60200184610cf187610936565b0160200183610d96565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610d8c5760405160e560020a62461bcd0281526004016102989190611418565b5050016020015190565b6020811015610dc0576001816020036101000a038019835116818551168082178652505050610e37565b82821415610dcd57610e37565b82821115610e075760208103905080820181840181515b82851015610dff578451865260209586019590940193610de4565b905250610e37565b60208103905080820181840183515b81861215610e325782518252601f199283019290910190610e16565b855250505b505050565b815481835581811115610e3757600083815260209020610e3791810190830161093691905b80821115610e755760008155600101610e61565b5090565b6000610c0282356114c1565b6000601f82018313610e9657600080fd5b8135610ea9610ea48261146e565b611447565b91508181835260208401935060208101905083856020840282011115610ece57600080fd5b60005b83811015610efa5781610ee48882610e79565b8452506020928301929190910190600101610ed1565b5050505092915050565b6000601f82018313610f1557600080fd5b8135610f23610ea48261146e565b81815260209384019390925082018360005b83811015610efa5781358601610f4b888261101a565b8452506020928301929190910190600101610f35565b6000601f82018313610f7257600080fd5b8135610f80610ea48261146e565b91508181835260208401935060208101905083856020840282011115610fa557600080fd5b60005b83811015610efa5781610fbb8882611069565b8452506020928301929190910190600101610fa8565b600080601f83018413610fe357600080fd5b50813567ffffffffffffffff811115610ffb57600080fd5b60208301915083600182028301111561101357600080fd5b9250929050565b6000601f8201831361102b57600080fd5b8135611039610ea48261148f565b9150808252602083016020830185838301111561105557600080fd5b6110608382846114d8565b50505092915050565b6000610c028235610936565b60006020828403121561108757600080fd5b60006110938484610e79565b949350505050565b600080604083850312156110ae57600080fd5b60006110ba8585610e79565b92505060206110cb85828601611069565b9150509250929050565b600080600080608085870312156110eb57600080fd5b843567ffffffffffffffff81111561110257600080fd5b61110e87828801610f04565b945050602085013567ffffffffffffffff81111561112b57600080fd5b61113787828801610e85565b935050604085013567ffffffffffffffff81111561115457600080fd5b61116087828801610e85565b925050606085013567ffffffffffffffff81111561117d57600080fd5b61118987828801610f61565b91505092959194509250565b6000806000806000608086880312156111ad57600080fd5b853567ffffffffffffffff8111156111c457600080fd5b6111d088828901610fd1565b955095505060206111e388828901610e79565b93505060406111f488828901610e79565b925050606061120588828901611069565b9150509295509295909350565b60006020828403121561122457600080fd5b813567ffffffffffffffff81111561123b57600080fd5b6110938482850161101a565b60006020828403121561125957600080fd5b60006110938484611069565b61126e816114c1565b82525050565b600061127f826114bd565b808452602084019350611291836114b7565b60005b828110156112c1576112a7868351611265565b6112b0826114b7565b602096909601959150600101611294565b5093949350505050565b61126e816114cd565b60006112df826114bd565b8084526112f38160208601602086016114e4565b6112fc81611514565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61126e81610936565b61126e816114d2565b60208101610bf08284611265565b6080810161138d8287611265565b61139a6020830186611265565b6113a7604083018561135f565b81810360608301526113b981846112d4565b9695505050505050565b606081016113d18286611265565b6113de602083018561135f565b81810360408301526113f081846112d4565b95945050505050565b60208082528101610c028184611274565b60208101610bf082846112cb565b60208082528101610c0281846112d4565b60208082528101610bf081611309565b60208101610bf08284611368565b60405181810167ffffffffffffffff8111828210171561146657600080fd5b604052919050565b600067ffffffffffffffff82111561148557600080fd5b5060209081020190565b600067ffffffffffffffff8211156114a657600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156114ff5781810151838201526020016114e7565b8381111561150e576000848401525b50505050565b601f01601f1916905600a265627a7a72305820c0e1254b6a6e47d3753fadf9b2ee898bdfcee2a2593be86be1ecad7c815324356c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x1558 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1DA JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x24B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0xD9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x26B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x1247 JUMP JUMPDEST PUSH2 0x3B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1371 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x10D5 JUMP JUMPDEST PUSH2 0x3DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x4CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x162 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x171 CALLDATASIZE PUSH1 0x4 PUSH2 0x1212 JUMP JUMPDEST PUSH2 0x69B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x13C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0x6B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x109B JUMP JUMPDEST PUSH2 0x6C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1195 JUMP JUMPDEST PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EF PUSH2 0x933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1439 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x939 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x140A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x94E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x13F9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x9B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2A1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x1429 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3C0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x447 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x4C6 JUMPI PUSH2 0x4BE DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x467 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x47F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x497 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4AF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x1429 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x571 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5B7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x659 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x60A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x653 SWAP1 DUP3 PUSH2 0xE3C JUMP JUMPDEST POP PUSH2 0x661 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x594 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x6A9 DUP5 PUSH2 0xB11 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x71F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7DD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x803 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x84C SWAP1 DUP3 PUSH2 0xE3C JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH2 0x4C6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9A6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x988 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x1429 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA15 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0x1 DUP6 EQ PUSH2 0xA78 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH2 0xA82 DUP8 PUSH2 0xB11 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP DUP3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xB88D4FDE DUP8 DUP8 DUP6 DUP6 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xAD6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x137F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB04 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0xB21 DUP5 PUSH1 0x0 PUSH2 0xB4F JUMP JUMPDEST SWAP3 POP PUSH2 0xB2E DUP5 PUSH1 0x14 PUSH2 0xBF6 JUMP JUMPDEST SWAP2 POP PUSH1 0x34 DUP5 MLOAD GT ISZERO PUSH2 0xB48 JUMPI PUSH2 0xB45 DUP5 PUSH1 0x34 PUSH2 0xC09 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xBD9 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC02 DUP4 DUP4 PUSH2 0xD02 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC17 DUP5 DUP5 PUSH2 0xBF6 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xCA6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xCD5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xCFB PUSH2 0xCE4 DUP4 PUSH2 0x936 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xCF1 DUP8 PUSH2 0x936 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0xD96 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xD8C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xDC0 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xE37 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xDCD JUMPI PUSH2 0xE37 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xE07 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xDFF JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0xDE4 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0xE37 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0xE32 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xE16 JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xE37 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xE37 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x936 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xE75 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xE61 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC02 DUP3 CALLDATALOAD PUSH2 0x14C1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xE96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xEA9 PUSH2 0xEA4 DUP3 PUSH2 0x146E JUMP JUMPDEST PUSH2 0x1447 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xECE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEFA JUMPI DUP2 PUSH2 0xEE4 DUP9 DUP3 PUSH2 0xE79 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xED1 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF23 PUSH2 0xEA4 DUP3 PUSH2 0x146E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEFA JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xF4B DUP9 DUP3 PUSH2 0x101A JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF35 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF80 PUSH2 0xEA4 DUP3 PUSH2 0x146E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xFA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEFA JUMPI DUP2 PUSH2 0xFBB DUP9 DUP3 PUSH2 0x1069 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0xFE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x1013 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x102B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1039 PUSH2 0xEA4 DUP3 PUSH2 0x148F JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1055 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1060 DUP4 DUP3 DUP5 PUSH2 0x14D8 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC02 DUP3 CALLDATALOAD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1087 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1093 DUP5 DUP5 PUSH2 0xE79 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x10AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x10BA DUP6 DUP6 PUSH2 0xE79 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x10CB DUP6 DUP3 DUP7 ADD PUSH2 0x1069 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x10EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x110E DUP8 DUP3 DUP9 ADD PUSH2 0xF04 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x112B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1137 DUP8 DUP3 DUP9 ADD PUSH2 0xE85 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1160 DUP8 DUP3 DUP9 ADD PUSH2 0xE85 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x117D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1189 DUP8 DUP3 DUP9 ADD PUSH2 0xF61 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x11AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D0 DUP9 DUP3 DUP10 ADD PUSH2 0xFD1 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x11E3 DUP9 DUP3 DUP10 ADD PUSH2 0xE79 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x11F4 DUP9 DUP3 DUP10 ADD PUSH2 0xE79 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x1205 DUP9 DUP3 DUP10 ADD PUSH2 0x1069 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x123B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1093 DUP5 DUP3 DUP6 ADD PUSH2 0x101A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1259 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1093 DUP5 DUP5 PUSH2 0x1069 JUMP JUMPDEST PUSH2 0x126E DUP2 PUSH2 0x14C1 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127F DUP3 PUSH2 0x14BD JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1291 DUP4 PUSH2 0x14B7 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x12C1 JUMPI PUSH2 0x12A7 DUP7 DUP4 MLOAD PUSH2 0x1265 JUMP JUMPDEST PUSH2 0x12B0 DUP3 PUSH2 0x14B7 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1294 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x126E DUP2 PUSH2 0x14CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12DF DUP3 PUSH2 0x14BD JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x12F3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x14E4 JUMP JUMPDEST PUSH2 0x12FC DUP2 PUSH2 0x1514 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x126E DUP2 PUSH2 0x936 JUMP JUMPDEST PUSH2 0x126E DUP2 PUSH2 0x14D2 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xBF0 DUP3 DUP5 PUSH2 0x1265 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x138D DUP3 DUP8 PUSH2 0x1265 JUMP JUMPDEST PUSH2 0x139A PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1265 JUMP JUMPDEST PUSH2 0x13A7 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x135F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x13B9 DUP2 DUP5 PUSH2 0x12D4 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x13D1 DUP3 DUP7 PUSH2 0x1265 JUMP JUMPDEST PUSH2 0x13DE PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x135F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x13F0 DUP2 DUP5 PUSH2 0x12D4 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC02 DUP2 DUP5 PUSH2 0x1274 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xBF0 DUP3 DUP5 PUSH2 0x12CB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC02 DUP2 DUP5 PUSH2 0x12D4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBF0 DUP2 PUSH2 0x1309 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xBF0 DUP3 DUP5 PUSH2 0x1368 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1466 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1485 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x14A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x14FF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x14E7 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x150E JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xc0 0xe1 0x25 0x4b PUSH11 0x6E47D3753FADF9B2EE898B 0xdf 0xce 0xe2 LOG2 MSIZE EXTCODESIZE 0xe8 PUSH12 0xE1ECAD7C815324356C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 STOP CALLDATACOPY ",
"sourceMap": "744:871:12:-;;;363:5:20;:18;;-1:-1:-1;;;;;;363:18:20;371:10;363:18;;;744:871:12;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100be578063494503d4146100e0578063563c875d14610116578063707129391461013657806372c2f527146101565780638da5cb5b146101855780639ad267441461019a578063a85e59e4146101ba578063ae25532e146101da578063b9181611146101fc578063d39de6e914610229578063f2fde38b1461024b575b600080fd5b3480156100ca57600080fd5b506100de6100d9366004611075565b61026b565b005b3480156100ec57600080fd5b506101006100fb366004611247565b6103b2565b60405161010d9190611371565b60405180910390f35b34801561012257600080fd5b506100de6101313660046110d5565b6103da565b34801561014257600080fd5b506100de610151366004611075565b6104cd565b34801561016257600080fd5b50610176610171366004611212565b61069b565b60405161010d939291906113c3565b34801561019157600080fd5b506101006106b6565b3480156101a657600080fd5b506100de6101b536600461109b565b6106c5565b3480156101c657600080fd5b506100de6101d5366004611195565b610887565b3480156101e657600080fd5b506101ef610933565b60405161010d9190611439565b34801561020857600080fd5b5061021c610217366004611075565b610939565b60405161010d919061140a565b34801561023557600080fd5b5061023e61094e565b60405161010d91906113f9565b34801561025757600080fd5b506100de610266366004611075565b6109b0565b600054600160a060020a031633146102a15760405160e560020a62461bcd02815260040161029890611429565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103165760405160e560020a62461bcd0281526004016102989190611418565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103c057fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104475760405160e560020a62461bcd0281526004016102989190611418565b50600090505b84518110156104c6576104be858281518110151561046757fe5b90602001906020020151858381518110151561047f57fe5b90602001906020020151858481518110151561049757fe5b9060200190602002015185858151811015156104af57fe5b90602001906020020151610a18565b60010161044d565b5050505050565b60008054600160a060020a031633146104fb5760405160e560020a62461bcd02815260040161029890611429565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105715760405160e560020a62461bcd0281526004016102989190611418565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106615781600160a060020a03166002828154811015156105b757fe5b600091825260209091200154600160a060020a03161415610659576002805460001981019081106105e457fe5b60009182526020909120015460028054600160a060020a03909216918390811061060a57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106539082610e3c565b50610661565b600101610594565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60008060606106a984610b11565b9196909550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061071f5760405160e560020a62461bcd0281526004016102989190611418565b5081600160a060020a031660028281548110151561073957fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107aa5760405160e560020a62461bcd0281526004016102989190611418565b50600160a060020a0382166000908152600160205260409020805460ff191690556002805460001981019081106107dd57fe5b60009182526020909120015460028054600160a060020a03909216918390811061080357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061084c9082610e3c565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156108f45760405160e560020a62461bcd0281526004016102989190611418565b506104c685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a18565b60025b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156109a657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610988575b5050505050905090565b600054600160a060020a031633146109dd5760405160e560020a62461bcd02815260040161029890611429565b600160a060020a03811615610a15576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600e81527f494e56414c49445f414d4f554e540000000000000000000000000000000000006020820152600090819060609060018514610a785760405160e560020a62461bcd0281526004016102989190611418565b50610a8287610b11565b92509250925082600160a060020a031663b88d4fde878785856040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610ad6949392919061137f565b600060405180830381600087803b158015610af057600080fd5b505af1158015610b04573d6000803e3d6000fd5b5050505050505050505050565b6000806060610b21846000610b4f565b9250610b2e846014610bf6565b9150603484511115610b4857610b45846034610c09565b90505b9193909250565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610bd95760405160e560020a62461bcd0281526004016102989190611418565b50506014818301810151910190600160a060020a03165b92915050565b6000610c028383610d02565b9392505050565b60606000610c178484610bf6565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610ca65760405160e560020a62461bcd0281526004016102989190611418565b50806040519080825280601f01601f191660200182016040528015610cd5578160200160208202803883390190505b509150610cfb610ce483610936565b60200184610cf187610936565b0160200183610d96565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610d8c5760405160e560020a62461bcd0281526004016102989190611418565b5050016020015190565b6020811015610dc0576001816020036101000a038019835116818551168082178652505050610e37565b82821415610dcd57610e37565b82821115610e075760208103905080820181840181515b82851015610dff578451865260209586019590940193610de4565b905250610e37565b60208103905080820181840183515b81861215610e325782518252601f199283019290910190610e16565b855250505b505050565b815481835581811115610e3757600083815260209020610e3791810190830161093691905b80821115610e755760008155600101610e61565b5090565b6000610c0282356114c1565b6000601f82018313610e9657600080fd5b8135610ea9610ea48261146e565b611447565b91508181835260208401935060208101905083856020840282011115610ece57600080fd5b60005b83811015610efa5781610ee48882610e79565b8452506020928301929190910190600101610ed1565b5050505092915050565b6000601f82018313610f1557600080fd5b8135610f23610ea48261146e565b81815260209384019390925082018360005b83811015610efa5781358601610f4b888261101a565b8452506020928301929190910190600101610f35565b6000601f82018313610f7257600080fd5b8135610f80610ea48261146e565b91508181835260208401935060208101905083856020840282011115610fa557600080fd5b60005b83811015610efa5781610fbb8882611069565b8452506020928301929190910190600101610fa8565b600080601f83018413610fe357600080fd5b50813567ffffffffffffffff811115610ffb57600080fd5b60208301915083600182028301111561101357600080fd5b9250929050565b6000601f8201831361102b57600080fd5b8135611039610ea48261148f565b9150808252602083016020830185838301111561105557600080fd5b6110608382846114d8565b50505092915050565b6000610c028235610936565b60006020828403121561108757600080fd5b60006110938484610e79565b949350505050565b600080604083850312156110ae57600080fd5b60006110ba8585610e79565b92505060206110cb85828601611069565b9150509250929050565b600080600080608085870312156110eb57600080fd5b843567ffffffffffffffff81111561110257600080fd5b61110e87828801610f04565b945050602085013567ffffffffffffffff81111561112b57600080fd5b61113787828801610e85565b935050604085013567ffffffffffffffff81111561115457600080fd5b61116087828801610e85565b925050606085013567ffffffffffffffff81111561117d57600080fd5b61118987828801610f61565b91505092959194509250565b6000806000806000608086880312156111ad57600080fd5b853567ffffffffffffffff8111156111c457600080fd5b6111d088828901610fd1565b955095505060206111e388828901610e79565b93505060406111f488828901610e79565b925050606061120588828901611069565b9150509295509295909350565b60006020828403121561122457600080fd5b813567ffffffffffffffff81111561123b57600080fd5b6110938482850161101a565b60006020828403121561125957600080fd5b60006110938484611069565b61126e816114c1565b82525050565b600061127f826114bd565b808452602084019350611291836114b7565b60005b828110156112c1576112a7868351611265565b6112b0826114b7565b602096909601959150600101611294565b5093949350505050565b61126e816114cd565b60006112df826114bd565b8084526112f38160208601602086016114e4565b6112fc81611514565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61126e81610936565b61126e816114d2565b60208101610bf08284611265565b6080810161138d8287611265565b61139a6020830186611265565b6113a7604083018561135f565b81810360608301526113b981846112d4565b9695505050505050565b606081016113d18286611265565b6113de602083018561135f565b81810360408301526113f081846112d4565b95945050505050565b60208082528101610c028184611274565b60208101610bf082846112cb565b60208082528101610c0281846112d4565b60208082528101610bf081611309565b60208101610bf08284611368565b60405181810167ffffffffffffffff8111828210171561146657600080fd5b604052919050565b600067ffffffffffffffff82111561148557600080fd5b5060209081020190565b600067ffffffffffffffff8211156114a657600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156114ff5781810151838201526020016114e7565b8381111561150e576000848401525b50505050565b601f01601f1916905600a265627a7a72305820c0e1254b6a6e47d3753fadf9b2ee898bdfcee2a2593be86be1ecad7c815324356c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1DA JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x24B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0xD9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x26B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x1247 JUMP JUMPDEST PUSH2 0x3B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1371 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x10D5 JUMP JUMPDEST PUSH2 0x3DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x4CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x162 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x171 CALLDATASIZE PUSH1 0x4 PUSH2 0x1212 JUMP JUMPDEST PUSH2 0x69B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x13C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0x6B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x109B JUMP JUMPDEST PUSH2 0x6C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1195 JUMP JUMPDEST PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EF PUSH2 0x933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1439 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x939 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x140A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x94E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x13F9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1075 JUMP JUMPDEST PUSH2 0x9B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2A1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x1429 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3C0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x447 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x4C6 JUMPI PUSH2 0x4BE DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x467 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x47F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x497 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4AF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x1429 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x571 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5B7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x659 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x60A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x653 SWAP1 DUP3 PUSH2 0xE3C JUMP JUMPDEST POP PUSH2 0x661 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x594 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x6A9 DUP5 PUSH2 0xB11 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x71F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7DD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x803 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x84C SWAP1 DUP3 PUSH2 0xE3C JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH2 0x4C6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9A6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x988 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x1429 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA15 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0x1 DUP6 EQ PUSH2 0xA78 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP PUSH2 0xA82 DUP8 PUSH2 0xB11 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP DUP3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xB88D4FDE DUP8 DUP8 DUP6 DUP6 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xAD6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x137F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB04 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0xB21 DUP5 PUSH1 0x0 PUSH2 0xB4F JUMP JUMPDEST SWAP3 POP PUSH2 0xB2E DUP5 PUSH1 0x14 PUSH2 0xBF6 JUMP JUMPDEST SWAP2 POP PUSH1 0x34 DUP5 MLOAD GT ISZERO PUSH2 0xB48 JUMPI PUSH2 0xB45 DUP5 PUSH1 0x34 PUSH2 0xC09 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xBD9 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC02 DUP4 DUP4 PUSH2 0xD02 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC17 DUP5 DUP5 PUSH2 0xBF6 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xCA6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xCD5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xCFB PUSH2 0xCE4 DUP4 PUSH2 0x936 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xCF1 DUP8 PUSH2 0x936 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0xD96 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xD8C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x1418 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xDC0 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xE37 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xDCD JUMPI PUSH2 0xE37 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xE07 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xDFF JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0xDE4 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0xE37 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0xE32 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xE16 JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xE37 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xE37 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x936 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xE75 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xE61 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC02 DUP3 CALLDATALOAD PUSH2 0x14C1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xE96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xEA9 PUSH2 0xEA4 DUP3 PUSH2 0x146E JUMP JUMPDEST PUSH2 0x1447 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xECE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEFA JUMPI DUP2 PUSH2 0xEE4 DUP9 DUP3 PUSH2 0xE79 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xED1 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF23 PUSH2 0xEA4 DUP3 PUSH2 0x146E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEFA JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xF4B DUP9 DUP3 PUSH2 0x101A JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF35 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF80 PUSH2 0xEA4 DUP3 PUSH2 0x146E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xFA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEFA JUMPI DUP2 PUSH2 0xFBB DUP9 DUP3 PUSH2 0x1069 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0xFE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x1013 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x102B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1039 PUSH2 0xEA4 DUP3 PUSH2 0x148F JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1055 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1060 DUP4 DUP3 DUP5 PUSH2 0x14D8 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC02 DUP3 CALLDATALOAD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1087 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1093 DUP5 DUP5 PUSH2 0xE79 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x10AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x10BA DUP6 DUP6 PUSH2 0xE79 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x10CB DUP6 DUP3 DUP7 ADD PUSH2 0x1069 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x10EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x110E DUP8 DUP3 DUP9 ADD PUSH2 0xF04 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x112B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1137 DUP8 DUP3 DUP9 ADD PUSH2 0xE85 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1160 DUP8 DUP3 DUP9 ADD PUSH2 0xE85 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x117D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1189 DUP8 DUP3 DUP9 ADD PUSH2 0xF61 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x11AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D0 DUP9 DUP3 DUP10 ADD PUSH2 0xFD1 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x11E3 DUP9 DUP3 DUP10 ADD PUSH2 0xE79 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x11F4 DUP9 DUP3 DUP10 ADD PUSH2 0xE79 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x1205 DUP9 DUP3 DUP10 ADD PUSH2 0x1069 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x123B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1093 DUP5 DUP3 DUP6 ADD PUSH2 0x101A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1259 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1093 DUP5 DUP5 PUSH2 0x1069 JUMP JUMPDEST PUSH2 0x126E DUP2 PUSH2 0x14C1 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127F DUP3 PUSH2 0x14BD JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1291 DUP4 PUSH2 0x14B7 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x12C1 JUMPI PUSH2 0x12A7 DUP7 DUP4 MLOAD PUSH2 0x1265 JUMP JUMPDEST PUSH2 0x12B0 DUP3 PUSH2 0x14B7 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1294 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x126E DUP2 PUSH2 0x14CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12DF DUP3 PUSH2 0x14BD JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x12F3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x14E4 JUMP JUMPDEST PUSH2 0x12FC DUP2 PUSH2 0x1514 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x126E DUP2 PUSH2 0x936 JUMP JUMPDEST PUSH2 0x126E DUP2 PUSH2 0x14D2 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xBF0 DUP3 DUP5 PUSH2 0x1265 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x138D DUP3 DUP8 PUSH2 0x1265 JUMP JUMPDEST PUSH2 0x139A PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1265 JUMP JUMPDEST PUSH2 0x13A7 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x135F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x13B9 DUP2 DUP5 PUSH2 0x12D4 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x13D1 DUP3 DUP7 PUSH2 0x1265 JUMP JUMPDEST PUSH2 0x13DE PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x135F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x13F0 DUP2 DUP5 PUSH2 0x12D4 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC02 DUP2 DUP5 PUSH2 0x1274 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xBF0 DUP3 DUP5 PUSH2 0x12CB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC02 DUP2 DUP5 PUSH2 0x12D4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBF0 DUP2 PUSH2 0x1309 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xBF0 DUP3 DUP5 PUSH2 0x1368 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1466 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1485 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x14A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x14FF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x14E7 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x150E JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xc0 0xe1 0x25 0x4b PUSH11 0x6E47D3753FADF9B2EE898B 0xdf 0xce 0xe2 LOG2 MSIZE EXTCODESIZE 0xe8 PUSH12 0xE1ECAD7C815324356C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 STOP CALLDATACOPY ",
"sourceMap": "744:871:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1244:318:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1244:318:3;;;;;;;;;;;1129:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1129:28:3;;;;;;;;;;;;;;;;;;;;;;;;;1679:431:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1679:431:2;;;;;;;;;1676:542:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1676:542:3;;;;;;;;;1181:432:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1181:432:12;;;;;;;;;;;;;;;;;;;292:20:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:20;;;;2391:525:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2391:525:3;;;;;;;;;1037:287:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1037:287:2;;;;;;;;;1036:112:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1036:112:1;;;;;;;;;;;;1080:43:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1080:43:3;;;;;;;;;;;;;;;;;3013:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3013:138:3;;;;;;;;;;;;566:167:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:20;;;;;;;;;1244:318:3;460:5:20;;-1:-1:-1;;;;;460:5:20;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:20;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1361:18:3;;;;;;:10;:18;;;;;;;;;;1393:25;;;;;;;;;;;;;;;;;;;1361:18;;1360:19;1339:89;;;;-1:-1:-1;;;;;1339:89:3;;;;;;;;;;-1:-1:-1;;;;;;1439:18:3;;;;;;1460:4;1439:18;;;;;;;;:25;;-1:-1:-1;;1439:25:3;;;;;1474:11;27:10:-1;;23:18;;;45:23;;1474:24:3;;;;;;;;-1:-1:-1;;1474:24:3;;;;;1513:42;1544:10;;1439:18;1513:42;;;1244:318;:::o;1129:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1129:28:3;;-1:-1:-1;1129:28:3;:::o;1679:431:2:-;1000:10:3;1897:9:2;989:22:3;;;:10;:22;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:3;;;;;;;;;;;1909:1:2;1897:13;;1892:212;1916:9;:16;1912:1;:20;1892:212;;;1953:140;1991:9;2001:1;1991:12;;;;;;;;;;;;;;;;;;2021:4;2026:1;2021:7;;;;;;;;;;;;;;;;;;2046:2;2049:1;2046:5;;;;;;;;;;;;;;;;;;2069:7;2077:1;2069:10;;;;;;;;;;;;;;;;;;1953:20;:140::i;:::-;1934:3;;1892:212;;;1679:431;;;;;:::o;1676:542:3:-;1909:6;460:5:20;;-1:-1:-1;;;;;460:5:20;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:20;;;;;;;;;-1:-1:-1;;;;;1795:18:3;;;;;;:10;:18;;;;;;;;;;1827:21;;;;;;;;;;;;;;;;;;;1795:18;;1774:84;;;;;;-1:-1:-1;;;;;1774:84:3;;;;;;;;;;-1:-1:-1;;;;;;;1876:18:3;;;;;;:10;:18;;;;;1869:25;;-1:-1:-1;;1869:25:3;;;1904:249;1925:11;:18;1921:22;;1904:249;;;1986:6;-1:-1:-1;;;;;1968:24:3;:11;1980:1;1968:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1968:14:3;:24;1964:179;;;2029:11;2041:18;;-1:-1:-1;;2041:22:3;;;2029:35;;;;;;;;;;;;;;;;2012:11;:14;;-1:-1:-1;;;;;2029:35:3;;;;2024:1;;2012:14;;;;;;;;;;;;;;;:52;;-1:-1:-1;;2012:52:3;-1:-1:-1;;;;;2012:52:3;;;;;;;;;;2082:11;:23;;-1:-1:-1;;2082:23:3;;;;;;:::i;:::-;;2123:5;;1964:179;1945:3;;1904:249;;;2167:44;;2200:10;;-1:-1:-1;;;;;2167:44:3;;;;;;;;1676:542;;:::o;1181:432:12:-;1295:13;1322:15;1351:25;1480:32;1502:9;1480:21;:32::i;:::-;1401:111;;;;-1:-1:-1;1401:111:12;;-1:-1:-1;1181:432:12;-1:-1:-1;;1181:432:12:o;292:20:20:-;;;-1:-1:-1;;;;;292:20:20;;:::o;2391:525:3:-;2544:11;:18;2576:19;;;;;;;;;;;;;;;;;;2536:26;;2515:90;;;;-1:-1:-1;;;;;2515:90:3;;;;;;;;;;;2658:6;-1:-1:-1;;;;;2636:28:3;:11;2648:5;2636:18;;;;;;;;;;;;;;;;;;;;;2678:27;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2636:18:3;;;:28;2615:100;;;;-1:-1:-1;;;;;2615:100:3;;;;;;;;;;-1:-1:-1;;;;;;2733:18:3;;;;;;:10;:18;;;;;2726:25;;-1:-1:-1;;2726:25:3;;;2782:11;2794:18;;-1:-1:-1;;2794:22:3;;;2782:35;;;;;;;;;;;;;;;;2761:11;:18;;-1:-1:-1;;;;;2782:35:3;;;;2773:5;;2761:18;;;;;;;;;;;;;;;:56;;-1:-1:-1;;2761:56:3;-1:-1:-1;;;;;2761:56:3;;;;;;;;;;2827:11;:23;;-1:-1:-1;;2827:23:3;;;;;;:::i;:::-;-1:-1:-1;2865:44:3;;2898:10;;-1:-1:-1;;;;;2865:44:3;;;;;;;;2391:525;;:::o;1037:287:2:-;1000:10:3;989:22;;;;:10;:22;;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:3;;;;;;;;;;;1210:107:2;1244:9;;1210:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1267:4;1285:2;1301:6;1210:20;:107::i;1036:112:1:-;936:1;1036:112;;:::o;1080:43:3:-;;;;;;;;;;;;;;;:::o;3013:138::-;3094:9;3133:11;3126:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3126:18:3;;;;;;;;;;;;;;;;;;;;;;;3013:138;:::o;566:167:20:-;460:5;;-1:-1:-1;;;;;460:5:20;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:20;;;;;;;;;-1:-1:-1;;;;;662:22:20;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:20;-1:-1:-1;;;;;700:16:20;;;;;658:69;566:167;:::o;1094:552:5:-;1351:14;;;;;;;;;;;;;;;;;1434:13;;;;1490:25;;1336:1;1326:11;;1305:70;;;;-1:-1:-1;;;;;1305:70:5;;;;;;;;;;;1528:32;1550:9;1528:21;:32::i;:::-;1420:140;;;;;;1583:5;-1:-1:-1;;;;;1571:35:5;;1607:4;1613:2;1617:7;1626:12;1571:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1571:68:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1571:68:5;;;;1094:552;;;;;;;:::o;2033:531::-;2148:13;2175:15;2204:25;2292;2304:9;2315:1;2292:11;:25::i;:::-;2284:33;;2337:26;2349:9;2360:2;2337:11;:26::i;:::-;2327:36;;2396:2;2377:9;:16;:21;2373:91;;;2429:24;2439:9;2450:2;2429:9;:24::i;:::-;2414:39;;2373:91;2033:531;;;;;:::o;2855:884:17:-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:17;;;;;;;;;;-1:-1:-1;;3386:2:17;3641:13;;;;;3635:20;3377:11;;;-1:-1:-1;;;;;3631:69:17;2855:884;;;;;:::o;7053:195::-;7174:14;7219:21;7231:1;7234:5;7219:11;:21::i;:::-;7211:30;7053:195;-1:-1:-1;;;7053:195:17:o;8352:784::-;8471:19;8545:25;8573:21;8585:1;8588:5;8573:11;:21::i;:::-;8545:49;;8613:2;8604:11;;;;8749:17;8741:5;:25;8729:1;:8;:37;;8780:48;;;;;;;;;;;;;;;;;;;;;;;8708:130;;;;;;;-1:-1:-1;;;;;8708:130:17;;;;;;;;;;;8920:17;8910:28;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8910:28:17;;8901:37;;8948:157;8969:21;8983:6;8969:13;:21::i;:::-;8993:2;8969:26;9054:5;9035:16;9049:1;9035:13;:16::i;:::-;:24;9062:2;9035:29;9078:17;8948:7;:157::i;:::-;8352:784;;;;;:::o;5639:488::-;5760:14;5823:5;5831:2;5823:10;5811:1;:8;:22;;5847:38;;;;;;;;;;;;;;;;;;;;;;;5790:105;;;;;;;-1:-1:-1;;;;;5790:105:17;;;;;;;;;;-1:-1:-1;;6074:13:17;5976:2;6074:13;6068:20;;5639:488::o;1244:4207:18:-;1394:2;1385:6;:11;1381:4064;;;1683:1;1673:6;1669:2;1665:15;1660:3;1656:25;1652:33;1734:4;1730:9;1721:6;1715:13;1711:29;1783:4;1776;1770:11;1766:22;1824:1;1821;1818:8;1812:4;1805:22;1622:219;;;;;;1945:4;1935:6;:14;1931:59;;;1969:7;;1931:59;2679:4;2670:6;:13;2666:2769;;;3005:2;2997:6;2993:15;2983:25;;3053:6;3045;3041:19;3103:6;3097:4;3093:17;3410:4;3404:11;3613:198;3631:4;3623:6;3620:16;3613:198;;;3679:13;;3666:27;;3740:2;3776:13;;;;3728:15;;;;3613:198;;;3900:18;;-1:-1:-1;2712:1224:18;;;4181:2;4173:6;4169:15;4159:25;;4229:6;4221;4217:19;4279:6;4273:4;4269:17;4589:6;4583:13;5103:191;5120:4;5114;5110:15;5103:191;;;5168:11;;5155:25;;-1:-1:-1;;5213:13:18;;;;5259;;;;5103:191;;;5384:19;;-1:-1:-1;;3983:1438:18;1244:4207;;;:::o;744:871:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:118:-1;;72:46;110:6;97:20;72:46;;148:707;;258:4;246:17;;242:27;-1:-1;232:2;;283:1;280;273:12;232:2;320:6;307:20;342:80;357:64;414:6;357:64;;;342:80;;;333:89;;439:5;464:6;457:5;450:21;494:4;486:6;482:17;472:27;;516:4;511:3;507:14;500:21;;569:6;616:3;608:4;600:6;596:17;591:3;587:27;584:36;581:2;;;633:1;630;623:12;581:2;658:1;643:206;668:6;665:1;662:13;643:206;;;726:3;748:37;781:3;769:10;748:37;;;736:50;;-1:-1;809:4;800:14;;;;828;;;;;690:1;683:9;643:206;;;647:14;225:630;;;;;;;;879:693;;994:4;982:17;;978:27;-1:-1;968:2;;1019:1;1016;1009:12;968:2;1056:6;1043:20;1078:85;1093:69;1155:6;1093:69;;1078:85;1191:21;;;1235:4;1223:17;;;;1069:94;;-1:-1;1248:14;;1223:17;1343:1;1328:238;1353:6;1350:1;1347:13;1328:238;;;1436:3;1423:17;1415:6;1411:30;1460:42;1498:3;1486:10;1460:42;;;1448:55;;-1:-1;1526:4;1517:14;;;;1545;;;;;1375:1;1368:9;1328:238;;1598:707;;1708:4;1696:17;;1692:27;-1:-1;1682:2;;1733:1;1730;1723:12;1682:2;1770:6;1757:20;1792:80;1807:64;1864:6;1807:64;;1792:80;1783:89;;1889:5;1914:6;1907:5;1900:21;1944:4;1936:6;1932:17;1922:27;;1966:4;1961:3;1957:14;1950:21;;2019:6;2066:3;2058:4;2050:6;2046:17;2041:3;2037:27;2034:36;2031:2;;;2083:1;2080;2073:12;2031:2;2108:1;2093:206;2118:6;2115:1;2112:13;2093:206;;;2176:3;2198:37;2231:3;2219:10;2198:37;;;2186:50;;-1:-1;2259:4;2250:14;;;;2278;;;;;2140:1;2133:9;2093:206;;2327:335;;;2434:4;2422:17;;2418:27;-1:-1;2408:2;;2459:1;2456;2449:12;2408:2;-1:-1;2479:20;;2519:18;2508:30;;2505:2;;;2551:1;2548;2541:12;2505:2;2585:4;2577:6;2573:17;2561:29;;2635:3;2628;2620:6;2616:16;2606:8;2602:31;2599:40;2596:2;;;2652:1;2649;2642:12;2596:2;2401:261;;;;;;2671:432;;2761:4;2749:17;;2745:27;-1:-1;2735:2;;2786:1;2783;2776:12;2735:2;2823:6;2810:20;2845:60;2860:44;2897:6;2860:44;;2845:60;2836:69;;2925:6;2918:5;2911:21;2961:4;2953:6;2949:17;2994:4;2987:5;2983:16;3029:3;3020:6;3015:3;3011:16;3008:25;3005:2;;;3046:1;3043;3036:12;3005:2;3056:41;3090:6;3085:3;3080;3056:41;;;2728:375;;;;;;;;3560:118;;3627:46;3665:6;3652:20;3627:46;;3685:241;;3789:2;3777:9;3768:7;3764:23;3760:32;3757:2;;;3805:1;3802;3795:12;3757:2;3840:1;3857:53;3902:7;3882:9;3857:53;;;3847:63;3751:175;-1:-1;;;;3751:175;3933:366;;;4054:2;4042:9;4033:7;4029:23;4025:32;4022:2;;;4070:1;4067;4060:12;4022:2;4105:1;4122:53;4167:7;4147:9;4122:53;;;4112:63;;4084:97;4212:2;4230:53;4275:7;4266:6;4255:9;4251:22;4230:53;;;4220:63;;4191:98;4016:283;;;;;;4306:1171;;;;;4566:3;4554:9;4545:7;4541:23;4537:33;4534:2;;;4583:1;4580;4573:12;4534:2;4618:31;;4669:18;4658:30;;4655:2;;;4701:1;4698;4691:12;4655:2;4721:83;4796:7;4787:6;4776:9;4772:22;4721:83;;;4711:93;;4597:213;4869:2;4858:9;4854:18;4841:32;4893:18;4885:6;4882:30;4879:2;;;4925:1;4922;4915:12;4879:2;4945:78;5015:7;5006:6;4995:9;4991:22;4945:78;;;4935:88;;4820:209;5088:2;5077:9;5073:18;5060:32;5112:18;5104:6;5101:30;5098:2;;;5144:1;5141;5134:12;5098:2;5164:78;5234:7;5225:6;5214:9;5210:22;5164:78;;;5154:88;;5039:209;5307:2;5296:9;5292:18;5279:32;5331:18;5323:6;5320:30;5317:2;;;5363:1;5360;5353:12;5317:2;5383:78;5453:7;5444:6;5433:9;5429:22;5383:78;;;5373:88;;5258:209;4528:949;;;;;;;;5484:741;;;;;;5658:3;5646:9;5637:7;5633:23;5629:33;5626:2;;;5675:1;5672;5665:12;5626:2;5710:31;;5761:18;5750:30;;5747:2;;;5793:1;5790;5783:12;5747:2;5821:64;5877:7;5868:6;5857:9;5853:22;5821:64;;;5803:82;;;;5689:202;5922:2;5940:53;5985:7;5976:6;5965:9;5961:22;5940:53;;;5930:63;;5901:98;6030:2;6048:53;6093:7;6084:6;6073:9;6069:22;6048:53;;;6038:63;;6009:98;6138:2;6156:53;6201:7;6192:6;6181:9;6177:22;6156:53;;;6146:63;;6117:98;5620:605;;;;;;;;;6232:345;;6345:2;6333:9;6324:7;6320:23;6316:32;6313:2;;;6361:1;6358;6351:12;6313:2;6396:31;;6447:18;6436:30;;6433:2;;;6479:1;6476;6469:12;6433:2;6499:62;6553:7;6544:6;6533:9;6529:22;6499:62;;6584:241;;6688:2;6676:9;6667:7;6663:23;6659:32;6656:2;;;6704:1;6701;6694:12;6656:2;6739:1;6756:53;6801:7;6781:9;6756:53;;6832:110;6905:31;6930:5;6905:31;;;6900:3;6893:44;6887:55;;;6980:590;;7115:54;7163:5;7115:54;;;7187:6;7182:3;7175:19;7211:4;7206:3;7202:14;7195:21;;7256:56;7306:5;7256:56;;;7333:1;7318:230;7343:6;7340:1;7337:13;7318:230;;;7383:53;7432:3;7423:6;7417:13;7383:53;;;7453:60;7506:6;7453:60;;;7536:4;7527:14;;;;;7443:70;-1:-1;7365:1;7358:9;7318:230;;;-1:-1;7561:3;;7094:476;-1:-1;;;;7094:476;7578:101;7645:28;7667:5;7645:28;;7686:297;;7786:38;7818:5;7786:38;;;7841:6;7836:3;7829:19;7853:63;7909:6;7902:4;7897:3;7893:14;7886:4;7879:5;7875:16;7853:63;;;7948:29;7970:6;7948:29;;;7928:50;;;7941:4;7928:50;;7766:217;-1:-1;;;7766:217;8290:397;8445:2;8433:15;;8482:66;8477:2;8468:12;;8461:88;8583:66;8578:2;8569:12;;8562:88;8678:2;8669:12;;8426:261;8695:110;8768:31;8793:5;8768:31;;8812:104;8881:29;8904:5;8881:29;;8923:193;9031:2;9016:18;;9045:61;9020:9;9079:6;9045:61;;9123:581;9333:3;9318:19;;9348:61;9322:9;9382:6;9348:61;;;9420:62;9478:2;9467:9;9463:18;9454:6;9420:62;;;9493;9551:2;9540:9;9536:18;9527:6;9493:62;;;9603:9;9597:4;9593:20;9588:2;9577:9;9573:18;9566:48;9628:66;9689:4;9680:6;9628:66;;;9620:74;9304:400;-1:-1;;;;;;9304:400;9711:479;9893:2;9878:18;;9907:61;9882:9;9941:6;9907:61;;;9979:62;10037:2;10026:9;10022:18;10013:6;9979:62;;;10089:9;10083:4;10079:20;10074:2;10063:9;10059:18;10052:48;10114:66;10175:4;10166:6;10114:66;;;10106:74;9864:326;-1:-1;;;;;9864:326;10197:341;10355:2;10369:47;;;10340:18;;10430:98;10340:18;10514:6;10430:98;;10545:181;10647:2;10632:18;;10661:55;10636:9;10689:6;10661:55;;10733:273;10857:2;10871:47;;;10842:18;;10932:64;10842:18;10982:6;10932:64;;11013:387;11194:2;11208:47;;;11179:18;;11269:121;11179:18;11269:121;;11407:185;11511:2;11496:18;;11525:57;11500:9;11555:6;11525:57;;11599:256;11661:2;11655:9;11687:17;;;11762:18;11747:34;;11783:22;;;11744:62;11741:2;;;11819:1;11816;11809:12;11741:2;11835;11828:22;11639:216;;-1:-1;11639:216;11862:258;;12021:18;12013:6;12010:30;12007:2;;;12053:1;12050;12043:12;12007:2;-1:-1;12082:4;12070:17;;;12100:15;;11944:176;12662:254;;12801:18;12793:6;12790:30;12787:2;;;12833:1;12830;12823:12;12787:2;-1:-1;12906:4;12877;12854:17;;;;-1:-1;;12850:33;12896:15;;12724:192;13190:121;13299:4;13287:17;;13268:43;13320:107;13410:12;;13394:33;13758:128;-1:-1;;;;;13827:54;;13810:76;13893:92;13966:13;13959:21;;13942:43;14078:88;14156:4;14145:16;;14128:38;14395:145;14476:6;14471:3;14466;14453:30;-1:-1;14532:1;14514:16;;14507:27;14446:94;14549:268;14614:1;14621:101;14635:6;14632:1;14629:13;14621:101;;;14702:11;;;14696:18;14683:11;;;14676:39;14657:2;14650:10;14621:101;;;14737:6;14734:1;14731:13;14728:2;;;14802:1;14793:6;14788:3;14784:16;14777:27;14728:2;14598:219;;;;;14825:97;14913:2;14893:14;-1:-1;;14889:28;;14873:49"
}
}
},
"sources": {
"current/protocol/AssetProxy/ERC20Proxy.sol": {
"id": 0
},
"current/protocol/AssetProxy/ERC721Proxy.sol": {
"id": 1
},
"current/protocol/AssetProxy/MixinAssetProxy.sol": {
"id": 2
},
"current/protocol/AssetProxy/MixinAuthorizable.sol": {
"id": 3
},
"current/protocol/AssetProxy/MixinERC20Transfer.sol": {
"id": 4
},
"current/protocol/AssetProxy/MixinERC721Transfer.sol": {
"id": 5
},
"current/protocol/AssetProxy/interfaces/IAssetProxy.sol": {
"id": 6
},
"current/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
"id": 7
},
"current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol": {
"id": 8
},
"current/protocol/AssetProxy/libs/LibTransferErrors.sol": {
"id": 9
},
"current/protocol/AssetProxy/mixins/MAssetProxy.sol": {
"id": 10
},
"current/protocol/AssetProxy/mixins/MAuthorizable.sol": {
"id": 11
},
"current/test/TestAssetDataDecoders/TestAssetDataDecoders.sol": {
"id": 12
},
"current/tokens/ERC20Token/IERC20Token.sol": {
"id": 13
},
"current/tokens/ERC721Token/ERC721Token.sol": {
"id": 14
},
"current/tokens/ERC721Token/IERC721Receiver.sol": {
"id": 15
},
"current/tokens/ERC721Token/IERC721Token.sol": {
"id": 16
},
"current/utils/LibBytes/LibBytes.sol": {
"id": 17
},
"current/utils/LibMem/LibMem.sol": {
"id": 18
},
"current/utils/Ownable/IOwnable.sol": {
"id": 19
},
"current/utils/Ownable/Ownable.sol": {
"id": 20
},
"current/utils/SafeMath/SafeMath.sol": {
"id": 21
}
},
"sourceCodes": {
"current/protocol/AssetProxy/ERC20Proxy.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 \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"./MixinERC20Transfer.sol\";\n\ncontract ERC20Proxy is\n MixinAssetProxy,\n MixinAuthorizable,\n MixinERC20Transfer\n{\n // Id of this proxy.\n uint8 constant PROXY_ID = 1;\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n}\n",
"current/protocol/AssetProxy/ERC721Proxy.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 \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"./MixinERC721Transfer.sol\";\n\ncontract ERC721Proxy is\n MixinAssetProxy,\n MixinAuthorizable,\n MixinERC721Transfer\n{\n // Id of this proxy.\n uint8 constant PROXY_ID = 2;\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n}\n",
"current/protocol/AssetProxy/MixinAssetProxy.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 \"./mixins/MAuthorizable.sol\";\nimport \"./mixins/MAssetProxy.sol\";\n\ncontract MixinAssetProxy is\n MAuthorizable,\n MAssetProxy\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external\n onlyAuthorized\n {\n transferFromInternal(\n assetData,\n from,\n to,\n amount\n );\n }\n\n /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n /// @param from Array of addresses to transfer assets from.\n /// @param to Array of addresses to transfer assets to.\n /// @param amounts Array of amounts of assets to transfer.\n function batchTransferFrom(\n bytes[] memory assetData,\n address[] memory from,\n address[] memory to,\n uint256[] memory amounts\n )\n public\n onlyAuthorized\n {\n for (uint256 i = 0; i < assetData.length; i++) {\n transferFromInternal(\n assetData[i],\n from[i],\n to[i],\n amounts[i]\n );\n }\n }\n}\n",
"current/protocol/AssetProxy/MixinAuthorizable.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 \"./libs/LibAssetProxyErrors.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\ncontract MixinAuthorizable is\n LibAssetProxyErrors,\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n SENDER_NOT_AUTHORIZED\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n TARGET_ALREADY_AUTHORIZED\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n TARGET_NOT_AUTHORIZED\n );\n\n delete authorized[target];\n for (uint i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n {\n require(\n index < authorities.length,\n INDEX_OUT_OF_BOUNDS\n );\n require(\n authorities[index] == target,\n AUTHORIZED_ADDRESS_MISMATCH\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n",
"current/protocol/AssetProxy/MixinERC20Transfer.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 \"../../utils/LibBytes/LibBytes.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\nimport \"./libs/LibTransferErrors.sol\";\n\ncontract MixinERC20Transfer is\n LibBytes,\n LibTransferErrors\n{\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Decode asset data.\n address token = readAddress(assetData, 0);\n\n // Transfer tokens.\n // We do a raw call so we can check the success separate\n // from the return data.\n bool success = token.call(abi.encodeWithSelector(\n IERC20Token(token).transferFrom.selector,\n from,\n to,\n amount\n ));\n require(\n success,\n TRANSFER_FAILED\n );\n \n // Check return data.\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // value that evaluates to true.\n assembly {\n if returndatasize {\n success := 0\n if eq(returndatasize, 32) {\n // First 64 bytes of memory are reserved scratch space\n returndatacopy(0, 0, 32)\n success := mload(0)\n }\n }\n }\n require(\n success,\n TRANSFER_FAILED\n );\n }\n}\n",
"current/protocol/AssetProxy/MixinERC721Transfer.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 \"../../utils/LibBytes/LibBytes.sol\";\nimport \"../../tokens/ERC721Token/ERC721Token.sol\";\nimport \"./libs/LibTransferErrors.sol\";\n\ncontract MixinERC721Transfer is\n LibBytes,\n LibTransferErrors\n{\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // There exists only 1 of each token.\n require(\n amount == 1,\n INVALID_AMOUNT\n );\n \n // Decode asset data.\n (\n address token,\n uint256 tokenId,\n bytes memory receiverData\n ) = decodeERC721AssetData(assetData);\n\n ERC721Token(token).safeTransferFrom(from, to, tokenId, receiverData);\n }\n\n /// @dev Decodes ERC721 Asset data.\n /// @param assetData Encoded byte array.\n /// @return proxyId Intended ERC721 proxy id.\n /// @return token ERC721 token address.\n /// @return tokenId ERC721 token id.\n /// @return receiverData Additional data with no specific format, which\n /// is passed to the receiving contract's onERC721Received.\n function decodeERC721AssetData(bytes memory assetData)\n internal\n pure\n returns (\n address token,\n uint256 tokenId,\n bytes memory receiverData\n )\n {\n // Decode asset data.\n token = readAddress(assetData, 0);\n tokenId = readUint256(assetData, 20);\n if (assetData.length > 52) {\n receiverData = readBytes(assetData, 52);\n }\n\n return (\n token,\n tokenId,\n receiverData\n );\n }\n}\n",
"current/protocol/AssetProxy/interfaces/IAssetProxy.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 \"./IAuthorizable.sol\";\n\ncontract IAssetProxy is\n IAuthorizable\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n /// @param from Array of addresses to transfer assets from.\n /// @param to Array of addresses to transfer assets to.\n /// @param amounts Array of amounts of assets to transfer.\n function batchTransferFrom(\n bytes[] memory assetData,\n address[] memory from,\n address[] memory to,\n uint256[] memory amounts\n )\n public;\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8);\n}\n\n",
"current/protocol/AssetProxy/interfaces/IAuthorizable.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 \"../../../utils/Ownable/IOwnable.sol\";\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[]);\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n}\n",
"current/protocol/AssetProxy/libs/LibAssetProxyErrors.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\ncontract LibAssetProxyErrors {\n /// Authorizable errors ///\n string constant SENDER_NOT_AUTHORIZED = \"SENDER_NOT_AUTHORIZED\"; // Sender not authorized to call this method.\n string constant TARGET_NOT_AUTHORIZED = \"TARGET_NOT_AUTHORIZED\"; // Target address not authorized to call this method.\n string constant TARGET_ALREADY_AUTHORIZED = \"TARGET_ALREADY_AUTHORIZED\"; // Target address must not already be authorized.\n string constant INDEX_OUT_OF_BOUNDS = \"INDEX_OUT_OF_BOUNDS\"; // Specified array index is out of bounds.\n string constant AUTHORIZED_ADDRESS_MISMATCH = \"AUTHORIZED_ADDRESS_MISMATCH\"; // Address at index does not match given target address.\n}\n",
"current/protocol/AssetProxy/libs/LibTransferErrors.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\ncontract LibTransferErrors {\n /// Transfer errors ///\n string constant INVALID_AMOUNT = \"INVALID_AMOUNT\"; // Transfer amount must equal 1.\n string constant TRANSFER_FAILED = \"TRANSFER_FAILED\"; // Transfer failed.\n}\n",
"current/protocol/AssetProxy/mixins/MAssetProxy.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 \"../interfaces/IAssetProxy.sol\";\n\ncontract MAssetProxy is\n IAssetProxy\n{\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal;\n}\n",
"current/protocol/AssetProxy/mixins/MAuthorizable.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 \"../interfaces/IAuthorizable.sol\";\n\ncontract MAuthorizable is\n IAuthorizable\n{\n\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized { revert(); _; }\n}\n",
"current/test/TestAssetDataDecoders/TestAssetDataDecoders.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/AssetProxy/ERC20Proxy.sol\";\nimport \"../../protocol/AssetProxy/ERC721Proxy.sol\";\n\ncontract TestAssetDataDecoders is\n ERC721Proxy\n{\n /// @dev Decodes ERC721 Asset data.\n /// @param assetData Encoded byte array.\n /// @return proxyId Intended ERC721 proxy id.\n /// @return token ERC721 token address.\n /// @return tokenId ERC721 token id.\n /// @return receiverData Additional data with no specific format, which\n /// is passed to the receiving contract's onERC721Received.\n function publicDecodeERC721Data(bytes memory assetData)\n public\n pure\n returns (\n address token,\n uint256 tokenId,\n bytes memory receiverData\n )\n {\n (\n token,\n tokenId,\n receiverData\n ) = decodeERC721AssetData(assetData);\n\n return (\n token,\n tokenId,\n receiverData\n );\n }\n}\n",
"current/tokens/ERC20Token/IERC20Token.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\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
"current/tokens/ERC721Token/ERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\nimport \"./IERC721Token.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic implementation\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721BasicToken.sol\n */\ncontract ERC721Token is\n IERC721Token,\n SafeMath\n{\n // Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;\n\n // Mapping from token ID to owner\n mapping (uint256 => address) internal tokenOwner;\n\n // Mapping from token ID to approved address\n mapping (uint256 => address) internal tokenApprovals;\n\n // Mapping from owner to number of owned token\n mapping (address => uint256) internal ownedTokensCount;\n\n // Mapping from owner to operator approvals\n mapping (address => mapping (address => bool)) internal operatorApprovals;\n\n /**\n * @dev Guarantees msg.sender is owner of the given token\n * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender\n */\n modifier onlyOwnerOf(uint256 _tokenId) {\n require(ownerOf(_tokenId) == msg.sender);\n _;\n }\n\n /**\n * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator\n * @param _tokenId uint256 ID of the token to validate\n */\n modifier canTransfer(uint256 _tokenId) {\n require(isApprovedOrOwner(msg.sender, _tokenId));\n _;\n }\n\n function ERC721Token(\n string _name,\n string _symbol)\n public\n {\n name_ = _name;\n symbol_ = _symbol;\n }\n\n /**\n * @dev Gets the token name\n * @return string representing the token name\n */\n function name()\n public\n view\n returns (string)\n {\n return name_;\n }\n\n /**\n * @dev Gets the token symbol\n * @return string representing the token symbol\n */\n function symbol()\n public\n view\n returns (string)\n {\n return symbol_;\n }\n\n /**\n * @dev Gets the balance of the specified address\n * @param _owner address to query the balance of\n * @return uint256 representing the amount owned by the passed address\n */\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n require(_owner != address(0));\n return ownedTokensCount[_owner];\n }\n\n /**\n * @dev Gets the owner of the specified token ID\n * @param _tokenId uint256 ID of the token to query the owner of\n * @return owner address currently marked as the owner of the given token ID\n */\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address)\n {\n address owner = tokenOwner[_tokenId];\n require(owner != address(0));\n return owner;\n }\n\n /**\n * @dev Returns whether the specified token exists\n * @param _tokenId uint256 ID of the token to query the existance of\n * @return whether the token exists\n */\n function exists(uint256 _tokenId)\n public\n view\n returns (bool)\n {\n address owner = tokenOwner[_tokenId];\n return owner != address(0);\n }\n\n /**\n * @dev Approves another address to transfer the given token ID\n * @dev The zero address indicates there is no approved address.\n * @dev There can only be one approved address per token at a given time.\n * @dev Can only be called by the token owner or an approved operator.\n * @param _to address to be approved for the given token ID\n * @param _tokenId uint256 ID of the token to be approved\n */\n function approve(address _to, uint256 _tokenId)\n public\n {\n address owner = ownerOf(_tokenId);\n require(_to != owner);\n require(msg.sender == owner || isApprovedForAll(owner, msg.sender));\n\n if (getApproved(_tokenId) != address(0) || _to != address(0)) {\n tokenApprovals[_tokenId] = _to;\n emit Approval(owner, _to, _tokenId);\n }\n }\n\n /**\n * @dev Gets the approved address for a token ID, or zero if no address set\n * @param _tokenId uint256 ID of the token to query the approval of\n * @return address currently approved for a the given token ID\n */\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address)\n {\n return tokenApprovals[_tokenId];\n }\n\n /**\n * @dev Sets or unsets the approval of a given operator\n * @dev An operator is allowed to transfer all tokens of the sender on their behalf\n * @param _to operator address to set the approval\n * @param _approved representing the status of the approval to be set\n */\n function setApprovalForAll(address _to, bool _approved)\n public\n {\n require(_to != msg.sender);\n operatorApprovals[msg.sender][_to] = _approved;\n emit ApprovalForAll(msg.sender, _to, _approved);\n }\n\n /**\n * @dev Tells whether an operator is approved by a given owner\n * @param _owner owner address which you want to query the approval of\n * @param _operator operator address which you want to query the approval of\n * @return bool whether the given operator is approved by the given owner\n */\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool)\n {\n return operatorApprovals[_owner][_operator];\n }\n\n /**\n * @dev Transfers the ownership of a given token ID to another address\n * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function transferFrom(address _from, address _to, uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n require(_from != address(0));\n require(_to != address(0));\n\n clearApproval(_from, _tokenId);\n removeTokenFrom(_from, _tokenId);\n addTokenTo(_to, _tokenId);\n\n emit Transfer(_from, _to, _tokenId);\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n // solium-disable-next-line arg-overflow\n safeTransferFrom(_from, _to, _tokenId, \"\");\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes data to send along with a safe transfer check\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public\n canTransfer(_tokenId)\n {\n transferFrom(_from, _to, _tokenId);\n // solium-disable-next-line arg-overflow\n require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));\n }\n\n /**\n * @dev Returns whether the given spender can transfer a given token ID\n * @param _spender address of the spender to query\n * @param _tokenId uint256 ID of the token to be transferred\n * @return bool whether the msg.sender is approved for the given token ID,\n * is an operator of the owner, or is the owner of the token\n */\n function isApprovedOrOwner(address _spender, uint256 _tokenId)\n internal\n view\n returns (bool)\n {\n address owner = ownerOf(_tokenId);\n return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);\n }\n\n /**\n * @dev Internal function to mint a new token\n * @dev Reverts if the given token ID already exists\n * @param _to The address that will own the minted token\n * @param _tokenId uint256 ID of the token to be minted by the msg.sender\n */\n function _mint(address _to, uint256 _tokenId)\n internal\n {\n require(_to != address(0));\n addTokenTo(_to, _tokenId);\n emit Transfer(address(0), _to, _tokenId);\n }\n\n /**\n * @dev Internal function to burn a specific token\n * @dev Reverts if the token does not exist\n * @param _tokenId uint256 ID of the token being burned by the msg.sender\n */\n function _burn(address _owner, uint256 _tokenId)\n internal\n {\n clearApproval(_owner, _tokenId);\n removeTokenFrom(_owner, _tokenId);\n emit Transfer(_owner, address(0), _tokenId);\n }\n\n /**\n * @dev Internal function to clear current approval of a given token ID\n * @dev Reverts if the given address is not indeed the owner of the token\n * @param _owner owner of the token\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function clearApproval(address _owner, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _owner);\n if (tokenApprovals[_tokenId] != address(0)) {\n tokenApprovals[_tokenId] = address(0);\n emit Approval(_owner, address(0), _tokenId);\n }\n }\n\n /**\n * @dev Internal function to add a token ID to the list of a given address\n * @param _to address representing the new owner of the given token ID\n * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address\n */\n function addTokenTo(address _to, uint256 _tokenId)\n internal\n {\n require(tokenOwner[_tokenId] == address(0));\n tokenOwner[_tokenId] = _to;\n ownedTokensCount[_to] = safeAdd(ownedTokensCount[_to], 1);\n }\n\n /**\n * @dev Internal function to remove a token ID from the list of a given address\n * @param _from address representing the previous owner of the given token ID\n * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address\n */\n function removeTokenFrom(address _from, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _from);\n ownedTokensCount[_from] = safeSub(ownedTokensCount[_from], 1);\n tokenOwner[_tokenId] = address(0);\n }\n\n /**\n * @dev Internal function to invoke `onERC721Received` on a target address\n * @dev The call is not executed if the target address is not a contract\n * @param _from address representing the previous owner of the given token ID\n * @param _to target address that will receive the tokens\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes optional data to send along with the call\n * @return whether the call correctly returned the expected magic value\n */\n function checkAndCallSafeTransfer(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n internal\n returns (bool)\n {\n if (!isContract(_to)) {\n return true;\n }\n bytes4 retval = IERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);\n return (retval == ERC721_RECEIVED);\n }\n\n function isContract(address addr)\n internal\n view\n returns (bool)\n {\n uint256 size;\n // XXX Currently there is no better way to check if there is a contract in an address\n // than to check the size of the code at that address.\n // See https://ethereum.stackexchange.com/a/14016/36603\n // for more details about how this works.\n // TODO Check this again before the Serenity release, because all addresses will be\n // contracts then.\n assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly\n return size > 0;\n }\n}\n",
"current/tokens/ERC721Token/IERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * rom ERC721 asset contracts.\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol\n */\ncontract IERC721Receiver {\n /**\n * @dev Magic value to be returned upon successful reception of an NFT\n * Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`,\n * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n */\n bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;\n\n /**\n * @notice Handle the receipt of an NFT\n * @dev The ERC721 smart contract calls this function on the recipient\n * after a `safetransfer`. This function MAY throw to revert and reject the\n * transfer. This function MUST use 50,000 gas or less. Return of other\n * than the magic value MUST result in the transaction being reverted.\n * Note: the contract address is always the message sender.\n * @param _from The sending address\n * @param _tokenId The NFT identifier which is being transfered\n * @param _data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n */\n function onERC721Received(\n address _from,\n uint256 _tokenId,\n bytes _data)\n public\n returns (bytes4);\n}\n",
"current/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public;\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public;\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public;\n}\n",
"current/utils/LibBytes/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../LibMem/LibMem.sol\";\n\ncontract LibBytes is\n LibMem\n{\n\n // Revert reasons\n string constant GREATER_THAN_ZERO_LENGTH_REQUIRED = \"GREATER_THAN_ZERO_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\";\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n GREATER_THAN_ZERO_LENGTH_REQUIRED\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads the first 4 bytes from a byte array of arbitrary length.\n /// @param b Byte array to read first 4 bytes from.\n /// @return First 4 bytes of data.\n function readFirst4(bytes memory b)\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= 4,\n GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\n );\n assembly {\n result := mload(add(b, 32))\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytes(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Allocate memory and copy value to result\n result = new bytes(nestedBytesLength);\n memCopy(\n getMemAddress(result) + 32, // +32 skips array length\n getMemAddress(b) + index + 32,\n nestedBytesLength\n );\n\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes to insert.\n function writeBytes(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of is valid, given\n // length of input\n require(\n b.length >= index + 32 /* 32 bytes to store length */ + input.length,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Copy into \n memCopy(\n getMemAddress(b) + 32 + index, // +32 to skip length of \n getMemAddress(input), // includes length of \n input.length + 32 // +32 bytes to store length\n );\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function areBytesEqual(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n assembly {\n // Get the number of words occupied by \n let lenFullWords := div(add(mload(lhs), 0x1F), 0x20)\n\n // Add 1 to the number of words, to account for the length field\n lenFullWords := add(lenFullWords, 0x1)\n\n // Test equality word-by-word.\n // Terminates early if there is a mismatch.\n for {let i := 0} lt(i, lenFullWords) {i := add(i, 1)} {\n let lhsWord := mload(add(lhs, mul(i, 0x20)))\n let rhsWord := mload(add(rhs, mul(i, 0x20)))\n equal := eq(lhsWord, rhsWord)\n if eq(equal, 0) {\n // Break\n i := lenFullWords\n }\n }\n }\n\n return equal;\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\n );\n memCopy(\n getMemAddress(dest) + 32, // +32 to skip length of \n getMemAddress(source) + 32, // +32 to skip length of