aboutsummaryrefslogtreecommitdiffstats
path: root/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json
blob: 7635ab779fcb6c4723a6bd4129a53de014a293d8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
{
    "schemaVersion": "2.0.0",
    "contractName": "TestSignatureValidator",
    "compilerOutput": {
        "abi": [
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "hash",
                        "type": "bytes32"
                    },
                    {
                        "name": "signer",
                        "type": "address"
                    },
                    {
                        "name": "signature",
                        "type": "bytes"
                    }
                ],
                "name": "preSign",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "hash",
                        "type": "bytes32"
                    },
                    {
                        "name": "signer",
                        "type": "address"
                    },
                    {
                        "name": "signature",
                        "type": "bytes"
                    }
                ],
                "name": "publicIsValidSignature",
                "outputs": [
                    {
                        "name": "isValid",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": true,
                        "name": "errorId",
                        "type": "uint8"
                    },
                    {
                        "indexed": true,
                        "name": "orderHash",
                        "type": "bytes32"
                    }
                ],
                "name": "ExchangeError",
                "type": "event"
            }
        ],
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b50610bdf806100206000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e8114610050578063abba41cc14610072575b600080fd5b34801561005c57600080fd5b5061007061006b3660046108b2565b6100a8565b005b34801561007e57600080fd5b5061009261008d36600461091a565b610174565b60405161009f9190610a35565b60405180910390f35b6100e3848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750610189945050505050565b60408051808201909152601c81527f5369676e61747572652076616c69646174696f6e206661696c65642e0000000060208201529015156101435760405160e560020a62461bcd02815260040161013a9190610aa1565b60405180910390fd5b505050600091825260208281526040808420600160a060020a0390931684529190529020805460ff19166001179055565b6000610181848484610189565b949350505050565b600080600080600080600187511015604080519081016040528060198152602001600080516020610b868339815191528152509015156101df5760405160e560020a62461bcd02815260040161013a9190610aa1565b508660008151811015156101ef57fe5b90602001015160f860020a900460f860020a0260f860020a900460ff16600781111561021757fe5b9450600085600781111561022757fe5b14156102485760405160e560020a62461bcd02815260040161013a90610ac2565b600185600781111561025657fe5b14156102ae5786516040805180820190915260198152600080516020610b868339815191526020820152906001146102a45760405160e560020a62461bcd02815260040161013a9190610aa1565b5060009550610722565b60028560078111156102bc57fe5b141561032a5786516040805180820190915260198152600080516020610b8683398151915260208201529060011461030a5760405160e560020a62461bcd02815260040161013a9190610aa1565b5033600160a060020a031688600160a060020a0316149550859550610722565b600385600781111561033857fe5b14156104655786516040805180820190915260198152600080516020610b868339815191526020820152906042146103865760405160e560020a62461bcd02815260040161013a9190610aa1565b5086600181518110151561039657fe5b016020015160f860020a9081900481020493506103b487600261072e565b92506103c187602261072e565b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c81018c9052815190819003603c018120600082526020919091019182905291935060019161041d91879087908790610a63565b60206040516020810390808403906000865af1158015610441573d6000803e3d6000fd5b5050604051601f190151600160a060020a038a811690821614975091506107229050565b600485600781111561047357fe5b14156105215786516040805180820190915260198152600080516020610b868339815191526020820152906042146104c15760405160e560020a62461bcd02815260040161013a9190610aa1565b508660018151811015156104d157fe5b016020015160f860020a9081900481020493506104ef87600261072e565b92506104fc87602261072e565b91506001898585856040516000815260200160405260405161041d9493929190610a63565b600585600781111561052f57fe5b14156106145786516040805180820190915260198152600080516020610b8683398151915260208201529060421461057d5760405160e560020a62461bcd02815260040161013a9190610aa1565b5086600181518110151561058d57fe5b016020015160f860020a9081900481020493506105ab87600261072e565b92506105b887602261072e565b604080517f19457468657265756d205369676e6564204d6573736167653a0a4100000000008152601b81018c9052815190819003603b018120600082526020919091019182905291935060019161041d91879087908790610a63565b600685600781111561062257fe5b14156106c8576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a03891690631626ba7e9061066f908c908b90600401610a43565b602060405180830381600087803b15801561068957600080fd5b505af115801561069d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106c19190810190610894565b9550610722565b60078560078111156106d657fe5b141561070757600089815260208181526040808320600160a060020a038c16845290915290205460ff169550610722565b60405160e560020a62461bcd02815260040161013a90610ab2565b50505050509392505050565b60008160200183511015606060405190810160405280602b81526020017f4c656e677468206d7573742062652067726561746572207468616e206f72206581526020017f7175616c20746f2033322e0000000000000000000000000000000000000000008152509015156107b85760405160e560020a62461bcd02815260040161013a9190610aa1565b505060208183018101519101905b92915050565b60006107d88235610b33565b9392505050565b60006107d88251610b25565b60006107d88235610b2a565b600080601f8301841361080957600080fd5b50813567ffffffffffffffff81111561082157600080fd5b60208301915083600182028301111561083957600080fd5b9250929050565b6000601f8201831361085157600080fd5b813561086461085f82610af9565b610ad2565b9150808252602083016020830185838301111561088057600080fd5b61088b838284610b3f565b50505092915050565b6000602082840312156108a657600080fd5b600061018184846107df565b600080600080606085870312156108c857600080fd5b60006108d487876107eb565b94505060206108e5878288016107cc565b935050604085013567ffffffffffffffff81111561090257600080fd5b61090e878288016107f7565b95989497509550505050565b60008060006060848603121561092f57600080fd5b600061093b86866107eb565b935050602061094c868287016107cc565b925050604084013567ffffffffffffffff81111561096957600080fd5b61097586828701610840565b9150509250925092565b61098881610b25565b82525050565b61098881610b2a565b60006109a282610b21565b8084526109b6816020860160208601610b4b565b6109bf81610b7b565b9093016020019392505050565b601b81527f556e737570706f72746564207369676e617475726520747970652e0000000000602082015260400190565b601781527f496c6c6567616c207369676e617475726520747970652e000000000000000000602082015260400190565b61098881610b2d565b602081016107c6828461097f565b60408101610a51828561098e565b81810360208301526101818184610997565b60808101610a71828761098e565b610a7e6020830186610a2c565b610a8b604083018561098e565b610a98606083018461098e565b95945050505050565b602080825281016107d88184610997565b602080825281016107c6816109cc565b602080825281016107c6816109fc565b60405181810167ffffffffffffffff81118282101715610af157600080fd5b604052919050565b600067ffffffffffffffff821115610b1057600080fd5b506020601f91909101601f19160190565b5190565b151590565b90565b60ff1690565b600160a060020a031690565b82818337506000910152565b60005b83811015610b66578181015183820152602001610b4e565b83811115610b75576000848401525b50505050565b601f01601f1916905600496e76616c6964207369676e6174757265206c656e6774682e00000000000000a265627a7a7230582030a6aeb933e87ee8a7bc28a61aa098df7cb21f2be40a9c9b98e39ab7b33c74356c6578706572696d656e74616cf50037",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBDF DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x72 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x6B CALLDATASIZE PUSH1 0x4 PUSH2 0x8B2 JUMP JUMPDEST PUSH2 0xA8 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x92 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x91A JUMP JUMPDEST PUSH2 0x174 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x9F SWAP2 SWAP1 PUSH2 0xA35 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE3 DUP5 DUP5 DUP5 DUP5 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 POP PUSH2 0x189 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1C DUP2 MSTORE PUSH32 0x5369676E61747572652076616C69646174696F6E206661696C65642E00000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x143 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x181 DUP5 DUP5 DUP5 PUSH2 0x189 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x1 DUP8 MLOAD LT ISZERO PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1DF JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1EF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xF8 PUSH1 0x2 EXP MUL PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x217 JUMPI INVALID JUMPDEST SWAP5 POP PUSH1 0x0 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x227 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x248 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP1 PUSH2 0xAC2 JUMP JUMPDEST PUSH1 0x1 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x256 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x2AE JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 EQ PUSH2 0x2A4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP PUSH1 0x0 SWAP6 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x2 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x2BC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x32A JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 EQ PUSH2 0x30A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP9 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ SWAP6 POP DUP6 SWAP6 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x3 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x338 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x465 JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x42 EQ PUSH2 0x386 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP DUP7 PUSH1 0x1 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x396 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP4 POP PUSH2 0x3B4 DUP8 PUSH1 0x2 PUSH2 0x72E JUMP JUMPDEST SWAP3 POP PUSH2 0x3C1 DUP8 PUSH1 0x22 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE PUSH1 0x1C DUP2 ADD DUP13 SWAP1 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x3C ADD DUP2 KECCAK256 PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 SWAP1 MSTORE SWAP2 SWAP4 POP PUSH1 0x1 SWAP2 PUSH2 0x41D SWAP2 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0xA63 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x441 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 DUP2 AND SWAP1 DUP3 AND EQ SWAP8 POP SWAP2 POP PUSH2 0x722 SWAP1 POP JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x473 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x521 JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x42 EQ PUSH2 0x4C1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP DUP7 PUSH1 0x1 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4D1 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP4 POP PUSH2 0x4EF DUP8 PUSH1 0x2 PUSH2 0x72E JUMP JUMPDEST SWAP3 POP PUSH2 0x4FC DUP8 PUSH1 0x22 PUSH2 0x72E JUMP JUMPDEST SWAP2 POP PUSH1 0x1 DUP10 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x41D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xA63 JUMP JUMPDEST PUSH1 0x5 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x52F JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x614 JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x42 EQ PUSH2 0x57D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP DUP7 PUSH1 0x1 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x58D JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP4 POP PUSH2 0x5AB DUP8 PUSH1 0x2 PUSH2 0x72E JUMP JUMPDEST SWAP3 POP PUSH2 0x5B8 DUP8 PUSH1 0x22 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 DUP2 MSTORE PUSH1 0x1B DUP2 ADD DUP13 SWAP1 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x3B ADD DUP2 KECCAK256 PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 SWAP1 MSTORE SWAP2 SWAP4 POP PUSH1 0x1 SWAP2 PUSH2 0x41D SWAP2 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0xA63 JUMP JUMPDEST PUSH1 0x6 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x622 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x6C8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x66F SWAP1 DUP13 SWAP1 DUP12 SWAP1 PUSH1 0x4 ADD PUSH2 0xA43 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x689 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x69D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x6C1 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x894 JUMP JUMPDEST SWAP6 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x7 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x6D6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x707 JUMPI PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP13 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP6 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP1 PUSH2 0xAB2 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP 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 0x2B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E206F722065 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7175616C20746F2033322E000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x7B8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP POP PUSH1 0x20 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7D8 DUP3 CALLDATALOAD PUSH2 0xB33 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7D8 DUP3 MLOAD PUSH2 0xB25 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7D8 DUP3 CALLDATALOAD PUSH2 0xB2A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x821 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x839 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x851 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x864 PUSH2 0x85F DUP3 PUSH2 0xAF9 JUMP JUMPDEST PUSH2 0xAD2 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x880 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x88B DUP4 DUP3 DUP5 PUSH2 0xB3F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x181 DUP5 DUP5 PUSH2 0x7DF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x8C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x8D4 DUP8 DUP8 PUSH2 0x7EB JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x8E5 DUP8 DUP3 DUP9 ADD PUSH2 0x7CC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x902 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x90E DUP8 DUP3 DUP9 ADD PUSH2 0x7F7 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x92F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x93B DUP7 DUP7 PUSH2 0x7EB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x94C DUP7 DUP3 DUP8 ADD PUSH2 0x7CC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x969 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x975 DUP7 DUP3 DUP8 ADD PUSH2 0x840 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH2 0x988 DUP2 PUSH2 0xB25 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x988 DUP2 PUSH2 0xB2A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9A2 DUP3 PUSH2 0xB21 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x9B6 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xB4B JUMP JUMPDEST PUSH2 0x9BF DUP2 PUSH2 0xB7B JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1B DUP2 MSTORE PUSH32 0x556E737570706F72746564207369676E617475726520747970652E0000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x496C6C6567616C207369676E617475726520747970652E000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH2 0x988 DUP2 PUSH2 0xB2D JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x7C6 DUP3 DUP5 PUSH2 0x97F JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0xA51 DUP3 DUP6 PUSH2 0x98E JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x181 DUP2 DUP5 PUSH2 0x997 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xA71 DUP3 DUP8 PUSH2 0x98E JUMP JUMPDEST PUSH2 0xA7E PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0xA2C JUMP JUMPDEST PUSH2 0xA8B PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x98E JUMP JUMPDEST PUSH2 0xA98 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x98E JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7D8 DUP2 DUP5 PUSH2 0x997 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7C6 DUP2 PUSH2 0x9CC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7C6 DUP2 PUSH2 0x9FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xAF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xB10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB66 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB4E JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xB75 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP 0x49 PUSH15 0x76616C6964207369676E6174757265 KECCAK256 PUSH13 0x656E6774682E00000000000000 LOG2 PUSH6 0x627A7A723058 KECCAK256 ADDRESS 0xa6 0xae 0xb9 CALLER 0xe8 PUSH31 0xE8A7BC28A61AA098DF7CB21F2BE40A9C9B98E39AB7B33C74356C6578706572 PUSH10 0x6D656E74616CF5003700 ",
                "sourceMap": "703:380:5:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;703:380:5;;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x60806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e8114610050578063abba41cc14610072575b600080fd5b34801561005c57600080fd5b5061007061006b3660046108b2565b6100a8565b005b34801561007e57600080fd5b5061009261008d36600461091a565b610174565b60405161009f9190610a35565b60405180910390f35b6100e3848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750610189945050505050565b60408051808201909152601c81527f5369676e61747572652076616c69646174696f6e206661696c65642e0000000060208201529015156101435760405160e560020a62461bcd02815260040161013a9190610aa1565b60405180910390fd5b505050600091825260208281526040808420600160a060020a0390931684529190529020805460ff19166001179055565b6000610181848484610189565b949350505050565b600080600080600080600187511015604080519081016040528060198152602001600080516020610b868339815191528152509015156101df5760405160e560020a62461bcd02815260040161013a9190610aa1565b508660008151811015156101ef57fe5b90602001015160f860020a900460f860020a0260f860020a900460ff16600781111561021757fe5b9450600085600781111561022757fe5b14156102485760405160e560020a62461bcd02815260040161013a90610ac2565b600185600781111561025657fe5b14156102ae5786516040805180820190915260198152600080516020610b868339815191526020820152906001146102a45760405160e560020a62461bcd02815260040161013a9190610aa1565b5060009550610722565b60028560078111156102bc57fe5b141561032a5786516040805180820190915260198152600080516020610b8683398151915260208201529060011461030a5760405160e560020a62461bcd02815260040161013a9190610aa1565b5033600160a060020a031688600160a060020a0316149550859550610722565b600385600781111561033857fe5b14156104655786516040805180820190915260198152600080516020610b868339815191526020820152906042146103865760405160e560020a62461bcd02815260040161013a9190610aa1565b5086600181518110151561039657fe5b016020015160f860020a9081900481020493506103b487600261072e565b92506103c187602261072e565b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c81018c9052815190819003603c018120600082526020919091019182905291935060019161041d91879087908790610a63565b60206040516020810390808403906000865af1158015610441573d6000803e3d6000fd5b5050604051601f190151600160a060020a038a811690821614975091506107229050565b600485600781111561047357fe5b14156105215786516040805180820190915260198152600080516020610b868339815191526020820152906042146104c15760405160e560020a62461bcd02815260040161013a9190610aa1565b508660018151811015156104d157fe5b016020015160f860020a9081900481020493506104ef87600261072e565b92506104fc87602261072e565b91506001898585856040516000815260200160405260405161041d9493929190610a63565b600585600781111561052f57fe5b14156106145786516040805180820190915260198152600080516020610b8683398151915260208201529060421461057d5760405160e560020a62461bcd02815260040161013a9190610aa1565b5086600181518110151561058d57fe5b016020015160f860020a9081900481020493506105ab87600261072e565b92506105b887602261072e565b604080517f19457468657265756d205369676e6564204d6573736167653a0a4100000000008152601b81018c9052815190819003603b018120600082526020919091019182905291935060019161041d91879087908790610a63565b600685600781111561062257fe5b14156106c8576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a03891690631626ba7e9061066f908c908b90600401610a43565b602060405180830381600087803b15801561068957600080fd5b505af115801561069d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106c19190810190610894565b9550610722565b60078560078111156106d657fe5b141561070757600089815260208181526040808320600160a060020a038c16845290915290205460ff169550610722565b60405160e560020a62461bcd02815260040161013a90610ab2565b50505050509392505050565b60008160200183511015606060405190810160405280602b81526020017f4c656e677468206d7573742062652067726561746572207468616e206f72206581526020017f7175616c20746f2033322e0000000000000000000000000000000000000000008152509015156107b85760405160e560020a62461bcd02815260040161013a9190610aa1565b505060208183018101519101905b92915050565b60006107d88235610b33565b9392505050565b60006107d88251610b25565b60006107d88235610b2a565b600080601f8301841361080957600080fd5b50813567ffffffffffffffff81111561082157600080fd5b60208301915083600182028301111561083957600080fd5b9250929050565b6000601f8201831361085157600080fd5b813561086461085f82610af9565b610ad2565b9150808252602083016020830185838301111561088057600080fd5b61088b838284610b3f565b50505092915050565b6000602082840312156108a657600080fd5b600061018184846107df565b600080600080606085870312156108c857600080fd5b60006108d487876107eb565b94505060206108e5878288016107cc565b935050604085013567ffffffffffffffff81111561090257600080fd5b61090e878288016107f7565b95989497509550505050565b60008060006060848603121561092f57600080fd5b600061093b86866107eb565b935050602061094c868287016107cc565b925050604084013567ffffffffffffffff81111561096957600080fd5b61097586828701610840565b9150509250925092565b61098881610b25565b82525050565b61098881610b2a565b60006109a282610b21565b8084526109b6816020860160208601610b4b565b6109bf81610b7b565b9093016020019392505050565b601b81527f556e737570706f72746564207369676e617475726520747970652e0000000000602082015260400190565b601781527f496c6c6567616c207369676e617475726520747970652e000000000000000000602082015260400190565b61098881610b2d565b602081016107c6828461097f565b60408101610a51828561098e565b81810360208301526101818184610997565b60808101610a71828761098e565b610a7e6020830186610a2c565b610a8b604083018561098e565b610a98606083018461098e565b95945050505050565b602080825281016107d88184610997565b602080825281016107c6816109cc565b602080825281016107c6816109fc565b60405181810167ffffffffffffffff81118282101715610af157600080fd5b604052919050565b600067ffffffffffffffff821115610b1057600080fd5b506020601f91909101601f19160190565b5190565b151590565b90565b60ff1690565b600160a060020a031690565b82818337506000910152565b60005b83811015610b66578181015183820152602001610b4e565b83811115610b75576000848401525b50505050565b601f01601f1916905600496e76616c6964207369676e6174757265206c656e6774682e00000000000000a265627a7a7230582030a6aeb933e87ee8a7bc28a61aa098df7cb21f2be40a9c9b98e39ab7b33c74356c6578706572696d656e74616cf50037",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x72 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x6B CALLDATASIZE PUSH1 0x4 PUSH2 0x8B2 JUMP JUMPDEST PUSH2 0xA8 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x92 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x91A JUMP JUMPDEST PUSH2 0x174 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x9F SWAP2 SWAP1 PUSH2 0xA35 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE3 DUP5 DUP5 DUP5 DUP5 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 POP PUSH2 0x189 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1C DUP2 MSTORE PUSH32 0x5369676E61747572652076616C69646174696F6E206661696C65642E00000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x143 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x181 DUP5 DUP5 DUP5 PUSH2 0x189 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x1 DUP8 MLOAD LT ISZERO PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1DF JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1EF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xF8 PUSH1 0x2 EXP MUL PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x217 JUMPI INVALID JUMPDEST SWAP5 POP PUSH1 0x0 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x227 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x248 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP1 PUSH2 0xAC2 JUMP JUMPDEST PUSH1 0x1 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x256 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x2AE JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 EQ PUSH2 0x2A4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP PUSH1 0x0 SWAP6 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x2 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x2BC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x32A JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 EQ PUSH2 0x30A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP9 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ SWAP6 POP DUP6 SWAP6 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x3 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x338 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x465 JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x42 EQ PUSH2 0x386 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP DUP7 PUSH1 0x1 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x396 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP4 POP PUSH2 0x3B4 DUP8 PUSH1 0x2 PUSH2 0x72E JUMP JUMPDEST SWAP3 POP PUSH2 0x3C1 DUP8 PUSH1 0x22 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE PUSH1 0x1C DUP2 ADD DUP13 SWAP1 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x3C ADD DUP2 KECCAK256 PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 SWAP1 MSTORE SWAP2 SWAP4 POP PUSH1 0x1 SWAP2 PUSH2 0x41D SWAP2 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0xA63 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x441 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 DUP2 AND SWAP1 DUP3 AND EQ SWAP8 POP SWAP2 POP PUSH2 0x722 SWAP1 POP JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x473 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x521 JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x42 EQ PUSH2 0x4C1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP DUP7 PUSH1 0x1 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4D1 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP4 POP PUSH2 0x4EF DUP8 PUSH1 0x2 PUSH2 0x72E JUMP JUMPDEST SWAP3 POP PUSH2 0x4FC DUP8 PUSH1 0x22 PUSH2 0x72E JUMP JUMPDEST SWAP2 POP PUSH1 0x1 DUP10 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x41D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xA63 JUMP JUMPDEST PUSH1 0x5 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x52F JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x614 JUMPI DUP7 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xB86 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x42 EQ PUSH2 0x57D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP DUP7 PUSH1 0x1 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x58D JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP4 POP PUSH2 0x5AB DUP8 PUSH1 0x2 PUSH2 0x72E JUMP JUMPDEST SWAP3 POP PUSH2 0x5B8 DUP8 PUSH1 0x22 PUSH2 0x72E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 DUP2 MSTORE PUSH1 0x1B DUP2 ADD DUP13 SWAP1 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x3B ADD DUP2 KECCAK256 PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 SWAP1 MSTORE SWAP2 SWAP4 POP PUSH1 0x1 SWAP2 PUSH2 0x41D SWAP2 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0xA63 JUMP JUMPDEST PUSH1 0x6 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x622 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x6C8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x66F SWAP1 DUP13 SWAP1 DUP12 SWAP1 PUSH1 0x4 ADD PUSH2 0xA43 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x689 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x69D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x6C1 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x894 JUMP JUMPDEST SWAP6 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x7 DUP6 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x6D6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x707 JUMPI PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP13 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP6 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP1 PUSH2 0xAB2 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP 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 0x2B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E206F722065 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7175616C20746F2033322E000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x7B8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP2 SWAP1 PUSH2 0xAA1 JUMP JUMPDEST POP POP PUSH1 0x20 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7D8 DUP3 CALLDATALOAD PUSH2 0xB33 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7D8 DUP3 MLOAD PUSH2 0xB25 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7D8 DUP3 CALLDATALOAD PUSH2 0xB2A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x821 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x839 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x851 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x864 PUSH2 0x85F DUP3 PUSH2 0xAF9 JUMP JUMPDEST PUSH2 0xAD2 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x880 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x88B DUP4 DUP3 DUP5 PUSH2 0xB3F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x181 DUP5 DUP5 PUSH2 0x7DF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x8C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x8D4 DUP8 DUP8 PUSH2 0x7EB JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x8E5 DUP8 DUP3 DUP9 ADD PUSH2 0x7CC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x902 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x90E DUP8 DUP3 DUP9 ADD PUSH2 0x7F7 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x92F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x93B DUP7 DUP7 PUSH2 0x7EB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x94C DUP7 DUP3 DUP8 ADD PUSH2 0x7CC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x969 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x975 DUP7 DUP3 DUP8 ADD PUSH2 0x840 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH2 0x988 DUP2 PUSH2 0xB25 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x988 DUP2 PUSH2 0xB2A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9A2 DUP3 PUSH2 0xB21 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x9B6 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xB4B JUMP JUMPDEST PUSH2 0x9BF DUP2 PUSH2 0xB7B JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1B DUP2 MSTORE PUSH32 0x556E737570706F72746564207369676E617475726520747970652E0000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x496C6C6567616C207369676E617475726520747970652E000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH2 0x988 DUP2 PUSH2 0xB2D JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x7C6 DUP3 DUP5 PUSH2 0x97F JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0xA51 DUP3 DUP6 PUSH2 0x98E JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x181 DUP2 DUP5 PUSH2 0x997 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xA71 DUP3 DUP8 PUSH2 0x98E JUMP JUMPDEST PUSH2 0xA7E PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0xA2C JUMP JUMPDEST PUSH2 0xA8B PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x98E JUMP JUMPDEST PUSH2 0xA98 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x98E JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7D8 DUP2 DUP5 PUSH2 0x997 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7C6 DUP2 PUSH2 0x9CC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7C6 DUP2 PUSH2 0x9FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xAF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xB10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB66 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB4E JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xB75 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP 0x49 PUSH15 0x76616C6964207369676E6174757265 KECCAK256 PUSH13 0x656E6774682E00000000000000 LOG2 PUSH6 0x627A7A723058 KECCAK256 ADDRESS 0xa6 0xae 0xb9 CALLER 0xe8 PUSH31 0xE8A7BC28A61AA098DF7CB21F2BE40A9C9B98E39AB7B33C74356C6578706572 PUSH10 0x6D656E74616CF5003700 ",
                "sourceMap": "703:380:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1297:280:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1297:280:0;;;;;;;;;;;769:312:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;769:312:5;;;;;;;;;;;;;;;;;;;;;;;;;1297:280:0;1438:41;1455:4;1461:6;1469:9;;1438:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1438:16:0;;-1:-1:-1;;;;;1438:41:0:i;:::-;1493:27;;;;;;;;;;;;;;;;;;1417:113;;;;;;-1:-1:-1;;;;;1417:113:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1540:9:0;:15;;;;;;;;;;;-1:-1:-1;;;;;1540:23:0;;;;;;;;;;:30;;-1:-1:-1;;1540:30:0;1566:4;1540:30;;;1297:280::o;769:312:5:-;925:12;963:87;993:4;1011:6;1031:9;963:16;:87::i;:::-;953:97;769:312;-1:-1:-1;;;;769:312:5:o;1942:5431:0:-;2094:12;2336:27;2459:7;2476:9;2495;2514:17;2277:1;2257:9;:16;:21;;2292:24;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2292:24:0;;;2236:90;;;;;;;-1:-1:-1;;;;;2236:90:0;;;;;;;;;;;2386:9;2396:1;2386:12;;;;;;;;;;;;;;;-1:-1:-1;;;2386:12:0;;-1:-1:-1;;;2386:12:0;-1:-1:-1;;;2380:19:0;;2366:34;;;;;;;;;;2336:64;-1:-1:-1;2880:21:0;2863:13;:38;;;;;;;;;2859:4041;;;3038:33;;-1:-1:-1;;;;;3038:33:0;;;;;;;;2859:4041;3352:21;3335:13;:38;;;;;;;;;3331:3569;;;3414:16;;3453:24;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3453:24:0;;;;;3434:1;3414:21;3389:102;;;;-1:-1:-1;;;;;3389:102:0;;;;;;;;;;-1:-1:-1;3515:5:0;;-1:-1:-1;3534:14:0;;3331:3569;4137:20;4120:13;:37;;;;;;;;;4116:2784;;;4198:16;;4237:24;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4237:24:0;;;;;4218:1;4198:21;4173:102;;;;-1:-1:-1;;;;;4173:102:0;;;;;;;;;;;4309:10;-1:-1:-1;;;;;4299:20:0;:6;-1:-1:-1;;;;;4299:20:0;;4289:30;;4340:7;4333:14;;;;4116:2784;4424:23;4407:13;:40;;;;;;;;;4403:2497;;;4488:16;;4528:24;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4528:24:0;;;;;4508:2;4488:22;4463:103;;;;-1:-1:-1;;;;;4463:103:0;;;;;;;;;;;4590:9;4600:1;4590:12;;;;;;;;;;;;;;-1:-1:-1;;;4590:12:0;;;;;;4584:19;;-1:-1:-1;4621:25:0;4633:9;4644:1;4621:11;:25::i;:::-;4617:29;;4664:26;4676:9;4687:2;4664:11;:26::i;:::-;4743:51;;;;;;;;;;;;;;;;;;;;;;;4716:149;;4743:51;4716:149;;;;;;;;4660:30;;-1:-1:-1;4716:149:0;;;;4812:1;;4831;;4660:30;;4716:149;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4716:149:0;;-1:-1:-1;;4716:149:0;;-1:-1:-1;;;;;4889:19:0;;;;;;;;-1:-1:-1;4716:149:0;-1:-1:-1;4922:14:0;;-1:-1:-1;4922:14:0;4403:2497;5009:20;4992:13;:37;;;;;;;;;4988:1912;;;5070:16;;5110:24;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5110:24:0;;;;;5090:2;5070:22;5045:103;;;;-1:-1:-1;;;;;5045:103:0;;;;;;;;;;;5172:9;5182:1;5172:12;;;;;;;;;;;;;;-1:-1:-1;;;5172:12:0;;;;;;5166:19;;-1:-1:-1;5203:25:0;5215:9;5226:1;5203:11;:25::i;:::-;5199:29;;5246:26;5258:9;5269:2;5246:11;:26::i;:::-;5242:30;;5298:24;5308:4;5314:1;5317;5320;5298:24;;;;;;;;;;;;;;;;;;;4988:1912;5958:20;5941:13;:37;;;;;;;;;5937:963;;;6019:16;;6059:24;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6059:24:0;;;;;6039:2;6019:22;5994:103;;;;-1:-1:-1;;;;;5994:103:0;;;;;;;;;;;6121:9;6131:1;6121:12;;;;;;;;;;;;;;-1:-1:-1;;;6121:12:0;;;;;;6115:19;;-1:-1:-1;6152:25:0;6164:9;6175:1;6152:11;:25::i;:::-;6148:29;;6195:26;6207:9;6218:2;6195:11;:26::i;:::-;6274:53;;;;;;;;;;;;;;;;;;;;;;;6247:151;;6274:53;6247:151;;;;;;;;6191:30;;-1:-1:-1;6247:151:0;;;;6345:1;;6364;;6191:30;;6247:151;;5937:963;6557:22;6540:13;:39;;;;;;;;;6536:364;;;6605:49;;;;;-1:-1:-1;;;;;6605:32:0;;;;;:49;;6638:4;;6644:9;;6605:49;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6605:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6605:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6605:49:0;;;;;;;;;6595:59;-1:-1:-1;6668:14:0;;6536:364;6789:23;6772:13;:40;;;;;;;;;6768:132;;;6838:9;:15;;;;;;;;;;;-1:-1:-1;;;;;6838:23:0;;;;;;;;;;;;;-1:-1:-1;6875:14:0;;6768:132;7329:37;;-1:-1:-1;;;;;7329:37:0;;;;;;;;1942:5431;;;;;;;;;;;:::o;4902:467:6:-;5018:14;5081:5;5089:2;5081:10;5069:1;:8;:22;;5105;;;;;;;;;;;;;;;;;;;;;;;5048:89;;;;;;;-1:-1:-1;;;;;5048:89:6;;;;;;;;;;-1:-1:-1;;5218:2:6;5316:13;;;;;5310:20;5209:11;;;4902:467;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:116;;205:36;233:6;227:13;205:36;;253:118;;320:46;358:6;345:20;320:46;;392:335;;;499:4;487:17;;483:27;-1:-1;473:2;;524:1;521;514:12;473:2;-1:-1;544:20;;584:18;573:30;;570:2;;;616:1;613;606:12;570:2;650:4;642:6;638:17;626:29;;700:3;693;685:6;681:16;671:8;667:31;664:40;661:2;;;717:1;714;707:12;661:2;466:261;;;;;;736:440;;830:4;818:17;;814:27;-1:-1;804:2;;855:1;852;845:12;804:2;892:6;879:20;914:64;929:48;970:6;929:48;;;914:64;;;905:73;;998:6;991:5;984:21;1034:4;1026:6;1022:17;1067:4;1060:5;1056:16;1102:3;1093:6;1088:3;1084:16;1081:25;1078:2;;;1119:1;1116;1109:12;1078:2;1129:41;1163:6;1158:3;1153;1129:41;;;797:379;;;;;;;;1184:257;;1296:2;1284:9;1275:7;1271:23;1267:32;1264:2;;;1312:1;1309;1302:12;1264:2;1347:1;1364:61;1417:7;1397:9;1364:61;;1448:615;;;;;1605:2;1593:9;1584:7;1580:23;1576:32;1573:2;;;1621:1;1618;1611:12;1573:2;1656:1;1673:53;1718:7;1698:9;1673:53;;;1663:63;;1635:97;1763:2;1781:53;1826:7;1817:6;1806:9;1802:22;1781:53;;;1771:63;;1742:98;1899:2;1888:9;1884:18;1871:32;1923:18;1915:6;1912:30;1909:2;;;1955:1;1952;1945:12;1909:2;1983:64;2039:7;2030:6;2019:9;2015:22;1983:64;;;1567:496;;;;-1:-1;1965:82;-1:-1;;;;1567:496;2070:595;;;;2217:2;2205:9;2196:7;2192:23;2188:32;2185:2;;;2233:1;2230;2223:12;2185:2;2268:1;2285:53;2330:7;2310:9;2285:53;;;2275:63;;2247:97;2375:2;2393:53;2438:7;2429:6;2418:9;2414:22;2393:53;;;2383:63;;2354:98;2511:2;2500:9;2496:18;2483:32;2535:18;2527:6;2524:30;2521:2;;;2567:1;2564;2557:12;2521:2;2587:62;2641:7;2632:6;2621:9;2617:22;2587:62;;;2577:72;;2462:193;2179:486;;;;;;2672:101;2739:28;2761:5;2739:28;;;2734:3;2727:41;2721:52;;;2780:110;2853:31;2878:5;2853:31;;2897:297;;2997:38;3029:5;2997:38;;;3052:6;3047:3;3040:19;3064:63;3120:6;3113:4;3108:3;3104:14;3097:4;3090:5;3086:16;3064:63;;;3159:29;3181:6;3159:29;;;3139:50;;;3152:4;3139:50;;2977:217;-1:-1;;;2977:217;3501:296;3656:2;3644:15;;3693:66;3688:2;3679:12;;3672:88;3788:2;3779:12;;3637:160;3806:296;3961:2;3949:15;;3998:66;3993:2;3984:12;;3977:88;4093:2;4084:12;;3942:160;4110:104;4179:29;4202:5;4179:29;;4221:181;4323:2;4308:18;;4337:55;4312:9;4365:6;4337:55;;4409:378;4563:2;4548:18;;4577:61;4552:9;4611:6;4577:61;;;4686:9;4680:4;4676:20;4671:2;4660:9;4656:18;4649:48;4711:66;4772:4;4763:6;4711:66;;4794:489;4982:3;4967:19;;4997:61;4971:9;5031:6;4997:61;;;5069:58;5123:2;5112:9;5108:18;5099:6;5069:58;;;5138:62;5196:2;5185:9;5181:18;5172:6;5138:62;;;5211;5269:2;5258:9;5254:18;5245:6;5211:62;;;4953:330;;;;;;;;5290:273;5414:2;5428:47;;;5399:18;;5489:64;5399:18;5539:6;5489:64;;5570:387;5751:2;5765:47;;;5736:18;;5826:121;5736:18;5826:121;;5964:387;6145:2;6159:47;;;6130:18;;6220:121;6130:18;6220:121;;6358:256;6420:2;6414:9;6446:17;;;6521:18;6506:34;;6542:22;;;6503:62;6500:2;;;6578:1;6575;6568:12;6500:2;6594;6587:22;6398:216;;-1:-1;6398:216;6621:258;;6764:18;6756:6;6753:30;6750:2;;;6796:1;6793;6786:12;6750:2;-1:-1;6869:4;6840;6817:17;;;;-1:-1;;6813:33;6859:15;;6687:192;6886:91;6960:12;;6944:33;7079:92;7152:13;7145:21;;7128:43;7178:79;7247:5;7230:27;7264:88;7342:4;7331:16;;7314:38;7359:128;-1:-1;;;;;7428:54;;7411:76;7680:145;7761:6;7756:3;7751;7738:30;-1:-1;7817:1;7799:16;;7792:27;7731:94;7834:268;7899:1;7906:101;7920:6;7917:1;7914:13;7906:101;;;7987:11;;;7981:18;7968:11;;;7961:39;7942:2;7935:10;7906:101;;;8022:6;8019:1;8016:13;8013:2;;;8087:1;8078:6;8073:3;8069:16;8062:27;8013:2;7883:219;;;;;8110:97;8198:2;8178:14;-1:-1;;8174:28;;8158:49"
            }
        }
    },
    "sources": {
        "current/protocol/Exchange/MixinSignatureValidator.sol": {
            "id": 0
        },
        "current/protocol/Exchange/interfaces/ISignatureValidator.sol": {
            "id": 1
        },
        "current/protocol/Exchange/interfaces/ISigner.sol": {
            "id": 2
        },
        "current/protocol/Exchange/libs/LibExchangeErrors.sol": {
            "id": 3
        },
        "current/protocol/Exchange/mixins/MSignatureValidator.sol": {
            "id": 4
        },
        "current/test/TestSignatureValidator/TestSignatureValidator.sol": {
            "id": 5
        },
        "current/utils/LibBytes/LibBytes.sol": {
            "id": 6
        }
    },
    "sourceCodes": {
        "current/protocol/Exchange/MixinSignatureValidator.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.23;\n\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./interfaces/ISigner.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\n\ncontract MixinSignatureValidator is\n    LibBytes,\n    LibExchangeErrors,\n    MSignatureValidator\n{\n\n    // Mapping of hash => signer => signed\n    mapping(bytes32 => mapping(address => bool)) preSigned;\n\n    /// @dev Approves a hash on-chain using any valid signature type.\n    ///      After presigning a hash, the preSign signature type will become valid for that hash and signer.\n    /// @param signer Address that should have signed the given hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    function preSign(\n        bytes32 hash,\n        address signer,\n        bytes signature)\n        external\n    {\n        require(\n            isValidSignature(hash, signer, signature),\n            SIGNATURE_VALIDATION_FAILED\n        );\n        preSigned[hash][signer] = true;\n    }\n\n    /// @dev Verifies that a hash has been signed by the given signer.\n    /// @param hash Any 32 byte hash.\n    /// @param signer Address that should have signed the given hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return True if the address recovered from the provided signature matches the input signer address.\n    function isValidSignature(\n        bytes32 hash,\n        address signer,\n        bytes memory signature)\n        internal\n        view\n        returns (bool isValid)\n    {\n        // TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)\n\n        require(\n            signature.length >= 1,\n            INVALID_SIGNATURE_LENGTH\n        );\n        SignatureType signatureType = SignatureType(uint8(signature[0]));\n\n        // Variables are not scoped in Solidity\n        uint8 v;\n        bytes32 r;\n        bytes32 s;\n        address recovered;\n\n        // Always illegal signature\n        // This is always an implicit option since a signer can create a\n        // signature array with invalid type or length. We may as well make\n        // it an explicit option. This aids testing and analysis. It is\n        // also the initialization value for the enum type.\n        if (signatureType == SignatureType.Illegal) {\n            // NOTE: Reason cannot be assigned to a variable because of https://github.com/ethereum/solidity/issues/4051\n            revert(\"Illegal signature type.\");\n\n        // Always invalid signature\n        // Like Illegal, this is always implicitly available and therefore\n        // offered explicitly. It can be implicitly created by providing\n        // a correctly formatted but incorrect signature.\n        } else if (signatureType == SignatureType.Invalid) {\n            require(\n                signature.length == 1,\n                INVALID_SIGNATURE_LENGTH\n            );\n            isValid = false;\n            return isValid;\n\n        // Implicitly signed by caller\n        // The signer has initiated the call. In the case of non-contract\n        // accounts it means the transaction itself was signed.\n        // Example: let's say for a particular operation three signatures\n        // A, B and C are required. To submit the transaction, A and B can\n        // give a signature to C, who can then submit the transaction using\n        // `Caller` for his own signature. Or A and C can sign and B can\n        // submit using `Caller`. Having `Caller` allows this flexibility.\n        } else if (signatureType == SignatureType.Caller) {\n            require(\n                signature.length == 1,\n                INVALID_SIGNATURE_LENGTH\n            );\n            isValid = signer == msg.sender;\n            return isValid;\n\n        // Signed using web3.eth_sign\n        } else if (signatureType == SignatureType.Ecrecover) {\n            require(\n                signature.length == 66,\n                INVALID_SIGNATURE_LENGTH\n            );\n            v = uint8(signature[1]);\n            r = readBytes32(signature, 2);\n            s = readBytes32(signature, 34);\n            recovered = ecrecover(\n                keccak256(\"\\x19Ethereum Signed Message:\\n32\", hash),\n                v,\n                r,\n                s\n            );\n            isValid = signer == recovered;\n            return isValid;\n\n        // Signature using EIP712\n        } else if (signatureType == SignatureType.EIP712) {\n            require(\n                signature.length == 66,\n                INVALID_SIGNATURE_LENGTH\n            );\n            v = uint8(signature[1]);\n            r = readBytes32(signature, 2);\n            s = readBytes32(signature, 34);\n            recovered = ecrecover(hash, v, r, s);\n            isValid = signer == recovered;\n            return isValid;\n\n        // Signature from Trezor hardware wallet\n        // It differs from web3.eth_sign in the encoding of message length\n        // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n        // self-terminating which leads to ambiguities).\n        // See also:\n        // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n        // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n        // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n        } else if (signatureType == SignatureType.Trezor) {\n            require(\n                signature.length == 66,\n                INVALID_SIGNATURE_LENGTH\n            );\n            v = uint8(signature[1]);\n            r = readBytes32(signature, 2);\n            s = readBytes32(signature, 34);\n            recovered = ecrecover(\n                keccak256(\"\\x19Ethereum Signed Message:\\n\\x41\", hash),\n                v,\n                r,\n                s\n            );\n            isValid = signer == recovered;\n            return isValid;\n\n        // Signature verified by signer contract\n        } else if (signatureType == SignatureType.Contract) {\n            isValid = ISigner(signer).isValidSignature(hash, signature);\n            return isValid;\n\n        // Signer signed hash previously using the preSign function\n        } else if (signatureType == SignatureType.PreSigned) {\n            isValid = preSigned[hash][signer];\n            return isValid;\n        }\n\n        // Anything else is illegal (We do not return false because\n        // the signature may actually be valid, just not in a format\n        // that we currently support. In this case returning false\n        // may lead the caller to incorrectly believe that the\n        // signature was invalid.)\n        // NOTE: Reason cannot be assigned to a variable because of https://github.com/ethereum/solidity/issues/4051\n        revert(\"Unsupported signature type.\");\n    }\n}\n",
        "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.23;\n\ncontract ISignatureValidator {\n\n    /// @dev Approves a hash on-chain using any valid signature type.\n    ///      After presigning a hash, the preSign signature type will become valid for that hash and signer.\n    /// @param signer Address that should have signed the given hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    function preSign(\n        bytes32 hash,\n        address signer,\n        bytes signature)\n        external;\n}\n",
        "current/protocol/Exchange/interfaces/ISigner.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.23;\n\ncontract ISigner {\n\n    /// @dev Verifies that a signature is valid.\n    /// @param hash Message hash that is signed.\n    /// @param signature Proof of signing.\n    /// @return Validity of order signature.\n    function isValidSignature(\n        bytes32 hash,\n        bytes signature)\n        external\n        view\n        returns (bool isValid);\n}\n",
        "current/protocol/Exchange/libs/LibExchangeErrors.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.23;\n\ncontract LibExchangeErrors {\n\n    // Error Codes\n    enum Errors {\n        ORDER_EXPIRED,                     // Order has already expired\n        ORDER_FULLY_FILLED,                // Order has already been fully filled\n        ORDER_CANCELLED,                   // Order has already been cancelled\n        ROUNDING_ERROR_TOO_LARGE,          // Rounding error too large\n        INSUFFICIENT_BALANCE_OR_ALLOWANCE  // Insufficient balance or allowance for token transfer\n    }\n\n    event ExchangeError(uint8 indexed errorId, bytes32 indexed orderHash);\n\n    // Core revert reasons\n    string constant GT_ZERO_AMOUNT_REQUIRED = \"Amount must be greater than 0.\";\n    string constant SIGNATURE_VALIDATION_FAILED = \"Signature validation failed.\";\n    string constant INVALID_SENDER = \"Invalid `msg.sender`.\";\n    string constant INVALID_CONTEXT = \"Function called in an invalid context.\";\n    string constant INVALID_NEW_MAKER_EPOCH = \"Specified salt must be greater than or equal to existing makerEpoch.\";\n\n    // Transaction revert reasons\n    string constant DUPLICATE_TRANSACTION_HASH = \"Transaction has already been executed.\";\n    string constant TRANSACTION_EXECUTION_FAILED = \"Transaction execution failed.\";\n\n    // Wrapper revert reasons\n    string constant COMPLETE_FILL_FAILED = \"Desired fill amount could not be completely filled.\";\n    string constant ASSET_DATA_MISMATCH = \"Asset data must be the same for each order.\";\n\n    // Asset proxy dispatcher revert reasons\n    string constant GT_ZERO_LENGTH_REQUIRED = \"Length must be greater than 0.\";\n    string constant OLD_ASSET_PROXY_MISMATCH = \"Old asset proxy does not match asset proxy at given id.\";\n    string constant NEW_ASSET_PROXY_MISMATCH = \"New asset proxy id does not match given id.\";\n\n    // Signature validator revert reasons\n    string constant INVALID_SIGNATURE_LENGTH = \"Invalid signature length.\";\n    string constant ILLEGAL_SIGNATURE_TYPE = \"Illegal signature type.\";\n    string constant UNSUPPORTED_SIGNATURE_TYPE = \"Unsupported signature type.\";\n}\n",
        "current/protocol/Exchange/mixins/MSignatureValidator.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.23;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\ncontract MSignatureValidator is\n    ISignatureValidator\n{\n    // Allowed signature types.\n    enum SignatureType {\n        Illegal,  // Default value\n        Invalid,\n        Caller,\n        Ecrecover,\n        EIP712,\n        Trezor,\n        Contract,\n        PreSigned\n    }\n\n    /// @dev Verifies that a signature is valid.\n    /// @param hash Message hash that is signed.\n    /// @param signer Address of signer.\n    /// @param signature Proof of signing.\n    /// @return Validity of order signature.\n    function isValidSignature(\n        bytes32 hash,\n        address signer,\n        bytes memory signature)\n        internal\n        view\n        returns (bool isValid);\n}\n",
        "current/test/TestSignatureValidator/TestSignatureValidator.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.23;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/MixinSignatureValidator.sol\";\n\ncontract TestSignatureValidator is MixinSignatureValidator {\n\n    function publicIsValidSignature(\n        bytes32 hash,\n        address signer,\n        bytes memory signature)\n        public\n        view\n        returns (bool isValid)\n    {\n        isValid = isValidSignature(\n            hash,\n            signer,\n            signature\n        );\n        return isValid;\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.23;\n\ncontract LibBytes {\n\n    // Revert reasons\n    string constant GTE_20_LENGTH_REQUIRED = \"Length must be greater than or equal to 20.\";\n    string constant GTE_32_LENGTH_REQUIRED = \"Length must be greater than or equal to 32.\";\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(bytes memory lhs, bytes memory rhs)\n        internal\n        pure\n        returns (bool equal)\n    {\n        assembly {\n            // Get the number of words occupied by <lhs>\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 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        internal\n        pure\n        returns (address result)\n    {\n        require(\n            b.length >= index + 20,  // 20 is length of address\n            GTE_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        internal\n        pure\n    {\n        require(\n            b.length >= index + 20,  // 20 is length of address\n            GTE_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        internal\n        pure\n        returns (bytes32 result)\n    {\n        require(\n            b.length >= index + 32,\n            GTE_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 <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input)\n        internal\n        pure\n    {\n        require(\n            b.length >= index + 32,\n            GTE_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        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 <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input)\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n}\n"
    },
    "sourceTreeHashHex": "0xf4dc76251604b90db5fac293745087d0ba5a0edae605b925bc25a374a7487c2e",
    "compiler": {
        "name": "solc",
        "version": "0.4.23",
        "settings": {
            "optimizer": {
                "enabled": true,
                "runs": 200
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            }
        }
    },
    "networks": {}
}